/*		
	Conduit.js, by bennor.
*/

/* bug fixes / cross-browser compatibility */
if(!document.getElementById)	if(document.all)
		document.getElementById = function(id) { return document.all[id]; }
		
/* event setup functions */

function _setClearDefaults(on, setOnBlur)
{
	var els = document.getElementsByTagName('INPUT');
	for( var i = 0; i < els.length; i++ )
	{
		if(els[i].className.indexOf('jsClearDefault') > -1)
		{
			if(on)
			{
				els[i].defaultValue = trim(els[i].value);
				// on focus, clear default value (if present)
				els[i].onfocus = function()
				{ 
					if(trim(this.value) == this.defaultValue)
						this.value = ''; 
				}
				if(setOnBlur)
				{
					// on blur, set default value (if value is empty)
					els[i].onblur = function()
					{
						if(trim(this.value) == '')
							this.value = this.defaultValue;
					}
				}
			}
			else
			{
				els[i].onfocus = null;
				if(setOnBlur)
					els[i].onblur = null;
			}
		}
	}
}
function _setExtUrl(on)
{
	var els = document.getElementsByTagName('A');
	for( var i = 0; i < els.length; i++ )
	{
		if(els[i].className.indexOf('jsExtUrl') != -1)
		{
			if(on)
				els[i].onclick = function() { window.open(this.href); return false; }	
			else
				els[i].onclick = null;
		}
	}
}
function _setCheckNumeric(on)
{
	var els = document.getElementsByTagName('INPUT');
	for( var i = 0; i < els.length; i++ )
	{
		if(els[i].getAttribute('type') == 'text' && els[i].className.indexOf('jsCheckNumeric') > -1)
		{
			if(on)
			{
				els[i].defaultValue = els[i].value;
				els[i].onchange = function()
				{ 
					if(trim(this.value) == '' || isNaN(this.value))
					{ 
						if(els[i].className.indexOf('jsAlert') > -1)
							alert('You may only enter a numerical value.'); 
						this.value = this.defaultValue; 
					}
				}
			}
			else
				els[i].onchange = null;
		}
	}
}

function _setRollOvers(on)
{
	// image elements
	var els = document.getElementsByTagName('IMG');
	for( var i = 0; i < els.length; i++ )
	{
		if(els[i].className.indexOf('jsRollOver') > -1)
			if(on)
				_attachRollOver(els[i]);
			else
				_clearRollOver(els[i]);
	}
	
	// image input elements
	var els = document.getElementsByTagName('INPUT');
	for( var i = 0; i < els.length; i++ )
	{
		if(els[i].getAttribute('type') == 'image' && els[i].className.indexOf('jsRollOver') > -1)
			if(on)
				_attachRollOver(els[i]);
			else
				_clearRollOver(els[i]);
	}
}

function _attachRollOver(el)
{
	// pre-load image
	var o = new Image();
	o.src = el.src.replace(/(\.\w{3,4})$/, "-over$1");
	o.prototype = el;
	o.onerror = function() { _clearRollOver(this.prototype); }
	o.onabort = function() { _clearRollOver(this.prototype); }
	
	// attach event handlers
	el.onmouseover = function() { this.src = this.src.replace(/(\.\w{3,4})$/, "-over$1"); }
	el.onmouseout = function() { this.src = this.src.replace("-over", ""); }
}

function _clearRollOver(el)
{
	el.onmouseover = null;			
	el.onmouseout = null;
}

/* suckerfish style IE hover fix: see http://www.htmldog.com/articles/suckerfish */
function _setHovers(on, el, tagName, className)
{
	el = $(el);
	if(!el)
		return;
		
	var els = el.getElementsByTagName(tagName.toUpperCase());
	for(var i = 0; i < els.length; i++)
	{
		if(!className || els[i].className.indexOf(className) != -1)
		{
			if(on)
			{
				if($B('msie'))
					els[i].className = els[i].className; // fix for size jumping around in IE
				els[i].onmouseover = function() { this.className = this.className.replace(' hover', '') + ' hover';	}
				els[i].onmouseout = function() { this.className = this.className.replace(' hover', ''); }
			}
			else
			{
				els[i].onmouseover = null;
				els[i].onmouseout = null;
			}
		}
	}
}

/*
var qs = new Array();
function _extractQueryString()
{
	var query = document.location.search.substring(1);
	var parms = query.split('&');
	for (var i=0; i<parms.length; i++) {
	   var pos = parms[i].indexOf('=');
	   if (pos > 0) {
	      var key = parms[i].substring(0,pos);
	      var val = parms[i].substring(pos+1);
	      qs[key] = val;
		}
	}
}
*/

/* other event related functions */
function addLoadEvent(func)
{
	var oldonload = window.onload;
	if( typeof window.onload != 'function' )
		window.onload = func;
	else
		window.onload = function()
		{
			oldonload();
			func();
		}
}

/* string functions */

// trim whitespace from the start & end of a string, or an element's value
function $T(el) 
{
	var s;
	if(typeof(el) == "string" && !$(el))
	{
		s = el;
		el = null; // clear the value of el (so we don't try and update it later)
	}
	else
	{
		el = $(el);
		if(!el || el.getAttribute('value') == null)
			return;
		s = el.value;
	}
		
	// remove leading whitespace
	s = s.replace(/^\s+/, '');
	// remove trailing whitespace
	s = s.replace(/\s+$/, '');
	
	if(el) // if el is still set, then we want to update the value
		el.value = s;
	return s;
}
function trim(s) { return $T(s); }

/* element utility functions */

