//Cross browser JavaScript functions.
//copyright Adam George 2002, 2003
//Code may be reused/modified with permission.
//Contact: adam_george_@hotmail.com

//Browser detection
var isW3C = (document.getElementById) ? true : false;
var isIE = (document.all) ? true : false;
var isMac = (navigator.appVersion.indexOf("Mac")!=-1) ? true : false;
var NS4 = (document.layers) ? true : false;
var IEmac = ((document.all)&&(isMac)) ? true : false;
var IE4plus = (document.all) ? true : false;
var IE4 = ((document.all)&&(navigator.appVersion.indexOf("MSIE 4.")!=-1)) ? true : false;
var IE5 = ((document.all)&&(navigator.appVersion.indexOf("MSIE 5.")!=-1)) ? true : false;
var IE6 = ((document.all)&&(navigator.appVersion.indexOf("MSIE 6.")!=-1)) ? true : false;
var ver4 = (NS4 || IE4plus) ? true : false;
var NS6 = (!document.layers) && (navigator.userAgent.indexOf('Netscape')!=-1)?true:false;
var IE5plus = IE5 || IE6;
var IEMajor = 0;

if(IE4plus){
	var start = navigator.appVersion.indexOf("MSIE");
	var end = navigator.appVersion.indexOf(".",start);
	IEMajor = parseInt(navigator.appVersion.substring(start+5,end));
	IE5plus = (IEMajor>=5) ? true : false;
}

//Get reference to a DOM element by it's ID property
function getObjectByID(id){
 	if(document.getElementById)
		return document.getElementById(id);
	else if(document.all)
		return document.all[id];
	else if(document.layers)
		return document.layers[id];
	else
		return null
}

//Get reference to a DOM elmement by it's name property
function getObjectByName(sName){				
	if(document.getElementsByName){
		oElements = document.getElementsByName(sName);
		if(oElements.length > 0)
			return oElements[0];
		else
			return null;
	}
	else if(document.all)
		return document.all[sName][0];
	else if(document.layers)
		return document.layers[sName][0];
	else
		return null;
}

//get array of all DOM elements with a particular name property
function getObjectsByName(sName){
	if(document.getElementsByName)
		return document.getElementsByName(sName);
	else if(document.all)
		return document.all[sName];
	else if(document.layers)
		return document.layers[sName];
	else
		return null
}

//get value of a DOM element by it's name property
function getObjectValueByName(sName){
	var theObj = getObjectByName(sName);
	
	if(theObj != null) return theObj.value;
	else return null;
}

//get value of a DOM element by it's id property
function getObjectValueByID(id){
	var theObj = getObjectByID(id);
	
	if(theObj != null) return theObj.value;
	else return null;
}

//get value of a particular property for a DOM elemement, referenced by it's name
function getObjectPropertyByID(id, property){
	var theObj = getObjectByID(id);

	if(theObj == null)
		return null;

	var bInvalid;

	eval("if(typeof theObj." + property + " == 'undefined') bInvalid = false; else bInvalid = true;");

	if(!bInvalid)
		return null;

	var propertyValue;

	eval("propertyValue = theObj." + property);

	return propertyValue;
}

//get value of a particular property for a DOM elemement, referenced by it's ID
function getObjectPropertyByName(sName, property){
	var theObj = getObjectByName(sName);

	if(theObj == null)
		return null;

	var bInvalid;

	eval("if(typeof theObj." + property + " == 'undefined') bInvalid = false; else bInvalid = true;");

	if(!bInvalid)
		return null;

	var propertyValue;

	eval("propertyValue = theObj." + property);

	return propertyValue;
}

//set a DOM elements value referenced by it's ID
function setObjectValueByID(id, value){
	var theObj = getObjectByID(id);
	
	if(theObj != null){
		theObj.value = value;
		return true;
	}
	else return false;
}

//set a DOM elements value referenced by it's Name
function setObjectValueByName(sName, value){
	var theObj = getObjectByName(sName);

	if(theObj != null){
		theObj.value = value;
		return true;
	}
	else return false;
}

//set any property for a DOM element, referenced by it's id
function setObjectPropertyByID(id, property, value){
	var theObj = getObjectByID(id);

	if(theObj == null)
		return false;

	var bInvalid;

	eval("if(typeof theObj." + property + " == 'undefined') bInvalid = false; else bInvalid = true;");

	if(!bInvalid)
		return false;

	eval("theObj." + property + " = " + value);

	return true;
}

//set any property for a DOM element, referenced by it's name
function setObjectPropertyByName(sName, property, value){
	var theObj = getObjectByName(sName);

	if(theObj == null)
		return false;

	var bInvalid;

	eval("if(typeof theObj." + property + " == 'undefined') bInvalid = false; else bInvalid = true;");

	if(!bInvalid)
		return false;

	eval("theObj." + property + " = " + value);

	return true;
}

