// from http://www.crockford.com/javascript/remedial.html
function isFunction(a) { return typeof a == 'function'; }
function isObject(a) { return (a && typeof a == 'object') || isFunction(a); }	
function isArray(a) { return isObject(a) && a.constructor == Array; }


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 );
	}
}


function removeEvent( obj, type, fn ) {
	if ( obj.detachEvent ) {
		obj.detachEvent( 'on'+type, obj[type+fn] );
		obj[type+fn] = null;
	} else {
		obj.removeEventListener( type, fn, false );
	}
}


function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

function toggleDisplay(obj) {
	var el = document.getElementById(obj);
	if ( el.style.display != 'none' ) {
		el.style.display = 'none';
	}
	else {
		el.style.display = '';
	}
}

function insertAfter(parent, node, referenceNode) {
	parent.insertBefore(node, referenceNode.nextSibling);
}


Array.prototype.inArray = function (value) {
	var i;
	for (i=0; i < this.length; i++) {
		if (this[i] === value) {
			return true;
		}
	}
	return false;
};

function findKey(evt) {
	var e = (evt) ? evt : ((window.event) ? window.event : null);
	if (e.type == 'keydown') {
		var charCode = (e.charCode) ? e.charCode : e.keyCode;
		return charCode;
	}
	return null;
}

function getCookie( name ) {
	var start = document.cookie.indexOf( name + "=" );
	var len = start + name.length + 1;
	if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
		return null;
	}
	if ( start == -1 ) return null;
	var end = document.cookie.indexOf( ";", len );
	if ( end == -1 ) end = document.cookie.length;
	return unescape( document.cookie.substring( len, end ) );
}
	
function setCookie( name, value, expires, path, domain, secure ) {
	var today = new Date();
	today.setTime( today.getTime() );
	if ( expires ) {
		expires = expires * 1000 * 60 * 60 * 24;
	}
	var expires_date = new Date( today.getTime() + (expires) );
	document.cookie = name+"="+escape( value ) +
		( ( expires ) ? ";expires="+expires_date.toGMTString() : "" ) + //expires.toGMTString()
		( ( path ) ? ";path=" + path : "" ) +
		( ( domain ) ? ";domain=" + domain : "" ) +
		( ( secure ) ? ";secure" : "" );
}
	
function deleteCookie( name, path, domain ) {
	if ( getCookie( name ) ) document.cookie = name + "=" +
			( ( path ) ? ";path=" + path : "") +
			( ( domain ) ? ";domain=\"" + domain : "" ) +
			";expires=Thu, 01-Jan-1970 00:00:01 GMT";
}

function $() {
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof element == 'string')
			element = document.getElementById(element);
		if (arguments.length == 1)
			return element;
		elements.push(element);
	}
	return elements;
}

/*
function loadXMLDoc(url, funcProcess) {
	
	http_request = false;
    
    // branch for native XMLHttpRequest object
    if(window.XMLHttpRequest) {
    	try {
			http_request = new XMLHttpRequest();
        } catch(e) {
			http_request = false;
        }
    // branch for IE/Windows ActiveX version
    } else if(window.ActiveXObject) {
       	try {
        	http_request = new ActiveXObject("Msxml2.XMLHTTP");
      	} catch(e) {
        	try {
          		http_request = new ActiveXObject("Microsoft.XMLHTTP");
        	} catch(e) {
          		http_request = false;
        	}
		}
    }
	if(http_request) {
		http_request.onreadystatechange = funcProcess;
		http_request.open("GET", url, true);
		http_request.send(null);
	}
}


function makePOSTRequest(url, parameters, funcProcess) {

   req = false;
   
    // branch for native XMLHttpRequest object
    if(window.XMLHttpRequest) {
    	try {
			req = new XMLHttpRequest();
        } catch(e) {
			req = false;
        }
    // branch for IE/Windows ActiveX version
    } else if(window.ActiveXObject) {
       	try {
        	req = new ActiveXObject("Msxml2.XMLHTTP");
      	} catch(e) {
        	try {
          		req = new ActiveXObject("Microsoft.XMLHTTP");
        	} catch(e) {
          		req = false;
        	}
		}
    }   
    if (!req) {
      alert('Cannot create XMLHTTP instance');
      return false;
   }
   req.onreadystatechange = funcProcess;
   req.open('POST', url, true);
   req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
   req.setRequestHeader("Content-length", parameters.length);
   req.setRequestHeader("Connection", "close");
   req.send(parameters);
}
*/

function mailto(name, domain, subject) {
	var url = 'mailto: ' + escape(name) + '%40' + escape(domain);
	if (subject != null) url += '?subject=' + escape(subject);
	window.location = url;
}


function urlDecode(s) {
	return unescape(s.replace("+", " "));
}


function parseQueryString() {
	var obj = new Object();
	
	var nvpairs = location.search.substring(1).split("&");
	
	for (var idx = 0; idx < nvpairs.length; idx++) {
		var tokens = nvpairs[idx].split("=");
		obj[urlDecode(tokens[0])] = tokens.length == 2 ? urlDecode(tokens[1]) : undefined;
	}

	return obj;
}