window.onerror = function(){return false;}

var new_fieldname = ""
var form_name = "";
var file_fld = 0;
var gFieldsChanged = 0;
var frmSubmit = false;

var new_fieldname = ""
var form_name = "";
var file_fld = 0;
var gFieldsChanged = 0;
var frmSubmit = 0;
var file_attached = 0;
var error_color = "F3F3F3"
var off_error_color = "FFFFFF"
var on_error_color = "FFF8DC"
var form_color = "FFFFFF"
var ignoreValidation = false;

var ItemsChecked = new Object();
var frmStr = new Object();

frmStr.formBeginMessage = "The following form field(s) were incomplete or incorrect:";
frmStr.formEndMessage = "Please complete or correct the form and submit again.";
frmStr.reqMsg = "is required";

frmStr["numeric"] = new Object();
frmStr["numeric"].message = "must be a numeric value";
frmStr["numeric"].regex = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/; 

frmStr["integer"] = new Object();
frmStr["integer"].message = "must be a valid number (greater than 0)";
frmStr["integer"].regex = /(^-?\d\d*$)/;

frmStr["date"] = new Object();
frmStr["date"].message = "must be a valid date";
frmStr["date"].regex = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;

frmStr["time"] = new Object();
frmStr["time"].message = "must be a valid time";
frmStr["time"].regex = /^([1-9]|1[0-2]):[0-5]\d(:[0-5]\d(\.\d{1,3})?)?$/;

frmStr["currency"] = new Object();
frmStr["currency"].message = "must be a valid currency";
frmStr["currency"].regex = /(^\$\d{1,3}(,\d{3})*\.\d{2}$)|(^\(\$\d{1,3}(,\d{3})*\.\d{2}\)$)/;

frmStr["email"] = new Object();
frmStr["email"].message = "must be a valid email (user@company.com)";
frmStr["email"].regex = /^[a-z0-9]([a-z0-9_\-\.]*)@([a-z0-9_\-\.]*)(\.[a-z]{2,3}(\.[a-z]{2}){0,2})$/i;

frmStr["date"] = new Object();
frmStr["date"].message = "must be a date";
frmStr["date"].regex = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;

function frmValidCheck(frmObj) {
	frmSubmit = true;
	if (ignoreValidation) return true;
	ItemsChecked = new Object();
	var x = frmObj.elements.length;
	var invalidFields = new Array();
	var currentMessage,statusMessage,vType,req,fldObj,vReg,vMsg,currentRegex;
  	for (var i = 0; i < x; i++) {
		fldObj = frmObj.elements[i];
		req = fldObj.getAttribute("required");
		vType = fldObj.getAttribute("vtype");
		vReg = fldObj.getAttribute("vReg");
		currentRegex = (typeof(frmStr[vType]) != "undefined")?frmStr[vType].regex:vReg;
		currentMessage = (typeof(frmStr[vType]) != "undefined")?frmStr[vType].message:fldObj.getAttribute('vMsg');
		statusMessage = "";
		if (req == "1" || req == "true" || req == true) {
			statusMessage = frmValidRequired(frmObj,fldObj,frmStr.reqMsg);
		}
		if (currentRegex != null && statusMessage == "") {
			statusMessage = frmValidOther(frmObj,fldObj,currentRegex,currentMessage);
		}
		
		if (statusMessage != "") {
			var newIndex = invalidFields.length;
			invalidFields[newIndex] = new Object();
			invalidFields[newIndex].message = statusMessage;
			invalidFields[newIndex].field = fldObj.name;
		}
    }
	if (invalidFields.length > 0) {
		var validationMessageJS = frmStr.formBeginMessage+"\n\n"
		var validationMessageHTML = "<div class=\"invalidFieldHeader\">"+frmStr.formBeginMessage+"</div><br><br>"
		for (var v=0;v<invalidFields.length;v++) { 
			validationMessageJS += unescape(invalidFields[v].message) + "\n";
			validationMessageHTML += "<div class=\"invalidFieldMessage\" onclick=\"frmNavigate('"+invalidFields[v].field+"');\">"+unescape(invalidFields[v].message) + "</div>";
		}
		validationMessageJS += "\n"+frmStr.formEndMessage;
		validationMessageHTML += "<br>"+frmStr.formEndMessage;

		var vObj = $("ValidationMessages");
		if (vObj) {
			alert("Form validation failed.  Click OK to review the list of fields that need correcting");
			vObj.innerHTML = validationMessageHTML;
			vObj.style.display = "block";
			document.body.scrollTop = vObj.offsetTop+"px";
		} else {
			alert(validationMessageJS);
		}
   		return false;
  	} else {
		return true;
   	}
} 