//format a number to a certain precision
function format(expr, decplaces) {
	var str = "" + Math.round(eval(expr) * Math.pow(10,decplaces))

	while(str.length <= decplaces)
		str = "0" + str

	var decpoint = str.length - decplaces
	return str.substring(0,decpoint) + "." + str.substring(decpoint,str.length);
}

//format a number to money format
function dollarise(expr){
	return "$" + format(expr,2)
}

//pad a number with leading zeros
function pad(sStr, iSize){
	//convert numrics to string
	sStr = sStr + "";

	while(sStr.length < iSize)
		sStr = "0" + sStr;
		
	return sStr;
}

//search through a DOM select element for a string and if find it in one of
//it's OPTION child elements, set that option as selected
function searchSelectBox(sNeedle,sSelectName,bFirst){
	//alert(sNeedle);
	var i;
	var oSelectBox = getObjectByName(sSelectName);

	if(oSelectBox == null)
		return;

	/*var re = new RegExp();
	re.compile(sNeedle, "gi")
														
	for(i=0; i<oSelectBox.length; i++){
		if(oSelectBox.options[i].text.search(re) != -1){
			oSelectBox.selectedIndex = i;
			return;
		}						
	}*/
	
	if(sNeedle == ""){
		oSelectBox.selectedIndex = 0;
		return;
	}
	
	var iMax = 0
	
	for(i=0; i<oSelectBox.length; i++){
		if(oSelectBox.options[i].text.length > iMax)
			iMax = oSelectBox.options[i].text.length
	}
	
	if(bFirst)
		iStart = 0;
	else
		iStart = 1;
		
	for(j=0; j<iMax; j++){
		for(i=iStart; i<oSelectBox.length; i++){
			if(oSelectBox.options[i].text.substr(j-1,sNeedle.length).toLowerCase() == sNeedle.toLowerCase()){
				oSelectBox.selectedIndex = i;
				return;
			}					
		}
	}
}

//Check if a value exists in an array
function inArray(value,aArray){
	if(typeof aArray.length == "undefined")
		return false;

	for(var i=0; i<aArray.length; i++){
		if(aArray[i] == value)
			return true;
	}

	return false;
}

//recursive function used by printReadable()
function buildArray(aArray){
	var sContent = "<table>";

	for(var i=0; i<aArray.length; i++){
		if(typeof aArray[i] == 'array'){
			sContent = sContent + '<tr><td colspan=\'4\' style=\'padding-left:33px;\' valign=\'top\'>';

			sContent = sContent + buildArray(aArray[i]);

			sContent = sContent + '</td></tr>';
		}
		else{
			sContent = sContent + '<tr><td valign=\'top\'>[' + i + ']</td><td valign=\'top\'> => </td><td valign=\'top\'>(' + typeof(aArray[i]) + ')</td><td valign=\'top\'>' + aArray[i] + '</td></tr>';
		}
	}

	sContent = sContent + '</table>';
	return sContent;
}

//Print information on an array (Used for debugging purposes)
function printReadable(aArray){
	var iWidth = 500;
	var iHeight = 500;
	var sTitle = "";

	var ctr = new Date();
	ctr = ctr.getTime();

	var oWindow = window.open("", "abc" + ctr, "status=no,menubar=no,width=" + iWidth + ",height=" + iHeight + ",resizable=yes,scrollbars=yes");

	if(typeof aArray == "array")
		var sArray = buildArray(aArray);
	else
		sArray = aArray;
	
	var sContent = '<html><head><title>' + sTitle + '</title></head><body style=\'font-family:verdana;\'>' + typeof(aArray) + " {<div style=\"padding-left:33px;\">" + sArray + "</div>}" + '</body></html>';

	oWindow.document.write(sContent);
	oWindow.document.close();
}


/*var x,y;
var test1 = document.body.scrollHeight;
var test2 = document.body.offsetHeight;
// all but Explorer Mac
if(test1 > test2){
	x = document.body.scrollWidth;
	y = document.body.scrollHeight;
}
// Explorer Mac;
//would also work in Explorer 6 Strict, Mozilla and Safari
else{
	x = document.body.offsetWidth;
	y = document.body.offsetHeight;
}*/




/*
 * Get the target element from the event
 */
function getTargetElementFromEvent(evt){
	if(!evt) return null;

    var el

    if(evt.target)
		//If target node is a text node, we must use the parent node instead
        el = (evt.target.nodeType == 3) ? evt.target.parentNode : evt.target
	else
        el = evt.srcElement

    return el
}




/*
 * Get X co-ordinate of an event (I.e. mouse click)
 */
