// Forms must have a name, the name must be the same in iEmailManager unless it doesn't use emailsave.asp.
// Make sure you have the DBO library in emailsave.asp or the page sending the email.
// You must have xmlString()
// Submit button must have id="submit" (double-clicking submit button fix)
// The Required attribute is case sensitive - The R must be uppercase

function validateTextSize(element,size)
{
  if (element.value.length > size)
  {
    alert("You have exceeded " + size + " characters, which is the maximum number of characters allowed for this field.");
	element.focus();
	return false;
  }
  
  return true;
}

function is_email_valid(inemail){
			invalidChars = "/:,;";
			for(i=0; i<invalidChars.length; i++){
				badChar = invalidChars.charAt(i);
				if(inemail.indexOf(badChar,0) != -1){
				return true;
				}
			}
			atPos = inemail.indexOf("@", 1);
			if (atPos == -1){
				return true;
			}
			if(inemail.indexOf("@", atPos+1) != -1){
					return true;
			}
			periodPos = inemail.indexOf(".", atPos);
			if(periodPos == -1){
					return true;
			}
			if(periodPos+3 > inemail.length){
					return true;
			}
			return false;
		}
		
function formatMask( obj, evnt, enforceSize, mask ) {
    if(!obj) return;
    if(!document.all&&evnt.type!='blur')return;
    var isBlur = false;
    if( evnt ) {
      isBlur = evnt.type=='blur';
      //if( isBlur && obj.iMaskDone==true) return;            // don't need to check on blur if already done.
      if( evnt.type=='keyup' ) {                            // ignore normal navigation keys.
        if( isNavigationKey(evnt.keyCode, evnt.shiftKey) ) return;
      }
    }
    //obj.iMaskDone = false;                                  // reset mask validation status
    //sMask = mask ? mask: (obj.iMask?obj.iMask:"");          // use supplied mask, object mask or no mask.
    sMask = mask;
    var maxsize = (sMask.length>0 && sMask.length <= obj.maxLength) ? sMask.length : obj.maxLength;
    var minsize = (sMask.length>0 && sMask.length <= maxsize) ? maxsize : 1;
    if( sMask.length>0 ) {                                  // check mask.
      if( obj.value.length > sMask.length ) 
          obj.value = obj.value.slice(0,sMask.length);      // remove extra characters.
      for( i=0; i<sMask.length; i++ ) {
        if( i<obj.value.length ) {
          if( !isNaN(sMask.charAt(i)) && sMask.charAt(i)!=' ' ) { // mask character is a digit.
            if( isNaN( obj.value.charAt(i) )
                || obj.value.charAt(i) > sMask.charAt(i))   // input must be a digit less than mask digit.
              obj.value = obj.value.substring(0,i) + obj.value.substring(i+1);
          }
          else if( sMask.charAt(i) != obj.value.charAt(i) ) // add mask characters if not present.
            obj.value = obj.value.substring(0,i) + sMask.charAt(i) + obj.value.substring(i);
        }
      }
    }
    if( obj.value.length==maxsize ) {                       // goto next field if mask size reached.
      //obj.iMaskDone = true;                                 // set mask status to prevent blur from checking.
      if(!isBlur) focusNext(obj);                           // don't set focus if already going somewhere.
    }
    else if( enforceSize ) {// check entered size, usually only on blur.
      if(obj.value.length > 0 && obj.value.length < minsize ) {
        alert( "Partial data not permited. \nSize required is "+minsize + "\n mask: "+sMask );
        obj.focus();                                        // refocus to offending object.
      }
    }
  }
  
function isNavigationKey( keyCode, shifted ) {
    if( !shifted ) {
      var keyList = [0,9,16,17,18,33,34,35,36,37,38,39,40,45];
      var index = 0;
      while( index < keyList.length) {
        if(keyList[index] == keyCode) return true;
        index++;
      }
    }
    return false;
}
  
