
// ------------------------------
// Utilities
// ------------------------------

mouseX = 0;
mouseY = 0;
deltaX = 0;
deltaY = 0;
isMSIE = (navigator.appName.indexOf("Microsoft") >= 0);

function e(x)
{
	return document.getElementById(x);
}

function ipx(i)
{
	return i + "px";
}

function pxi(px)
{
	return parseInt(px.replace("px", ""));
}

function strip(s)
{
	var startix = 0;
	var endix	= s.length;

	for (var i = 0; i < s.length; i++)
	{
		if ((s[i] == ' ') || (s[i] == '\r') || (s[i] == '\n') || (s[i] == '\t'))
			startix = i + 1;
		else
			break;
	}

	for (var i = s.length-1; i >= 0; i--)
	{
		if ((s[i] == ' ') || (s[i] == '\r') || (s[i] == '\n') || (s[i] == '\t'))
			endix = i;
		else
			break;
	}

	if (startix <= endix)
		return s.substr(startix, endix);
	else
		return "";
}

function dec_to_hex(d, padding)
{
	var hex = Number(d).toString(16);

	if (padding == undefined)
		padding = 6;

	while (hex.length < padding)
		hex = "0" + hex;

	return hex;
}

function key_press(ev, valid_chars)
{
	if ((valid_chars == undefined) || (valid_chars == "") || (valid_chars == null))
	{
		return true;
	}

	if(window.event)	keynum = window.event.keyCode;		// IE
	else if(ev.which)	keynum = ev.charCode;					// Firefox
  	else					return true;

	key = String.fromCharCode(keynum);

	if ((valid_chars.indexOf(key) >= 0) || (keynum == 0))
		return true;
	else
		return false;
}

function abs_x(obj, sum)
{
	if (sum == undefined)	sum = obj.offsetLeft;
	else							sum += obj.offsetLeft;

	if (obj.parentNode != null) 
		if (obj.parentNode.offsetLeft != undefined)
			return abs_x(obj.parentNode, sum);

	return sum;
}

function abs_y(obj, sum)
{
	if (sum == undefined)	sum = obj.offsetTop;
	else							sum += obj.offsetTop;

	if (obj.parentNode != null) 
		if (obj.parentNode.offsetTop != undefined)
			return abs_y(obj.parentNode, sum);

	return sum;
}

function bring_to_front(obj, levels)
{
	if (obj.parentNode != null) 
	{
		if (obj.tagName.toLowerCase() == "body")
			return;

		if (levels != undefined)
			if (levels <= 0)	return;
			else					levels--;

		obj.parentNode.appendChild(obj);
		bring_to_front(obj.parentNode, levels);
	}
}

function hide(elem)
{
	elem.style.visibility	= "hidden";
}

function show(elem)
{
	elem.style.visibility	= "visible";
}

function hideBlock(elem)
{
	elem.style.display		= "none";
}

function showBlock(elem, w, h)
{
	elem.style.display		= "block";
	elem.style.visibility	= "visible";

	if (w != undefined)	elem.style.width	= ipx(w);
	if (h != undefined)	elem.style.height	= ipx(h);
}

function numeric_sort(a, b)
{
	if (parseInt(a) > parseInt(b)) 		return 1;
	else if (parseInt(a) < parseInt(b)) return -1;
	else											return 0;
}

function httpRequest(url, f)
{
	if (window.XMLHttpRequest)			x = new XMLHttpRequest();
	else if (window.ActiveXObject)	x = new ActiveXObject("Microsoft.XMLHTTP");
	else										return;

	x.onreadystatechange = function()
	{
		if ((x.readyState == 4) && (f != undefined))
		{
			f(x.responseText);
		}
	}

	x.open("GET", url, true);
	x.send();
}

function httpPost(url, params, f)
{
	if (window.XMLHttpRequest)			x = new XMLHttpRequest();
	else if (window.ActiveXObject)	x = new ActiveXObject("Microsoft.XMLHTTP");
	else										return;

	x.onreadystatechange = function()
	{
		if ((x.readyState == 4) && (f != undefined))
		{
			f(x.responseText);
		}
	}

	x.open("POST", url, true);
	x.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	//x.setRequestHeader("Content-length", params.length);
	//x.setRequestHeader("Connection", "close");
	x.send(params);
}

