function $(id){
	return document.getElementById(id);
}

function getBrowser(){
	var browser = "unknown";
	var agent = navigator.userAgent.toLowerCase();
	var possibles = new Array('safari','msie','firefox','netscape','omniweb','avantbrowser','msn','konqueror','camino');
	for(var i=0;i<possibles.length;i++){
		if(agent.indexOf(possibles[i]) > -1){
			browser = possibles[i];
			break;
		}
	}
	return browser;
}
function newEl(el,attrs,styles){
	if(el.toUpperCase() == "TEXT"){
		var el = document.createTextNode(attrs);
	} else{
		var el = document.createElement(el);
		if(attrs){
			for(attr in attrs){
				if(attr == "class"){ 
					el.className = attrs[attr]
				}else{
					if(attr == "type" && (el.nodeName == "INPUT" || el.nodeName == "BUTTON" || el.nodeName == "SELECT")){
						// I HATE INTERNET EXPLORER!!!!!!!!!!!!!!!!!!!!!!!!!!
						var k = document.createElement('div');
						k.innerHTML = "<"+el.nodeName+" type='"+attrs[attr]+"'>";
						el = k.firstChild;
					} else{
						el.setAttribute(attr,attrs[attr]);
						el[attr] = attrs[attr]; 
					}
				}
			}
		}
		if(styles) setStyle(el,styles);
	}
	return el;	
}
function insertAfter(new_el,after_el){
	if(after_el.nextSibling) after_el.parentNode.insertBefore(new_el,after_el.nextSibling);
	else after_el.parentNode.appendChild(new_el);
}
function addEvent( obj, type, fn ) {
  if ( obj.attachEvent ) {
    obj['e'+type+fn] = fn;
    obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
    obj.attachEvent( 'on'+type, obj[type+fn] );
  } else
	obj.addEventListener( type, fn, false );
  return {'obj':obj,'type':type,'fn':fn};
}
function removeEvent( obj, type, fn ) {
	if(obj){
		if(obj.obj){
			removeEvent(obj.obj,obj.type,obj.fn);
			delete obj;
			return;	
		} else{
		  if ( obj.detachEvent ) {
			obj.detachEvent( 'on'+type, obj[type+fn] );
			obj[type+fn] = null;
		  } else
			obj.removeEventListener( type, fn, false );
		}
	}
}
function parentForm(el){
	var parent;
	while(parent = el.parentNode){
		if(parent.nodeName == "FORM") return parent;
		el = parent;
	}
	return false;
}
function loadJS(url){
	var scripts = document.getElementsByTagName("head")[0].getElementsByTagName("script");
	for(var i=0;i<scripts.length;i++) if(scripts[i].name == url) return;
	var e = document.createElement("script");
	e.name = url;
	e.src = url;
	e.type="text/javascript";
	document.getElementsByTagName("head")[0].appendChild(e); 
}
function loadCSS(url){
	var css = document.getElementsByTagName("head")[0].getElementsByTagName("link");
	for(var i=0;i<css.length;i++) if(css[i].name == url) return;
	var e = document.createElement('link');
	e.name = url;
	e.setAttribute('rel','stylesheet');
	e.setAttribute('type','text/css');
	e.setAttribute('href',url);
	document.getElementsByTagName("head")[0].appendChild(e); 
}
function setStyle(obj,styles){
	for(style in styles){
		if(obj.style[style] != 'undefined') obj.style[style] = styles[style];
	}
}
String.prototype.trim = function() {
    return this.replace( /^\s+|\s+$/, "" );
}
Array.prototype.inArray = function(a){
	for(var i=0;i<=this.length;i++)
		if(this[i] == a) return i;
	return -1;
}
Array.prototype.pushOnce = function(){
	for(var i=0,value;value=arguments[i];i++)if(this.inArray(value) == -1) return this.push(value);
}
Array.prototype.remove=function(s){
	var l = this.length;
	for(i=0;i<l;i++) if(s==this[i]) this.splice(i, 1);
	return (l==this.length) ? false : true;
}

function hasClassName(el,className){
	var classRegexp = new RegExp("( |^)"+className+"( |$)", "i");
	return classRegexp.test(el.className);
}
function addClassName (el, className) {
    if(!hasClassName(el,className)) el.className = (el.className + " " + className).trim();
}
function removeClassName (el, className) {
	var classRegexp = new RegExp("( |^)"+className+"( |$)", "i");
    el.className = el.className.replace(classRegexp, "$1");
}
function toggleClassName(el, className){
	if(hasClassName(el, className)){ removeClassName(el, className); return false;}
	else{ addClassName(el, className); return true;}
}

