
/* Utils */

	function isArray()
	{
		if (typeof arguments[0] == 'object')
		{
			var criterion = arguments[0].constructor.toString().match(/array/i);
			return (criterion != null);
		}
		
		return false;
	}

/* Box manipulation stuff */

	function moveBox (thingy, x, y)
	{
		var pos = new Array(x, y);
		YAHOO.util.Dom.setXY(thingy, pos);
	}

	function hideBox(box)
	{
		if (!document.getElementById(box))
			return;
		
		document.getElementById(box).style.display = 'none';
		YAHOO.util.Dom.setStyle(box, 'opacity', 1);			
	}

	function hideBoxFade (box)
	{
		var myAnim = new YAHOO.util.Anim(box, {opacity: {to: 0}}, 0.3, YAHOO.util.Easing.easeOut);
		myAnim.onComplete.subscribe(finishHideBoxFade);
		myAnim.animate();	
	}
	
	var finishHideBoxFade = function ()
	{
		var el = this.getEl();
		hideBox(el.id);
	}
	
	function hideBox2 (box)
	{
		if (!document.getElementById(box))
			return;		
		
		document.getElementById(box).style.visibility = 'hidden';
	}	
	
	function hideBox2Fade (box)
	{
		var myAnim = new YAHOO.util.Anim(box, {opacity: {to: 0}}, 0.3, YAHOO.util.Easing.easeOut);
		myAnim.onComplete.subscribe(finishHideBox2Fade);
		myAnim.animate();	
	}
	
	var finishHideBox2Fade = function ()
	{
		var el = this.getEl();
		hideBox2(el.id);
	}	
	
	function showBox (box)
	{
		if (!document.getElementById(box))
			return;		
		
		document.getElementById(box).style.display = '';
	}	
	
	function showBox2 (box)
	{
		if (!document.getElementById(box))
			return;		
		
		document.getElementById(box).style.visibility = 'visible';
	}		
	
	function toggleHiddenWithValue (thingy, value)
	{
		if (value)
			showBox(thingy);
		else
			hideBox(thingy);
	}
	
	function toggleHiddenWithValueInverted (thingy, value)
	{
		if (value == '0')
			value = 0;
		
		if (!value)
			showBox(thingy);
		else
			hideBox(thingy);		
	}
	
	function toggleHidden (thingy, img)
	{
		if (document.getElementById(thingy).style.display)
		{
			document.getElementById(thingy).style.display = '';
			if (img && minus.src)
				document.getElementById(thingy+'img').src = minus.src;
		}
		else
		{
			document.getElementById(thingy).style.display = 'none';
			if (img && plus.src)
				document.getElementById(thingy+'img').src = plus.src;
		}			
	}
	
	function toggleOpacity (value, thingy, off)
	{
		if (value)
			document.getElementById(thingy).style.opacity = '1';
		else
			document.getElementById(thingy).style.opacity = off;
	}	
	
	var removeElement = function()
	{
		var el = this.getEl();
		el.parentNode.removeChild(el);
	}
	
	function deleteBox2 (box)
	{
		var myAnim = new YAHOO.util.Anim(box, {opacity: {to: 0}}, 0.5, YAHOO.util.Easing.easeOut);
		
		myAnim.onComplete.subscribe(removeElement);
		myAnim.animate();
	}
	
	function checkHide (e)
	{	
		if (window.event)
		{
			x = window.event.clientX;
			y = window.event.clientY;
		}
		else if (e)
		{
			x = e.clientX;
			y = e.clientY;
		}
		
		var boxes = Array('searchResults', 'dataSuggestBox');
		var boxesHideFuncs = Array('hideBoxFade(\'searchResults\')', 0);
		
		for (a in boxes)
		{
			currentBox = boxes[a];
			var box = document.getElementById(currentBox);
			if (!box)
				continue;
				
			if (box.style.display == 'none')
				continue;
				
			var pos = YAHOO.util.Region.getRegion(currentBox);
			if ((x < pos.left) || (x > (pos.left+box.offsetWidth)) || (y < pos.top) || (y > (pos.top+box.offsetHeight)))
			{
				if (boxesHideFuncs[a])
					eval(boxesHideFuncs[a]);
				else
					hideBox(currentBox);
			}
		}
	}
	
	function setHTML (target, html)
	{
		document.getElementById(target).innerHTML = html;
	}		
	
/* Form manipulation stuff */

	function tickBox (boxname)
	{
		document.getElementById(boxname).checked = 1;
		if (document.getElementById(boxname).onchange)
			document.getElementById(boxname).onchange();		
		changeMade = 1;		
	}
	
	function untickBox (boxname)
	{
		document.getElementById(boxname).checked = 0;
		if (document.getElementById(boxname).onchange)
			document.getElementById(boxname).onchange();		
		changeMade = 1;		
	}
	
	function toggleBox (boxname)
	{
		if (document.getElementById(boxname).checked)
			document.getElementById(boxname).checked = false;
		else
			document.getElementById(boxname).checked = true;
			
		if (document.getElementById(boxname).onchange)
			document.getElementById(boxname).onchange();
			
		changeMade = 1;
	}
	
	function copyField (from, to)
	{
		document.getElementById(to).value = document.getElementById(from).value;
		changeMade = 1;		
	}
	
	function setField (target, val)
	{
		if (!document.getElementById(target))
			return;
			
		document.getElementById(target).value = val;
		changeMade = 1;
		
		if (document.getElementById(target).onchange)
			document.getElementById(target).onchange();
	}	
	
/* Generic AJAX stuff */

	var AJAXFailure = function(e)
	{
		alert('AJAX Failure');
	}
	
/* String functions */	
	
	function URLEncode(plaintext)
	{
		// The Javascript escape and unescape functions do not correspond
		// with what browsers actually do...
		var SAFECHARS = "0123456789" +					// Numeric
						"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
						"abcdefghijklmnopqrstuvwxyz" +
						"-_.!~*'()";					// RFC2396 Mark characters
		var HEX = "0123456789ABCDEF";
	
		var encoded = "";
		for (var i = 0; i < plaintext.length; i++ ) {
			var ch = plaintext.charAt(i);
			if (ch == " ") {
				encoded += "+";				// x-www-urlencoded, rather than %20
			} else if (SAFECHARS.indexOf(ch) != -1) {
				encoded += ch;
			} else {
				var charCode = ch.charCodeAt(0);
				if (charCode > 255) {
					alert( "Unicode Character '" 
							+ ch 
							+ "' cannot be encoded using standard URL encoding.\n" +
							  "(URL encoding only supports 8-bit characters.)\n" +
							  "A space (+) will be substituted." );
					encoded += "+";
				} else {
					encoded += "%";
					encoded += HEX.charAt((charCode >> 4) & 0xF);
					encoded += HEX.charAt(charCode & 0xF);
				}
			}
		} // for
	
		return encoded;
	}
