var formsGlobalsLoaded = 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 ItemsChecked = new Object();
var frmStr = new Object();

frmStr.formBeginMessage = "The following form field(s) were incomplete or incorrect.  Fields requiring input are highlighted in gray:";
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["phone"] = new Object();
frmStr["phone"].message = "must be a valid phone number (xxx-xxx-xxxx)";
frmStr["phone"].regex = /^(\d\d\d-)*\d\d\d-\d\d\d\d$/;

frmStr["fein"] = new Object();
frmStr["fein"].message = "must be a valid federal employer identification number (xx-xxxxxxx)";
frmStr["fein"].regex = /^(\d\d-)*\d\d\d\d\d\d\d$/;

frmStr["ssn"] = new Object();
frmStr["ssn"].message = "must be a valid social security number (xxx-xx-xxxx)";
frmStr["ssn"].regex = /^\d\d\d-\d\d-\d\d\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) {
	ItemsChecked = new Object();
	var x = frmObj.elements.length;
	if (frmObj.getAttribute("validate") == "false") return true;
	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");
		if (vType != null && vType.toLowerCase() == 'numeric') { fldObj.value = fldObj.value.replace(/,/g,"");	}				
		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\">We didn't correctly capture your response to the following item(s). Please click on the link below or if you prefer, scroll to see items marked with <img src='/lib/img/icon/error.gif' align='absmiddle'>. Many thanks!</div><br><br>"
		for (var v=0;v<invalidFields.length;v++) { 
			fldIcon = $("ValImg"+invalidFields[v].field);
			if (fldIcon) fldIcon.src = "/lib/img/icon/error.gif";;
			validationMessageJS += unescape(invalidFields[v].message) + "\n";
			validationMessageHTML += "<div class=\"invalidFieldMessage\" onclick=\"frmNavigate('"+invalidFields[v].field+"');\" onmouseover=\"this.className='invalidFieldMessageHL';\" onmouseout=\"this.className='invalidFieldMessage';\">"+unescape(invalidFields[v].message) + "</div>";
		}
		validationMessageJS += "\n"+frmStr.formEndMessage;
		validationMessageHTML += "<br>"+frmStr.formEndMessage;

		var vObj = $("ValidationMessages");
		if (vObj) {
			alert("Oops!  We found some errors.  \n\nPlease click OK to review them.");
			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) {
	try {
		var docImg = document.getElementById("ReqImg"+fldObj.name);
		if (docImg) docImg.src =  (flag)?"/lib/img/icon/asterisk.gif":"/lib/img/clear.gif";
	} catch(e) {;}
	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 = $("XMBubbleHintText");
	var hintText = obj.getAttribute("hint");
	var hintLabel = obj.getAttribute("vlabel");
	var required = obj.getAttribute("required");
	var vtype = obj.getAttribute("vtype");
	obj.className = obj.className.replace("Focus","");
	obj.className = obj.className+"Focus";
	var hint = "";
	if (hintObj) {
		hint += (hintText != null && hintText != "")?"<h3>"+unescape(hintLabel)+"</h3>"+"<p>"+hintText+"</p>":"";
		//hint += (required != null && required != "" && (required == "true" || required == true))?"This field is required.<br>":"";
		if (hint != "") {
			hintObj.innerHTML = hint;
			showObj(obj,"XMBubbleHint","right",false);
		}
	}
}

function hideFormHint(e) {
	var obj = (e.srcElement)?e.srcElement:e.target;
	hideObj("XMBubbleHint");
	obj.className = obj.className.replace("Focus","");
}

//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 XMBubbleHint = document.createElement("DIV");
	XMBubbleHint.id = "XMBubbleHint";
	XMBubbleHint.className = "BubbleTooltip";
	
	var XMBubbleHintContent = document.createElement("DIV");
	XMBubbleHintContent.className = "BubbleTooltipContent";
	XMBubbleHint.appendChild(XMBubbleHintContent);
	
	var XMBubbleHintContentArr = document.createElement("DIV");
	XMBubbleHintContentArr.className = "BubbleTooltipArrow";
	XMBubbleHintContent.appendChild(XMBubbleHintContentArr);

	var XMBubbleHintContentCB = document.createElement("DIV");
	XMBubbleHintContentCB.className = "BubbleTooltipClosebox";
	XMBubbleHintContentCB.setAttribute("title","Close");
	XMBubbleHintContentCB.onclick=function(){this.parentNode.parentNode.style.display="none"};
	XMBubbleHintContent.appendChild(XMBubbleHintContentCB);
	
	var XMBubbleHintContentTxt = document.createElement("SPAN");
	XMBubbleHintContentTxt.id = "XMBubbleHintText";
	XMBubbleHintContent.appendChild(XMBubbleHintContentTxt);
	
	/*
	var XMBubbleHint = document.createElement("DIV");
	XMBubbleHint.id = "XMBubbleHint";
	XMBubbleHint.style.backgroundColor = "#FFE479";
	XMBubbleHint.style.width = "auto";
	XMBubbleHint.style.padding = "5px";
	*/
	document.body.appendChild(XMBubbleHint);
	XMBubbleHint = null;
	for (var f=0;f<frms.length;f++) {
		frm = frms[f];
		//highlightRequired(frm);
		setupFormHints(frm);
		addEvent(frm,"submit",function(e){checkBeforeLeaving=false;});
		/*
		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; 
	
	//Check to see if this the hidden field for the FCKEditor
	var elId = ele[i].getAttribute("id");
	try {
		if (ele[i].type == "hidden" && document.getElementById(elId+"___Frame")) {
			var oEditor = FCKeditorAPI.GetInstance(elId) ;
			if (oEditor.IsDirty()) return true;
		}
	} catch(e){;}

	switch ( ele[i].type ) { 
		case "text" : 
			if ( ele[i].value != ele[i].defaultValue ) return true;
			break;
		case "hidden" : 
			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;
	}
}

function xmform_toggleimg(selector) {

	var selectorobjids = selector.id.split("___");		
	var selectorobjdynRowIds = selector.id.split("_");			
	var selectorobjdynRowId = selectorobjdynRowIds[selectorobjdynRowIds.length-1];
	if (!isNaN(selectorobjdynRowId))	//check if is a dynamic row. Lame test
		selectorobjdynRowId = '_'+ selectorobjdynRowId;
	else 
		selectorobjdynRowId = '';
		
	var selectorobj = document.getElementById(selectorobjids[0]+selectorobjdynRowId);
	var images = selector.imageslist.split(',');

	for (var i=0; i < images.length; i++) {	//I would like to allow for more than just on or off for the toggle
		if (selector.src.indexOf(images[i]) > -1)
			break;
	}
	
	if (i==0) //it is unchecked, so we make this the newly selected radio
	{
		selectorobj.value = selector.on;
		selector.src = images[1];
		var rows = selectorobjids[2].split('_');
		
		for (var x=0; x < 10; x++) { //assume no more than 10 sibling objects
			if (selectorobjids[2].indexOf('radioselector' + x+'_' + rows[1]) == -1 ) {
				var elementId = selectorobjids[0]+'___' + selectorobjids[1] +'___radioselector' + x + '_' + rows[1];
				var otherselectorobj = document.getElementById(elementId);
				if (!otherselectorobj)
					break;
				otherselectorobj.src = images[0];
			}
		}
	}

}


//END FORM SAVING CODE
//Check if form is dirty and add an event handler to prevent loss of data.

window.onbeforeunload = function(){
	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?";
		}
	}
};

if (!formsGlobalsLoaded) {
	addEvent(window,"load",function(){setupForms();});
	formsGlobalsLoaded = true;
}