// coalesce element reference by id or ref
// the parameter can be an element reference (usually passed with 'this'),
// or an id string
function $(el)
{ 
	if(typeof el == 'string')
		return document.getElementById(el);
	// assume el is already a reference
	return el;
}

// return an element (or elements) by tag name
// if there is only one element with that tag name found (e.g. 'body') 
// it will return a single element, otherwise, it will return an array
function $N(tagname)
{
	var els = document.getElementsByTagName(tagname.toUpperCase());
	if(els.length == 1)
		return els[0];
	return els;
}

// get/set element value by id or ref
// pass element id or ref as first parameter
// and optionally a value to set as secont parameter
function $V()	
{
	if(arguments.length == 0)
		return null;
	var el = $(arguments[0]);
	if(el && el.getAttribute('value') != null) // element exists
	{
		if(arguments.length < 2) // get value
			return el.value;
		else // set value
			el.value = arguments[1];
	}
	return null;
}

// get element value by id or ref
function $GV(el)
{
	var el = $(el);
	if(el && el.getAttribute('value') != null)
		return el.value;
	return null;
}

// set element value by id or ref
function $SV(el, newValue)	
{
	var el = $(el);
	if(el && el.getAttribute('value') != null)
		el.value = newValue;
}

// hide element by id or ref
function $H(el)
{
	el = $(el);
	if(el)
		el.style.display = 'none';
}

// show element by id or ref
function $S(el, displayValue) // display value can be inline or block
{
	if(!displayValue)
		var displayValue = 'block';
	el = $(el);
	if(el)
		el.style.display = displayValue;
}

// disable an element by id or ref
function $D(el)
{
	el = $(el);
	if(el)
		el.disabled = true;	
}
// enable an element by id or ref
function $E(el)
{
	el = $(el);
	if(el)
		el.disabled = false;
}

// focus element by id or ref
function $F()
{
	if(arguments.length == 0)
		return;
	var el = $(arguments[0]);
	if(!el)
		return;
	
	if(el.tagName && el.tagName.toLowerCase() == 'form')
	{
		// form element, select first visible input
		var inputs = el.getElementsByTagName('INPUT');
		el = null;
		for(var i = 0; i < inputs.length; i++)
		{
			if(!inputs[i].disabled && inputs[i].getAttribute('type') != 'hidden')
			{
				el = inputs[i];
				break;
			}
		}
		if(!el)
			return;
	}

	el.focus();
	if(arguments.length < 1 || !arguments[1] && el.select) // 'select' boolean
		el.select();

}

// flash an element (set it's colour then, reset it)
function $FL(el, flashColor, origColor)
{
	el = $(el);
	if(!el)
		return;
	if(el.getAttribute('type') && el.getAttribute('type') == 'checkbox')
		el.checked = !el.checked;
	else
		el.style.backgroundColor = flashColor;
	setTimeout("_$F('" + el.getAttribute('id') + "', '" + origColor + "')", 150);
}
function _$FL(el, origColor)
{
	el = $(el);
	if(!el)
		return;
	if(el.getAttribute('type') && el.getAttribute('type') == 'checkbox')
		el.checked = !el.checked;
	else
		el.style.backgroundColor = origColor;
}

// get the user agent string, or if a parameter is supplied, check the user agent string for presence of the parameter
function $B()
{
	if(arguments.length == 0)
		return navigator.userAgent;
	return (navigator.userAgent.toLowerCase().indexOf(arguments[0].toLowerCase()) != -1);
}

// open a new window, with the url provided in the parameter element's href or src attribute
function $NW(el)
{
	el = $(el);
	if(!el)
		return false;
		
	if(el.href != null)
		window.open(el.href);
	else if(el.src)
		window.open(el.src);
	
	return false;
}

// redirect to a given url
function $R(url)
{
	document.location = url;
	return false;
}

// searches an element for a url, returning the current url on fail
function $EU(el)
{
	el = $(el);
	var url = document.location.href;
	if(el)
	{
		if(el.href)
			url = el.href;
		else if(el.src)
			url = el.src;
		else if(el.value)
			url = el.value;
	}
	return url;
}

/*
$SI:Show Info (Show informational Div)
	div: 		div id or element
	className:	one of '', 'important', 'success', 'warning', 'error'
	content:	what to put in the div
*/
function $SI(div, className, content)
{
	div = $(div);
	if(div)
	{
		div.innerHTML = content;
		div.className = trim('info ' + className);
		if(div.style.display = 'none')
			div.style.display = 'block';
	}
}

function $AI(el, newid, className, content)
{
	if($(newid))
	{
		// id exists - update it
		$SI(newid, className, content);
		return;
	}
	el = $(el);
	if(el)
	{
		var div = document.createElement('div');
		el.appendChild(div);
		div.id = newid;
		div.innerHTML = content;
		div.className = trim('info ' + className);
	}
}

function numberFormat(value, decimals, bThousands)
{
	if(!value.toFixed)
		return value;
	var s = String(value.toFixed(decimals));
	if(bThousands)
	{
		var r = /(\d)((\d\d\d)+\b)/;
		while(s.match(r))
			s = s.replace(r, '$1,$2');
	}	
	return s;
}

function flashDetect()
{
	if( navigator.plugins && navigator.mimeTypes.length )
	{
		var x = navigator.plugins["Shockwave Flash"];
		if( x && x.description )
			return true;
	}
	else if( window.ActiveXObject )
	{
		try 
		{
			var x = new ActiveXObject( "ShockwaveFlash.ShockwaveFlash" );
			return true;
		} catch(e) {}
	}
	return false;
}