// JavaScript Document
//=====================================================================
//onerror=handleErr;
var txt="";
function handleErr(msg,url,l){
	txt="There was an error on this page.\n\n";
	txt+="Error: " + msg + "\n";
	txt+="URL: " + url + "\n";
	txt+="Line: " + l + "\n\n";
	txt+="Click OK to continue.\n\n";
	alert(txt);
	return true;
};

function show_hide(tag) {
	var t = document.getElementById(tag);
	t.style.display = (t.style.display=="none")?"block":"none";
}

// mutually exclusive divs ----------------------------------------------------------------------
function toggle_one_of(arIds/*array of divs*/,targ_id/*div to show*/) {
	var max = arIds.length;
	var v = document.getElementById(targ_id).style.display;
	for (var i = 0; i<max; i++) {
		var sID = arIds[i];
		document.getElementById(arIds[i]).style.display="none";
	}
	document.getElementById(targ_id).style.display = (v=="none")?"block":"none";
}

// Image workhorse ----------------------------------------------------------------------
var Img = {
		path: '_images/',
		// preload given arry of images image names (name.ext)
		preload: function(aImageCol){
			//alert('preload Images:\n\nImage: ' + aImageCol.join('\nImage: '));
			for (var i=0; i < aImageCol.length; i++) {
				var nImg = new Image();
				nImg.src = this.path + aImageCol[i];
			}
		},
		
		// toggle 2 images aroung with given array of 2 image names or source.
		swap: function(img,aImageCol){
			//alert('swap Images:\nimg: ' + img + '\nImage: ' + aImageCol.join('\nImage: '));
			img.src = (img.src.match(aImageCol[0]))
						? img.src.replace(aImageCol[0],aImageCol[1])
						: img.src.replace(aImageCol[1],aImageCol[0]);
		}
}
//---------------------------------------------------------------------------------------

// Toggle the log UL's. collapsing inner UL's on collapse
function toggleBlock(ID,collapseTag) {
		//alert(document.getElementById('exp_'+ID).className);
		// get the element to toggle
		var el = document.getElementById(ID);
		if((el.style.display=='block')||(el.style.display== '')){
			el.style.display='none';
			document.getElementById('exp_'+ID).className = 'preExpand';

			// if we gto a TAG name to check for inner childs of then collapse them too.
			if(collapseTag != ''){
				var childs = el.getElementsByTagName(collapseTag);
				for (var j=0; j<childs.length; j++){
					if(childs[j].style.display == 'block')
						childs[j].style.display = 'none';
				}
				//  change all the images to back to close (plus.gif)
				var imgChilds = el.getElementsByTagName('img');
				for (var j=0; j<imgChilds.length; j++){
				//alert("out " + imgChilds[j].src);
					if(imgChilds[j].src.match(expandTreeImages[1]))	{
						Img.swap(imgChilds[j],expandTreeImages);
					}
				}
			}
		}else{
			el.style.display='block';
			document.getElementById('exp_'+ID).className = 'preCollapse';
		}
		// swap the expander image				
		if(document.getElementById('img_'+ ID))
			Img.swap(document.getElementById('img_'+ ID),expandTreeImages);
		//alert(document.getElementById('exp_'+ID).className);
	}
	
// get the toggle images ready 
var expandTreeImages = new Array('plus.gif','minus.gif');
Img.preload(expandTreeImages);
//---------------------------------------------------------------------------------------

// div expander with speed 
var exec = new Array();
var dir  = new Array();
function Expand(target, expandTo, speed)
{
	if(!exec[target])
	exec[target] = 0;

		if(!dir[target])
		dir[target] = 'open';
		
		if(dir[target] == 'open') 
		{
			exec[target] = exec[target] + speed;
			if(exec[target] < expandTo) 
			{
				document.getElementById(target).style.height = (exec[target]) + "px";
				document.getElementById(target).style.display = "block";
				setTimeout("Expand('" + target + "'," + expandTo + "," + speed + ")",1);
			} else {
				document.getElementById(target).style.height = (expandTo) + "px";
				document.getElementById(target).style.display = "block";
				dir[target] = 'close';
			}
			
		} else {
		
			exec[target] = exec[target] - (speed*2);
			if(exec[target] > 0) {
				document.getElementById(target).style.height = (exec[target]) + "px";
				document.getElementById(target).style.display = "block";
				setTimeout("Expand('" + target + "'," + expandTo + "," + speed + ")",1);
			} else {
				document.getElementById(target).style.height = "0px";
				document.getElementById(target).style.display = "none";
				dir[target] = 'open';
			}

	}
}