function getElementsByClassName(className, tags, elm){
	var returnElements = [];
	var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
	tags = !(tags instanceof Array) ? (tags ? [tags] : "*") : tags;
	var elm = elm || document;
	var tag;
	var current;
	var elements;
	for(var i=0;tag=tags[i];i++){
		elements = (tag == "*" && elm.all) ? elm.all : elm.getElementsByTagName(tag);
		for(var p=0; current = elements[p]; p++){
			if(testClass.test(current.className)){
				returnElements.push(current);
			}
		}
	}
	return returnElements;
}
function getStyle(el,style){
	return el.currentStyle ? el.currentStyle[style] : (window.getComputedStyle ? document.defaultView.getComputedStyle(el,null).getPropertyValue(style) : false);
}
function makeDraggable(el){
	addEvent(el,'mousedown',function(event){
		var mi = getMouse(event);
		var pi = {'x':parseInt(el.style.left),'y':parseInt(el.style.top)}
		var move_event = addEvent(document,'mousemove',function(event){
			var m = getMouse(event);
			el.style.top = (pi.y + m.y - mi.y)+'px';
			el.style.left = (pi.x + m.x - mi.x)+'px';
		});
		addEvent(document,'mouseup',function(){
			removeEvent(move_event);
		});
	});
}
function absPos(el){
	var pos = {"x":el.offsetLeft,"y":el.offsetTop,"width":el.offsetWidth,"height":el.offsetHeight};
	while(el && el.offsetParent){
		while (el.parentNode!=el.offsetParent && (el.parentNode.scrollLeft || el.parentNode.scrollTop)) {
			el=el.parentNode;
			pos['x'] -= el.scrollLeft ? el.scrollLeft : 0;
			pos['y'] -= el.scrollTop ? el.scrollTop : 0;
		}
		pos['x'] += el.offsetParent.offsetLeft;
		pos['y'] += el.offsetParent.offsetTop;
		el = el.offsetParent;
	}
	pos['n'] = pos['y'];
	pos['w'] = pos['x'];
	pos['s'] = pos['y']+pos['height'];
	pos['e'] = pos['x']+pos['width'];
	return pos;
}
function getMouse(e){
	return (e && e.pageX) ? {"x":e.pageX, "y":e.pageY} : {"x":event.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft), "y":event.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop)};
}
function enableSelections(node){
	if (typeof node.style.userSelect == "string")			node.style.userSelect = "";
	if (typeof node.style.MozUserSelect == "string")	node.style.MozUserSelect = "";
	if(typeof node.onselectstart != "undefined")			node.onselectstart = false;
}
function disableSelections(node){
	if (typeof node.style.userSelect == "string")			node.style.userSelect = "none";
	if (typeof node.style.MozUserSelect == "string")	node.style.MozUserSelect = "none";
	if(typeof node.onselectstart != "undefined")			node.onselectstart = function(){return false;}
}
function appendChildren(parent,els){
	for(var i=0,el;i<els.length;i++){if(els[i]) parent.appendChild(els[i]);}
	return parent;
}
function removeChildren(el){
	while(el.hasChildNodes()) el.removeChild(el.firstChild);
}
String.prototype.capFirst = function(){
	return this.substr(0,1).toUpperCase()+this.substr(1);
}
var setContents = function(parent,el){
	removeChildren(parent);
	parent.appendChild(el);
}
var addOnBlur = function(el,action){
	var action_event;
	action_event = addEvent(document,'mousedown',function(){
		action();
		removeEvent(action_event);
	});
	addEvent(el,'mousedown',function(event){
		event.cancelBubble = true;
		if(event.stopPropagation) event.stopPropagation();
	});
	return action_event;
}
Array.prototype.quickSort = function(compare,left,right){
	left = typeof(left) != 'undefined' ? left : 0;
	right = typeof(right) != 'undefined' ? right : this.length-1;
	var pivot;
	var l_hold;
	var r_hold;
	l_hold = left;
	r_hold = right;
	pivot = this[left];
	while( left < right ) {
		while ( compare(this[right],pivot) && (left < right))
			right--;
		if(left != right) {
			this[left] = this[right];
			left++;
		}
		while (compare(pivot,this[left]) && (left < right))
			left++;
		if(left != right) {
			this[right] = this[left];
			right--;
		}
	}
	this[left] = pivot;
	
	pivot = left;
	left = l_hold
	right = r_hold;

	if( left < pivot )
		this.quickSort(compare,left, pivot-1);
	if( right > pivot )
		this.quickSort(compare,pivot+1, right);
}
function isLetter(val){
	var charCode = (val.which) ? val.which : val.keyCode;
	if(charCode != undefined){
		if(charCode) val = String.fromCharCode(charCode);
		else return true;
	}
	return val.trim() ? (val.toString().search(/^[a-zA-Z]+$/) == 0) : true;
}
function isInt(val){
	if(val){
		var charCode = (val.which) ? val.which : val.keyCode;
		if(charCode != undefined){
			if(charCode == 8 || charCode == 46) return true; // DELETE KEY
			if(charCode) val = String.fromCharCode(charCode);
			else return true;
		}
		return val.trim() ? (val.toString().search(/^[0-9-]+$/) == 0) : true;
	}
}
function isNumeric(val) {
	var charCode = (val.which) ? val.which : val.keyCode;
		
	if(charCode != undefined){
		if(charCode == 8 || charCode == 46) return true; // DELETE KEY
		if(charCode) val = String.fromCharCode(charCode);
		else return true;
	}
	return (val.toString().search(/^-?[0-9\.]+$/) == 0);
}