function check_email(em)
{
	// Check for one @ sign
	parts = em.split("@");
	if (parts.length != 2)
		return false;

	// Get the mailbox and domain
	box = parts[0];
	dom = parts[1];

	// Check for a legal mailbox 
	f = /^[a-zA-Z0-9]+(?:[\.\-_][a-zA-Z0-9]+)*[a-zA-Z0-9]+$/i
	if (! f.test(box))
		return false;

	// Check for a legal domain
	f = /^[a-zA-Z0-9]+(?:[\.\-_][a-zA-Z0-9]+)*[\.][a-zA-Z0-9]+$/i
	if (! f.test(dom))
		return false;

	// Default Return
	return true;
}

function get_cookie(key)
{
	if (document.cookie.length > 0)
	{
		var p1 = document.cookie.indexOf(key + "=");	
		var p2 = 0;

		if (p1 >= 0)
		{
			p1	= p1 + key.length + 1;
			p2	= document.cookie.indexOf(";", p1);

			if (p2 == -1)	p2 = document.cookie.length;

			return unescape(document.cookie.substring(p1, p2));
		}
	}

	return "";
}

function set_cookie(key, val, days, dompath)
{
	var expdays = (days != undefined) ? days : 365 * 100;
	var expdate = new Date();
	var path		= (dompath != undefined) ? dompath : "/";
	expdate.setDate(expdate.getDate() + expdays);
	document.cookie = key + "=" + escape(val) + ";expires=" + expdate.toGMTString() + ";path=" + path;
}

function get_widget(id)
{
	if (navigator.appName.indexOf("Microsoft") != -1)	return window[id];
	else																return document[id];
}

function set_sel_option(elem, val)
{
	for (var i = 0; i < elem.length; i++)
	{
		elem[i].selected = (elem[i].value == val);
	}
}

function debug(x, clear)
{
	if (clear != undefined)
		e("taDebug").value = x;
	else
		e("taDebug").value += x + "\n";
}

// http://www.netlobo.com/url_query_string_javascript.html
function get_query_params(name)
{
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results == null )
    return "";
  else
    return results[1];
}

function get_elements_by_class(cl) {
	var class_elements = [];
	var regex = new RegExp("(^|\\s)" + cl + "(\\s|$)");
	var elements = document.getElementsByTagName("*");
	for (var i=0, j=0; i < elements.length; i++) {
		if (regex.test(elements[i].className)) {
			class_elements[j] = elements[i];
		}
	}
	return class_elements;
}

function load_array(aa, bb)
{
	for (var i = 0; i < aa.length; i++)
	{
		if (i < bb.length)
		{
			if (aa[i] instanceof Array)
				load_array(aa[i], bb[i]);
			else
				aa[i] = bb[i];
		}
	}
}

function clear_sel_options(sel)
{
	while (sel.hasChildNodes())
		sel.removeChild(sel.firstChild);
}

function add_sel_option(sel, value, label, selected)
{
	var opt			= document.createElement('option');
	opt.innerHTML	= label;
	opt.value		= value; 
	opt.selected	= (selected != undefined) ? selected : false;
	sel.appendChild(opt);
}

function sum_widths(elems)
{
	var sum = 0;

	for (var i = 0; i < elems.length; i++)
	{
		if (elems[i])
		{
			if (elems[i].style.display)
			{
				if (elems[i].style.display != "none")
				{
					sum += (elems[i].style.width)					? pxi(elems[i].style.width)					: 0;
					sum += (elems[i].style.marginLeft)			? pxi(elems[i].style.marginLeft)				: 0;
					sum += (elems[i].style.marginRight)			? pxi(elems[i].style.marginRight)			: 0;
					sum += (elems[i].style.paddingLeft)			? pxi(elems[i].style.paddingLeft)			: 0;
					sum += (elems[i].style.paddingRight)		? pxi(elems[i].style.paddingRight)			: 0;
					sum += (elems[i].style.borderThickness)	? pxi(elems[i].style.borderThickness) * 2	: 0;
				}
			}
		}
	}

	return sum;

}