function focusNext(obj) {
    if( !obj ) return;
    var index = -1, i = 0;
    while (i < obj.form.length && index == -1) {
      if (obj.form[i] == obj) index = i;
      else i++;
    }
    if( ++i < obj.form.length && ( obj.form[i].tabIndex<0 || obj.form[i].type=="hidden" || obj.form[i].style.display=="none") ){
      obj.form[ i % obj.form.length].focus();
    }
}
function LTrim (strValue) {
	return strValue.replace(/^\s*/,"");
}
function RTrim (strValue) {
	return strValue.replace(/\s*$/,"");
}
function Trim(strValue) {
	return RTrim(LTrim(strValue));
}
function HighlightInvalid(objEle) {
	if (objEle.style) {
		objEle.style.background="#d3d3d3";
		objEle.style.border = 'solid medium red';
	} else {
		alert('The element ' + objEle.name + ' is required.');
	}

}
function UnHighlightInvalid(objEle) {
	if (objEle.style) {
		objEle.style.background="white";
		objEle.style.border = 'inset thin';
	}
}
function ValidateElement(objEle) {
var blnProblem;

	switch(objEle.type.toLowerCase()) {
		case 'text':
		case 'textarea':
		case 'password':
			//check if it's the email field and validate its an email address.
			if (objEle.name == "email") {
				inemail = objEle.value;
				blnProblem = is_email_valid(inemail);
				} else {
						objEle.value=Trim(objEle.value);
						blnProblem = (objEle.value=="");
				}
//alert('objEle.name:' + objEle.name + ' Problem:' + blnProblem);			
		break;
		case 'select-one':
		 if (objEle.options[objEle.selectedIndex].value == 'Select One' || objEle.options[objEle.selectedIndex].value == '')
		   { alert('How did you hear about us is required.'); }
			 blnProblem = (objEle.value=="");
		break;
		default:
		break;
	}
	if (blnProblem==true) {
		HighlightInvalid(objEle);
	} else if (blnProblem==false) {
		UnHighlightInvalid(objEle);
	}
	return blnProblem;
}


function ValidateForm(objForm) {
var i;
var a;
var objEle;
var blnProblem = false;
var blnReturn = true;
var checkFound = false; //ejm 4-11-06 
var objFirstControl;

	for (i=0; i< objForm.length; i++) {
	
		objEle = objForm.elements[i];
		if (objEle.Required=="true") 
		  { blnProblem = ValidateElement(objEle); }			
		
		//firefox fix ejm 4-11-06 
		for (a=0; a< objEle.attributes.length; a++) { 
		  if ((objEle.attributes[a].name=="required") && (objEle.attributes[a].value=="true"))
			{ blnProblem = ValidateElement(objEle); }	
		}
		
		if (blnProblem==true) 
		  {
			blnReturn = false;
			objFirstControl = (objFirstControl?objFirstControl:objEle);
		  }					
	}  
	
	if (objFirstControl) {
		//objFirstControl.focus();
	}
	
	if (blnReturn==true)
	{ document.getElementById("submit").disabled=true;}

	buildXML(objForm,objForm.xmlString)
	return blnReturn;
}


