String.prototype.trim = function (){
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.startsWith = function(str)
{return (this.match("^"+str)==str)}
function getBody(){
	return document.getElementsByTagName("body")[0];
}
_UniqueValue = new function(){
	var self = this;
	this.val = 0;
	this.getVal = function(){
		self.val++
		if(self.val > 10000000){self.val = 0;}
		return self.val;
	}
}
String.prototype.fixMSSql = function(){
	return this.replace(/'/g,"''")
}
Number.prototype.round = function(dec) {
	return Math.round(this*Math.pow(10,dec))/Math.pow(10,dec);
}
function myce(name){
	return document.createElement(name);
}
function newOpt(val,text,boolsel,id){
	var opt = new Option(text,val,boolsel);
	if(id){opt.id=id;}
	return opt
}
function setOpacity(testObj,value) {
	testObj.style.opacity = value/100;
	testObj.style.filter = 'alpha(opacity=' + value + ')';
}

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;
	var self = this;
	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);
	} 
	this.cancelBubble = function(){
		self.e.cancelBubble = true;
			if (self.e.stopPropagation) {
				self.e.stopPropagation();
				self.e.preventDefault();
			}
	}
	
	
}

function ajaxreq(url,func,args,post,as){
	var outer = this;	
	this.req = new ajaxreq2();
	this.rf = func;
	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 = this.args;
		this.req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");    
		this.req.setRequestHeader("Content-length", this.params.length);
		this.req.setRequestHeader("Connection", "close");
	}
	
	if(!this.isas){
		if(typeof(this.rf) == "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;
					outer.rf(outer);
				}else{
					outer.done = true;
					outer.responseText = "failed";
					outer.responseXML = "<xml>failed</xml>";
					outer.rf(outer);
				}
			 }
		};
		if(typeof(this.rf) == "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 getxmldocument(text){
	var returnval = true;
	this.checkForParseError = function(text) {
	    var errorNamespace ="http://www.mozilla.org/newlayout/xml/parsererror.xml";
	    var documentElement = text.documentElement;
	    var parseError = { errorCode : 0 };
	    if (documentElement.nodeName == 'parsererror' &&
	        documentElement.namespaceURI == errorNamespace) {
			parseError.errorCode = 1;
	     	var sourceText = documentElement.getElementsByTagNameNS(errorNamespace, 'sourcetext')[0];
	      	if (sourceText != null) {
	        	parseError.srcText = sourceText.firstChild.data
	      	}
	      	parseError.reason = documentElement.firstChild.data;
	    }
	    return parseError;
	}
	if (window.ActiveXObject){
		var doc=new ActiveXObject("Microsoft.XMLDOM");
		doc.async="false";
	  	doc.loadXML(text);
	  	if (doc.parseError.errorCode != '0'){
	  		message = doc.parseError.reason + "\n" + doc.parseError.srcText;
	  		alert(message);
			return false;		
		}else{
			//xmldocument = doc;
			return doc
			doc = null;
		}
	}
// code for Mozilla, Firefox, Opera, etc.
	else{
  		var parser=new DOMParser();
 		var doc=parser.parseFromString(text,"text/xml");
 		parseError = this.checkForParseError(doc);
  		if (parseError.errorCode == 0) {
			//xmldocument = doc;
			return doc;
			doc = null;
  		}else {
    		alert(parseError.reason + '\r\n' + parseError.srcText);
    		return false;
  		}
  	}	
	//return returnval;
}
function serializeNode(indoc){	  		
	  var text = "";
	  try {
	    var serializer = new XMLSerializer();
	    text = serializer.serializeToString(indoc);		
	  }
	  catch (e) {
	    try {
	      text = indoc.xml;
	    }
	    catch (e) {}
	  }
	  return text;			
}
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;}
}
function fade(node){
	var self = this;
	this.node = node;
	this.b = myce("div");
	this.b.style.width = node.scrollWidth;
	this.b.style.height = node.scrollHeight;
	this.b.style.position = "absolute";
	this.b.style.top = node.offsetTop;
	this.b.style.left = node.offsetLeft;
	setOpacity(this.b,65);
	this.b.style.display = "block";
	this.block = function(str){
		this.m = null;	
		self.node.appendChild(self.b);
		this.b.style.backgroundColor = "#ffffff";
		if(!und(str)){
			this.m = myce("div");
			this.m.style.width = 200;
			this.m.style.fontWeight = "bold";
			this.m.style.backgroundColor = "#FFFFFF";
			this.m.style.textAlign = "center";
			this.m.style.height = 40;
			this.m.style.paddingTop = "5px";
			this.m.style.position = "absolute";
			this.m.style.color = "#000000";
			this.m.appendChild(document.createTextNode(str))
			this.m.style.border = "1px solid black";
			this.m.style.top = self.node.offsetHeight/2 - 20
			this.m.style.left = self.node.offsetWidth/2 - 100
			self.node.appendChild(this.m);
		}
	}
	this.unblock = function(){
		self.b.parentNode.removeChild(self.b);
		try{
			self.node.removeChild(self.m);
		}catch(e){}
		this.b.style.backgroundColor = "transparent";
	}
}	
function getInputs(pNode){
	var GI = this;
	this.values = new Array();	
	this.values.getValue = function(strname){
		var ret = null;
		for(var x=0;x<GI.values.length;x++){
			if(GI.values[x].name == strname){
				ret =  GI.values[x].value
				break;
			}
		}
		return ret;
	}
	this.values.get = function(strname){
		var ret = null;
		for(var x=0;x<GI.values.length;x++){
			if(GI.values[x].name == strname){
				ret =  GI.values[x];
				break;
			}
		}
		return ret;
	}
	this.values.jsonString = function(){
		var js ="{";
		for(var x=0;x<GI.values.length;x++){
			if(GI.values[x].name == 'test'){
				alert(" test tostring: "+GI.values[x].value);
			}
			js +="\""+GI.values[x].name+"\":\""+escapeJsonString(GI.values[x].value)+"\","
		}
		return js.substring(0,js.length - 1)+"}";
	}
	this.values.add = function(obj){
		if(typeof(obj) == "object"){
			for(var p in obj){
				GI.values.push(new nvpair(p,obj[p],null));
			}
		}
	}
	this.values.json = function(){
		var j = new function(){};
		for(var x=0;x<GI.values.length;x++){
			j[GI.values[x].name]= escapeJsonString(GI.values[x].value);
		}
		return j;
	}
	this.values.getParamString = function(){
		var s = "";
		for(var x=0;x<GI.values.length;x++){
			s+= GI.values[x].name+"="+encodeURIComponent(GI.values[x].value)+"&";
		}
		s = s.substring(0,s.length - 1);
		return s;
	}
	this.nvpair = function(inname,value,node){
		this.name = inname;
		this.value = value;
		this.node = node;
	}
	this.values.hasName = function(inname){
		var ret = false;
		for(var x=0;x<GI.values.length;x++){
			if(GI.values[x].name == inname){
				ret =  true
				break;
			}
		}
		return ret;
	}
	var i = pNode.getElementsByTagName("input");
	var n = null;
	for(var x=0; x<i.length;x++){
		var tmp = i[x].name;
		if(tmp == ""){
			tmp = i[x].id;
		}
		if(i[x].type != "button" && !this.values.hasName(i[x].name)){
			
			this.values.push(new this.nvpair(tmp,getVal(i[x]),i[x]))
		}
		n = i[x].name;
	}
	var i = pNode.getElementsByTagName("textarea");
	for(var x=0; x<i.length;x++){
		var tmp = i[x].name;
		if(tmp == ""){
			tmp = i[x].id;
		}		
		this.values.push(new this.nvpair(tmp,i[x].value.trim(),i[x]))		
	}
	var i = pNode.getElementsByTagName("select");
	for(var x=0; x<i.length;x++){
		var tmp = i[x].name;
		if(tmp == ""){
			tmp = i[x].id;
		}		
		this.values.push(new this.nvpair(tmp,getVal(i[x]),i[x]))
	}
	return this.values;
}