function frmNavigate(fldName) {
	var rowObj = $("form_row_"+fldName);
	var fldObj = $(fldName);
	if (rowObj) {
		document.body.scrollTop = getObjectPosition(rowObj).y;
		if (rowObj.focus()) rowObj.focus();
		else if (fldObj.focus) fldObj.focus();
		//alert(getObjectPosition(rowObj).y);
	}
}

function frmValidOther(frmObj,fldObj,expChk,msg) {
	var msg_addition = "";
 	var objRegExp = eval(expChk);
	form_field_value = trimAll(fldObj.value);
    if (form_field_value != "" && (!objRegExp.test(form_field_value))) {
    	msg_addition = unescape(fldObj.getAttribute('vlabel'))+' '+msg;
	    changeColor(frmObj,fldObj,1);
   	}
 	return(msg_addition);
}

function setRequiredField(fldObj,flag) {
	if (fldObj.length) {
		for (var f=0;f<fldObj.length;f++) {
			fldObj[f].setAttribute("required",flag);
		}
	} else {
		fldObj.setAttribute("required",flag);
	}
}
 
function frmValidRequired(frmObj,fldObj,msg) {
	changeColor(frmObj,fldObj,0);
	var form_field_type = fldObj.getAttribute('type');
	var msg_addition = "";
	if ((form_field_type == "radio" || form_field_type == "checkbox") && ItemsChecked != null && typeof(ItemsChecked[fldObj.name]) == "undefined") {
		var anyChecked = false;
		if (typeof frmObj.elements[fldObj.name].length == "undefined") anyChecked = frmObj.elements[fldObj.name].checked;
		for (var i=0; i<frmObj.elements[fldObj.name].length; i++) {
			inst = frmObj.elements[fldObj.name][i];
			if (inst.checked) {
				anyChecked = true;
				break;
			}
		}
		if (!anyChecked) msg_addition = frmObj.elements[fldObj.name][0].getAttribute('vlabel')+' '+msg;
	} else {
		var strTemp = fldObj.value
		strTemp = trimAll(strTemp);
		if(strTemp.length == 0){
			msg_addition = fldObj.getAttribute('vlabel')+' '+msg;
			changeColor(frmObj,fldObj,1);
		}  
	}
	ItemsChecked[fldObj.name] = true;
	return msg_addition;
}

function frmValidRange(frmObj,fldObj,msg) {
	changeColor(frmObj,fldObj,0);
	var form_field_range = fldObj.getAttribute('range');
	var msg_addition = "";
	if (form_field_range && fldObj.value.length > 0) {
		if (form_field_range.indexOf(',') > -1) { var rng = form_field_range.split(',');} //we're dealing with a list
		else if (form_field_range.indexOf('-') > -1) { var rng = form_field_range.split('-');} //we're dealing with a range
		var val_1 = rng[0]; var val_2 = (rng[1] == 'null')?'':rng[1];

		if (rng[0].indexOf('.value') > -1) val_1 = eval(rng[0]);
		if (rng[1].indexOf('.value') > -1) val_2 = eval(rng[1]);
		var form_field_value = fldObj.value;
		if (val_1 > form_field_value || (val_2.length > 2 && val_2 < form_field_value)) {
			msg_addition = msg;
	 		changeColor(frmObj,fldObj,1);
	    }  
	}
	return msg_addition;
}
 
function changeColor(frmObj,fldObj,tog) {
	fldObj.style.backgroundColor = (tog==1)?error_color:off_error_color;
	//fldObj.style.borderColor = (tog==1)?"red":"";
}

function highlightRequired(frmObj) {
	for (x=0; x < frmObj.elements.length; x++) {
		fldObj = frmObj.elements[x];
		if (fldObj.getAttribute('required') == 1 || fldObj.getAttribute('required') == "true" || fldObj.getAttribute('required') == true)
			changeColor(frmObj,fldObj,1);
	}
 }	
 