function buildXML(oForm, xmlInput)
{
  var y = 0;
  var XMLString = "<records>"
  XMLString += "<table>" + oForm.name + "</table>";
  XMLString += "<record>";
  
  for( i = 0; i < oForm.elements.length; i++ ) 
  {
    var oField = oForm.elements[i];

	//First test for Utility fields (submit, reset, subject, etc)  
    if (oField.type!="submit"&&oField.type!="reset"&&oField.name!="subject"&&oField!=xmlInput)
    {
	
	  //Build the nodes
		switch( oField.type )
		{
		  //text, textarea or hidden field 
		  case 'text':
			case 'textarea':
			case 'hidden':
		    XMLString += "<action>new</action>";
    		  XMLString += "<data>";
    		    XMLString += "<" + oField.name + " fieldname='" + oField.name + "'";
			      //Test for something???	
              if(oField.name.indexOf('RequestId')>-1)
              {
   		          XMLString += " isauto = 'True' isprimary='True'";
              }
			      XMLString += " ischanged='True'>";
                XMLString += "<![CDATA[";
							  //start value 
			          XMLString += oField.value.replace(/\'/g,"''"); 
								//end value 
                XMLString += "]]>";
		 	    XMLString += "</" + oField.name + ">";
          XMLString += "</data>";
			  break;
				
			//select one drop down	
			case 'select-one':
		    XMLString += "<action>new</action>";
    		  XMLString += "<data>";
    		    XMLString += "<" + oField.name + " fieldname='" + oField.name + "'";
			      //Test for something???	
              if(oField.name.indexOf('RequestId')>-1)
              {
   		          XMLString += " isauto = 'True' isprimary='True'";
              }
			      XMLString += " ischanged='True'>";
                XMLString += "<![CDATA[";
							  //start value 
							  XMLString += (oField.options)?oField.options[oField.selectedIndex].value:"";
								//end value 
	            XMLString += "]]>";
		 	    XMLString += "</" + oField.name + ">";
          XMLString += "</data>";		  
				break;
				
			//select multiple drop down
			case 'select-multiple':
		    XMLString += "<action>new</action>";
    		  XMLString += "<data>";
    		    XMLString += "<" + oField.name + " fieldname='" + oField.name + "'";
			      //Test for something???	
              if(oField.name.indexOf('RequestId')>-1)
              {
   		          XMLString += " isauto = 'True' isprimary='True'";
              }
			      XMLString += " ischanged='True'>";
                XMLString += "<![CDATA[";		
							  //start value 
								for (k = 0; k < oField.options.length; k++)
						    {
						      if (oField.options[k].selected == true)							
							    { 
								    XMLString += (oField.options)?oField.options[k].value:"";
						        XMLString += ", "
							    }
						    }								
								//end value 
	            XMLString += "]]>";
		 	    XMLString += "</" + oField.name + ">";
          XMLString += "</data>";			
			  break;
			
			//checked radio button
			case 'radio':
			  if (oField.checked==true)
				{
		      XMLString += "<action>new</action>";
    		    XMLString += "<data>";
    		      XMLString += "<" + oField.name + " fieldname='" + oField.name + "'";
			        //Test for something???	
                if(oField.name.indexOf('RequestId')>-1)
                {
   		            XMLString += " isauto = 'True' isprimary='True'";
                }
			        XMLString += " ischanged='True'>";
                  XMLString += "<![CDATA[";		
							    //start value 
                    XMLString += (oField.value);		
								  //end value 
	              XMLString += "]]>";
		 	      XMLString += "</" + oField.name + ">";
            XMLString += "</data>";	
				}		
			  break;			
			
			//checked checkboxes	
			case 'checkbox':
			  //get current field name - ejm 12/2/2005 
			  currentfield = oField.name; 
				y = y + 1;
				
				// check to see if different checkbox group, if yes, reset counter to 1 - ejm 12/2/2005
				if (prevfield != currentfield)
				  { y = 1; }
	
				//total checkboxes with same name
				ttl = oForm.elements[oField.name].length
				if (ttl == undefined) {ttl = 1;}
				
				//debug 
				//alert ('y: ' + y + '\nTotal: ' + ttl + '\nPrev Field: ' + prevfield + ' Current Field: ' + currentfield);
				
				if (y == 1) //first checkbox, open tags
				{
				  XMLString += "<action>new</action>";
					XMLString += "<data>";
    		        XMLString += "<" + oField.name + " fieldname='" + oField.name + "'";
			        //Test for something???	
                if(oField.name.indexOf('RequestId')>-1)
                {
   		            XMLString += " isauto = 'True' isprimary='True'";
                }
			        XMLString += " ischanged='True'>";
						  XMLString += "<![CDATA[";	
				}
				
				if (oField.checked == true) //if checked, write value
				{					
					    //start value 
							  XMLString += oField.value.replace(/\'/g,"''") + ", ";					
						  //end value 
				}		
						
				if (y >= ttl) //if last field, close tags
					{
	            XMLString += "]]>";
		 	        XMLString += "</" + oField.name + ">";
              XMLString += "</data>";
					}
          break;			
		}//end switch

    }//close if 
	
	   //get the previous field name to compare with checkbox group
	   prevfield = oField.name; 
	
  }//close for
 
  // close record tags   
  XMLString += "</record>"
  XMLString += "</records>"; 

  // what is this??
  if(xmlInput)
   {
     xmlInput.value = XMLString;	
   }
  //used for testing the string; comment out for production   
  //alert(XMLString);
   
  return true;
  
}//end buildXML