function getPageX(evt){
    evt = (evt) ? evt : ((window.event) ? window.event : "")
    if(!evt) return false;

	var el = getTargetElementFromEvent(evt)
	if(!el) return false;

	if(typeof evt.pageX == "undefined")
		return (evt.clientX + getScrollX());
	else
		return evt.pageX;
}

/*
 * Get Y co-ordinate of an event (I.e. mouse click)
 */
function getPageY(evt){
	var evt = (evt) ? evt : (window.event) ? window.event : ""
	if(!evt) return false;

	var el = getTargetElementFromEvent(evt)
	if(!el)	return false;

	if(typeof evt.pageY == "undefined")
		return (evt.clientY + getScrollY());
	else
		return evt.pageY;
}




/*
 * Get the X offset from within the element you clicked
 * This function doesn't work very well!
 */
function getOffsetX(evt){
	var evt = (evt) ? evt : (window.event) ? window.event : ""
	if(!evt) return false;

	var el = getTargetElementFromEvent(evt)
	if(!el) return false;

	// All except IE (I don't think this is correct!)
	if(typeof evt.offsetX != "undefined")
		return evt.offsetX;
	// IE 6 strict mode
	else if(document.documentElement && document.documentElement.offsetLeft)
		return evt.pageX - el.offsetLeft - document.documentElement.offsetLeft;
	// All other IE
	else if(document.body)
		return evt.pageX - el.offsetLeft - document.body.offsetLeft;
	else
		return null;
}

/*
 * Get the Y offset from within the element you clicked
 * This function doesn't work very well!
 */
function getOffsetY(evt){
	var evt = (evt) ? evt : (window.event) ? window.event : ""
	if(!evt) return false;

	var el = getTargetElementFromEvent(evt)
	if(!el) return false;

	// All except IE
	if(typeof evt.offsetY != "undefined")
		return evt.offsetY;
	// IE 6 strict mode
	else if(document.documentElement && document.documentElement.offsetTop)
		return evt.pageY - el.offsetTop - document.documentElement.offsetTop;
	// All other IE
	else if(document.body)
		return evt.pageY - el.offsetTop - document.body.offsetTop;
	else
		return null;
}




/*
 * How far the document has scrolled left
 */
function getScrollX(){
	// All except IE
	if(typeof self.pageXOffset != "undefined")
		return self.pageXOffset;
	// IE 6 strict mode
	else if(document.documentElement && document.documentElement.scrollLeft)
		return document.documentElement.scrollLeft;
	// All other IE
	else if(document.body)
		return document.body.scrollLeft;
	else
		return null;
}

/*
 * How far the document has scrolled up
 */
function getScrollY(){
	// All except IE
	if(typeof self.pageYOffset != "undefined")
		return self.pageYOffset;
	// IE 6 strict mode
	else if(document.documentElement && document.documentElement.scrollTop)
		return document.documentElement.scrollTop;
	// All other IE
	else if(document.body)
		return document.body.scrollTop;
	else
		return null;
}




/*
 * The width of the window or frame
 */
function getWindowWidth(){
	// All except IE
	if(typeof self.innerWidth != "undefined")
		return self.innerWidth;
	// IE 6 strict mode
	else if(document.documentElement && document.documentElement.clientWidth)
		return document.documentElement.clientWidth;
	// Other IE
	else if(document.body)
		return document.body.clientWidth;
}

/*
 * The height of the window or frame
 */
function getWindowHeight(){
	// All except IE
	if(typeof self.innerHeight != "undefined")
		return self.innerHeight;
	// IE 6 strict mode
	else if(document.documentElement && document.documentElement.clientHeight)
		return document.documentElement.clientHeight;
	// Other IE
	else if(document.body)
		return document.body.clientHeight;
}




/*
* This function will not return until (at least)
* the specified number of milliseconds have passed.
* It uses a modal dialog.
*/
function pause(numberMillis){
	var dialogScript = 'window.setTimeout(' + ' function(){ window.close(); }, ' + numberMillis + ');';

	// For IE5.
	var result = window.showModalDialog('javascript:document.writeln(' + '"<script>' + dialogScript + '<' + '/script>")');

	/* For NN6, but it requires a trusted script.
	openDialog('javascript:document.writeln(' + '"<script>' + dialogScript + '<' + '/script>"','pauseDialog', 'modal=1,width=10,height=10');
	*/
}


/*
* This function will not return until (at least)
* the specified number of milliseconds have passed.
* It does a busy-wait loop.
* This function wastes a lot of CPU cycles.
*/
/*function pause(numberMillis) {
	var now = new Date();
	var exitTime = now.getTime() + numberMillis;
	while (true) {
		now = new Date();
		if (now.getTime() > exitTime)
			return;
	}
}*/
