//http://www.faqts.com/knowledge_base/view.phtml/aid/17226

/****** INIT APPLICATION VARIABLES ***********************/
var marker;
var map;
var customerHttp = getHTTPObject();
var requestHttp = getHTTPObject();
var zipHttp = getHTTPObject();
var geoHttp = getHTTPObject();
var customerBusy = false;
var requestBusy = false;
var geoBusy = false;
var lastFocused = '';
var tdprevobj1 = new Object();
var tdprevobj2 = new Object();
var i=0;
var display_div = '';
var qryfld = '';
var rows_aff = 0;
var frm_name; // assigned value in uR, pT() and referred in updateDBchange().


/****************************************************************************************************************/
/***************************** Create xmlhttp object based on browsertype ***************************************/
function getHTTPObject() {
  var xmlhttp;
  /*@cc_on
  @if (@_jscript_version >= 5)
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
        xmlhttp = false;
      }
    }
  @else
  xmlhttp = false;
  @end @*/
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    try {
      xmlhttp = new XMLHttpRequest();
      xmlhttp.overrideMimeType("text/xml"); 
    } catch (e) {
      xmlhttp = false;
    }
  }
  return xmlhttp;
}

/******* APPLICATION FUNCTIONS  *******************************************************************************/
function getData(event,qstr) {
	if (!event.target && event.srcElement) {
		event.target = event.srcElement
	}
	qryfld=event.target;

	if (event.keyCode == 27) {
		//hideDiv();
		return;
	}

	//alert (event.keyCode);
	//qryfld.onblur = hideDiv;
	qryfld.onkeydown = keypressHandler;

	// Only get data when alphanumeric key is pressed
	if ( (event.keyCode >= 48 && event.keyCode <= 57) ||	// 0-9 on top row keyboard
	     (event.keyCode >= 60 && event.keyCode <= 105)||	// Alphanumeric and keypad
	     (event.keyCode == 8 || event.keyCode == 46) ) {	// Backspace and delete
		display_div = document.getElementById('popupDiv');
		getItems(qstr);
	}
}

function getItems(qstr) {
	if (!customerBusy) {
		var url;

		if (qstr) { //for backward compatibility
			url = "/htdocs/getTD.php?"+qstr;
		} else {
			var itemName = document.getElementById('item_name').value;
			url = "/htdocs/getTD.php?arg1=1&iN="+itemName;
		}
		//alert(url);	
		//document.getElementById('notes').value = url;	
		customerHttp.open("GET", url, true);
		customerHttp.onreadystatechange = customersResponse1;
		customerBusy = true;
		customerHttp.send(null);
	}
}

function updateIns() {
	year1 = document.getElementById('year').value;
	mnth1 = document.getElementById('month').value;
	jsmnth= mnth1-1;	//Javascript uses 0-11 for Jan-Dec.
	date1 = document.getElementById('day_nr').value;

	start_time = document.getElementById('start_time').value;
	hr_min = start_time.split(':');
	hour1 = hr_min[0];
	minu1 = hr_min[1];
	var js_appnt_date = new Date(year1,jsmnth,date1,hour1,minu1,0)
	var appnt_date = js_appnt_date.getTime()/1000.0;	//Converting to unixtime.

	var patient_id = "'" + document.getElementById('patient_id').value + "'";
	var firstName = "'" + document.getElementById('firstName').value + "'";
	var lastName = "'" + document.getElementById('lastName').value + "'";
	var phone = "'" + document.getElementById('phone1').value + "'";
	var email = "'" + document.getElementById('email').value + "'";

	if (patient_id == "''") {
		var url = '/stmed/htdocs/tran.php?arg1=1&arg2=2&id=NULL&first_name=' + firstName + '&last_name=' + lastName + '&phone1=' + phone + '&email=' + email;
		fld = document.getElementById('patient_id');
		updateDB(fld,url);
		//document.getElementById('reason').value = url;
		//alert(url);

	}

	var ul = '&appnt_date='+appnt_date;
	uR('appnt_form1',ul);
}


function uR(f,ul) { //uR-UpdateRecord, f-form_name
	frm_name = f; //global scope, if not prefixed with var. Anyway it is defined at the top
	var fn = document.getElementById(f);
	var iN = fn.getElementsByTagName("input");
	var te = fn.getElementsByTagName("textarea");
	var se = fn.getElementsByTagName("select");

	var ni = iN.length; //ni,nt.ns numInputs, numTextarea, numSelects, 
	var nt = te.length;
	var ns = se.length;

	var sl='';

	for ( i=0; i < ni; i++ )
	{
		var c = iN[i];
		if (c.name.substr(c.name.length-2,2) == 'DA') {
			if (c.type =="checkbox") {
				if (c.checked)
					sl += "&"+c.id+"='1'";
				else
					sl += "&"+c.id+"='0'";
			} else {
				if (c.name == 'idDA') {
					fld = c;
					if (c.value == '') {
						arg1=1;
						//sl += "&id=NULL";
					} else {
						arg1=2;
						sl += "&id='"+c.value+"'";
					}
				} else {
					if (c.value == '')
						sl += '&'+c.id+"=NULL";
					else
						sl += '&'+c.id+"='"+c.value+"'";
				}
			}
		}

	}

	for ( i=0; i < nt; i++ )
	{
		var c = te[i];
		if (c.name.substr(c.name.length-2,2) == 'DA') {
			sl += '&'+c.id+"='"+escape(c.value)+"'";
		}
	}

	for ( i=0; i < ns; i++ )
	{
		var c = se[i];
		if (c.name.substr(c.name.length-2,2) == 'DA') {
			sl += '&'+c.id+"='"+c.value+"'";
		}
	}
	//alert (fn.id.substr(fn.id.length-2,2));
	var url = '/htdocs/tran.php?arg1='+arg1+'&arg2='+fn.id.substr(fn.id.length-1,1)+sl+ul;
	//alert(url);
	//document.getElementById('notes').value = url;
	updateDB(url);
	//return ul;
}

