function TestControlsInclude(aTag) {
	var dummy = true;
}


// get array of elements with a given class. tag and elm are optional
function GetElementsByClassName(className, tag, elm){
	var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
	var tag = tag || "*";
	var elm = elm || document;
	var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements = [];
	var current;
	var length = elements.length;
	for (var i=0; i<length; i++) {
		current = elements[i];
		if (testClass.test(current.className)) {
			returnElements.push(current);
		}
	}
	return returnElements;
}

function GetFirstByClassName(className, tag, elm) {
	elms = GetElementsByClassName(className, tag, elm);
	return elms.length == 0 ? null : elms[0];
}

// get array of input tags with a given class and type from an optional root
function GetInputsOfClass(aClass,aType,aRoot) {
	var aRoot = aRoot || document;
	var elements = aRoot.getElementsByTagName('input');

	var returnElements = [];
	var testClass = new RegExp("(^|\\s)" + aClass + "(\\s|$)");
	return returnElements;
}

function ClassModify(aObject,aAction,aClass1,aClass2) {
	if (Array.prototype.isPrototypeOf(aObject)) {
		for (var i=0; i<aObject.length; i++)
			ClassModify(aObject[i],aAction,aClass1,aClass2);
	}	else {
		switch (aAction){
			case 'swap':
				aObject.className = !ClassModify(aObject,'check',aClass1) ? aObject.className.replace(aClass2,aClass1) : o.className.replace(aClass1,aClass2);
			break;
			case 'override':
					ClassModify(aObject,'remove',aClass1);
					ClassModify(aObject,'add',aClass2);
			break;
			case 'replace':
				if(ClassModify(aObject,'check',aClass1)) {
					ClassModify(aObject,'remove',aClass1);
					ClassModify(aObject,'add',aClass2);
				}
			break;
			case 'add':
				if(!ClassModify(aObject,'check',aClass1)) {
					aObject.className += aObject.className ? ' '+aClass1 : aClass1;
				}
			break;
			case 'remove':
				var rep = aObject.className.match(' '+aClass1) ? ' ' + aClass1 : aClass1;
				aObject.className = aObject.className.replace(rep,'');
			break;
			case 'check':
				return new RegExp('\\b'+aClass1+'\\b').test(aObject.className)
			break;
		}
	}
}

// get array of radio buttons with a given name
function GetRadioGroup(aName) {
	var inputs = document.getElementsByTagName('input');
	var result = new Array()
	for (var i=0; i < inputs.length; i++) {
		if (inputs[i].getAttribute('name') == aName && inputs[i].getAttribute('type') == 'radio')
			result.push(inputs[i])
	}
	return result
}

// handler attached to bitmap radio buttons
function radioHandleClick(aControlId,aImageId,aOnImage,aOffImage) {
	ctrlRadio = document.getElementById(aControlId)
	//added to click the button
	ctrlRadio.click()
	ctrlRadio.checked = true
	var group_name = ctrlRadio.name
	var radios = GetRadioGroup(group_name)
	for (var i=0; i < radios.length; i++) {
		var img = document.getElementById(radios[i].id+'_img')
		img.src = radios[i].checked ? aOnImage : aOffImage
	}
}

// handler attached to bitmap checkboxes
function checkboxHandleClick(aControlId,aImageId,aOnImage,aOffImage) {
	var chk = document.getElementById(aControlId)
	var img = document.getElementById(aImageId)
	chk.checked = !chk.checked
	img.src = chk.checked ? aOnImage : aOffImage
}

// converts a single checkbox or radio button to a bitmap
function ConvertCheckboxRadioToBitmap(aControl,aOnImage,aOffImage) {
	var img = document.createElement('img');
	img.src = aControl.checked ? aOnImage : aOffImage
	if (aControl.id=='')
		aControl.id = '_'+aControl.name+'_'+aControl.value;
	img.id = aControl.id+'_img'
	img.onclick = new Function(aControl.getAttribute('type')+'HandleClick("'+aControl.id+'","'+img.id+'","'+aOnImage+'","'+aOffImage+'")');
	aControl.parentNode.insertBefore(img, aControl);
	aControl.style.display='none';	//hide the checkbox
}

// Use this on page load to convert all radio buttons with the given name to bitmaps
function ConvertRadioGroupToBitmaps(aName,aOnImage,aOffImage) {
	inputs = document.getElementsByTagName('input');
	for (var i=0; i < inputs.length; i++) {
		if (inputs[i].getAttribute('name') == aName && (inputs[i].getAttribute('type') == 'checkbox' || inputs[i].getAttribute('type') == 'radio')) {
			ConvertCheckboxRadioToBitmap(inputs[i],aOnImage,aOffImage)
		}
	}
}