function getVal(input){	
	if(input.type.toLowerCase() == "radio"){
		var myname = input.name;
		var allbtns = document.getElementsByName(myname);
		var value = "";
		for(var x=0;x<allbtns.length;x++){
			if(allbtns[x].checked){
				value =  allbtns[x].value;
			}
		}
		return value;
	}else if(input.type.toLowerCase() == "text" || 
				input.type.toLowerCase() == "hidden" || 
				input.type.toLowerCase() == "password"){
		return input.value.trim();
	}else if(input.type.toLowerCase() == "select-one"){
		return input.options[input.selectedIndex].value;
	}else if(input.type.toLowerCase() == "select-multiple"){
		var rv = "";
		for(var x=0;x<input.options.length;x++){
			if(input.options[x].selected){
				rv += input.options[x].value+",";
			}
		}
		return rv.substring(0,rv.length - 1);
	}else if(input.type.toLowerCase() == "checkbox"){
		return input.checked;
	}
}
function getTop(inputObj){
  var returnValue = inputObj.offsetTop
  while((inputObj = inputObj.offsetParent) != null)returnValue += inputObj.offsetTop;
  return returnValue;
}

function getLeft(inputObj){
  var returnValue = inputObj.offsetLeft;
  while((inputObj = inputObj.offsetParent) != null)returnValue += inputObj.offsetLeft;
  return returnValue;
}	
function escapeJsonString(value) {
	if(typeof(value) == "string" && !und(value)){
		value = value.replace(/\"/g,"\\\"");
		return value;
	}else if(typeof(value) == "boolean"){
		return value;
	}else if(typeof(value) == "number"){
		return value;		
	}else{
		return null;
	}
} 

_json = ({
	serialize : function(o) {var i,v,s=_json.serialize,t;if(o==null)
	return 'null';t=typeof o;if(t=='string'){v='\bb\tt\nn\ff\rr\""\'\'\\\\';
	return '"'+o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'])/g,function(a,b){i=v.indexOf(b);if(i+1)
	return '\\' + v.charAt(i + 1);a = b.charCodeAt().toString(16);return '\\u'+'0000'.substring(a.length)+a;
	})+'"';}if(t=='object'){if(o instanceof Array){
	for (i=0,v='['; i<o.length;i++)v+=(i>0?',':'')+s(o[i]);returnv+']';}v='{';
	for (i in o)v+=typeof o[i]!='function'?(v.length>1?',"':'"')+i+'":'+s(o[i]):'';return v+'}';}return ''+o;}
})