function gotoNext(size_chk,cur_id,next_id) {
	if ((document.getElementById(cur_id).value).length == size_chk) {
		document.getElementById(next_id).focus();
	}
}

function substr_count(haystack,needle,offset,length) {
	var pos = 0, cnt = 0;
	if (isNaN(offset)) offset = 0;
	if (isNaN(length)) length = 0;
	offset--;
	while((offset = haystack.indexOf(needle, offset+1)) != -1) {
		if (length > 0 && (offset+needle.length) > length) {
			return false;
		} else {
			cnt++;
		}
	}		
	return cnt;
}


function getURLParam(strParamName) {
	var found = false;
	var strReturn = "";
	
	if (substr_count(window.location.href,"#") > 0) { var href = window.location.href.split("#")[0]; } else { var href = window.location.href; }
	
	if (href.indexOf("?") > -1 ) {
		var strQueryString = href.substr(href.indexOf("?") + 1);
		var aQueryString = strQueryString.split("&");
		
		for (var iParam = 0; iParam < aQueryString.length; iParam++ ) {
			var paramParts = aQueryString[iParam].split("=");
			
			if (paramParts[0] == strParamName) {
				strReturn = paramParts[1];
				found = true;
			}
		}
	}
	
	if (found == true) {
		return unescape(strReturn);
	} else {
		return false;
	}
}

function urlParamExists(strParamName) {
	var found = false;
	
	if (substr_count(window.location.href,"#") > 0) { var href = window.location.href.split("#")[0]; } else { var href = window.location.href; }
	
	if (href.indexOf("?") > -1 ) {
		var strQueryString = href.substr(href.indexOf("?") + 1);
		var aQueryString = strQueryString.split("&");
		
		for (var iParam = 0; iParam < aQueryString.length; iParam++ ) {
			var paramParts = aQueryString[iParam].split("=");
			if (paramParts[0] == strParamName) { found = true; }
		}
	}
	
	if (found == true) {
		return true;
	} else {
		return false;
	}
}

function arrayKey(needle,haystack,strict) {
    var found = -1, key, strict = !!strict;
 
    for (key in haystack) {
        if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
            found = key;
            break;
        }
    }
 
    return found;
}
function setCheckboxParent(checkbox,parent){
	for(var i=0,els=parent.getElementsByTagName('INPUT'),el;el=els[i];i++){
		if(el.type == 'checkbox'){
			el.onclick = function(){
				if(this.checked == true){
					checkbox.checked=true;
				} else{
					for(var j=0,checked=false,els2=parent.getElementsByTagName('INPUT'),el2;el2=els2[j];j++) if(el2.checked) checked=true;						
					if(!checked) checkbox.checked = false;
				}
			}
		}
	}
}
function checkAll(parent){
	for(var i=0,els=parent.getElementsByTagName('INPUT'),el;el=els[i];i++){
		if(el.type == 'checkbox') el.checked  = true;
	}
}
function uncheckAll(parent){
	for(var i=0,els=parent.getElementsByTagName('INPUT'),el;el=els[i];i++){
		if(el.type == 'checkbox') el.checked  = false;
	}
}
function checkDefault(parent){
	for(var i=0,els=parent.getElementsByTagName('INPUT'),el;el=els[i];i++){
		el.checked  = (el.type == 'checkbox' && el.getAttribute('default') != null)  ? true : false;
	}
}

function setFormValue(el, value){
	if(el.options){
		for(var i=0, opt; opt=el.options[i]; i++) 
			if(opt.value == value) el.selectedIndex=i;
	} else if(el.length){
		for(var i=0;i<el.length;i++) if(el[i].value == value) el[i].checked = true;
	} else{
		el.value = value;
	}
}
function getFormValue(el){
	if(el.length){
		for(var i=0;i<el.length;i++) if(el[i].checked) return el[i].value;
		if(typeof el.selectedIndex != "undefined") return el.options[el.selectedIndex].value;
	} else{
		if(el.checked == undefined || el.checked) return el.value;
	}
}

function radioValue(el){
	for(var i=0;i<el.length;i++) if(el[i].checked) return el[i].value;
}
function getParentWithClass(el, className){
	while(el.parentNode && !hasClassName(el.parentNode, className) && (el.nodeName != "BODY" || el.nodeName != "HTML"))
		el = el.parentNode;
	if(el && el.parentNode && hasClassName(el.parentNode, className)) return el.parentNode;
}
function getParentWithTag(el, tag_name){
	while(el.parentNode && el.parentNode.nodeName != tag_name.toUpperCase())
		el = el.parentNode;
	if(el && el.parentNode && el.parentNode.nodeName == tag_name.toUpperCase()) return el.parentNode;
}