// Use this on page load to convert all checkboxes of the given class to bitmaps
function ConvertCheckboxClassToBitmaps(aClass,aOnImage,aOffImage) {
	targets = GetInputsOfClass(aClass,'checkbox')
	for (var i=0; i<targets.length; i++) {
		ConvertCheckboxRadioToBitmap(targets[i],aOnImage,aOffImage);
	}
}

// Use this on page load to convert all radio butttons of the given class to bitmaps
function ConvertRadioClassToBitmaps(aClass,aOnImage,aOffImage) {
	targets = GetInputsOfClass(aClass,'radio')
	for (var i=0; i<targets.length; i++) {
		ConvertCheckboxRadioToBitmap(targets[i],aOnImage,aOffImage);
	}
}

// Get the first className from aObject that matches the given regex.
// The regex is given as a string.
function GetFirstMatchingClass(aObject,aRegExStr) {
	var regex = new RegExp('\\b'+aRegExStr+'\\b');
	matches = aObject.className.match(regex);
	return matches.shift();
}

function SelectValue(idSelect) {
    el = document.getElementById(idSelect)
    val = el && el.selectedIndex>=0 ? el[el.selectedIndex].value : null
    return val=="null" ? null : val
}
function clear_array(aArray) {
    while (aArray.length > 0)
        aArray[0] = null;
}
function toggle_visibility(id) {
    var e = document.getElementById(id);
    if (e.style.display == 'none')
        show_element(e);
    else
        hide_element(e);
}
/*
Somehow this function works OK with <div id="divQueryInputs"></div> but not with <div id="divQueryInputs"/>,
so use the first. Even wierder is in Firebug, the second form is treated as an opening tag (wrong!), while 
the first form is displayed as the second form ! ie. copying firebugs output into its input will cause it to fail!
*/
function empty_element(e) {
    var c; 
    while ( ( c = e.firstChild ) ) { 
        e.removeChild(c); 
    }
}

/* Shows an element or an array of elements.  */
function hide_element(aObject) {
	if (Array.prototype.isPrototypeOf(aObject)) {
		for (var i=0; i<aObject.length; i++)
			hide_element(aObject[i]);
	}	else {
		aObject.style.display = 'none';
	}
}

/* Shows an element or an array of elements. Assumes the elements should be shown as 'block' */
function show_element(aObject) {
	if (Array.prototype.isPrototypeOf(aObject)) {
		for (var i=0; i<aObject.length; i++) {
				show_element(aObject[i]);
		}
	}	else {
    aObject.style.display = 'block';
	}
}

/* from http://simonwillison.net/2004/May/26/addLoadEvent/ */
function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}

// see http://viphaklay.com/articles/3.aspx

// eg.
//AddEvent(document.documentElement, "load", body_OnLoad);
//function body_OnLoad() {
//		//do stuff
//}
function AddEvent(obj, functionName, functionCode) {
	 eval("var oldEvent = obj.on" + functionName + ";");
	 
	 if (oldEvent != null) {
			 var additionalEvents = "obj.on" + functionName + " = function(e) { oldEvent(e); functionCode(); };"
			 eval(additionalEvents);
	 } else {
			 eval("obj.on" + functionName + " = functionCode;");
	 }
}

// use this to call the event of a control
function CallEvent(aElement,aEventName) {
	eval("var event = aElement." + aEventName + ";");
	if (event!=null)
		event(aElement);
}


function TriggerOnChange(aElement) {
	//On IE
	if (txt.fireEvent)
		txt.fireEvent('onchange');
	//On Gecko based browsers
	if(document.createEvent) {
		var evt = document.createEvent('HTMLEvents');
		if(evt.initEvent)
			evt.initEvent('change', true, true);
		if (txt.dispatchEvent)
			txt.dispatchEvent(evt);
	}
}


//eg.
//AddListener(document.documentElement, "load", body_OnLoad);
//function body_OnLoad() {
//		//do stuff
//}
function AddListener(obj, functionName, functionCode) {
	 if (obj.addEventListener) {
			 obj.addEventListener (functionName, functionCode, false );
	 } else if (obj.attachEvent) {
			 obj.attachEvent( "on" + functionName, functionCode);
	 } else {
		AddEvent(obj, functionName, functionCode);
	 }
}

//function PopupUrl(aUrl,aWidth=750,aHeight=500,aName='mywin') {
//	return window.open(aUrl,aName,'width='+aWidth.toString()+',height='+aHeight.toString());
//}

