String.prototype.trim = function (){
	return this.replace(/^\s+|\s+$/g,"");
}
function myce(name){
	return document.createElement(name);
}
function setManyAttributes(node,attstring){
	var st = attstring.split(" ");
	for(var ss in st){
		var t = st[ss].split("=")
		var att = t[0];
		var val = t[1]?t[1].replace(/\"/g,"").replace(/\'/g,""):" ";
		node.setAttribute(att,val);
	}	
}
function drawPoint(px,py){
	var page = document.getElementsByTagName("body")[0];
	var dp = this;
	this.ndiv = function(x,y){
		var d = document.createElement("Div");
		d.style.width = "1px";
		d.style.height = "1px";
		d.style.position = "absolute";
		d.style.top = y;
		d.style.left = x;
		d.style.backgroundColor = "red";
		d.style.lineHeight = "1px";
		d.style.fontSize = "1px";
		page.appendChild(d);
	}
	for(var y = (py - 3);y<=(py+3);y++){
		this.ndiv(px,y);
	}
	for(var x = (px - 3);x<=(px+3);x++){
		this.ndiv(x,py);
	}	
}
function arrayJoin(a,b){
	for(var x=0;x<b.length;x++){
		a.push(b[x]);
	}
	return a
}
function insertAfter(objAfterThis,objNode){
	var ns = objAfterThis.nextSibling;
	if(ns){
		ns.parentNode.insertBefore(objNode,ns);
	}else{
		objAfterThis.parentNode.appendchild(objNode);
	}
}
function und( val ) {
	return typeof(val) == 'undefined' || val == null;
}

function gid(id){
	return document.getElementById(id);
}

function myevent(evt){
	this.e = evt || window.event;
	this.type = this.e.type;
	this.target = (this.e.target) ? this.e.target : this.e.srcElement
	this.shiftKey = this.e.shiftKey;
    this.ctrlKey = this.e.ctrlKey;
    this.altKey = this.e.altKey;
	this.keyCode = this.e.keyCode || this.e.which || 0;
	this.enterKey = this.keyCode == 13 ? true : false;
	this.delKey = this.keyCode == 46 ? true : false;
	if(!this.shiftKey && this.keyCode > 64 && this.keyCode < 91){
		this.strKey=String.fromCharCode(this.keyCode + 32);		
	}else{
		this.strKey=String.fromCharCode(this.keyCode);
	} 
}

function ajaxreq(url,func,args,post,as){	
	this.req = new ajaxreq2();
	this.isas = true;
	if(as != null){this.isas = as;}
	if(post){
		this.req.open("POST", url, this.isas);
	}else{
		this.req.open("GET", url, this.isas); 
	}
	this.done = false;
	this.responseText = null;
	this.responseXML = null;
	this.success = false
	this.args = args;
	this.params = null;
	if(post){
		this.params = args;
		this.req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");    
		this.req.setRequestHeader("Content-length", this.params.length);
		this.req.setRequestHeader("Connection", "close");
	}
	var outer = this;
	if(!this.isas){
		if(typeof(func) == "string"){		
			location.href = url;	
		}else{
			this.req.send(this.params);	
		}
		if (this.req.status == 200) {
			this.responseText = this.req.responseText;
			this.responseXML = this.req.responseXML;
			this.success = true;
		}else{
			this.done = true;
			this.responseText = "failed";
			this.responseXML = "<xml>failed</xml>";
		}
	}else{
		this.req.onreadystatechange = function(){ 		
			if (outer.req.readyState == 4) {  
				if (outer.req.status == 200) {
					outer.responseText = outer.req.responseText;
					outer.responseXML = outer.req.responseXML;
					outer.success = true;
					func(outer);
				}else{
					outer.done = true;
					outer.responseText = "failed";
					outer.responseXML = "<xml>failed</xml>";
					func(outer);
				}
			 }
		};
		if(typeof(func) == "string"){		
		location.href = url;	
		}else{
			this.req.send(this.params);	
		}
	}	
}

function ajaxreq2() {
      var xmlhttp;
      try {
          // Mozilla / Safari / IE7
          xmlhttp = new XMLHttpRequest();
      } catch (e) {
           // IE
       var XMLHTTP_IDS = new Array('MSXML2.XMLHTTP.5.0',
                                       'MSXML2.XMLHTTP.4.0',
                                       'MSXML2.XMLHTTP.3.0',
                                       'MSXML2.XMLHTTP',
                                       'Microsoft.XMLHTTP' );
        var success = false;
        for (var i=0;i < XMLHTTP_IDS.length && !success; i++) {
             try {
                  xmlhttp = new ActiveXObject(XMLHTTP_IDS[i]);
                      success = true;
             } catch (e) {}
        }
        if (!success) {
            throw new Error('Unable to create XMLHttpRequest.');
        }
     }
     return xmlhttp;
}
function getElementsByClassName(oElm, strTagName, oClassNames){
	var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	var arrRegExpClassNames = new Array();
	if(typeof oClassNames == "object"){
		for(var i=0; i<oClassNames.length; i++){
			arrRegExpClassNames.push(new RegExp("(^|\s)" + oClassNames[i].replace(/-/g, "\-") + "(\s|$)"));
		}
	}
	else{
		arrRegExpClassNames.push(new RegExp("(^|\s)" + oClassNames.replace(/-/g, "\-") + "(\s|$)"));
	}
	var oElement;
	var bMatchesAll;
	for(var j=0; j<arrElements.length; j++){
		oElement = arrElements[j];
		bMatchesAll = false;
		for(var k=0; k<arrRegExpClassNames.length; k++){
			var classname = oElement.className.split(" ");
			for(q=0;q<classname.length;q++){
				if(arrRegExpClassNames[k].test(classname[q])){
					//alert(arrRegExpClassNames[k]+" | "+classname[q]);
					bMatchesAll = true;
					break;
				}
			}
		}
		if(bMatchesAll){
			arrReturnElements.push(oElement);
		}
	}
	return (arrReturnElements)
}

function getInnerText(node){
	var n = node.childNodes;
	var st = "";
		for(var x=0;x<n.length;x++){
			st += n[x].nodeValue.trim();
		}
	return st;
}
function serializeXMLNode(xmlNode) {
  var text = false;
  try {
    // Gecko-based browsers, Safari, Opera.
    var serializer = new XMLSerializer();
    text = serializer.serializeToString(xmlNode);

  }
  catch (e) {
    try {
      // Internet Explorer.
      text = xmlNode.xml;
    }
    catch (e) {}
  }
  return text;
}
//==========================functions used solely with server side sqlhelper

function testsql(sql){
	var sqltest = new ajaxreq("sqltojsonstring.jsp?query="+encodeURI(sql),sqltestresult);
}
function sqltestresult(req){
	eval("var result = " + req.responseText);
	var st = "";
	for(var x=0;x<result.headers.length;x++){
		st += result.headers[x]+ " | ";
	}
	st += "\n      Returned "+result.numRows+" Rows\n";
	//st += "\n";
	for(var x=0;x<result.numRows;x++){
		for(var y=0;y<result.headers.length;y++){
			st += result.rows[x][result.headers[y]].trim()+ " | ";
		}
		st +="\n";
	}
	alert(st);
}

function jsTimer(){
	this.time = new Array();
	this.starttime = null;
	this.stoptime = null;
	this.diff = null;
	
	var jt = this;
	this.clear = function(){
		jt.time = new Array;
	}
	this.start = function(){
		jt.starttime = new Date();
	}
	this.stop = function(){
		jt.stoptime = new Date();
		jt.time.push (jt.stoptime - jt.starttime)
	}
	this.lap = function(){
		jt.stoptime = new Date();
		jt.time.push (jt.stoptime - jt.starttime)
		jt.starttime = new Date();		
	}
	this.getTime = function(lap){
		if(!lap){lap = jt.time.length;}
		return jt.time[lap - 1];
	}
	this.clear = function(){jt.time = new Array();}
}


function addEvent(obj, evType, fn){ 
 if (obj.addEventListener){ 
   obj.addEventListener(evType, fn, false); 
   return true; 
 } else if (obj.attachEvent){ 
   var r = obj.attachEvent("on"+evType, fn); 
   return r; 
 } else { 
   return false; 
 } 
}
function addClass(/*DOMNode*/ node, /*String*/ classStr) {
	var classes = node.className;
	if (classes.lastIndexOf(classStr) >= 0) {
		//Already has this class. Don't add it again.
		return false;
	} 
	classes = (classes + " " + classStr).replace(/^\s+|\s+$/g,"");
	node.className = classes;
	return true;
}
function removeClass(/*DOMNode*/ node, /*String*/ classStr) {
	var classes = node.className;
	classes = classes.replace(classStr, "");
	node.className = classes;
}
function hasClass(ele,name){
	if(ele.className.lastIndexOf(name) > -1){
		return true;
	}else{
		return false;
	}
}
function getPreviousNode(n){
	if(n.previousSibling){
		var p = n.previousSibling
		if(p.nodeType == 1){
			return p;
		}else{
			return getPreviousNode(p);
		}
	}else{
		return false;
	}	
}
function getNextNode(n){
	if(n.nextSibling){
		var p = n.nextSibling
		if(p.nodeType == 1){
			return p;
		}else{
			return getNextNode(p);
		}
	}else{
		return false;
	}	
}
function getChildElements(ele){
	var a = ele.childNodes;
	var b = new Array();
	var e = ele.firstChild;
	while(e){
			if(e.nodeType ==1){
				b.push(e)
			}
			e = e.nextSibling;
		//}while(e)
	}
	if(b.length == 0){return false;}else{return b;}
}
	