//pT-Process Transaction, f-form_name, fl-file to be used: 'I' for tranI.php or 'Reg' for tranReg.php,
//md-method that needs to be called upon completetion of the tranI.php
function pT(f,ul,fl,md) {
//	alert (md);
	frm_name = f; //global scope, if not prefixed with var. Anyway it is defined at the top
	var str = new Array();
	var tabnum = new Array();
	var tabnumind = 0;
	var hdr = new Array();
	var naArr = new Array();
	var fn = document.getElementById(f);
	//alert ("form_obj: "+fn.id);
	var iN = fn.getElementsByTagName("input");
	var te = fn.getElementsByTagName("textarea");
	var se = fn.getElementsByTagName("select");
	var dV = fn.getElementsByTagName("div");

	var ni = iN.length; //ni,nt.ns numInputs, numTextarea, numSelects, 
	var nt = te.length;
	var ns = se.length;
	var ndV = dV.length;

	var fld_id, fld_val; // Field ID and its value.
	//alert ("ni:"+ni+", nt:"+nt+", ns:"+ns+", ndV:"+ndV );

	var rExp = /(\\|')/g; //to escape single quotes and back-slashes (and hence \t, \n, etc) with a \
	var ReStr = "\\$1"; // string to be replaced with

	/*
	http://simon.incutio.com/archive/2006/01/20/escape
	//var specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'];
	var specials = ['\'', '\\'];
	alert ("specials:"+specials);
	sRE = new RegExp( '(\\' + specials.join('|\\') + ')', 'g' );
	alert ("sRE:"+sRE);
	*/

	var sl='';

	for ( i=0; i < ni; i++ ) {
		var c = iN[i];
		naArr = c.name.split("_");

		if (naArr[0] == 'DA') {
			delete naArr[0];
			for (j in naArr) { // There are columns that belong to multiple tables and so naArr[1],naArr[2],..
				if (str[naArr[j]] == undefined) {
					str[naArr[j]] = '';
					tabnum[tabnumind++] = naArr[j];
				}
				if (!(hdr[naArr[j]]))  //Initialized here for forms that does not have any fields with class=DAid. class=DAid is only for fields corresponding to db sequences.
					hdr[naArr[j]] = "arg1=2&arg2="+naArr[j];  // arg1=2 i.e. update. if update fials inserts the record. see tranI.php for details.
			}

			if (c.id.substr(c.id.length-4,4) == '_COM') {
				fld_id  = c.id.substr(0,c.id.length-4);
				if (document.forms[f].elements[fld_id])
					fld_val = document.forms[f].elements[fld_id].value;
				else
					fld_val = document.forms['ceftep'].elements[fld_id].value;
			} else {
				fld_id  = c.id;
				fld_val = c.value;
			}
			//alert(c.name+" : "+fld_id+" : "+fld_val);

			if (c.type =="checkbox") {
				if (c.checked) {
					str[naArr[1]] += "&"+fld_id+"='\\'1\\''";
				} else {
					str[naArr[1]] += "&"+fld_id+"='\\'0\\''";
				}
			} else {
				if (c.className == 'DAid') { //class=DAid is for fields corresponding to db sequences.
					//fld = c;
					if (fld_val) {  //update
						for (j in naArr) {
							//if (!str[naArr[j]])
							//	str[naArr[j]] = "";

							/*  for tables which does not have a sequence.
							if (!(hdr[naArr[j]])) {
								hdr[naArr[j]] = "arg1=2&arg2="+naArr[j];
							*/

							if (j == 1) {
								hdr[naArr[j]] = "arg1=2&arg2="+naArr[j];
							}
							str[naArr[j]] += "&"+fld_id+"='\\'"+fld_val+"\\''";
						}
					} else {  //insert
						for (j in naArr) {
							//if (!str[naArr[j]])
							//	str[naArr[j]] = "";

							/*  for tables which does not have a sequence.
							if ( !(hdr[naArr[j]]) && (j == 1) ) {
								hdr[naArr[j]] = "arg1=1&arg2="+naArr[j];
							} else if ( (!hdr[naArr[j]]) && (j != 1) ) {
								hdr[naArr[j]] = "arg1=1&arg2="+naArr[j]+"&"+fld_id+"='\t"+fld_id+"'";
							*/

							if (j == 1) {
								hdr[naArr[j]] = "arg1=1&arg2="+naArr[j];
							} else {
								str[naArr[j]] += "&"+fld_id+"='\t"+fld_id+"'";
							}
						}
					}
				} else if (fld_id == "password") {
					if (fld_val) {
						str[naArr[1]] += "&"+fld_id+"='md5(\\'"+fld_val+"\\')'";
					} else {
						//str[naArr[1]] += "&"+fld_id+"='NULL'";
					}
				} else {
					//alert(fld_val);
					if (fld_val) {
						str[naArr[1]] += "&"+fld_id+"='\\'"+escape(fld_val.replace(rExp,ReStr))+"\\''";
					} else {
						str[naArr[1]] += "&"+fld_id+"='NULL'";
					}
				}
			}
		}

	}

	for ( i=0; i < nt; i++ ) {
		var c = te[i];
		naArr = c.name.split("_");

		if (naArr[0] == 'DA') {
			delete naArr[0];

			if (c.value) {
				//alert (c.value.replace(rExp,ReStr));
				str[naArr[1]] += "&"+c.id+"='\\'"+escape(c.value.replace(rExp,ReStr))+"\\''";
			} else {
				str[naArr[1]] += "&"+c.id+"='NULL'";
			}
		}
	}

	for ( i=0; i < ns; i++ ) {
		var c = se[i];
		naArr = c.name.split("_");

		if (naArr[0] == 'DA') {
			delete naArr[0];
			//alert (c.id);

			if (c.value) {
				str[naArr[1]] += "&"+c.id+"='\\'"+c.value+"\\''";
			} else {
				str[naArr[1]] += "&"+c.id+"='NULL'";
			}
		}
	}

	for ( i=0; i < ndV; i++ ) {

		var c = dV[i];
		
		if(c.getAttribute('name')) {
			naArr = c.getAttribute('name').split("_");
		}
		if (naArr[0] == 'DA') {
			delete naArr[0];
			if (c.innerHTML) {
				//alert (c.innerHTML.replace(rExp,ReStr));
				str[naArr[1]] += "&"+c.id+"='\\'"+escape(c.innerHTML.replace(rExp,ReStr))+"\\''";
			} else {
				str[naArr[1]] += "&"+c.id+"='NULL'";
			}
		}

	}

	if (!ul)
		ul = '';
	if (!fl)
		fl = 'I';
	var url = '/htdocs/tran'+fl+'.php';
	var fd = (md)?'md='+escape(md):'';
	//alert(md);
	//alert(fd);
	for (k in tabnum) {
		//alert(k+":"+tabnum[k]+":"+str[tabnum[k]]);
		if (fd) // form data
			fd+= "&";
		temp = hdr[tabnum[k]]+str[tabnum[k]];
		if (ul[tabnum[k]])
			temp += ul[tabnum[k]];
		fd += "str"+tabnum[k]+"='"+escape(temp);
	}

	//alert("url: "+url+"\nfd: "+unescape(fd));
	//return;
	//document.getElementById('notearea').value = (fd); return; //show it on the My Notes and exit here. Notes should be open beforehand otherwise clicking MyNotes will cause the notes to be updated from the Cookie.
	updateDB(url,fd);
	//return ul;
}

//dR - delete record.
function dR(nodeObj,ul,fl,md) {

	//return ul;
}

function updateDB(url,fd) {
//alert (unescape(fd));
	customerHttp = getHTTPObject(); // Appears that IE clears the customerHttp object after each execution.
	//alert("customerHttp:"+customerHttp);
	if (!url)
		url = '/htdocs/tranI.php';
	if (customerHttp) {

		//For GET requests uncomment the following
		/*
		url = url+"?"+fd;
		customerHttp.open("GET", url, true);
		customerHttp.onreadystatechange = updateDBchange;
		customerHttp.send(null);
		*/

		//alert("All Headers:"+customerHttp.getAllResponseHeaders());
		//alert ("updateDB\nURL:"+url+"  fd:"+unescape(fd));

		//For POST requests uncomment the following
		customerHttp.open("POST", url, true);
		customerHttp.onreadystatechange = updateDBchange;
		customerHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		customerHttp.send(fd);
	}
}

function updateDBchange () {
  var fld_idx;
  //alert (frm_name);
  //alert ("readystate:"+customerHttp.readyState);
  if (customerHttp.readyState == 4) {
     if (customerHttp.responseText.indexOf('invalid') == -1)	{
	try {
		xmlResults = customerHttp.responseXML.documentElement;
		//alert ("xmlResults.childNodes.length: "+xmlResults.childNodes.length);

		//alert("info_msg:"+xmlResults.getElementsByTagName('info_msg').length);
		for (i=0; i < xmlResults.getElementsByTagName('info_msg').length; i++) {
		    if (xmlResults.getElementsByTagName('info_msg')[i].firstChild) {
			alert("info_msg:\n"+unescape(xmlResults.getElementsByTagName('info_msg')[i].firstChild.data));
		    }
		}

		for (i=0; i < xmlResults.getElementsByTagName('id').length; i++) {
			if (xmlResults.getElementsByTagName('id')[i].firstChild) {
				//alert(i+":"+xmlResults.getElementsByTagName('id')[i].firstChild.data);
				name_val_arr = xmlResults.getElementsByTagName('id')[i].firstChild.data.split("=");
				//alert (name_val_arr[0]+":"+name_val_arr[1]);

				//if (typeof eval(name_val_arr[0]+"_cnt") == 'undefined') {
				//alert (eval("typeof ("+name_val_arr[0]+"_cnt)"));
				if (eval("typeof ("+name_val_arr[0]+"_cnt)") == 'undefined') {
					//alert ("initializing: "+name_val_arr[0]+"_cnt");
					eval("var "+name_val_arr[0]+"_cnt = 0"); // to make it a local variable. A new variable is used for each of the different IDs the insert may return, say, bus_id, doct_id, hour_id etc in a single transaction.
					fld_idx = eval(name_val_arr[0]+"_cnt");
					//alert ("initialized: "+eval(name_val_arr[0]+"_cnt"));
					//alert ("initialized: "+fld_idx);
				} else {
					//alert ("incrementing: "+name_val_arr[0]+"_cnt");
					fld_idx = eval("++"+name_val_arr[0]+"_cnt");
					//alert ("incremented: "+eval(name_val_arr[0]+"_cnt"));
				}

				//alert ("fld_idx: "+fld_idx);
				if (document.forms[frm_name].elements[name_val_arr[0]].length) {
					// If there are multiple elements with the same id in this from
					//alert ("There are multiple elements with the same id in this from");
					//alert ("form: "+frm_name+"\nfield: "+name_val_arr[0]+"\nfld_idx: "+fld_idx);
					document.forms[frm_name].elements[name_val_arr[0]][fld_idx].value = name_val_arr[1];
				} else {
					// If there is only one element with the same id in this from
					//alert ("There is only one element with the same id in this from");
					document.forms[frm_name].elements[name_val_arr[0]].value = name_val_arr[1];
				}
				//document.getElementById(name_val_arr[0]).value = name_val_arr[1];
				//fld.value = xmlResults.getElementsByTagName('id')[0].firstChild.data;
			}
		}


		if (xmlResults.getElementsByTagName('db_error')[0]) {
			alert("db_error:\n"+xmlResults.getElementsByTagName('db_error')[0].firstChild.data);
			//alert("db_error:\n"+unescape(xmlResults.getElementsByTagName('db_error')[0].firstChild.data));
			//return;
		}

		if (xmlResults.getElementsByTagName('msg_out')[0]) {
			message_out = '';
			for (i=0; i < xmlResults.getElementsByTagName('msg_out').length; i++) {
				if (xmlResults.getElementsByTagName('msg_out')[i].firstChild) {
					//alert("msg_out:\n"+unescape(xmlResults.getElementsByTagName('msg_out')[i].firstChild.data));
					message_out += (i+1)+" - "+unescape(xmlResults.getElementsByTagName('msg_out')[i].firstChild.data);
					message_out += "<BR>";
				}
			}
			//alert (message_out);
			document.getElementById('msg_out').innerHTML = message_out;
		}

		if (xmlResults.getElementsByTagName('rows_aff')[0]) {
			rows_aff = parseInt(xmlResults.getElementsByTagName('rows_aff')[0].firstChild.data);
			if (rows_aff == -1)
				stat_msg = 'Unable to Save Changes';
			else if (rows_aff == 0)
				stat_msg = 'Nothing to be Saved';
			else
				stat_msg = rows_aff+' Record(s) Saved';

			status_div = document.getElementById('statusDiv');
			//status_div.style.bottom = '3px';
			status_div.innerHTML = stat_msg;
			//document.getElementById('statfld').innerHTML = stat_msg;
			setTimeout("status_div.innerHTML=''", 2000);
		}

		//if (xmlResults.getElementsByTagName('result')[0].firstChild)
			//alert("result:\n"+xmlResults.getElementsByTagName('result')[0].firstChild.data);

		if (xmlResults.getElementsByTagName('method')[0]) {
			var method = xmlResults.getElementsByTagName('method')[0].firstChild.data;
			//alert("method:\n"+method);
			eval(method);
		}
	} catch(e) {
		alert("Please report this error to the network admin: " + e) ;
		//alert(customerHttp.statusText);
	}
    }
  }
}

function showDiv(show) {
	if (show) {
		display_div.style.visibility = "visible";
		//alert (display_div.style.zIndex);
	} else {
		display_div.style.visibility = "hidden";
	}
}

function hideDiv() {
	if (display_div) {
		display_div.style.visibility = "hidden";
	}
}

function keypressHandler(evt) {
  // don't do anything if the display_div is hidden
  if (display_div.style.visibility == "hidden")
    return true;
  
  // make sure we have a valid event variable
  if(!evt && window.event) {
    evt = window.event;
  }
  var key = evt.keyCode;
  
  // if this key isn't one of the ones we care about, just return
  var KEYUP = 38;
  var KEYDOWN = 40;
  var KEYENTER = 13;
  var KEYTAB = 9;
  
  if ((key != KEYUP) && (key != KEYDOWN) && (key != KEYENTER))
    return true;

  // get the TR that's currently selected, and perform an appropriate action
  var TRs = display_div.getElementsByTagName("TR");
  var selNum = getSelectedRec(TRs);
  var selRec = setSelectedRec(TRs, selNum);
  
  if ((key == KEYENTER)) {
    if (selRec)
      _selectResult(selRec);
    evt.cancelBubble=true;
    return false;
  } else {
    if (key == KEYUP) {
	if (selNum <=0) selNum=TRs.length;
	selRec = setSelectedRec(TRs, selNum - 1);
    }
    if (key == KEYDOWN)
      selRec = setSelectedRec(TRs, selNum + 1);
    if (selRec)
      _highlightResult(selRec);
  }
  showDiv(true);
  return true;
}

function getSelectedRec(TRs) {
  var count = -1;
  if (TRs) {
    for (var i = 0; i < TRs.length; i++) {
	//document.getElementById('notes').value += "getSelectedRec\n";
	count++;
	if ((TRs[i].style.backgroundColor == '#d1d1d1') || (TRs[i].style.backgroundColor == 'rgb(209, 209, 209)'))
		//alert ("P"+TRs[i].style.backgroundColor+"Q");
		return count;
    }
  }
  return -1; // 0 if there is a heading for the LOV and -1 if there is no heading.
}

function setSelectedRec(TRs, selNum) {
  var count = -1;
  var thisTR;
  if (TRs) {
	for (var i = 0; i < TRs.length; i++) {
		if (++count == selNum) {
			//document.getElementById('notes').value += "setSelectedRec\n";
			_highlightResult(TRs[i]);
			thisTR = TRs[i];
		} else {
			_unhighlightResult(TRs[i]);
		}
	}
  }
  return thisTR;
}

function _highlightResult(item) {
	item.style.background = '#d1d1d1';
}

function _unhighlightResult(item) {
	item.style.background = '';
}

function _selectResult(item) {
	eval(item.id);
	//item.fireEvent("onmousedown");
	//b=item.dispatchEvent("click");
	hideDiv();
}


/**************************************************************************************************************/
/******* Add Rules and Highlights to Input Fields *******************************/

function addRules(formName) {
    if (document.getElementById(formName)) {
	var fObj = document.getElementById(formName);
	var inputs = fObj.getElementsByTagName("input");
	var textareas = fObj.getElementsByTagName("textarea");
	var selects = fObj.getElementsByTagName("select");

	var numInputs = inputs.length;
	var numTextAreas = textareas.length;
	var numSelects = selects.length;


	for ( i=0; i < numInputs; i++ )
	{
		var currentInput = inputs[i];
		currentInput.onfocus = onFocus;
		currentInput.onblur = onBlur;
		currentInput.onmouseover = onOver;
		currentInput.onmouseout = onOut;
		if (currentInput.type =="checkbox") {
			currentInput.style.border = '0px';
			currentInput.style.margin = '0px';
		}

	}

	for ( i=0; i < numTextAreas; i++ )
	{
		var currentTextArea = textareas[i];
		currentTextArea.onfocus = onFocus;
		currentTextArea.onblur = onBlur;
		currentTextArea.onmouseover = onOver;
		currentTextArea.onmouseout = onOut;
	}

	for ( i=0; i < numSelects; i++ )
	{
		var currentSelect = selects[i];
		currentSelect.onfocus = onFocus;
		currentSelect.onblur = onBlur;
		currentSelect.onmouseover = onOver;
		currentSelect.onmouseout = onOut;
	}
    }

   if ((document.getElementById('appntIFrame')) || (document.getElementById('calTable'))) {
	if (document.getElementById('appntIFrame')) {
		var appntFrame = document.getElementById("appntIFrame");

		if(appntFrame.contentDocument) {
			//var tds = appntIFrame.getElementsByTagName("TD");
			var calTable = appntFrame.contentDocument.getElementById('calTable');
			//var tds = calTable.getElementsByTagName("TD");
			//alert('Moz:'+calTable.id);
		}
		else {
			//var tds = appntIFrame.document.getElementsByTagName('TD');
			var calTable = document.frames("appntIFrame").document.getElementById('calTable');
			//alert('IE:'+calTable.id);
		}
	} 

	if (document.getElementById('calTable')) {
		var calTable = document.getElementById('calTable');
	}
	var tds = calTable.getElementsByTagName("TD");
	var numtds = tds.length;

	for ( i=0; i < numtds; i++ )
	{
		var currenttd = tds[i];
		currenttd.onfocus = onFocus;
		currenttd.onblur = onBlur;
		currenttd.onmouseover = onOver;
		currenttd.onmouseout = onOut;
	}
   }

}

function onFocus() {
//alert (this.innerText.charCodeAt(0));
	if (this.type != "button") {
		//alert(this);
		//alert(this.parentElement.tagName);
		if ((this.tagName =="TD") && (this.id != "no") && (this.innerText != ".")) {
			tdprevobj2 = this;
			//this.style.border = '1px solid #C00000';
		} else if (this.tagName !="TD") {
			this.style.background = '#FFFFFF';
			this.style.border = '1px solid #C00000';
			this.style.color = '#0000C0';
			if (this.type =="checkbox") {
				this.style.border = '0px';
			}
		}
			lastFocused = this;
	}
}

function onBlur() {
	if (this.type != "button") {
		if ((this.tagName =="TD") && (this.id != "no")) {
			//this.style.border = 'solid 1px #e5e5e5';
			//this.style.borderBottom = 'solid 1px #ffffff';
			//this.style.borderLeft = 'solid 1px #ffffff';
			//this.style.background = tdprevobj2.bgColor;
		}
		if (this.tagName !="TD") {
			if ((this.className == "email") && (this.value.length > 0)) {
				//alert (this.value.length);
				validate_email(this);
			}
			this.style.background = '#ECECEC';
			this.style.border = 'solid 1px #B0B0B0';
			this.style.color = '#000000';
			if (this.type =="checkbox") {
				this.style.border = '0px';
			}
			//hideDiv();
			setTimeout("hideDiv()", 500); //because this hideDiv() fires before onmouseup on popupDiv is fired. if onmousedown is used instead of onmousup then this problem doesnot happen. But that will be problem for email recipients field to refocus on the field being entered.
		}
	}
}

function onOver() {
	if (document.getElementById('statfld'))
		document.getElementById('statfld').innerText=".";
	if (this.type != "button" && this != lastFocused) {
		if ((this.tagName =="TD") && (this.id != "no") && (this.innerText != ".")) { // TD1 to disable the functionality
			tdprevobj1 = this;
			//this.style.border = 'dotted 1px #C00000';
			//alert(tdprevobj.bgColor);
			//alert(this.style.borderTopColor);
		} else if (this.tagName !="TD") {
			this.style.background = '#F8F8F8';
		}
	} else if (this.type == "button") {
		this.style.background = '#ECECEC';
	}

	if (this.type =="checkbox") {
		this.style.border = '0px';
	}
}

function onOut() {
	if (this.type != "button" && this != lastFocused) {
		if ((this.tagName =="TD") && (this.id != "no")) { // TD1 to disable the functionality
			//this.style.background = tdprevobj1.bgColor;
			//this.style.border = 'solid 1px #e5e5e5';
			//this.style.borderBottomColor = '';
			//this.style.borderLeftColor = '';
		} else if (this.tagName !="TD") {
			this.style.background = '#ECECEC';
			//this.style.border = 'solid 1px #B0B0B0';
			this.style.color = '#000000';
		}
	} else if (this.type == "button") {
		this.style.background = '#FFFFFF';
	}
	if (this.type =="checkbox") {
		this.style.border = '0px';
	}
}


/****************************************************************************************************************/
function validate_email(email_fld) {
	/*
	with (email_fld) {
		atpos=value.indexOf("@");
		dotpos=value.lastIndexOf(".");
		if (atpos<1||dotpos-atpos<2) {
			alert("Invalid Email");
			email_fld.focus();
			return false;
		} else {
			return true;
		}
	}
	*/

		email_list = email_fld.value;
		//alert(email_list);

		specialRE = /[",;\.\s@a-zA-Z0-9_<>-]/g; // special chars which are allowed in email list.
		non_list = email_list.replace(specialRE,"");
		if (non_list) {
			alert("The following characters are not allowed:\n"+non_list);
			email_fld.focus();
			return false;
		}

		qteRE = /[^"]/g; // look for matching number of " (double quote) in email list.
		qte_list = email_list.replace(qteRE,"");
		//alert (qte_list.length % 2);
		if (qte_list.length % 2) {
			alert("Does not have matching number of \"");
			email_fld.focus();
			return false;
		}

		ltRE = /[^<]/g; // look for matching number of < (less than) in email list.
		lt_list = email_list.replace(ltRE,"");
		gtRE = /[^>]/g; // look for matching number of > (greater than) in email list.
		gt_list = email_list.replace(gtRE,"");

		if (lt_list.length != gt_list.length) {
			alert("Does not have matching pair(s) of < and >");
			email_fld.focus();
			return false;
		}

		spaceRE = /[\s]+/g; // replace white spaces tabs and newlines with a single white space.
		email_list = email_list.replace(spaceRE," ");
		//alert ("Post spaceRE:"+email_list);

		commaRE = /\s,/g; // remove the white spaces tabs and newlines before a comma.
		email_list = email_list.replace(commaRE,",");
		//alert ("Post commaRE:"+email_list);

		ltRE = /\s</g; // remove the white spaces tabs and newlines before the <.
		email_list = email_list.replace(ltRE,"<");
		//alert ("Post ltRE:"+email_list);

		//emailRE = /['"]?[\sa-zA-Z]*[,]?[\sa-zA-Z]*['"]?\s*[<]?([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9])+(\.[a-zA-Z0-9_-]+)+[>]?/g;
		emailRE = /(['"][\sa-zA-Z]+[,]?[\sa-zA-Z]*['"])*\s*[<]?([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9])+(\.[a-zA-Z0-9_-]+)+[>]?/g;

		var temp = email_list.replace(emailRE, "");
		//alert ("temp:"+temp);
		//alert(temp.replace(/[,;]+/g, ""));
		tempRE = /[,;\s]+/g;
		if (temp.replace(tempRE, "")) {
			alert ("The following are not valid email addresses:\n"+temp.replace(tempRE,","));
			email_fld.focus();
			return false;
		}

		emailArr = email_list.match(emailRE);
		if (!emailArr) {
			alert("No valid email Recipients are entered");
			email_fld.focus();
			return false;
		}

			
		//alert("emailArr:"+emailArr);
		//alert("emailArr:"+emailArr.join(";"));
		//alert("emailArr_length:"+emailArr.length);
		//for (i in emailArr) { //in IE i will have input, index, lastIndex besides the array of emails.
		for (i=0; i<emailArr.length; i++) {
  			//alert (i+":"+emailArr[i]);
  			//alert (":"+emailArr[i]+":");
		}
		//alert (document.getElementById('recipient').value.split(/[;,:]/).length);
		//alert (document.getElementById('recipient').value.replace(/(.*@.+\..+[;,:])+/g,"tt"));
		email_fld.value = emailArr.join(", ").replace(spaceRE," "); //This replace is required becuase the join preceding it may add additional space if there is already a space after the ; (semicolon).
		return true;
}

function autoTab(spot,nextO,sender,event) {
	if ( sender.value.length == spot && 
	   ((event.keyCode >= 48 && event.keyCode <= 57) || (event.keyCode >= 96 && event.keyCode <= 105)))
			sender.form[nextO].focus();
}


function viewRequest(serial) {
	window.open('process.php?request='+serial);
}


function clearForm(formid) {
		formElements = parent.document.getElementById(formid).elements;
		for(i=0;i<formElements.length;i++) {
		//alert(formElements[i].className);
			if (formElements[i].id != "") {
				formElements[i].value="";
		//alert(formElements[i]);
				formElements[i].checked=false;
			}
		}
}
function highlighTR(row) {
 selected=row.id;
 unhighTR=document.getElementById('popupDiv').getElementsByTagName('TR');
 for (i=0;i<unhighTR.length; i++) {
	unhighTR[i].className='';
 }
 row.className='goldbg';
}

function customersResponse1() {
	if (customerHttp.readyState == 4) {
		if (customerHttp.responseText.indexOf('invalid') == -1)	{
			try {
				xmlResults = customerHttp.responseXML.documentElement;

				//if (xmlResults.getElementsByTagName('info_msg')[0].firstChild)
					//alert(xmlResults.getElementsByTagName('info_msg')[0].firstChild.data);

				if (xmlResults.getElementsByTagName('db_error')[0])
					alert(xmlResults.getElementsByTagName('db_error')[0].firstChild.data);

				//alert(xmlResults.childNodes.length);
				//alert(xmlResults.getElementsByTagName('method').item(i).firstChild.data);
				var output;
				output = '<table class="data" style="background:white;width:100%;">';
				//output += '<tr><th>Name</th><th>Phone</th></tr>\n';
				
				// Create table rows for each record
				for (var i=0; i < xmlResults.childNodes.length; i++) {
					output += "<TR id='tr"+i+"'";
					//alert (output);
					output += 'onClick="highlighTR(this);" style="cursor:pointer;"';
					output += '<TD class="data" style="width:100%" nowrap >\n';
					output += '<input id=item_count class="frDB" style="display: none;" value="1" >\n';
					output += '<input id=item_id class="frDB" style="display: none;" value="'+xmlResults.getElementsByTagName('id').item(i).firstChild.data+'" >\n';
					output += '<input id=item_name class="frDB" style="display: none;border:1px solid white;" value="'+xmlResults.getElementsByTagName('name').item(i).firstChild.data+'" >'+xmlResults.getElementsByTagName('name').item(i).firstChild.data+'</TD>';
					output += "</TR>\n";
				}
				output += '</table>';

				display_div.innerHTML = output;
			if(qryfld != '') {
				var x = qryfld.offsetLeft;// - qryfld.offsetWidth/2;
				var y = qryfld.offsetTop + qryfld.offsetHeight;// + 2;
				var parent = qryfld;
				while (parent.offsetParent) {
					parent = parent.offsetParent;
					x += parent.offsetLeft;
					y += parent.offsetTop;
				}
				//x = display_div.style.width.replace('px','');
				//x = x-display_div.style.width.replace('px','');
				//display_div.style.position = "absolute";
				//display_div.style.zIndex = 1000;
				display_div.style.left = x;
				display_div.style.top = y;//qryfld.style.top;
				display_div.style.border = "1px solid #777777";

			}
				showDiv(xmlResults.childNodes.length > 0);
				customerBusy = false;
			} catch(e) {
				alert("Please report this error to the network admin: " + e);
			}
		}
	}
}

function showData(frmName, detail) {
	//alert (detail);
	var detail_array = detail.split("\t");
	var part_num=0;
	while (part_num < detail_array.length) {
		var name_value_array = detail_array[part_num].split("=");
		//alert(name_value_array);
		var field_name = name_value_array[0];
		var field_value = name_value_array[1];

		//document.getElementById(field_name).value=field_value;
		if (frmName) {
			//document.forms[frmName].elements[field_name].value = unescape(field_value);
			str = "document.forms['"+frmName+"'].elements['"+field_name+"']";
			//alert (str);
		} else {
			str = "document.getElementById('"+field_name+"')";
			//alert (str);
		}
		if(eval(str)) {
			if(eval(str).type == "checkbox")
				eval(str).checked = (field_value =="t")? 1 : 0;
			else
				eval(str).value=unescape(field_value);
		}
		part_num+=1;
	}

	//hideDiv();
}

function emailList(detail) {
	//alert (detail);
	//alert (mailfld); // mailfld is set in msgPopupNew.php
	//alert (sStr); //sStr is set in msgPopupNew.php. This is used in the rgular expression replace below.
	var re = new RegExp(sStr + '$');

	var detail_array = detail.split("\t");
	var part_num=0;
	while (part_num < detail_array.length) {
		var name_value_array = detail_array[part_num].split("=");
		//alert(name_value_array);
		var field_name = name_value_array[0];
		var field_value = name_value_array[1];
		//alert (field_name+":"+field_value);
		if(field_name == "recipientlist") {
			//append with the new email id after replacing the qstr string that is already typed. mailfld is set in msgPopupNew.php
			document.getElementById(mailfld).focus();  // on IE this will put cursor at the field, when mouse is used. But the following replace will cuase the cursor to move to the end of the text. see comments below for the same entry.
			document.getElementById(mailfld).value = document.getElementById(mailfld).value.replace(re, unescape(field_value));
		}
		part_num+=1;
	}
	hideDiv();
	//document.getElementById(mailfld).focus(); // on IE this will put cursor in the beginning og the field, when mouse is used. see comments above for the same entry.
}

function getElementIndex(element) { //used in
	if (element.form) {
		for (var i = 0; i < element.form.elements.length; i++) {
			if (element == element.form.elements[i]) {
				return i;
			}
		}
		return -1; // <input type="image"> in some browsers
	} else {
		return -1;
	}
}

function getElementIndexByID(element) { //used in bus_hour.php
	if (element.form) {
		var i = element.form.elements[element.id].length;
		if (!i) { // i.e if there is only one elemet with the same name.
			return 0;
		}
		while (i--) {
			if (element == element.form.elements[element.id][i]) {
				return i;
			}
		}
		return -1; // <input type="image"> in some browsers
	} else {
		return -1;
	}
}

//HTML Tables' functions
function addTblRowClone(tblId,idx,l_fld_data) { // idx is the TR rowIndex to be cloned.
	if (!idx) {
		var idx=0;
	}
	var tblBody = document.getElementById(tblId).tBodies[0];
	var j=tblBody.rows.length;

	if (idx == -1) { // clone the last row
		var newNode = tblBody.rows[--j].cloneNode(true);
	} else {
		var newNode = tblBody.rows[idx].cloneNode(true);
	}
	tblBody.appendChild(newNode);

	nameElements(newNode,'',l_fld_data)
}

function nameElements(nodeObj,b_idx,l_fld_data) { // b_idx is the numeric part of the element's NAME as the base. The new NAME string contains (b_idx + # of table rows)
	if (!b_idx) {
		b_idx=0; // not implemented yet.
	}

	var numRE = /(\d+$)/;
	var nameStr, nameStr1, nameStr2;

	//to get the list all inputs,select, etc must be inside a TD otherwise Mozilla will not return those inputs.
	var iN = nodeObj.getElementsByTagName("input");
	var sE = nodeObj.getElementsByTagName("select");
	var tA = nodeObj.getElementsByTagName("textarea");

	var len = iN.length;
	for (i=0; i<len; i++) {
		if (numRE.test(iN[i].name)) {
			//alert(iN[i].name);
			nameStr1 = iN[i].name.replace(numRE,''); //non-numeric portion of the name
			nameStr2 = iN[i].name.match(numRE); //numeric portion will be stored in second element (i.e. [1]) of the array. [0] will be the whole name.
			nameStr = nameStr1+(nameStr2[1]*1+1);
			//alert(nameStr);
			iN[i].name = nameStr;
			//alert(iN[i].name);
			//alert(iN[i].id+":"+iN[i].style.display);

			if(iN[i].type == "checkbox") {
				iN[i].checked = (l_fld_data[iN[i].id])? 1 : 0;
			} else if (l_fld_data[iN[i].id] == 'visible') {
				iN[i].style.display = '';
			} else if (l_fld_data[iN[i].id] == 'hidden') {
				iN[i].style.display = 'none';
			} else if (l_fld_data[iN[i].id]) { // if there is a value for this field in the array, assign to the field
				iN[i].value = l_fld_data[iN[i].id];
				//alert(iN[i].id+":"+l_fld_data[iN[i].id]);
			}
		}
	}

	len = sE.length;
	for (i=0; i<len; i++) {
		if (numRE.test(sE[i].name)) {
			//alert(sE[i].name);
			nameStr1 = sE[i].name.replace(numRE,'');
			nameStr2 = sE[i].name.match(numRE);
			nameStr = nameStr1+(nameStr2[1]*1+1);
			//alert(nameStr);
			sE[i].name = nameStr;
			//alert(sE[i].name);
			if (l_fld_data[sE[i].id]) {
				if (l_fld_data[sE[i].id] == 'disabled') {
					sE[i].disabled = true;
				} else {
					sE[i].value = l_fld_data[sE[i].id];
					sE[i].disabled = false;
				}
				//alert(sE[i].id+":"+l_fld_data[sE[i].id]);
			}
		}
	}

	len = tA.length;
	for (i=0; i<len; i++) {
		if (numRE.test(tA[i].name)) {
			//alert(tA[i].name);
			nameStr1 = tA[i].name.replace(numRE,'');
			nameStr2 = tA[i].name.match(numRE);
			nameStr = nameStr1+(nameStr2[1]*1+1);
			//alert(nameStr);
			tA[i].name = nameStr;
			//alert(tA[i].name);
			if (l_fld_data[tA[i].id]) {
				tA[i].value = l_fld_data[tA[i].id];
				//alert(tA[i].id+":"+l_fld_data[tA[i].id]);
			}
		}
	}
}

function delTblRow(nodeObj,idx) {
	var idx = idx || 0;
	//alert("Node "+nodeObj);

	if (nodeObj.tagName == 'TR') {
		nodeObj.parentNode.deleteRow(nodeObj.rowIndex);
		return;
	} else if (nodeObj.tagName == 'TBODY') {
		var tbodyObj = nodeObj;
	} else if (nodeObj.tagName == 'TABLE') {
		var tbodyObj = nodeObj.tBodies[0];
	} else { //if the ID of the table is passed. Useful for calling from post pT(), since the object cannot be passsed through ajax.
		var tbodyObj = document.getElementById(nodeObj).tBodies[0];
	}

	var j=tbodyObj.rows.length;

	if (idx == -2) { // delete all rows
		while(j--) {
			tbodyObj.deleteRow(j);
		}
	} else if (i == -1) { // delete the last row
		tbodyObj.deleteRow(--j);
	} else {
		tbodyObj.deleteRow(idx);
	}
}