function removeCurrency( strValue ) {
  var objRegExp = /\(/;
  var strMinus = '';
  var strValue = removeCommas(strValue);
  objRegExp = /\)|\(|[,]/g;
  strValue = (strValue)? strValue.replace(objRegExp,''):'';
  if(strValue.indexOf('$') >= 0){
    strValue = strValue.substring(1, strValue.length);
  }
  return strValue;
}

function removeCommas( strValue ) {
  return strValue.replace(',','');
}

function trimAll( strValue ) {
  var objRegExp = /^(\s*)$/;
    if(objRegExp.test(strValue)) {
       strValue = strValue.replace(objRegExp, '');
       if( strValue.length == 0)
          return strValue;
    }
   //check for leading & trailing spaces
   objRegExp = /^(\s*)([\W\w]*)(\b\s*$)/;
   if(objRegExp.test(strValue)) {
       //remove leading and trailing whitespace characters
       strValue = strValue.replace(objRegExp, '$2');
    }
  return strValue;
}

function showProgress(pth) {
  var strAppVersion = navigator.appVersion;
	if (navigator.userAgent.indexOf("Mac") == -1 && navigator.userAgent.indexOf("MSIE") != -1)
      window.showModelessDialog(pth,null,"dialogWidth=375px; dialogHeight:130px; center:yes");
	else 
      window.open(pth,'','width=370,height=115', true);
  return true;
}

function loadFileCopy(abRoot) {
	var el = document.getElementById("FileDialog");
	el.style.pixelTop = window.event.y - 140;
	el.style.pixelLeft = window.event.x - 50;	
	el.style.visibility="visible";
}

var getLookupResults = new Array();

function getDataResults(id,obj) {
	var sp = document.getElementById(id);
	var i;
	var qryObj = obj.result;
	var rc = qryObj.RECORDCOUNT;
	var conMnu = new Array();
	for (i=0;i<rc;i++) {
		txt = qryObj.DATA.OPTION_LABEL[i];
		conMnu[i] = new Array(txt,"setName('"+id+"','"+txt+"');");
	}
	if (rc == 1) {
		setName(txt);
	} else {
		if (rc == 0) conMnu[0] = new Array("No Matches","");
		addEvent(sp,"contextmenu", function(){showMenu(sp, conMnu, e);return false; }, true);
		sp.className = "txtInputFailed";
	}
}

function setName(id,txt) {
	var sp = document.getElementById(id);
	sp.value = txt;
	sp.setAttribute("value",txt);
	sp.className = "txtInputSuccess";
	var conMnu = new Array();
	sp.oncontextmenu = function () {
		//showMenu(sp, conMnu);
		return false;
	}
}				

function FormatField(fldObj) {
	var args = {};
	var fx = "";
	switch(fldObj.getAttribute("mask")) {
		case "usphone":
			args={varInput:fldObj.value,varMask:'us'};
			fx = 'FormatPhone';
		break;
		
	}
	MaskField(fldObj,args,fx);
}

function MaskField(fld,arg,fx) {
	getWebService('com.portalxm.courtreporter.util.format',fx,arg,null,'',function(obj){fld.value=obj.result;});
}

function setupFormHints(frmObj) {
	var fldObj;
	var hintFld;
	var req = false;
	for (x=0; x < frmObj.elements.length; x++) {
		fldObj = frmObj.elements[x];
		hintFld = fldObj.getAttribute('hint');
		addEvent(fldObj,"focus",function(e){showFormHint(e);});
		addEvent(fldObj,"blur",function(e){hideFormHint(e);});
	}	
}

function showFormHint(e) {
	var obj = (e.srcElement)?e.srcElement:e.target;
	var hintObj = $("XMHint");
	var hintText = obj.getAttribute("hint");
	var required = obj.getAttribute("required");
	var vtype = obj.getAttribute("vtype");
	var hint = "";
	if (hintObj) {
		hint += (hintText != null && hintText != "")?hintText+"<br>":"";
		//hint += (required != null && required != "" && (required == "true" || required == true))?"This field is required.<br>":"";
		if (hint != "") {
			hintObj.innerHTML = hint;
			showObj(obj,"XMHint","top",false);
		}
	}
}

function hideFormHint(obj) {
	hideObj("XMHint");
}

//START FORM SAVING CODE
function SubmitForm(frm) {
	var frmChk = frmValidCheck(frm);
	//no need to check if form is dirty (since we ARE submitting the form)
	checkBeforeLeaving = false;
	if (frmChk) frm.submit();
}

function setupForms() {
	var frms = document.forms;
	var frm,fldObj;
	//Add Div for tooltip hints
	var xmHint = document.createElement("DIV");
	xmHint.id = "XMHint";
	xmHint.style.backgroundColor = "#FFE479";
	xmHint.style.width = "auto";
	xmHint.style.padding = "5px";
	xmHint.style.display = "none";
	document.body.appendChild(xmHint);
	xmHint = null;
	for (var f=0;f<frms.length;f++) {
		frm = frms[f];
		//highlightRequired(frm);
		setupFormHints(frm);
		if (window.addEventListener) frm.addEventListener("submit",function(e){checkBeforeLeaving=false;},true);
		/*
		for (var e=0;e<frm.elements.length;e++) {
			fldObj = frm.elements[e];
			if (fldObj.getAttribute("mask") != null && fldObj.getAttribute("mask") != "") {
				if (window.attachEvent)
					fldObj.attachEvent("onblur",function(){FormatField(fldObj);});
			}
		}
		*/
	}
}

function checkForms() {
	var form;
	for (var f=0;f<document.forms.length;f++) {
		form = document.forms[f];
		if (checkBeforeLeaving && isFormChanged(form)) {
            return "You have attempted to leave this page.  If you have made any changes to the fields without clicking the Save button, your changes will be lost.  Are you sure you want to exit this page?";
		}
	}
}

var checkBeforeLeaving = true;
function isFormChanged(frmObj) {
	if (!checkBeforeLeaving) return false;
	var rtnVal = false; 
	try {
		var frm = (typeof(frmObj) == "undefined")?document.forms[0]:frmObj;
		var ele = frm.elements;
		for (var i=0; i < ele.length; i++ ) {
			if ((ele[i].type) && ele[i].type.length > 0 && isElementChanged(ele,i) && ele[i].name != "") {
				rtnVal = true;
				break;
			}
		}
	} catch(e){;}
	return rtnVal;
}

function isElementChanged( ele, i ) {
	var isEleChanged = false; 
	var elType = ele[i].type;
	if ((elType == "text" || elType == "hidden" || elType == "textarea") && ele[i].value != ele[i].defaultValue) return true;
	if ((elType == "radio" || elType == "checkbox") && ele[i].checked != ele[i].defaultChecked) return true;
	if (elType == "select-one" || elType == "select-multiple") {
		return false; //By Pass select boxes
		for ( var x =0 ; x <ele[i].length; x++ ) {
			if ( ele[i].options[ x ].selected != ele[i].options[ x ].defaultSelected ) 
				return true;
		}
	 }
	return false;
}

function frmRecord(fldObj) {
	if (fldObj.value != fldObj.defaultValue) {
		gFieldsChanged = gFieldsChanged+1;
	}
}

var checkBeforeLeaving = true;
function isFormChanged(frmObj) {
	if (!checkBeforeLeaving) return false;
	var rtnVal = false; 
	try {
		var frm = (typeof(frmObj) == "undefined")?document.forms[0]:frmObj;
		var ele = frm.elements;
		
		for ( i=0; i < ele.length; i++ ) {
			if ((ele[i].type) && ele[i].type.length > 0 ) {
				if ( isElementChanged( ele, i ) ) {
					if (ele[i].name != "") {
						rtnVal = true;
						break;
					}
				}
			}
		}
	} catch(e){;}
	return rtnVal;
}

function isElementChanged( ele, i ) {
	var isEleChanged = false; 

	switch ( ele[i].type ) { 
		case "text" : 
			if ( ele[i].value != ele[i].defaultValue ) return true;
			break;
		case "textarea" : 
			if ( ele[i].value != ele[i].defaultValue ) return true;
			break;
		case "radio" :
			val = "";
			if ( ele[i].checked != ele[i].defaultChecked ) return true;
			break;
		case "select-one" : 
			return false; //By Pass select boxes
			for ( var x =0 ; x <ele[i].length; x++ ) {
				if ( ele[i].options[ x ].selected != ele[i].options[ x ].defaultSelected ) 
					return true;
			}
		break;
		case "select-multiple" :
			return false; //By Pass select boxes
			for ( var x =0 ; x <ele[i].length; x++ ) {
				if ( ele[i].options[ x ].selected != ele[i].options[ x ].defaultSelected ) 
					return true;
			}
			break;
		case "checkbox" :
			if ( ele[i].checked != ele[i].defaultChecked ) return true;
		default:
			return false;
			break;
	}
}

if (document.all) {
	window.onbeforeunload = function(){if (!frmSubmit && isFormChanged()) return "Please save your changes before exiting";};
}
//END FORM SAVING CODE
//Check if form is dirty and add an event handler to prevent loss of data.
addEvent(window,"beforeunload",function(){checkForms();});
addEvent(window,"load",function(){setupForms();});