// adds or removes a single item from given array. 
function add_to_list(alist,entry){
	var oLen = alist.length;
	// search if this entry already exists
	key = search_array(entry,alist); 
	(key === -1) 
		? alist.push(entry) // add entry
		: alist.splice(key,1); // remove entry by its key
		
	// check we are either 1 up or 1 down for a good result
	var result = (((alist.length - oLen) == 1) || ((oLen - alist.length) == 1)) ? true : false;
	return result;
}

// search array function. returns -1 or array index. not multidimensional. 
function search_array(needle, haystack){
	if(haystack.constructor != Array)
		return false;
	for(var i = 0; i <  haystack.length; i++){
		//alert ('search_array\n\nkey= ' + i +'\nneedle = ' + needle + '\nhaystack = ' + haystack[i]);
		if(haystack[i] == needle) 
			return i;
	}
	return -1; // magic number here as we sending back an array key if matched. so false would return 0!!
}


/****************************************************************************/
/* oEvent: event object for event handling							 		*/
/****************************************************************************/

var oEvent = new Object;
oEvent = {
		fix : function(e) {
			if (!e) e = window.event
	
			if (e.target) {
				if (e.target.nodeType == 3) e.target = e.target.parentNode
			} else if (e.srcElement) {
				e.target = e.srcElement
			}
	
			return e
		},

		register: function(obj, type, fn){
			if ( obj.attachEvent ) {
				obj['e'+type+fn] = fn;
				obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
				obj.attachEvent( 'on'+type, obj[type+fn] );
			} else {
				obj.addEventListener( type, fn, false );
			}
		},
		
		unregister: function(obj, type, fn){
			if ( obj.detachEvent ) {
			   obj.detachEvent( 'on'+type, obj[type+fn] );
			   obj[type+fn] = null;
			}else{
			  obj.removeEventListener( type, fn, false );
			}
		},
		
		stopDefault: function (e){
			( e.preventDefault ) ? e.preventDefault() :	e.returnValue = false;
		},

		getKeyCode: function (e) {
			var kNum = (window.event) ? e.keyCode : e.which;
			return kNum;
		},

		getKeyChar: function (e) {
			var keyChar = String.fromCharCode(getKeyCode(e));
			return keyChar;
		}
};
/* oEvent end */

/****************************************************************************/
/* oCoords: coorinates object to get & set position on element or mouse		*/
/****************************************************************************/
var oCoords = new Object
oCoords = {
	
	create: function(x,y){
		var x = {left: x, top: y};
		return x;
	},
	
	/*get the position (top , left) of given element*/
	getElementPosition: function(element){
		var curleft = curtop = 0;
		if (element.offsetParent) {
			curleft = element.offsetLeft
			curtop 	= element.offsetTop
			while (element = element.offsetParent) {
				curleft += element.offsetLeft
				curtop 	+= element.offsetTop
			}
		}
		return this.create(curleft,curtop);
	},
	
	/* get mouse position relative to window */
	getMousePosition : function(e) {
		e = oEvent.fix(e)
		return this.create(e.clientX, e.clientY);
	}
};


function alertObject(obj){
	if(typeof obj != 'object')
		return alert('Not a valid Object to loop round');
	
	var x = obj;
	var type = "";
	alert("in loop");
	for (myVar in x){
		if(typeof x[myVar] == 'undefined') type ="UNDEFINED";
		if(typeof x[myVar] == 'object') type ="OBJECT";
		if(typeof x[myVar] == 'function') type ="FUNCTION";
		if(typeof x[myVar] == 'string') type ="STRING";
		if(!isNaN(x[myVar])) type ="NUMBER";
		if(typeof x[myVar]  == 'boolean') type ="BOOLEAN";
		if((x[myVar]) instanceof Array) type ="ARRAY";
	
		alert('Property: ' + myVar +'\n\nType: ' + type + '\n\nValue:\n'+x[myVar]);
	}
};