/*	
	*******************************************************************************************
	(C)2002 Peopleclick, Inc.  All Rights Reserved
	*******************************************************************************************
*/

var CONST_TEXTBOX=1;
var CONST_QUERYBOX=2;
var CONST_TEXTAREA=3;
var CONST_CHECKBOX=4;
var CONST_COMBOBOX=5;
var CONST_LISTBOX=6;
var CONST_DATECONTROL=7;
var CONST_USPHONE=10;  
var CONST_USPHONE_EXT=11; 
var CONST_GLOBALPHONE=14;
var CONST_YEARMONTH=15; 
var CONST_NC=16;

var ValidDateStr  = "0123456789";  
//var ValidDateStr  = "0123456789";
	                                             
//GUI Data formats
var CONST_SHORT_DATE_FORMAT=/^\d{2}[\-\/]\d{2}[\-\/]\d{2}$/
var CONST_NO_FORMAT_FORMAT=/.*/
var CONST_TEXT_FORMAT=/.*/
var CONST_TEXT_LONG_FORMAT=/.*/
//var CONST_USCURRENCY_FORMAT=/^\d*$|^\d*\.\d{2}$/
var CONST_USCURRENCY_FORMAT= /^\${1}[\d]{1,3}([\,]{1}[\d]{3})*[\.]{1}[\d]{2}$|^\${1}[\d]{1,3}([\,]{1}[\d]{3})*$|^[\d]{1,3}([\,]{1}[\d]{3})*[\.]{1}[\d]{2}$|^[\d]{1,3}([\,]{1}[\d]{3})*$|^\d*$|[\.]{1}[\d]{2}$|^\${1}\d*$/
var CONST_BOOLEAN_FORMAT=/^\btrue|\bfalse|\byes|\bno/i
var CONST_INTEGER_FORMAT=/^\d*$/
var CONST_LONG_FORMAT=/^\d*$/
var CONST_AREACODE_FORMAT=/^\d{3}$/
var CONST_PHONEEXT_FORMAT=/\D/
var CONST_PHONE_FORMAT=/^(\d{3}-\d{4}|\d{7})$/
var CONST_REAL_FORMAT=/^\d*$|^\d*\.\d*$/
var CONST_PERCENT_FORMAT=/^\d*$|^\d*\.\d*$/
var CONST_LONG_DATE_FORMAT=/^\d{2}[\-\/]\d{2}[\-\/]\d{4}\s\d{2}:\d{2}:\d{2} pm|PM|am|AM$/
var CONST_TEXT_DATE_FORMAT=/^january|february|march|april|may|june|july|august|september|october|november|december\s\d{2},\s\d{4}$/i
//var CONST_YES_NO_BIT_FORMAT=/^\btrue|\bfalse|\byes|\bno$/

var CONST_USER_SHORT_DATE_FORMAT="MM/DD/YYYY";
var CONST_USER_USCURRENCY_FORMAT="$#,###.##";
var CONST_USER_BOOLEAN_FORMAT="True/False";
var CONST_USER_INTEGER_FORMAT="#,###";
var CONST_USER_LONG_FORMAT="###,###";
var CONST_USER_REAL_FORMAT="#,#.##";
var CONST_USER_LONG_DATE_FORMAT="##/##/#### ##:##:## am/pm";
var CONST_USER_YES_NO_BIT_FORMAT="Yes/No";
var CONST_USER_NO_FORMAT_FORMAT="ANY TEXT";
var CONST_USER_TEXT_FORMAT="ANY TEXT";
var CONST_USER_TEXT_LONG_FORMAT="ANY TEXT";
var CONST_USER_TEXT_DATE_FORMAT="MONTH DD, YYYY"

var NAV_DIR_FWD = "FWD";
var NAV_DIR_BACK = "BACK";
var NAV_DIR_FINISH = "FINISH";
var NAV_DIR_CANCEL = "CANCEL";
var NAV_DIR_UPDATE = "SUBMIT";
var NAV_DIR_PREVIEW = "PREVIEW";
var NAV_DIR_GO_PAGE = "GO";

var NAV_DIR_SUBMIT = "SUBMIT";
var NAV_DIR_ADD_MULTI = "ADD_MULTI";
var NAV_ADD_MULTI = "ADD_MULTI";
var NAV_ADD_CERTIF = "ADD_CERTIF";
var NAV_ADD_EDU = "ADD_EDU";
var NAV_ADD_SKILL = "ADD_SKILL";
var NAV_ADD_PROF = "ADD_PROF";
var NAV_ADD_REF = "ADD_REF";
var NAV_ADD_EMPL = "ADD_EMPL";


var MISSING_RESUME_FILE = "RESUME_ERROR"

//~ VARIABLE DECLARATIONS FOR VALIDATION 
var defaultEmptyOk = false;
var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
// whitespace characters
var whitespace = " \t\n\r";
// decimal point character differs by language and culture
var decimalPointDelimiter = "."
// non-digit characters which are allowed in phone numbers
var phoneNumberDelimiters = "()- ";
// characters which are allowed in US phone numbers
var validUSPhoneChars = digits + phoneNumberDelimiters;
// characters which are allowed in international phone numbers
// (a leading + is OK)
var validWorldPhoneChars = digits + phoneNumberDelimiters + "+";
// non-digit characters which are allowed in 
// Social Security Numbersvar INVALID_POSINTEGER_TYPE	 = "You must enter a valid positive integer value for field ";

var SSNDelimiters = "- ";
// characters which are allowed in Social Security Numbersvar INVALID_POSINTEGER_TYPE	 = "You must enter a valid positive integer value for field ";

var validSSNChars = digits + SSNDelimiters;
// U.S. Social Security Numbers have 9 digits.
// They are formatted as 123-45-6789.
var digitsInSocialSecurityNumber = 9;
// U.S. phone numbers have 10 digits.
// They are formatted as 123 456 7890 or (123) 456-7890.
var digitsInUSPhoneNumber = 10;
// non-digit characters which are allowed in ZIP Codes
var ZIPCodeDelimiters = "-";
// our preferred delimiter for reformatting ZIP Codes
var ZIPCodeDelimeter = "-"
// characters which are allowed in Social Security Numbers
var validZIPCodeChars = digits + ZIPCodeDelimiters
// U.S. ZIP codes have 5 or 9 digits.
// They are formatted as 12345 or 12345-6789.
var digitsInZIPCode1 = 5
var digitsInZIPCode2 = 9
//~ END VAR DECLARATIONS  FOR VALIDATION

var gbFieldInFocus = false;

function fnNavRB(psPageNumber){

	if(document.frmSubmit.RB_MODE.value == 'RB_NEW'){
		return ;
	}else{
		if(confirm(CONFIRM_NAVIGATION)){
			runForm('GO', psPageNumber);
		}	
	}
}

function fnSubmitExpress(psGoPage){
		 var sResumeID = "";
	if(controlExists("frmSubmit","OLA_SAVED_RESUMES")) {
		sResumeID = getComboValue('frmSubmit', 'OLA_SAVED_RESUMES');
		//alert(sResumeID);
		if (sResumeID == MISSING_RESUME_FILE){
				 alert(RESUME_NOT_FOUND);
				 document.frmSubmit.OLA_SAVED_RESUMES.focus();
				 return ;
		}
		else{
				 if(document.frmSubmit.OLA_SAVED_RESUMES.value != ''){
				 		document.frmSubmit.FRM_ACTION.value = "EXPRESS"
						document.frmSubmit.PAGE_SEQUENCE.value = parseInt(document.frmSubmit.CURRENT_PAGE.value,10) + ','+psGoPage;   
						document.frmSubmit.PAGE.value = psGoPage
						document.frmSubmit.submit();
				}else{
						alert(SELECT_RESUME);	
					}
	  }
	}
}

function fnRefineSearch(){

	document.frmSubmit.action = "JobSearch.xml"
	document.frmSubmit.submit();
}


function fnClearSearch(){

   if(screenForm.clearForm()== false) {
      return false;
   }
   else {
      return true;
   }     
}

function fnSaveQuestionnaire() {
	if(questionnaire.saveQuestionnaire())
		document.frmSubmit.submit();
}


function fnSaveVisionPanel(){
      document.frmSubmit.action = "SubmissionRequestEdit.xml";
      document.frmSubmit.FRM_ACTION.value = "SUBMIT";
      document.frmSubmit.submit();

}


function goToRB(psPageToReturnTo){
	document.location = 'ResumeBuilder.xml?FRM_ACTION=UPDATE&RB_MODE=OLA&RETURN_URL=ResumeSubmission.xml?Page='+psPageToReturnTo+'&PAGE_SEQUENCE='+parseInt(document.frmSubmit.PAGE_SEQUENCE.value,10)+','+psPageToReturnTo;
}

/*
These navigation options should only appear on the OLA for the job post questionnaire screen.
*/
function runQuestForm(psDirection, psSecondParam) {
   var sRet, lGoToPage, sTmp, sQList, lQListNum;
    
   document.frmSubmit.NAV_DIRECTION.value = psDirection;
   // find out where we are within the list of questionnaires
   sTmp = document.frmSubmit.QUEST_FULL_LIST.value;
   sQList = sTmp.split('|');
   lQListNum = -1;
   for(var i=0;i<sQList.length;i++) {
      if(document.frmSubmit.QUEST_CURRENT_ID.value == parseInt(sQList[i])) {
         lQListNum = i;
         break;
      }
   }

   // default is to stay on questionnaire page
   lGoToPage = parseInt(document.frmSubmit.CURRENT_PAGE.value, 10);
	switch(psDirection) {
   case "FWD":
      sRet = questionnaire.validateQuestionnaire("frmSubmit");
      if(sRet == '')
         return false;
      else {
         // are there more questionnaires to show?
         if(lQListNum >= 0) {
            if(lQListNum + 1 >= sQList.length) lGoToPage += 1;
         }
         else
            lGoToPage += 1;

         document.frmSubmit.questXML.value = "<QUESTIONNAIRE id=\"" + questionnaire.id + "\"><SESSIONID/>" +
            "<CREATEDON/><MODIFIEDON/><SESSION_RESULTS>" + sRet + "</SESSION_RESULTS></QUESTIONNAIRE>";
      }
      break;
		
   case "BACK":
      // are there more questionnaires to show?
      if(lQListNum >= 0) {
         if(lQListNum - 1 < 0) lGoToPage -= 1;
      }
      else
         lGoToPage -= 1;
      break;

   default:
      return false;
      break;
	}

   document.frmSubmit.PAGE.value = lGoToPage;
	document.frmSubmit.submit();
}

function runForm(psDirection, psSecondParam){
	
   document.frmSubmit.NAV_DIRECTION.value = psDirection;
	switch(psDirection)
	{
		case "FWD":
		  	if(screenForm.validateForm()== false) {
				 return false;
			}
			else
				document.frmSubmit.PAGE.value = parseInt(document.frmSubmit.CURRENT_PAGE.value, 10) + 1;			
			break;
	
		case "BACK":
			if(screenForm.validateForm()== false)
				return false;
			else	  {
				//document.frmSubmit.FRM_ACTION.value = psDirection;
				document.frmSubmit.PAGE.value = parseInt(document.frmSubmit.CURRENT_PAGE.value, 10) - 1;

			}
						break;
		
		case "FINISH":
			if(screenForm.validateForm()== false){
				return false;
			}else{
				if (window.event) {
					window.event.srcElement.disabled = true;
				} 
				document.frmSubmit.PAGE.value = parseInt(document.frmSubmit.CURRENT_PAGE.value, 10) + 1;
				document.frmSubmit.FRM_ACTION.value = psDirection;
			}
			break;
		case "GO":
		
			document.frmSubmit.PAGE.value = parseInt(psSecondParam,10)
			document.frmSubmit.FRM_ACTION.value = psDirection
			break;
		
		case "CANCEL":
			
			var psReturnURL = "";
			if(document.frmSubmit.RETURN_URL){	
				if(document.frmSubmit.RETURN_URL.value !=''){
					document.location = document.frmSubmit.RETURN_URL.value
					return;
				}
			}
			
			document.frmSubmit.FRM_ACTION.value = psDirection;
		break;
		
		case "NAVIGATE":
			document.location = psSecondParam
			return;

		case "PREVIEW":
			document.frmSubmit.PAGE.value = parseInt(document.frmSubmit.CURRENT_PAGE.value, 10) + 1;
			document.frmSubmit.FRM_ACTION.value = psDirection;
			break;
			
		case "ADD_MULTI":
			document.frmSubmit.FRM_ACTION.value = NAV_DIR_ADD_MULTI;
			document.frmSubmit.FRM_ACTION_MULTI.value = psSecondParam;
		break;
		
		case "SUBMIT":
			
			if(screenForm.validateForm()==false)
					return false;
			else
				document.frmSubmit.FRM_ACTION.value = psDirection;
									
			break;
		case "SEND":
			if(screenForm.validateForm()==false){
				return false;
			}else{
				document.frmSubmit.FRM_ACTION.value = psDirection;
				document.frmSubmit.PAGE.value = parseInt(document.frmSubmit.CURRENT_PAGE.value, 10) + 1;
			}
			break;
			
		case "SAVE":
			if(screenForm.validateForm()==false)
				return false;
			else
				document.frmSubmit.FRM_ACTION.value = psDirection;

			break;
		case "PWD_STEP1":
			if(screenForm.validateForm()==false){
				return false;
			}else{
				document.frmSubmit.FRM_ACTION.value = psDirection
				document.frmSubmit.PAGE.value = parseInt(document.frmSubmit.CURRENT_PAGE.value, 10) + 1;
			}
			break;
		
		default:
			document.frmSubmit.FRM_ACTION.value = psDirection;
			break;
	}
	document.frmSubmit.submit();
}

function previewResume(sForm){
				 
	var sResumeID = "";
		 switch(sForm){
		    case "HOME_PAGE":
				sResumeID = getComboValue('frmSubmit', 'MY_SAVED_RESUME');	
				if(sResumeID == '' || sResumeID == null){
						alert(SELECT_RESUME);
						document.frmSubmit.MY_SAVED_RESUME.focus();
						return ;
				}
				sResumeID = getComboValue('frmSubmit', 'MY_SAVED_RESUME');
				
				break;
				default:
				if(document.frmSubmit.RB_MODE.value =='OLA'){
						sResumeID = "TEMP_RESUME"
			}	else{
				sResumeID = document.frmSubmit.MY_SAVED_RESUME.value;		
			}
			break;
			}
			//alert(sResumeID);
			if (sResumeID == MISSING_RESUME_FILE){
				 alert(RESUME_NOT_FOUND);
				 document.frmSubmit.MY_SAVED_RESUME.focus();
				 return ;
			}
			else{
					 // open a new window with the resume in it.
					 var sFeatures = "menubar=no,resizable=yes,titlebar=no,toolbar=no,file=no,status=yes,scrollbars=yes,width=675px,height=600px"
					 var sURL = 'ResumePreview.xml?MY_SAVED_RESUME='+ sResumeID
			
					 var sret = window.open(sURL, 'RES_WINDOW',sFeatures);
					 sret.focus();
			}
	
}


function saveProfile(psAction){
	document.frmSubmit.FRM_ACTION.value = "UPDATE"
	document.frmSubmit.submit();
}

function mySearchAgents(psAction){
	
	var svalue = '';
	svalue = getComboValue('frmSubmit', 'MY_SAVED_JOB_AGENT');
	
	if(psAction == 'RUN' || psAction == 'EDIT' || psAction == 'DELETE'){
		if(svalue == '' || svalue == null){
			alert(SELECT_JOB_AGENT);
			document.frmSubmit.MY_SAVED_JOB_AGENT.focus();
			return ;
		}
		if(psAction == 'DELETE'){
			if(!confirm(CONFIRM_DELETE_JOB_AGENT)){
				return;
			}
		}
	}
	document.frmSubmit.REDIRECT_URL.value = 'JobAgentManage.xml';
	document.frmSubmit.method.value = 'GET';
	document.frmSubmit.action.value = 'JobAgentManage.xml';
	document.frmSubmit.FRM_ACTION.value = psAction;
	document.frmSubmit.submit();
}

function myDocuments(psAction){
	if(psAction == 'DOWNLOAD' || psAction == 'DELETE'){
		if(document.frmSubmit.MY_SAVED_DOCUMENT.value == '' || document.frmMyDocuments.MY_SAVED_DOCUMENT.value == null){
			alert(SELECT_RESUME);
			document.frmSubmit.MY_SAVED_DOCUMENT.focus();
			return;
		}
		document.frmSubmit.FRM_ACTION.value = psAction;
		document.frmSubmit.submit();
	}
}
function myResumes( psAction ){
			var sResumeID = "";
			sResumeID = getComboValue('frmSubmit', 'MY_SAVED_RESUME');
			
			if (sResumeID == MISSING_RESUME_FILE && psAction != 'NEW'){
				 alert(RESUME_NOT_FOUND);
				 document.frmSubmit.MY_SAVED_RESUME.focus();
				 return ;
			}
			else {
				 if ( confirmResumeAction( psAction ) ) {
				 setResumeForm( );
				 submitResumeForm( psAction );
				 }
			}

}

function myHomeResumes( psAction ) {
			var sResumeID = '';
			sResumeID = getComboValue('frmSubmit', 'MY_SAVED_RESUME');	
			
			if(psAction == 'VIEW' || psAction == 'EDIT' || psAction == 'DELETE' || psAction=='COPY'){
				if(sResumeID == '' || sResumeID == null){
					alert(SELECT_RESUME);
					document.frmSubmit.MY_SAVED_RESUME.focus();
					return false;
				}
				if(psAction == 'DELETE'){
					if(!confirm(CONFIRM_DELETE_RESUME)){ document.frmSubmit.REDIRECT_URL.value = 'ResumeManage.xml';
					
						return false;
					}
				}
				if(psAction == 'COPY'){
					if(!confirm(CONFIRM_COPY_RESUME)){
						return false;
					}
				}		
			}
			
		  	//document.frmSubmit.REDIRECT_URL.value = 'HomePage.xml';
  			submitResumeForm( psAction );
			return true;



 }

function confirmResumeAction( psAction ) {
	var sResumeID = '';
	sResumeID = getComboValue('frmSubmit', 'MY_SAVED_RESUME');	

	if(psAction == 'VIEW' || psAction == 'EDIT' || psAction == 'DELETE' || psAction=='COPY'){
	 if(sResumeID == '' || sResumeID == null){
		 alert(SELECT_RESUME);
		 document.frmSubmit.MY_SAVED_RESUME.focus();
		 return false;
	 }
	 if(psAction == 'DELETE'){
		 if(!confirm(CONFIRM_DELETE_RESUME)){ document.frmSubmit.REDIRECT_URL.value = 'ResumeManage.xml';

			 return false;
		 }
	 }
	 if(psAction == 'COPY'){
		 if(!confirm(CONFIRM_COPY_RESUME)){
			 return false;
		 }
	 }		
	}
	
	return true;
}
function setResumeForm( ) {
	document.frmSubmit.REDIRECT_URL.value = 'ResumeManage.xml';
	document.frmSubmit.action.value =  'ResumeManage.xml';
	document.frmSubmit.method.value = 'GET';
}
function submitResumeForm( psAction ) {
	document.frmSubmit.FRM_ACTION.value = psAction;
  	document.frmSubmit.submit();
}



function controlExists(FormName,ControlName) {

	
	var form = eval("document." + FormName);

	var bControlExists = false;
	for(var i = 0; i < form.elements.length;i++)
	{
		if(form.elements[i].name == ControlName) {
			bControlExists = true;
			break;
		}
	}
	return bControlExists;
}


function addJobCartItems(){
	
	var sJobId = '';

	if(controlExists("frmSubmit","JOB_CART_CHECKBOX")) { 

		if(typeof(document.frmSubmit.JOB_CART_CHECKBOX.length) != "undefined"){
			if(document.frmSubmit.JOB_CART_CHECKBOX.length == 0){
				alert(NO_JOBS_SELECTED_FOR_JOB_CART);
				return ;
			}	
			for(var i=0;i<document.frmSubmit.JOB_CART_CHECKBOX.length;i++){
	
				if(document.frmSubmit.JOB_CART_CHECKBOX[i].checked == true){
					if(sJobId.length > 0){
						sJobId += ',' + document.frmSubmit.JOB_CART_CHECKBOX[i].value;
					}else{
						sJobId += document.frmSubmit.JOB_CART_CHECKBOX[i].value;
					}
				}
			}
		}else {
			if(document.frmSubmit.JOB_CART_CHECKBOX.checked){
				sJobId = document.frmSubmit.JOB_CART_CHECKBOX.value;
			}
		}	
		
	}else {
		alert(NO_JOBS_SELECTED_FOR_JOB_CART);
		return ;
	}
	if(sJobId.length == 0){
			alert(NO_JOBS_SELECTED_FOR_JOB_CART);
			return ;
	}	
	var sURL, sFeatures;
	sURL  = "JobCart.xml?FRM_ACTION=ADD&JOB_CART_ITEMS="+sJobId;
	var sFeatures = "menubar=no,resizable=yes,titlebar=no,toolbar=no,scrollbars=yes,file=no,status=no,width=650px,height=500px";
	runForm('NAVIGATE', sURL);
}


function addSingleJob(){
	var sJobId = "";
	if(controlExists("frmSubmit","PC_JPID")) {
		sJobId = document.frmSubmit.PC_JPID.value;
		
		if(sJobId.length != 0 && sJobId != null){
			sURL  = "JobCart.xml?FRM_ACTION=ADD&JOB_CART_ITEMS="+sJobId;
			var sFeatures = "menubar=no,resizable=yes,titlebar=no,toolbar=no,file=no,status=no,width=650px,height=500px";
			runForm('NAVIGATE', sURL);
		}
	}
	return "true";
}
function fnNavigatePage(psDirection){

	var h=window.history;
	if(h.length){
		switch(psDirection){
			case "FWD":
				h.forward();
				break;
			case "BACK":
				h.back();
				break;
		}
	}
	return "T";
}

function removeFromJobCart(){
		var sJobId = "";
		
	  		if(controlExists("frmSubmit", "JOB_CART_CHECKBOX")) {
				if(typeof(document.frmSubmit.JOB_CART_CHECKBOX.length) != "undefined"){
					if(document.frmSubmit.JOB_CART_CHECKBOX.length == 0){
						alert(NO_JOBS_SELECTED_FOR_JOB_CART_DELETE);
						return ;
					}
					for(i=0;i<document.frmSubmit.JOB_CART_CHECKBOX.length;i++){
						if(document.frmSubmit.JOB_CART_CHECKBOX[i].checked == true){
							if(sJobId.length > 0){
								sJobId += ',' + document.frmSubmit.JOB_CART_CHECKBOX[i].value;
							}else{
								sJobId += document.frmSubmit.JOB_CART_CHECKBOX[i].value;
							}
						}
					}
				}else {
					if(document.frmSubmit.JOB_CART_CHECKBOX.checked == true){
						sJobId = document.frmSubmit.JOB_CART_CHECKBOX.value;	
					}
				}
	 			
			if(sJobId.length == 0){
				alert(NO_JOBS_SELECTED_FOR_JOB_CART_DELETE);
				return ;
			}	
			document.frmSubmit.JOB_CART_ITEMS.value = sJobId
			document.frmSubmit.FRM_ACTION.value = "DELETE";
			document.frmSubmit.submit();

		}else{
			alert(NO_JOBS_SELECTED_FOR_JOB_CART_DELETE);
			return ;
		}	

}

function goToSearchResults(psDir){
	
	if(SRCH_SHOW_SELECTED_JOBS_WARNING == 1){
		var bJobSelected = "false";
		if(controlExists("frmSubmit","JOB_CART_CHECKBOX")) { 
			if(typeof(document.frmSubmit.JOB_CART_CHECKBOX.length) != "undefined"){
				for(var i=0;i<document.frmSubmit.JOB_CART_CHECKBOX.length;i++){
					if(document.frmSubmit.JOB_CART_CHECKBOX[i].checked == true){
						if (bJobSelected != "true"){
							bJobSelected = true;
						}
					}
				}
			}else {
				if(document.frmSubmit.JOB_CART_CHECKBOX.checked){
					if (bJobSelected == false){
						bJobSelected = true;
					}
				}
			}	
		}
		if (bJobSelected == true) {
			if (confirm(SAVE_SELECTED_JOBS_IN_CART)){
				addJobCartItems();
				return;
			}
		
		}
	}
	switch(psDir){
		case "BACK":
			document.frmSubmit.SEARCH_PAGE_NUM.value = parseInt(document.frmSubmit.SEARCH_PAGE_NUM.value,10) - 1
			break;
		case "FWD":
			document.frmSubmit.SEARCH_PAGE_NUM.value = parseInt(document.frmSubmit.SEARCH_PAGE_NUM.value, 10) + 1
			break;
	}
	document.frmSubmit.submit();
}

  
  	
  function clearSelectedJobs(){
  	if(controlExists("frmSubmit","JOB_CART_CHECKBOX")) { 
		if(typeof(document.frmSubmit.JOB_CART_CHECKBOX.length) != "undefined"){
			for(var i=0;i<document.frmSubmit.JOB_CART_CHECKBOX.length;i++){
				if(document.frmSubmit.JOB_CART_CHECKBOX[i].checked == true){
					document.frmSubmit.JOB_CART_CHECKBOX[i].checked = false;
				}
			}
		}else {
			if(document.frmSubmit.JOB_CART_CHECKBOX.checked){
				document.frmSubmit.JOB_CART_CHECKBOX.checked = false;
			}
		}	
	}
}
        
      

function emailJobToFriend(){
	var sJobId = document.frmSubmit.PC_JPID.value;
	var sFeatures = "menubar=no,resizable=yes,titlebar=no,toolbar=no,file=no,status=no,width=450px,height=450px"
	var sURL = 'EmailFriend.xml?jpid='+sJobId
	var sret = window.open(sURL, 'EMAIL_JOB_TO_FRIEND',sFeatures);
	sret.focus();
}


function applyToJobPosting(){

	document.location = 'ResumeSubmission.xml?jpid='+document.frmSubmit.PC_JPID.value;
}

function closeWindow(){
	window.close();
}
function isBlank(s)
{
	for(var i=0; i<s.length;i++){
		var c= s.charAt(i);
		if((c!=' ') && (c!='\n')&&(c!='\t')) return false;
	}
	return true;
}

function getComboValue(psForm, psField){

	var list = document.forms[psForm].elements[psField]
	return list.options[list.selectedIndex].value;
}
/*********************BEGIN SCREENMEDSOS CLASS***********************/
function screenMeDSOs()
{
	var m_mePanels = new Array();
	this.mePanels = m_mePanels;
	this.addMeDSO = screenMeFields_addMeDSO;
}
function screenMeFields_addMeDSO(objDSO)
{
	 this.mePanels[this.mePanels.length] = objDSO;
}
function meDSO(sPanelDSO)
{
	var m_ScreenMEFields = new Array();
	this.screenFields = m_ScreenMEFields;
	this.addField = screenFields_AddField;
	this.GetField = screenFields_GetField;
	this.panelDSO = sPanelDSO;
	this.isDirty = meDSO_isDirty;
	this.scrapeDSO = meDSO_scrapeDSO;
}
function meDSO_scrapeDSO()
{
	for(var i = 0; i < this.screenFields.length; i++) {
		this.screenFields[i].scrapeField();
	}
}
function meDSO_isDirty()
{
	for(var i = 0; i < this.screenFields.length; i++)
	{
		
	  	if(this.screenFields[i].currentValue.length > 0)
		{
			return true;
		}
	}
			return false;
}
/****************END SCREENMEDSOS CLASS***************************/

/******************BEGIN SCREENFIELDS CLASS***********************/
function screenFields()
{

	var m_ScreenFields = new Array();
	this.screenFields = m_ScreenFields;
	this.validateForm = screenFields_validateForm;
   this.clearForm = screenFields_clearForm;
	this.doValidation = screenFields_DoValidation;
	this.validateMeDSOs = screenFields_validateMeDSOs;
	this.addField = screenFields_AddField;
	this.GetField = screenFields_GetField;
	this.meDSOs = null;
	this.missingRequiredMessage = "";
	this.missingRequired = false;

	  	
}
function screenFields_GetField(sCode) {

	for(var i = 0; i < this.screenFields.length; i++)
	{
		if(this.screenFields[i].code == sCode)
		{
			return this.screenFields[i];
		}
	}
	return null;
}
function screenFields_AddField(screenField)
{
	this.screenFields[this.screenFields.length] = screenField;
}
function screenFields_validateMeDSOs()
{
	var bSet = false;
	 //multi-edit stuff
	if(this.meDSOs != null)
	{
		for(var i = 0; i < this.meDSOs.mePanels.length; i++)
		{
			 this.meDSOs.mePanels[i].scrapeDSO();
			 if(this.meDSOs.mePanels[i].isDirty())
			 {
					for(var j = 0; j < this.meDSOs.mePanels[i].screenFields.length; j++)
					{
					  if(!this.doValidation(this.meDSOs.mePanels[i].screenFields[j]))
					  {
						  return false;
					  }

					  if(!bSet)
					  {
							if(this.meDSOs.mePanels[i].screenFields[j].isRequired && this.meDSOs.mePanels[i].screenFields[j].isBlank)
							{  
								bSet = true;
								this.missingRequired = true;
							}	 
					  }
				}
			 }
		}
		return true;
	}

}
function screenFields_DoValidation(screenField)
{
	
	 if(screenField.validateField() == true && screenField.currentValue != "pc_false"){
		  if(screenField.checkRequired() == false){
			  this.missingRequiredMessage += '- '+ screenField.displayText + "\n"
			  screenField.isBlank = true;
		  }
		  else {
			  screenField.isBlank = false;
		  }
	  }
	  else {
			alert(screenField.errorMessage);
		  // alert(screenField.currentValue);
			//alert(screenField.code);
			if(controlExists("frmSubmit",screenField.code)) {
				document.frmSubmit.elements[screenField.code].focus();
			}
			return false;
	  }
	  return true;
}

function screenFields_clearForm(){

   var FieldCode;
       
   if(this.screenFields != null)
   {
      for(var i=0;i<this.screenFields.length;i++)
      {
         FieldCode = this.screenFields[i].code;
         document.frmSubmit.elements[FieldCode].value = "";
      }
   }
   return true;
}


function screenFields_validateForm(){
	var bSet = false;
	this.missingRequiredMessage = REQUIRED_FIELDS_NOT_FILLED_IN + "\n";		 
	//reset missingRequired, order is important because it may get set again
	//in validateMeDSOs function
  
   this.missingRequired = false;
   if(!this.validateMeDSOs()) { return false; }
  	if(this.screenFields != null)
	{
		for(var i=0;i<this.screenFields.length;i++)
		{
		  //alert(this.screenFields[i].code);
			this.screenFields[i].scrapeField();
			//alert(this.screenFields[i].currentValue);
			//check for valid data
			if(!this.doValidation(this.screenFields[i]))
				return false;
			//check for blank required fields
			if(!bSet)
			{
				if(this.screenFields[i].isRequired && this.screenFields[i].isBlank)
				{  
				  	bSet = true;
					this.missingRequired = true;
				}	 
			}
		}
	}
	if(this.missingRequired)
	{
		alert(this.missingRequiredMessage);
		return false;
	} 

	return true; 
}
/************************END SCREENFIELDS CLASS**************************/

/*********************BEGIN SCREENFIELD CLASS****************************/
function screenField(code, isRequired, minValue, maxValue, maxLength, controlType, displayText, GUIDataType, isME, panelDSO)
{
	this.code = code;
	this.minValue = minValue;
	this.maxValue = maxValue;
	this.maxLength = maxLength;
	this.controlType = controlType;
	this.displayText = displayText;
	this.currentValue = "";	
	if (isRequired.toUpperCase()=='FALSE' || isRequired=='')
		this.isRequired=false;
	else
		this.isRequired=true;

	if(GUIDataType == '')
		this.GUIDataType = "TEXT";
	else
		this.GUIDataType = GUIDataType;			
	
	if(this.scrapeField == false){
		return false;
	}
	this.scrapeField = screenField_scrapeField;
	this.validateField = screenField_validateField;
	this.checkRequired = screenField_checkRequired;
	//validate calls scrapefield, validatefield 	
	this.validate = screenField_validate;
	this.isInRange = screenField_isInRange;
 	this.errorMessage = "";
	this.isME = isME || false;
	this.panelDSO = panelDSO || "";
	this.isBlank = false;
	
	
}
function screenField_isInRange(ParseFunctionName)
{
	var parsedVal;
	//if the argment is there is will be a string of the function name like 'parseFloat'
	//otherwise it defaults to using parseInt
	if(screenField_isInRange.arguments.length == 1)
	{
	  parsedVal = eval(ParseFunctionName + '(' + this.currentValue + ')');
	}
	else
	{
		parsedVal = parseInt(this.currentValue);
	}
	
	if(this.maxValue > 0 && this.maxValue != '' && this.maxValue != null)
	{
		if(parsedVal > this.maxValue || parsedVal < this.minValue) {
			return false;
		}
	}
	return true;
}

function screenField_checkRequired()
{	
	if(this.isRequired == true){
		if(this.currentValue.length == 0)
			return false;
		else
			return true;
	}else
		return true;
}
function screenField_validate()
{
		  this.scrapeField();
		  if(this.validateField() == true && this.currentValue != "pc_false"){
			  
			 return true;
			} else {
				alert(this.errorMessage);
				if(controlExists("frmSubmit",this.code)){
				document.frmSubmit.elements[this.code].focus();
				}
			 
			}
			return false;
}

function screenField_validateField()
{
  	var strObj = document.frmSubmit.elements[this.code];
	var str = this.currentValue;
   var sTmp, sFld;

   // This phone validation is a temporary hack. ALL VALIDATION should go through
   // getFieldValue() and ValidateFieldData()
   if(this.controlType=='USPHONE' || this.controlType=='USPHONE_EXT') {
      // this.currentValue may not have all the phone number data. checkPhoneValue() can not
      // be relied on to return the extension and country code
      sFld = this.code + "_AC";
      str = trim(document.frmSubmit.elements[sFld].value);
      sFld = this.code + "_TELNUM";
      str += trim(document.frmSubmit.elements[sFld].value);
      sFld = this.code + "_EXT";
      if(controlExists("frmSubmit", sFld))
         str += trim(document.frmSubmit.elements[sFld].value);
      if(str == '') return true;

      // test areacode (required)
      sFld = this.code + "_AC";
      sTmp = trim(document.frmSubmit.elements[sFld].value);
      if(!CONST_AREACODE_FORMAT.test(sTmp)) {
         this.errorMessage = INVALID_PHONE_NUMBER + " " + this.displayText;
         return false;
      }

      // test phone (required)
      sFld = this.code + "_TELNUM";
		sTmp = trim(document.frmSubmit.elements[sFld].value);
      if(!CONST_PHONE_FORMAT.test(sTmp)) {
         this.errorMessage = INVALID_PHONE_NUMBER + " " + this.displayText;
         return false;
      }

      // optional extension
      sFld = this.code + "_EXT";
      if(controlExists("frmSubmit", sFld)) {
         sTmp = trim(document.frmSubmit.elements[sFld].value);
         if(sTmp != '') {
            if(CONST_PHONEEXT_FORMAT.test(sTmp)) {
               this.errorMessage = INVALID_PHONE_NUMBER + " " + this.displayText;
               return false;
            }
         }
      }
   }
   // more temporary hacking
   else if(this.controlType=='UKPHONE' || this.controlType=='UKPHONE_EXT' ||
      this.controlType=='GLOBALPHONE' || this.controlType=='GLOBAL_EXT') {
      // this.currentValue may not have all the phone number data. checkPhoneValue() can not
      // be relied on to return the extension and country code
      
      str = "";
      sFld = this.code + "_CC";
      if(controlExists("frmSubmit", sFld))
         str = trim(document.frmSubmit.elements[sFld].value);
      sFld = this.code + "_AC";
      str += trim(document.frmSubmit.elements[sFld].value);
      sFld = this.code + "_TELNUM";
      str += trim(document.frmSubmit.elements[sFld].value);
      sFld = this.code + "_EXT";
      if(controlExists("frmSubmit", sFld))
         str += trim(document.frmSubmit.elements[sFld].value);
      
      if(str == '') return true;

      // test areacode (required)
      sFld = this.code + "_AC";
      sTmp = trim(document.frmSubmit.elements[sFld].value);
      if(sTmp == "") {
         this.errorMessage = INVALID_PHONE_NUMBER + " " + this.displayText;
         return false;
      }

      // test phone (required)
      sFld = this.code + "_TELNUM";
		sTmp = trim(document.frmSubmit.elements[sFld].value);
      if(sTmp == "") {
         this.errorMessage = INVALID_PHONE_NUMBER + " " + this.displayText;
         return false;
      }
   }
	else if ((this.controlType=='TEXTBOX')||(this.controlType=='TEXTAREA'))
	{
		
				if (this.controlType=='TEXTAREA') {
				// Check for Max Length on the textarea control.
					if (testMaxChars(str,this.maxLength)==false){
                  sTmp = MAX_CHAR_EXCEEDED.replace(/\[X\]/,this.maxLength);
                  this.errorMessage = sTmp;
						return false;     
               }
				}
						switch(this.GUIDataType)
						{
						case 'POS_INTEGER':     
							if (trim(str)=='')
								  return true;
							if(!locale.integerRegEx.test(str) || str.indexOf(locale.negativeSymbol) > -1) {
								this.errorMessage = INVALID_POSINTEGER_TYPE;	
							  	return false;
						   }
						   else {
								this.currentValue = fnConvertToStandard(str,this.GUIDataType);
								if(!this.isInRange())
								{
                         sTmp = MSG_BAD_RANGE.replace(/\[X\]/,this.minValue);
                         this.errorMessage = sTmp.replace(/\[Y\]/,this.maxValue);
								 return false;
								}
								return true;
						  	}
							break;
						case 'US_ZIP':
							if (trim(str)=='')
									return true;
							if(!isZIPCode(str)) {
								this.errorMessage = INVALID_ZIP_CODE_TYPE;
								return false;
							} else {
								return true;
							}
							break;
						case 'ALPHA_NUMERIC':
							if (trim(str)=='')
									return true;
							if(!isAlphanumeric(str)) {
								this.errorMessage = INVALID_ALPHANUMERIC_TYPE;
								return false;
							} else {
								return true;
							}
							break;
						case 'SSN':
							if (trim(str)=='')
									return true;
							if(!isSSN(str)) {
								this.errorMessage = INVALID_SSN_TYPE;
								return false;
							}
							else {
								return true;
							}
							break;
						case 'PERCENT': //same as integer so fall through
						case 'INTEGER':
							if (trim(str)=='')
									return true;
							if(!locale.integerRegEx.test(str)) {
								this.errorMessage = INVALID_INTEGER_TYPE;								
								return false;
							} else {
							  this.currentValue = fnConvertToStandard(str,this.GUIDataType);							  
							  if(!this.isInRange()) {
                          sTmp = MSG_BAD_RANGE.replace(/\[X\]/,this.minValue);
                          this.errorMessage = sTmp.replace(/\[Y\]/,this.maxValue);
                          return false;
							  }
							  return true;
							}
							 break;
						case 'CURRENCY': 	
					  	
                     if(trim(str) == '')
								return true;
							if(!locale.currencyRegEx.test(str))
							{
								this.errorMessage = INVALID_CURRENCY_TYPE;
								return false;
							}
							else
							{
                       this.currentValue = fnConvertToStandard(str,this.GUIDataType);
								if((parseFloat(str) <= 922337203685477.5808) && (parseFloat(str) >= -922337203685477.5808)){
							      if(!this.isInRange()) {
                              sTmp = MSG_BAD_RANGE.replace(/\[X\]/,this.minValue);
                              this.errorMessage = sTmp.replace(/\[Y\]/,this.maxValue);
                              return false;
							      }
                           else {
                              return true;
                           }
                         }
								else {
									this.errorMessage = INVALID_CURRENCY_TYPE;
								}
							}
							break;
						case 'USCURRENCY':
							if (trim(str)=='')
								return true;
							if(CONST_USCURRENCY_FORMAT.test(str)==false)
							{
								this.errorMessage = INVALID_CURRENCY_TYPE;
								return false;	
							}
							else
							{missingRequiredMessage
								// do a little more validating
								var val=str;
								val=val.replace(/,/g,"");
								val=val.replace(/\$/g,"");
								if((parseFloat(val) <= 922337203685477.5808) && (parseFloat(val) >= -922337203685477.5808)) {
									if(!this.isInRange()) {
                              sTmp = MSG_BAD_RANGE.replace(/\[X\]/,this.minValue);
                              this.errorMessage = sTmp.replace(/\[Y\]/,this.maxValue);
                              return false;
							      }
                           else {
                              return true;
                           }
                         }
								else {
									this.errorMessage = INVALID_CURRENCY_TYPE;
									return false;	
								}
							}
							break;
							case 'NO_FORMAT':
								return true;
							break;
							case 'TEXT':
								return true;missingRequiredMessage
							case 'TEXT_LONG':
								return true;
							case 'TEXT_DATE':
								if (trim(str)=='')
									return true;
								
								if(!CONST_TEXT_DATE_FORMAT.test(str)) {  
									this.errorMessage = INVALID_DATE_TYPE; 									
									return false;
								}
								else {
									return true;
								}
								break;
						case 'EMAIL':
								if (trim(str)=='')
									return true;
								if(!isEmail(str)) {
									this.errorMessage = INVALID_EMAIL_TYPE;
									return false;					
								}
								else
									return true;
								break;
							case 'SHORT_DATE':
								if (trim(str)=='')
									return true;
								if(!CONST_SHORT_DATE_FORMAT.test(str)) {
									this.errorMessage = INVALID_DATE_TYPE;
									return false;
								} else {
									return true;
								}
								break;
							
							case 'LONG_DATE':	
								if (trim(str)=='')
									return true;
								if(!CONST_LONG_DATE_FORMAT.test(str)) {
									 this.errorMessage = INVALID_DATE_TYPE;
									 return false;missingRequiredMessage
								}
							break;
								
							case 'BOOLEAN':
								if (trim(str)=='')
									return true;
								else
									if(!CONST_BOOLEAN_FORMAT.test(str)) {
										this.errorMessage = INVALID_BOOL_TYPE;
										return false;
									}
							break;
							case 'LONG':
								if (trim(str)=='')
									return true;
								if (locale.integerRegEx.test(str)) {
										this.currentValue = fnConvertToStandard(str,this.GUIDataType);
							  			if(this.isInRange()) {
									  		return true;
										}
										else{
										  sTmp = MSG_BAD_RANGE.replace(/\[X\]/,this.minValue);
                                this.errorMessage = sTmp.replace(/\[Y\]/,this.maxValue);
                                return false;
										}
								} else {
									this.errorMessage = INVALID_LONG_TYPE;
									return false;
								}
								break;
							case 'NUMERIC':
								if (trim(str)=='')
									return true;
								if (locale.integerRegEx.test(str) || locale.floatRegEx.test(str))
								{
									this.currentValue = fnConvertToStandard(str,this.GUIDataType);
								  	if(this.isInRange())
									{
									  	return true;
									}
									else
									{

                              sTmp = MSG_BAD_RANGE.replace(/\[X\]/,this.minValue);
                              this.errorMessage = sTmp.replace(/\[Y\]/,this.maxValue);
										return false;
									}
							   }
								else	{
									this.errorMessage = INVALID_NUMERIC_TYPE;
									return false;
								}
								break;
							case 'REAL':
								if (trim(str)=='')
									return true;
								if (locale.floatRegEx.test(str))
								{
									this.currentValue = fnConvertToStandard(str,this.GUIDataType);
									if(this.isInRange('parseFloat'))
									{
										return true;
									}
									else
									{
										sTmp = MSG_BAD_RANGE.replace(/\[X\]/,this.minValue);
                              this.errorMessage = sTmp.replace(/\[Y\]/,this.maxValue);
										return false;    
									}
											  					
								}
								else  
								{
									this.errorMessage = INVALID_REAL_TYPE; 								
									return false;
								}
								 break;
							default:
								return false;
						} //END SWITCH
	} //END IF
	return true;
}



function screenField_scrapeField(bCheckForRequired)
{
	var bRequiredMissing = false;
	
	var sCountry = this.code+"_CC";
	var sCountryVal = "";
	var sAreaCode = this.code+"_AC";
	var sAreaCodeVal = "";
	var sTelNum = this.code+"_TELNUM"; 
	var sTelNumVal = "";
	var sExt = this.code+"_EXT";
	var sExtVal = ""; 
	var sPhoneValue ;
	var sCheckBoxField = this.code+"_CHK";
	
	var sDay = this.code+"_dd";
	var sMonth = this.code+"_mmm";
	var sYear = this.code+"_yyyy";
	var sDateValue = "";
 
	this.currentValue  = "";
  
 	switch(this.controlType){
	
	case "TEXTBOX":
	 		this.currentValue = trim(document.frmSubmit.elements[this.code].value);
		  	break;
	case "QUERYBOX": //we will save the domain list value 
			this.currentValue = trim(document.frmSubmit.elements[this.code].value);
			break;
			
	case "MULTISELECT_LISTBOX":  //same as multiselect so fall through
	case "MULTISELECT":
		  	var cntrl = document.frmSubmit.elements[this.code]
				this.currentValue = "";
			 	 for(var i = 0; i < cntrl.options.length;i++)
				 {
				
					if(cntrl.options[i].selected && typeof(cntrl.options[i].value.length) != "undefined")
					{
						if(cntrl.options[i].value.length > 0)
						{
							this.currentValue += cntrl.options[i].value;
							this.currentvalue += ",";
						}
					}
				 }
				 break;
	case "MULTISELECT_CHECKBOX":
		
		var cntrl = document.frmSubmit.elements[this.code];			 
			 for(var i = 0; i < cntrl.length; i++)
			 {
				if(cntrl[i].checked && typeof(cntrl[i].value.length)!="undefined")
				{	

					if(cntrl[i].value.length > 0) 
					{
						this.currentValue += cntrl[i].value;
					   this.currentValue += ",";
					}
				}
			}
			
			break;
	case "RADIO":
          var cntrl = document.frmSubmit.elements[this.code];			 
			 for(var i = 0; i < cntrl.length; i++)
			 {
				if(cntrl[i].checked && typeof(cntrl[i].value.length)!="undefined")
				{
					if(cntrl[i].value.length > 0) 
					{
						this.currentValue = cntrl[i].value;
						break;
					}
				}
			 }
			break; 
		case "TEXTAREA":
			this.currentValue = trim(document.frmSubmit.elements[this.code].value);
		   break;
		
		case "CHECKBOX":
			this.currentValue = 0;
			if(document.frmSubmit.elements[sCheckBoxField].checked == true)
				this.currentValue = 1;
			break;
		
		case "COMBOBOX":
			var list = document.frmSubmit.elements[this.code];
         if(list.selectedIndex > -1 && list.options[list.selectedIndex] != null)
			   this.currentValue = trim(list.options[list.selectedIndex].value);
			break;
		
		case "DATECONTROL":
			var dayIdx = document.frmSubmit.elements[sDay].selectedIndex;
			var mnIdx = document.frmSubmit.elements[sMonth].selectedIndex;
			sDateValue = fnFormatNumberToString(document.frmSubmit.elements[sMonth].options[mnIdx].value,2) + "/" + document.frmSubmit.elements[sDay].options[dayIdx].value + "/" +  document.frmSubmit.elements[sYear].value
		 	if(sDateValue != '//'){
			  if(fnCheckDate(sDateValue) == false)	 {
				  this.errorMessage = INVALID_DATE_TYPE + ' ' + this.displayText + '.';
				  this.currentValue = "pc_false";
			  }
			  else
			 		this.currentValue = sDateValue;
			} else {
				this.currentValue = "";
			}
					break;
		
		case "USPHONE":
			sAreaCodeVal = trim(document.frmSubmit.elements[sAreaCode].value);
			sTelNumVal = trim(document.frmSubmit.elements[sTelNum].value);
			sPhoneValue = checkPhoneValue(sCountryVal, sAreaCodeVal, sTelNumVal, sExtVal,this)
		 	this.currentValue = sPhoneValue;
			break;
		case "USPHONE_EXT":
			sAreaCodeVal = trim(document.frmSubmit.elements[sAreaCode].value);
			sTelNumVal = trim(document.frmSubmit.elements[sTelNum].value);
			sExtVal = trim(document.frmSubmit.elements[sTelNum].value);
			sPhoneValue = checkPhoneValue(sCountryVal, sAreaCodeVal, sTelNumVal, sExtVal,this)
	  		this.currentValue = sPhoneValue;
		 	break;
		case "GLOBALPHONE":
			sCountryVal = trim(document.frmSubmit.elements[sCountry].value);
			sAreaCodeVal = trim(document.frmSubmit.elements[sAreaCode].value);
			sTelNumVal = trim(document.frmSubmit.elements[sTelNum].value);
			sPhoneValue = checkPhoneValue(sCountryVal, sAreaCodeVal, sTelNumVal, sExtVal,this)
		 	this.currentValue = sPhoneValue;
		 	break;
		case "UKPHONE":
			sAreaCodeVal = trim(document.frmSubmit.elements[sAreaCode].value);
			sTelNumVal = trim(document.frmSubmit.elements[sTelNum].value);
			sPhoneValue = checkPhoneValue(sCountryVal, sAreaCodeVal, sTelNumVal, sExtVal,this)
			this.currentValue = sPhoneValue;
			break;
		case "UKPHONE_EXT":
			sAreaCodeVal = trim(document.frmSubmit.elements[sAreaCode].value);
			sTelNumVal = trim(document.frmSubmit.elements[sTelNum].value);
			sExtVal = trim(document.frmSubmit.elements[sTelNum].value);
			sPhoneValue = checkPhoneValue(sCountryVal, sAreaCodeVal, sTelNumVal, sExtVal,this)
 			this.currentValue = sPhoneValue;
			break;		
		case "GLOBAL_EXT":
			sCountryVal = trim(document.frmSubmit.elements[sCountry].value);
			sAreaCodeVal = trim(document.frmSubmit.elements[sAreaCode].value);
			sTelNumVal = trim(document.frmSubmit.elements[sTelNum].value);
			sExtVal = trim(document.frmSubmit.elements[sTelNum].value);
			sPhoneValue = checkPhoneValue(sCountryVal, sAreaCodeVal, sTelNumVal, sExtVal,this)
			this.currentValue = sPhoneValue;
			break;
		case "YEARMONTH":
			var idx = document.frmSubmit.elements[sMonth].selectedIndex;
			sDateValue = document.frmSubmit.elements[sMonth].options[idx].value + "/01/" +  document.frmSubmit.elements[sYear].value
			if(sDateValue != '/01/'){				  this.currentValue = "pc_false";

			  if(fnCheckDate(sDateValue) == false)	{
				  this.errorMessage = INVALID_DATE_TYPE + ' ' + this.displayText;
				  this.currentValue = "pc_false";
			  }
			  else
			 		this.currentValue = sDateValue;
			}
			else {
				this.currentValue = ""
			}
		break;
		
		case "PASSWORD":
			this.currentValue = trim(document.frmSubmit.elements[this.code].value);
		break;
		
		default:
			this.currentValue = "";
		break;
	}
	return true;
}


screenField.prototype.getUserFormat = function()
{
	if(this.controlType=='DATECONTROL')
		return CONST_USER_SHORT_DATE_FORMAT;
	
	switch(this.GUIDataType)
		{
		case 'SHORT_DATE':
			return CONST_USER_SHORT_DATE_FORMAT;
			break;
					
		case 'USCURRENCY':
			return CONST_USER_USCURRENCY_FORMAT;
			break;
			
		case 'BOOLEAN':
			return CONST_USER_BOOLEAN_FORMAT;
			break;
			
		case 'INTEGER':
			return CONST_USER_INTEGER_FORMAT;
			break;
			
		case 'LONG':
			return CONST_USER_LONG_FORMAT;
			break;
			
		case 'REAL':
			return CONST_USER_REAL_FORMAT;
			break;
			
		case 'LONG_DATE':
			return CONST_USER_LONG_DATE_FORMAT;
			break;
			
		case 'TEXT_DATE':
			return CONST_USER_TEXT_DATE_FORMAT;
			break;
					
		case 'TEXT':
			return CONST_USER_TEXT_FORMAT;
			break;
			
		case 'TEXT_LONG':
			return CONST_USER_TEXT_LONG_FORMAT;
			break;
			
		case 'NO_FORMAT':
			return CONST_USER_NO_FORMAT_FORMAT;
			break;
			
		}

}
/**************************END SCREENFIELD CLASS**************************************/


/*******************************BEGIN VALIDATION UTILITY FUNCTIONS**************************/

function checkPhoneValue(psCountryCodeVal, psAreaCodeVal, psTelNumVal, psExtVal,currentControl)
{	

	var bValue = false;
	var sRetVal = "";
   // AreaCode and Telnum are required phone parts. Extension and CountryCode are optional.
   // This function should be deleted when the screenField validation is redone.
	if(psAreaCodeVal.length == 0 && psTelNumVal.length == 0){
		return sRetVal;
	}
	if(psAreaCodeVal.length > 0 && psTelNumVal.length > 0)
	{
		sRetVal = "("+psAreaCodeVal+")"+psTelNumVal+" "+psExtVal
		if(currentControl.controlType == "GLOBALPHONE" || currentControl.controlType == "GLOBAL_EXT"){
			if(psCountryCodeVal.length > 0)
				sRetVal = psCountryCodeVal + sRetVal;
		}
	  		
	}else{
		sRetVal = "pc_false";
	}
	if(sRetVal == "pc_false" && typeof(currentControl) != "undefined") {
		currentControl.errorMessage = INVALID_PHONE_NUMBER + ' ' + currentControl.displayText + '.'; 
	} 
	return trim(sRetVal);
		
}
function fnOnBlur(currentControl){

	if(gbFieldInFocus) { return; }
	
	gbFieldInFocus = true;
	var bRetVal = false;
  // if(navigator.appName.indexOf("Netscape") < 0) {  	  
			//var bMultiEdit = true;
			var screenField = screenForm.GetField(currentControl.name);
			if(screenField == null || typeof(screenField) == "undefined" || screenField == "")
			{
				//if its not a screenField then check the meDSOs collection to see if its
				//a multi-edit field
				 for(var i = 0; i < screenForm.meDSOs.mePanels.length; i ++)	{
					screenField = screenForm.meDSOs.mePanels[i].GetField(currentControl.name);
					if(screenField != null && typeof(screenField) != "undefined" && screenField != "")
						bRetVal = screenField.validate();
						
					}
			  bRetVal = true;
			} 
			else {
			   bRetVal = screenField.validate();
			}  
	//}
  	  		gbFieldInFocus = false;
			return bRetVal;

}

function fnEnableNetscapeControl() {
// do nothing - this is the redirect funtion for a SLF field's onfocus event
}

function fnDisableNetscapeControl(oField) {
/* early versions of Netscape do not support the "disabled" property,
   so we must make do by preventing focus */

   if(rs_sBrowser == "NS4") oField.blur();
}

function fnOnChange(oField, sSLPF) {
/* 
   Added to support sub-list filtering. All SELECT type controls use this function. The
   query box type fires from the fnSelectQueryBoxItem(). Input values are:
   oField   = handle to html control
   sSLPF    = sub-list filter parent field - a string either: 'true' or 'false' or ''
*/
   var sID, sValue;
   rs_NS4qrybox = false;
   // process sub-list filter relationship
   if(sSLPF == "true") {
      if(oField.options[oField.selectedIndex] != null) // for netscape
         sValue = oField.options[oField.selectedIndex].value;
      else
         sValue = "";

      if(sValue == "") { // no need for RPC call here
         rs_RecursiveClear(oField.name);
      }
      else {
         // get the user session - the order of these two tries is important
         sID = getStateValue("tempSessionId");
         if(sID == "") sID = getStateValue("sessionId");
         if(sID != "") {
            rs_ExecuteRPC(sID, oField.name, sValue);
         }
      }
   }
}


function trim(sBuf){
	var sVal = "";
	
	// Added conditional statement due to the inefficiency of
	//  the Ltrim and Rtrim functions when processing TextArea objects
	//  with large numbers of characters (i.e. Resume field).
	// Ltrim and Rtrim should be rewritten/replaced when more time permits. These functions
	//  are called from numerous areas, making it difficult to insure other validation
	//  paths are not broken. May want to explore using stringTrim() function found in
	//  Admin Portal. - KRB 7/21/2003
	if (sBuf.length < 4000){
		sVal = Ltrim(Rtrim(sBuf));
	}else{
		sVal = sBuf;
	}
	  return sVal;
	}
	
function Ltrim(str){
  var i
  var outStr = "";    
  var l = str.length;    
  for (i = 0; i < l; i++)
    if (str.charAt(i)!=' ')
      break;    
  for (; i < str.length; i++)
    outStr += str.charAt(i);    
  return outStr ;    
}

function Rtrim(str){

  var j
  var outStr = "";    
  var i = str.length - 1;    
  for (; i >= 0; i--)
    if (str.charAt(i) != ' ' )
      break;    
  for (j = 0; j <= i; j++)
    outStr += str.charAt(j);    
  return outStr ;
 
 }
 
 function fnCheckDate(input){
    var relYear=30;
    var IsLeapYear = false;
    if ((input)== "")
  		return false;
	
	if (input.indexOf("/") == input.lastIndexOf("/"))
		return false;
	
	var DateYear=input.substr(input.lastIndexOf("/")+1,4)
	
	var lNum;
  	lNum = CheckString(DateYear, ValidDateStr);
  	
  	if(lNum != -1){
  		return false;
  	}
  	
  	DateYear=parseInt(DateYear, 10);
  	if(isNaN(DateYear))
  		return false;
	if(DateYear.toString().length != 4 || DateYear < 1900 || DateYear > 2050){
		return false;
	}

  	var DateMonth=input.substring(0,input.indexOf("/") );
  	DateMonth=parseInt(DateMonth,10);
  	if(DateMonth == '' || isNaN(DateMonth)){
  		return false;
  	}

	if(DateMonth < 1 || DateMonth > 12)
  		return false;

  	var DateDay=input.substring(input.indexOf("/")+1,input.lastIndexOf("/"));
  	DateDay=parseInt(DateDay,10);
  	if(DateDay == '' || isNaN(DateDay)){
  		return false;
  	}
  	
	IsLeapYear = fnIsLeapYear(DateYear);
	if((IsLeapYear == false && DateMonth == 2 && DateDay > 28) || (IsLeapYear == true && DateMonth == 2 && DateDay > 29)){
		return false;
	}
	
	if ((DateDay > 31 || DateDay < 1) || ((DateMonth == 4 || DateMonth == 6 || DateMonth == 9 || DateMonth == 11) && DateDay > 30)){
  		return false;
	}
	else{
		return true;
	}
}

 function fnCheckQuestDate(input){
    var relYear=30;
    var IsLeapYear = false;
    if ((input)== "")
  		return false;
	
	if (input.indexOf("-") == input.lastIndexOf("-"))
		return false;
	
	var DateYear=input.substr(0,input.indexOf("-"))
	
	var lNum;
  	lNum = CheckString(DateYear, ValidDateStr);
  	
  	if(lNum != -1){
  		return false;
  	}
  	
  	DateYear=parseInt(DateYear, 10);
  	if(isNaN(DateYear))
  		return false;
	if(DateYear.toString().length != 4 || DateYear < 1900 || DateYear > 2050){
		return false;
	}

  	var DateMonth=input.substring(input.indexOf("-")+1,input.lastIndexOf("-"));
  	DateMonth=parseInt(DateMonth,10);
  	if(DateMonth == '' || isNaN(DateMonth)){
  		return false;
  	}

	if(DateMonth < 1 || DateMonth > 12)
  		return false;

  	var DateDay=input.substr(input.lastIndexOf("-")+1,2);
  	DateDay=parseInt(DateDay,10);
  	if(DateDay == '' || isNaN(DateDay)){
  		return false;
  	}
  	
	IsLeapYear = fnIsLeapYear(DateYear);
	if((IsLeapYear == false && DateMonth == 2 && DateDay > 28) || (IsLeapYear == true && DateMonth == 2 && DateDay > 29)){
		return false;
	}
	
	if ((DateDay > 31 || DateDay < 1) || ((DateMonth == 4 || DateMonth == 6 || DateMonth == 9 || DateMonth == 11) && DateDay > 30)){
  		return false;
	}
	else{
		return true;
	}
}

function fnIsLeapYear(sYear){
	return (sYear % 4 == 0 && (sYear % 100 !=0 || sYear % 400 ==0));
}


function CheckString( InputStr, ValidStr3 )
    {
      var i,j, ch2
      var l = InputStr.length;    
      var cl = ValidStr3.length;    
      for (i = 0; i < l; i++)
      {
        ch2 = InputStr.charAt(i); 
        for (j = 0; j < cl; j++)
          if (ch2 == ValidStr3.charAt(j))
    		break;    
		  if( j >= cl )
           return ch2;    
      }
      return "-1";
}
    
function fnGetDateMonth(input){
  	
  	var DateMonth=input.substring(0,input.indexOf("/"));
  	DateMonth=parseInt(DateMonth,10);
	if(DateMonth < 1 || DateMonth > 12)
  		return false;
  	
  	return DateMonth;
}

function fnGetDateYear(input){
    var relYear=30;
	var DateYear=input.substring(input.lastIndexOf("/")+1,input.length)
  	DateYear=parseInt(DateYear, 10);
  	if(isNaN(DateYear))
  		return false;
	
	//if(document.frmSubmit.OLA_SAVED_RESUMES){
	YearCheck =(DateYear / 100 )
	if(YearCheck < 1){
  		if (DateYear <= relYear)
  			DateYear = DateYear + 2000;
  		else
  			DateYear = DateYear + 1900;
  	}
  	return DateYear;
}
		
function fnGetDateDay(input){
  	var DateDay=input.substring(input.indexOf("/")+1,input.lastIndexOf("/"));
  	DateDay=parseInt(DateDay,10);
	if(DateDay < 1 || DateDay > 31){
		return false;
	}
	return DateDay;
}

function fnFormatNumberToString(sValue, lNumber){
		
// this function will pad the number with the length of digits.
			
	var sZero = '0';
	if(sValue != null && sValue.length != 0) {
		if(sValue.length < lNumber){	
			sLocalReturn = sValue;
			while(sLocalReturn.length < lNumber){
				sLocalReturn = sZero + sValue.toString();
			}
			return sLocalReturn;
		}
	}
	return sValue;
}

function testMaxChars(sValue, maxlimit) 
{
	if (maxlimit==0) 
		return true;
	if (sValue.length > maxlimit)
		return false;
	else
		return true;
}


/****************NEW FUNCTIONS ADDED FOR VALIDATION ON 3-25-2002 BRC************************/
function isInteger (s)

{   var i;

    if (isEmpty(s)) 
       if (isInteger.arguments.length == 1) return defaultEmptyOk;
       else return (isInteger.arguments[1] == true);

    // Search through string's characters one by one
    // until we find a non-numeric character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number.
        var c = s.charAt(i);// isEmail (STRING s [, BOOLEAN emptyOK])
// 
// Email address must be of form a@b.c -- in other words:
// * there must be at least one character before the @
// * there must be at least one character before and after the .
// * the characters @ and . are both required
//
// For explanation of optional argument emptyOK,
// see comments of function isInteger.

function isEmail (s)
{   if (isEmpty(s)) 
       if (isEmail.arguments.length == 1) return defaultEmptyOk;
       else return (isEmail.arguments[1] == true);
   
    // is s whitespace?
    if (isWhitespace(s)) return false;
    
    // there must be >= 1 character before @, so we
    // start looking at character position 1 
    // (i.e. second character)
    var i = 1;
    var sLength = s.length;

    // look for @
    while ((i < sLength) && (s.charAt(i) != "@"))
    { i++
    }

    if ((i >= sLength) || (s.charAt(i) != "@")) return false;
    else i += 2;

    // look for .
    while ((i < sLength) && (s.charAt(i) != "."))
    { i++
    }

    // there must be at least one character after the .
    if ((i >= sLength - 1) || (s.charAt(i) != ".")) return false;
    else return true;
}



        if (!isDigit(c)) return false;
    }

    // All characters are numbers.
    return true;
}

function isAlphanumeric (s)

{   var i;

    if (isEmpty(s)) 
       if (isAlphanumeric.arguments.length == 1) return defaultEmptyOk;

       else return (isAlphanumeric.arguments[1] == true);

    // Search through string's characters one by one
    // until we find a non-alphanumeric character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number or letter.
        var c = s.charAt(i);

        if (! (isLetter(c) || isDigit(c) ) )
        return false;
    }

    // All characters are numbers or letters.
    return true;
}

function isLetter (c)
{   return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) )
}
// Returns true if character c is a digit 
// (0 .. 9).
function isDigit (c)
{   return ((c >= "0") && (c <= "9"))
}

// Returns true if character c is a letter or digit.
function isLetterOrDigit (c)
{   return (isLetter(c) || isDigit(c))
}
function isEmpty(s)
{   return ((s == null) || (s.length == 0))
}






// Returns true if string s is empty or 
// whitespace characters only.

function isWhitespace (s)

{   var i;

    // Is s empty?
    if (isEmpty(s)) return true;

    // Search through string's characters one by one
    // until we find a non-whitespace character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);

        if (whitespace.indexOf(c) == -1) return false;
    }

    // All characters are whitespace.
    return true;
}

// isEmail (STRING s [, BOOLEAN emptyOK])
// 
// Email address must be of form a@b.c -- in other words:
// * there must be at least one character before the @
// * there must be at least one character before and after the .
// * the characters @ and . are both required
//
// For explanation of optional argument emptyOK,
// see comments of function isInteger.

function isEmail (s)
{   if (isEmpty(s)) 
       if (isEmail.arguments.length == 1) return defaultEmptyOk;
       else return (isEmail.arguments[1] == true);
     // is s whitespace?
    if (isWhitespace(s)) return false;
    
    // there must be >= 1 character before @, so we
    // start looking at character position 1 
    // (i.e. second character)
    var i = 1;
    var sLength = s.length;

    // look for @
    while ((i < sLength) && (s.charAt(i) != "@"))
    { i++
    }

    if ((i >= sLength) || (s.charAt(i) != "@")) return false;
    else i += 2;

    // look for .
    while ((i < sLength) && (s.charAt(i) != "."))
    { i++
    }

    // there must be at least one character after the .
    if ((i >= sLength - 1) || (s.charAt(i) != ".")) return false;
    else return true;
}


// isSSN (STRING s [, BOOLEAN emptyOK])
// 
// isSSN returns true if string s is a valid U.S. Social
// Security Number.  Must be 9 digits.
//
// NOTE: Strip out any delimiters (spaces, hyphens, etc.)
// from string s before calling this function.
//
// For explanation of optional argument emptyOK,
// see comments of function isInteger.

function isSSN (s)
{   if (isEmpty(s)) 
       if (isSSN.arguments.length == 1) return defaultEmptyOk;
       else return (isSSN.arguments[1] == true);
    return (isInteger(s) && s.length == digitsInSocialSecurityNumber)
}


function isSignedInteger (s)

{   if (isEmpty(s)) 
       if (isSignedInteger.arguments.length == 1) return defaultEmptyOk;
       else return (isSignedInteger.arguments[1] == true);

    else {
        var startPos = 0;
        var secondArg = defaultEmptyOk;

        if (isSignedInteger.arguments.length > 1)
            secondArg = isSignedInteger.arguments[1];

        // skip leading + or -
        if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
           startPos = 1;    
        return (isInteger(s.substring(startPos, s.length), secondArg))
    }
}
function reformat (s)

{   var arg;
    var sPos = 0;
    var resultString = "";

    for (var i = 1; i < reformat.arguments.length; i++) {
       arg = reformat.arguments[i];
       if (i % 2 == 1) resultString += arg;
       else {
           resultString += s.substring(sPos, sPos + arg);
           sPos += arg;
       }
    }
    return resultString;
}

 // isPositiveInteger (STRING s [, BOOLEAN emptyOK])
// 
// Returns true if string s is an integer > 0.
//
// For explanation of optional argument emptyOK,
// see comments of function isInteger.

function isPositiveInteger (s) {   

	 var secondArg = defaultEmptyOk;

    if (isPositiveInteger.arguments.length > 1)
        secondArg = isPositiveInteger.arguments[1];

    // The next line is a bit byzantine.  What it means is:
    // a) s must be a signed integer, AND
    // b) one of the following must be true:
    //    i)  s is empty and we are supposed to return true for
    //        empty strings
    //    ii) this is a positive, not negative, number

    return (isSignedInteger(s, secondArg)
         && ( (isEmpty(s) && secondArg)  || (parseInt (s) > 0) ) );
}

// isFloat (STRING s [, BOOLEAN emptyOK])
// 
// True if string s is an unsigned floating point (real) number. 
//
// Also returns true for unsigned integers. If you wish
// to distinguish between integers and floating point numbers,
// first call isInteger, then call isFloat.
//
// Does not accept exponential notation.
//
// For explanation of optional argument emptyOK,
// see comments of function isInteger.

function isFloat (s)

{   var i;
    var seenDecimalPoint = false;

    if (isEmpty(s)) 
       if (isFloat.arguments.length == 1) return defaultEmptyOk;
       else return (isFloat.arguments[1] == true);

    if (s == decimalPointDelimiter) return false;

    // Search through string's characters one by one
    // until we find a non-numeric character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number.
        var c = s.charAt(i);

        if ((c == decimalPointDelimiter) && !seenDecimalPoint) seenDecimalPoint = true;
        else if (!isDigit(c)) return false;
    }

    // All characters are numbers.
    return true;
}



// isUSPhoneNumber (STRING s [, BOOLEAN emptyOK])
// 
// isUSPhoneNumber returns true if string s is a valid U.S. Phone
// Number.  Must be 10 digits.
//
// NOTE: Strip out any delimiters (spaces, hyphens, parentheses, etc.)
// from string s before calling this function.
//
// For explanation of optional argument emptyOK,
// see comments of function isInteger.

function isUSPhoneNumber (s)
{   if (isEmpty(s)) 
       if (isUSPhoneNumber.arguments.length == 1) return defaultEmptyOk;
       else return (isUSPhoneNumber.arguments[1] == true);
    return (isInteger(s) && s.length == digitsInUSPhoneNumber)
}
// isInternationalPhoneNumber (STRING s [, BOOLEAN emptyOK])
// 
// isInternationalPhoneNumber returns true if string s is a valid 
// international phone number.  Must be digits only; any length OK.
// May be prefixed by + character.
//
// NOTE: A phone number of all zeros would not be accepted.
// I don't think that is a valid phone number anyway.
//
// NOTE: Strip out any delimiters (spaces, hyphens, parentheses, etc.)
// from string s before calling this function.  You may leave in 
// leading + character if you wish.
//
// For explanation of optional argument emptyOK,
// see comments of function isInteger.

function isInternationalPhoneNumber (s)
{   if (isEmpty(s)) 
       if (isInternationalPhoneNumber.arguments.length == 1) return defaultEmptyOk;
       else return (isInternationalPhoneNumber.arguments[1] == true);
    return (isPositiveInteger(s))
}
// isZIPCode (STRING s [, BOOLEAN emptyOK])
// 
// isZIPCode returns true if string s is a valid 
// U.S. ZIP code.  Must be 5 or 9 digits only.
//
// NOTE: Strip out any delimiters (spaces, hyphens, etc.)
// from string s before calling this function.  
//
// For explanation of optional argument emptyOK,
// see comments of function isInteger.

// checkUSPhone (TEXTFIELD theField [, BOOLEAN emptyOK==false])
//
// Check that string theField.value is a valid US Phone.
//
// For explanation of optional argument emptyOK,
// see comments of function isInteger.

/*function checkUSPhone (s, emptyOK)
{   
	if (checkUSPhone.arguments.length == 1) emptyOK = defaultEmptyOk;
    if ((emptyOK == true) && (isEmpty(s))) return true;
    else
    {  var normalizedPhone = stripCharsInBag(s, phoneNumberDelimiters)
       if (!isUSPhoneNumber(normalizedPhone, false)) 
          return false;
		else 
       {  // if you don't want to reformat as (123) 456-789, comment next line out
          s = reformatUSPhone(normalizedPhone)
          return true;
       }
    }
}
function reformatUSPhone (USPhone)
{   return (reformat (USPhone, "(", 3, ") ", 3, "-", 4))
}
function reformat (s)
{  
	 var arg;
    var sPos = 0;
    var resultString = "";

    for (var i = 1; i < reformat.arguments.length; i++) {
       arg = reformat.arguments[i];
       if (i % 2 == 1) resultString += arg;
       else {
           resultString += s.substring(sPos, sPos + arg);
           sPos += arg;
       }
    }
    return resultString;
}
// checkInternationalPhone (TEXTFIELD theField [, BOOLEAN emptyOK==false])
//
// Check that string theField.value is a valid International Phone.
//
// For explanation of optional argument emptyOK,
// see comments of function isInteger.

function checkInternationalPhone (s, emptyOK)
{   
	if (checkInternationalPhone.arguments.length == 1) emptyOK = defaultEmptyOk;
    if ((emptyOK == true) && (isEmpty(s))) return true;
    else
    {  var normalizedPhone = stripCharsInBag(s, phoneNumberDelimiters)
		 if (!isInternationalPhoneNumber(s, false)) 
          return false
       else return true;
    }
}
// isInternationalPhoneNumber (STRING s [, BOOLEAN emptyOK])
// 
// isInternationalPhoneNumber returns true if string s is a valid 
// international phone number.  Must be digits only; any length OK.
// May be prefixed by + character.

function isInternationalPhoneNumber (s)
{   if (isEmpty(s)) 
       if (isInternationalPhoneNumber.arguments.length == 1) return defaultEmptyOk;
       else return (isInternationalPhoneNumber.arguments[1] == true);
    return (isPositiveInteger(s))
} */
function isZIPCode (s)
{  
	if (isEmpty(s)) 
       if (isZIPCode.arguments.length == 1) return defaultEmptyOk;
       else return (isZIPCode.arguments[1] == true);
   return (isInteger(s) && 
            ((s.length == digitsInZIPCode1) ||
             (s.length == digitsInZIPCode2)))
}


// Removes all characters which appear in string bag from string s.

function stripCharsInBag (s, bag){   
	 var i;
    var returnString = "";

    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }

    return returnString;
}
/******************************END VALIDATION UTILITY FUNCTIONS************************************/

/***********************START GLOBALIZATION FUNCTIONS************************************************/
function isNegative(sNum) {
	//need to add ability to check negative
	//number mask for valid negative formats
	//and check against those instead of 
	//just this...  afw 

   var sTmp = trim(sNum);
	if (sTmp.charAt(0) == '-')
		return true;
	else 
		return false;
}

function fnConvertToStandard(psValue, psDataType) {

	var sTemp = psValue;
	
	if (isNegative(sTemp)) {
		var bNegative = true;
	}

	switch(psDataType){
			
			case "CURRENCY":
				if (sTemp.length > 0) {
					var iDecPos = sTemp.indexOf(locale.curDecSymbol);
					if (iDecPos != -1) {
						var sRight = sTemp.substring(iDecPos + 1, sTemp.length);
						var sLeft = sTemp.substring(0, iDecPos);
						sRight = sRight.replace(/[^0-9]/g,"");
						sLeft = sLeft.replace(/[^0-9]/g,"");
						sTemp = sLeft;
						if (parseInt(sRight) > 0) {
							sTemp = sTemp + "." + sRight;
						}					
					} else {
						sTemp = sTemp.replace(/[^0-9]/g,"");
					}
				}
				break;
				
      case "REAL":
      case "NUMERIC":
				if (sTemp.length > 0) {
					var iDecPos = sTemp.indexOf(locale.decSymbol);
					if (iDecPos != -1) {
						var sRight = sTemp.substring(iDecPos + 1, sTemp.length);
						var sLeft = sTemp.substring(0, iDecPos);
						sRight = sRight.replace(/[^0-9]/g,"");
						sLeft = sLeft.replace(/[^0-9]/g,"");
						sTemp = sLeft;
						if (parseInt(sRight) > 0) {
							sTemp = sTemp + "." + sRight;
						}
					} else {
						sTemp = sTemp.replace(/[^0-9]/g,"");
					}
				}
				break;
				
         case "INTEGER":
         case "PERCENT":
         case "POS_INTEGER":
			case "LONG":
				if (sTemp.length > 0) {
					sTemp = sTemp.replace(/[^0-9]/g,"");
				}
				break;
			
			default:
				break;
		}
	
	if (bNegative) {
		sTemp = "-" + sTemp;
	}		
	
	return sTemp;	
}

// *****************************  QUESTIONNAIRE STUFF *****************************/

function questions(id)
{
	var m_questions =  new Array();
	this.questions=m_questions;
	this.fillAnswers=questions_FillAnswers;
	this.id=id;
	this.validateQuestionnaire = questions_ValidateQuestionnaire;
	this.saveQuestionnaire=questions_SaveQuestionnaire;
	this.addQuestion=questions_AddQuestion;
}

function questions_AddQuestion(question)
{
	this.questions[this.questions.length]=question;
}
function questions_FillAnswers()
{
}

/* 
This function is serving as an "onblur()" data validation for screen fields. This only makes
sense for TEXTBOX and TEXTAREA control types. If other control types are desired (after rigorous testing!)
then add them to the switch statement.
*/
function FieldLevelValidation(sForm, sField, sControlType, lLength, sGUIType, lMin, lMax) {
   var sVal;
   
   switch(sControlType) {
   case "TEXTBOX":
   case "TEXTAREA":
      sVal = getFieldValue(sControlType, sForm, sField);
      ValidateFieldData(sForm, sField, sVal, sControlType, sGUIType, lMin, lMax, lLength);
      break;
   }
}

function CheckFieldRequired(sVal, bRequired) {
   var bRet;

   if(bRequired) {
      if(sVal.length > 0)
         bRet = true;
      else
         bRet = false;
   }
   else
      bRet = true;
   return bRet;
}


/*
Performs validation on a vision questionnaire (job post or interview) and returns the xml data.
Returning an empty string signifies failure.
*/
function questions_ValidateQuestionnaire(sForm) {
   var sXML, sValue, lCount, lQueryBoxes, sTmp;
   var objFld, sFldID, bIsQuestionnaire, sTmpVal;

   sXML = '';
   bIsQuestionnaire = true
   for(var i=0;i<this.questions.length;i++) {
	  sXML += "<QUESTION id=\"" + this.questions[i].id + "\">"

      lCount = 0;
      for(var j=0;j<this.questions[i].answers.length;j++) {
      	//KRL 12/04 modified to support new Vision IR/Questionnaire XML
      	sFldID = this.questions[i].answers[j].fieldID;
      	objFld = document.forms[sForm].elements[sFldID];
        sTmpVal = '';
      	if((this.questions[i].answers[j].controlType == "CHECKBOX") && (objFld.length > 1)){
		 	sTmpVal = getDLCheckboxXML(this.questions[i].answers[j].id, sForm, sFldID);
		 	if(sTmpVal.length > 0){
			 	sXML += sTmpVal;
			 	lCount++;
			}else{
		        // check answer required status
		        if(!CheckFieldRequired(sValue, this.questions[i].answers[j].isRequired)) {
		            sTmp = ANSWER_REQUIRED.replace(/\[X\]/,this.questions[i].answers[j].answerNumber);
		            alert(sTmp.replace(/\[Y\]/,this.questions[i].questionNumber));
		            return '';
		        }
		 	}
		}else{
	        sTmpVal = getFieldValue(this.questions[i].answers[j].controlType, sForm, 
	            sFldID, bIsQuestionnaire);

	        if(sTmpVal.length > 0){
				sXML += "<ANSWER id=\"" + this.questions[i].answers[j].id + "\"";
				if(sTmpVal.indexOf("|") > 0){
			         sValue = sTmpVal.substr(0,sTmpVal.indexOf("|"));
			         sXML += " domainid=\"" + sTmpVal.substr(sTmpVal.indexOf("|")+1) + "\">";
			    }else{
			     	 sValue = sTmpVal;
			         sXML += ">";
			    }
		        lCount++;
	
		        // validate field types
		        if(!ValidateFieldData(sForm, this.questions[i].answers[j].fieldID, 
		            sValue, this.questions[i].answers[j].controlType, 
		            this.questions[i].answers[j].guiFormat, this.questions[i].answers[j].minValue, 
		            this.questions[i].answers[j].maxValue, this.questions[i].answers[j].maxLength, bIsQuestionnaire))
		            return '';
		
		        // safer to enclose everything in CDATA
		        sXML += "<![CDATA[" + sValue + "]]></ANSWER>";
			}else{
		        // check answer required status
		        if(!CheckFieldRequired(sTmpVal, this.questions[i].answers[j].isRequired)) {
		            sTmp = ANSWER_REQUIRED.replace(/\[X\]/,this.questions[i].answers[j].answerNumber);
		            alert(sTmp.replace(/\[Y\]/,this.questions[i].questionNumber));
		            return '';
		        }
		    }
	    }
      }

      // check required question status
      if(this.questions[i].isRequired) {
         if(lCount == 0) {
            // must code workaround for QueryBoxes which are not supported yet
            lQueryBoxes = 0;
			if(document.forms[sForm].PRE_WP6) {
			// must code workaround for QueryBoxes in pre WP6 setup
	            for(var k=0;k<this.questions[i].answers.length;k++) {
	               if(this.questions[i].answers[k].controlType == "QUERYBOX") lQueryBoxes++;
	            }
			}

            if(lQueryBoxes != this.questions[i].answers.length) {
               alert(QUESTION_REQUIRED.replace(/\[X\]/,this.questions[i].questionNumber));
               return '';
            }
         }
      }
      
      // check for required number of answers
      if(this.questions[i].maxAnswers > 0) {
         if(lCount > this.questions[i].maxAnswers) {
            sTmp = ANSWERS_MAXMIN.replace(/\[X\]/,this.questions[i].questionNumber);
            sTmp = sTmp.replace(/\[Y\]/,this.questions[i].minAnswers);
            alert(sTmp.replace(/\[Z\]/,this.questions[i].maxAnswers));
            return '';
         }
      }
      if(this.questions[i].minAnswers > 0) {
         if(lCount < this.questions[i].minAnswers) {
            sTmp = ANSWERS_MAXMIN.replace(/\[X\]/,this.questions[i].questionNumber);
            sTmp = sTmp.replace(/\[Y\]/,this.questions[i].minAnswers);
            alert(sTmp.replace(/\[Z\]/,this.questions[i].maxAnswers));
            return '';
         }
      }

      sXML += "</QUESTION>";
   }
   return sXML;
}

/*
This is a generic function that retrieves form element values. It is written for
questionnaires (and needs to be workable in general use), but it might also be used by 
the screenField functions (may require alterations).

This function does not perform any validation. It should work even if a previous validation
step is skipped.

!! This function may require modification in order to be truely generic. Formatting
depends on the final destination (Vision quest, Vision panel, CRP, ...)
*/
function getFieldValue(sType, sForm, sField, bIsQuestionnaire) {
   var sValue = '';
   var obj, sTmp, i;
   var bQuest = (typeof(bIsQuestionnaire) != "undefined");

   switch(sType) {
   case "TEXTBOX":
   case "TEXTAREA":
   case "PASSWORD":
	   sValue = trim(document.forms[sForm].elements[sField].value);
		break;

   case "QUERYBOX": 
		sValue = trim(document.forms[sForm].elements[sField + '_display'].value);
		//KRL 12/04 modified to support new Vision IR/Questionnaire XML
		if(sValue!=''){
			sValue += '|' + trim(document.forms[sForm].elements[sField].value);
		}
		break;

	case "MULTISELECT_LISTBOX":
	case "MULTISELECT":
	  	obj = document.forms[sForm].elements[sField];
		for(var i=0;i<obj.options.length;i++) {
			if(obj.options[i].selected) {
            sTmp = trim(obj.options[i].value);
				if(sTmp != '') sValue += sTmp + ',';
			}
		}
		break;

	case "MULTISELECT_CHECKBOX":
		obj = document.forms[sForm].elements[sField];
		for(var i=0;i<obj[i].length;i++) {
			if(obj[i].checked) {
            sTmp = trim(obj[i].value);
				if(sTmp != '') sValue += sTmp + ',';
			}
		}
		break;

	case "RADIO":
	   obj = document.forms[sForm].elements[sField];
		for(var i=0;i<obj[i].length;i++) {
			if(obj[i].checked) {
            sValue = trim(obj[i].value);
            break;
			}
		}
		break;	

	case "CHECKBOX":
		//KRL 12/04 modified to support new Vision IR/Questionnaire data display
		if(document.forms[sForm].elements[sField].checked)
			sValue = trim(document.forms[sForm].elements[sField + '_display'].value);
		break;
		
	case "COMBOBOX":
		//KRL 12/04 modified to support new Vision IR/Questionnaire XML
		obj = document.forms[sForm].elements[sField];
		if(obj.selectedIndex >= 0){
			stext = trim(obj.options[obj.selectedIndex].text)
			if(stext.length > 0){
				sValue = stext + '|' + obj.options[obj.selectedIndex].value;
			}
		}
		break;
		
   case "DATECONTROL":
      // the valid format for date control data in Vision questionniares is:
      // "01/04/2000" -- Jan 4, 2000
      if(bQuest){
	      sValue = trim(document.forms[sForm].elements[sField + "_yyyy"].value);
	      sValue += '-';
	      obj = document.forms[sForm].elements[sField + "_mmm"];
	      if(obj.selectedIndex >= 0) sValue += obj.options[obj.selectedIndex].value;
	      sValue += '-';
	      obj = document.forms[sForm].elements[sField + "_dd"];
	      if(obj.selectedIndex >= 0) sValue += obj.options[obj.selectedIndex].value;
	      if(sValue == "--") sValue = '';
      }else{
	      obj = document.forms[sForm].elements[sField + "_mmm"];
	      if(obj.selectedIndex >= 0) sValue = obj.options[obj.selectedIndex].value;
	      sValue += '/';
	      obj = document.forms[sForm].elements[sField + "_dd"];
	      if(obj.selectedIndex >= 0) sValue += obj.options[obj.selectedIndex].value;
	      sValue += '/' + trim(document.forms[sForm].elements[sField + "_yyyy"].value);
	      // make sure there is some data
	      if(sValue == "//") sValue = '';
      }
	  break;

   case "USPHONE":
   case "USPHONE_EXT":
      // The valid format for saving phone numbers so they can be read in the Vision questionnaire is:
      // "111 222-3333 abcde" where "111" is the areacode, "222-3333" is the phone, and 
      // "abcde" is the extension. No need to pad field elements cause the validation ensures
      // they are filled properly.
      sValue = trim(document.forms[sForm].elements[sField + "_AREACODE"].value);
      sTmp = trim(document.forms[sForm].elements[sField + "_PHONE"].value);
      if(sTmp != '') {
         i = sTmp.indexOf('-');
         if(i<0){ 
            if(bQuest){
	            sValue += ' ' + sTmp.substr(0,3) + '-' + sTmp.substr(3);
            }else{
            	sValue += sTmp.substr(0,3) + '-' + sTmp.substr(3);
            }
         }else{
            if(bQuest){
	            sValue += ' ' + sTmp;
	        }else{
	            sValue += sTmp;
	        }
         }
	      if(controlExists(sForm,sField + "_EXT")){
		  	 if(bQuest){
		         sValue += ' ' + trim(document.forms[sForm].elements[sField + "_EXT"].value);
		  	 }else{
		         sValue += trim(document.forms[sForm].elements[sField + "_EXT"].value);
		  	 }
		  }
	  }
	  break;

   case "UKPHONE":
   case "UKPHONE_EXT":
   case "GLOBALPHONE":
   case "GLOBAL_EXT":
      // Must pad phone elements so they parse correctly in Vision. Element
      // lengths are hardcoded.
      if(sType == "GLOBALPHONE" || sType == "GLOBAL_EXT") {
         sTmp = trim(document.forms[sForm].elements[sField + "_COUNTRYCODE"].value);
         sValue = PadFieldLength(sTmp,3);
      }
      sTmp = trim(document.forms[sForm].elements[sField + "_AREACODE"].value);
      sTmp = PadFieldLength(sTmp,5);
      sValue += " " + sTmp + " "; // pad for parens in the Vision display
      sTmp = trim(document.forms[sForm].elements[sField + "_PHONE"].value);
      sTmp = PadFieldLength(sTmp,10);
      sValue += sTmp;
      if(controlExists(sForm,sField + "_EXT"))
         // no need to pad the last field value
         sValue += trim(document.forms[sForm].elements[sField + "_EXT"].value);

      // make sure there is some data
      if(trim(sValue) == "") sValue = "";
		break;

   case "YEARMONTH":
	  if(bQuest){
	      obj = document.forms[sForm].elements[sField + "_yyyy"];
	      if(obj.selectedIndex > 0) sValue = '20' + obj.options[obj.selectedIndex].value;
	      sValue += '-';
		  obj = document.forms[sForm].elements[sField + "_mm"];
	      if(obj.selectedIndex > 0) sValue += obj.options[obj.selectedIndex].value + '-01';
	
	      // make sure there is some data
	      if(sValue == '-') sValue = '';
	  }else{
		  obj = document.forms[sForm].elements[sField + "_mm"];
	      if(obj.selectedIndex >= 0) sValue = obj.options[obj.selectedIndex].value;
	      sValue += '/';
	      obj = document.forms[sForm].elements[sField + "_yyyy"];
	      if(obj.selectedIndex >= 0) sValue += obj.options[obj.selectedIndex].value;
	
	      // make sure there is some data
	      if(sValue == '/') sValue = '';
	  }
	  break;
		
   }
   return sValue;
}

function ValidateFieldData(sForm, sField, sData, sControlType, sGUIType, lMin, lMax, lLength, bIsQuestionnaire) {
   var bRet = true;
   var i, sTmp, sFldName, obj;
   var bQuest = (typeof(bIsQuestionnaire) != "undefined");

   if(sData == '') return true;
   
   // default for setting focus on an error
   sFldName = sField;

   switch(sControlType) {
   case "TEXTAREA":
      if(lLength > 0 && sData.length > lLength) {
         alert(MAX_CHAR_EXCEEDED.replace(/\[X\]/,lLength));
         bRet = false;
      }
      // no break! fall through for GUIType validation

   case "TEXTBOX":
      if(!ValidateGUIType(sData, sGUIType, lMin, lMax))
         bRet = false;
      break;

   case "DATECONTROL":
      // first collect the data in the format expected by "fnCheckDate()"
	  if(bQuest){
         if(!fnCheckQuestDate(sData)) {
            alert(MSG_BAD_DATE);
            sFldName = sField + "_dd";
            bRet = false;
         }
	  }else{
	      obj = document.forms[sForm].elements[sField + "_mmm"];
	      if(obj.selectedIndex >= 0) sTmp = obj.options[obj.selectedIndex].value;
	      sTmp += '/';
	      obj = document.forms[sForm].elements[sField + "_dd"];
	      if(obj.selectedIndex >= 0) sTmp += obj.options[obj.selectedIndex].value;
	      sTmp += '/' + trim(document.forms[sForm].elements[sField + "_yyyy"].value);
	      if(sTmp != "//") {
	         if(!fnCheckDate(sTmp)) {
	            alert(MSG_BAD_DATE);
	            sFldName = sField + "_dd";
	            bRet = false;
	         }
	      }
	  }
      // make sure there is some data
      break;

   case "YEARMONTH":
      if(bQuest){
      	i = sData.indexOf('-');
      }else{
      	i = sData.indexOf('/');
      }
      if(i >= 0) {
         // create a valid date by adding the "Day"
         if(bQuest){
	         if(!fnCheckQuestDate(sData)) {
	            alert(MSG_BAD_DATE);
	            sFldName = sField + "_yyyy";
	            bRet = false;
	         }
	     }else{
	         if(!fnCheckDate(sData.substr(0,i) + "/01/20" + sData.substr(i+1))) {
	            alert(MSG_BAD_DATE);
	            sFldName = sField + "_yyyy";
	            bRet = false;
	     	 }
	     }
      }else {
      	 if(trim(sData)!=''){
	         alert(MSG_BAD_DATE);
	         sFldName = sField + "_yyyy";
	         bRet = false;
	     }
      }
      break;

   case "USPHONE":
   case "USPHONE_EXT":
      // areacode is required
      sTmp = trim(document.forms[sForm].elements[sField + "_AREACODE"].value);
      if(!CONST_AREACODE_FORMAT.test(sTmp)) {
         alert(MSG_BAD_PHONE);
         sFldName = sField + "_AREACODE";
         bRet = false;
         break;
      }

      // phone is required
      sTmp = trim(document.forms[sForm].elements[sField + "_PHONE"].value);
      if(!CONST_PHONE_FORMAT.test(sTmp)) {
         alert(MSG_BAD_PHONE);
         sFldName = sField + "_PHONE";
         bRet = false;
         break;
      }

      // optional
      if(controlExists(sForm,sField + "_EXT")) {
         sTmp = trim(document.forms[sForm].elements[sField + "_EXT"].value);
         if(sTmp != '') {
            if(CONST_PHONEEXT_FORMAT.test(sTmp)) {
               alert(MSG_BAD_PHONE);
               sFldName = sField + "_EXT";
               bRet = false;
               break;
            }
         }
      }
      break;

   case "GLOBALPHONE":
   case "UKPHONE":
   case "UKPHONE_EXT":
   case "GLOBAL_EXT":
      // NO validation of entered data. The areacode and phone are still required parts.
      sTmp = trim(document.forms[sForm].elements[sField + "_AREACODE"].value);
      if(sTmp == '') {
         alert(MSG_BAD_PHONE);
         sFldName = sField + "_AREACODE";
         bRet = false;
         break;
      }

      sTmp = trim(document.forms[sForm].elements[sField + "_PHONE"].value);
      if(sTmp == '') {
         alert(MSG_BAD_PHONE);
         sFldName = sField + "_PHONE";
         bRet = false;
         break;
      }
      break;
   }

   // highlight the problem
   if(!bRet) {
      document.forms[sForm].elements[sFldName].focus();
      if(sControlType != "DATECONTROL" && sControlType != "YEARMONTH") document.forms[sForm].elements[sFldName].select();
   }
   return bRet;
}

function ValidateGUIType(sData, sGUIType, lMin, lMax) {
   var bRet = true;
   var sTmp;

   if(sData == '') return true;

   switch(sGUIType) {
   case "POS_INTEGER":
      if(!locale.integerRegEx.test(sData) || sData.indexOf(locale.negativeSymbol) > -1) {
         alert(INVALID_POSINTEGER_TYPE);	
         bRet = false;
      }
      else {
         sTmp = fnConvertToStandard(sData, sGUIType);
         if(!CheckFieldBounds(sTmp, lMin, lMax)) {
            sTmp = MSG_BAD_RANGE.replace(/\[X\]/,lMin);
            alert(sTmp.replace(/\[Y\]/,lMax));
            bRet = false;
         }
      }
      break;

   case "US_ZIP":
      if(!isZIPCode(sData)) {
         alert(INVALID_ZIP_CODE_TYPE);
         bRet = false;
      } 
      break;

   case "ALPHA_NUMERIC":
      if(!isAlphanumeric(sData)) {
         alert(INVALID_ALPHANUMERIC_TYPE);
         bRet = false;
      } 
      break;

   case "SSN":
      if(!isSSN(sData)) {
         alert(INVALID_SSN_TYPE);
         bRet = false;
      }
      break;

   case "PERCENT":
   case "INTEGER":
      if(!locale.integerRegEx.test(sData)) {
         alert(INVALID_INTEGER_TYPE);	
         bRet = false;
      } 
      else {
         sTmp = fnConvertToStandard(sData, sGUIType);
         if(!CheckFieldBounds(sTmp, lMin, lMax)) {
            sTmp = MSG_BAD_RANGE.replace(/\[X\]/,lMin);
            alert(sTmp.replace(/\[Y\]/,lMax));
            bRet = false;
         }
      }
      break;

   case "CURRENCY": 	
      if(!locale.currencyRegEx.test(sData)) {
         alert(INVALID_CURRENCY_TYPE);
         bRet = false;
      }
      else {
         sTmp = fnConvertToStandard(sData, sGUIType);
         if(!CheckFieldBounds(sTmp, -922337203685477.5808, 922337203685477.5808)) {
            sTmp = MSG_BAD_RANGE.replace(/\[X\]/,"-922337203685477.5808");
            alert(sTmp.replace(/\[Y\]/,"922337203685477.5808"));
            bRet = false;
         }
         else if(!CheckFieldBounds(sTmp, lMin, lMax)) {
            sTmp = MSG_BAD_RANGE.replace(/\[X\]/,lMin);
            alert(sTmp.replace(/\[Y\]/,lMax));
            bRet = false;
         }
      }
      break;

   case "USCURRENCY":
      if(!CONST_USCURRENCY_FORMAT.test(sData)) {
         alert(INVALID_CURRENCY_TYPE);
         bRet = false;	
      }
      else {
         sTmp = sData;
         sTmp = sTmp.replace(/,/g,"");
         sTmp = sTmp.replace(/\$/g,"");
         if(!CheckFieldBounds(sTmp, -922337203685477.5808, 922337203685477.5808)) {
            sTmp = MSG_BAD_RANGE.replace(/\[X\]/,"-922337203685477.5808");
            alert(sTmp.replace(/\[Y\]/,"922337203685477.5808"));
            bRet = false;
         }
         else if(!CheckFieldBounds(sTmp, lMin, lMax)) {
            sTmp = MSG_BAD_RANGE.replace(/\[X\]/,lMin);
            alert(sTmp.replace(/\[Y\]/,lMax));
            bRet = false;
         }
      }
      break;

   case "TEXT_DATE":
      if(!CONST_TEXT_DATE_FORMAT.test(sData)) {  
         alert(MSG_BAD_DATE);	
         bRet = false;
      }
      break;

   case "EMAIL":
      if(!isEmail(sData)) {
         alert(INVALID_EMAIL_TYPE);
         bRet = false;					
      }
      break;

   case "SHORT_DATE":
      if(!CONST_SHORT_DATE_FORMAT.test(sData)) {
         alert(MSG_BAD_DATE);	
         bRet = false;
      }
      break;
   
   case "LONG_DATE":	
      if(!CONST_LONG_DATE_FORMAT.test(sData)) {
         alert(MSG_BAD_DATE);	
         bRet = false;
      }
      break;
      
   case "BOOLEAN":
      if(!CONST_BOOLEAN_FORMAT.test(sData)) {
         alert(INVALID_BOOL_TYPE);
         bRet = false;
      }
      break;

   case "LONG":
      if(!locale.integerRegEx.test(sData)) {
         alert(INVALID_LONG_TYPE);
         bRet = false;
      }
      else {
         sTmp = fnConvertToStandard(sData, sGUIType);
         if(!CheckFieldBounds(sTmp, lMin, lMax)) {
            sTmp = MSG_BAD_RANGE.replace(/\[X\]/,lMin);
            alert(sTmp.replace(/\[Y\]/,lMax));
            bRet = false;
         }
      } 
      break;

   case "NUMERIC":
      if(locale.integerRegEx.test(sData) || locale.floatRegEx.test(sData)) {
         sTmp = fnConvertToStandard(sData, sGUIType);
         if(!CheckFieldBounds(sTmp, lMin, lMax)) {
            sTmp = MSG_BAD_RANGE.replace(/\[X\]/,lMin);
            alert(sTmp.replace(/\[Y\]/,lMax));
            bRet = false;
         }
      }
      else {
         alert(INVALID_NUMERIC_TYPE);
         bRet = false;
      }
      break;

   case "REAL":
      if(!locale.floatRegEx.test(sData)) {
         alert(INVALID_REAL_TYPE);
         bRet = false;
      }
      else {
         sTmp = fnConvertToStandard(sData, sGUIType);
         if(!CheckFieldBounds(sTmp, lMin, lMax)) {
            sTmp = MSG_BAD_RANGE.replace(/\[X\]/,lMin);
            alert(sTmp.replace(/\[Y\]/,lMax));
            bRet = false;
         }
      }
      break;
   }

   return bRet;
}

/* 
add spaces to end of string 
*/
function PadFieldLength(sVal, n) {
   var sRet = "";

   if(sVal.length < n) {
      for(var i=0;i<n-sVal.length;i++) sRet += " ";
   }
   return sVal + sRet;
}

/*
Check numerical value boundaries. Zero (0) max and min values mean there are no limits.
*/
function CheckFieldBounds(sVal, lMin, lMax) {
   var lValue;

   lValue = parseFloat(sVal);
   if(isNaN(lValue)) return false;

   if(lMax != 0) {
      if(lValue > lMax) return false;
   }
   if(lMin != 0) {
      if(lValue < lMin) return false;
   }
   return true;
}

function questions_SaveQuestionnaire() {
   var sXML, sRet;
    
   sRet = questionnaire.validateQuestionnaire("frmSubmit");
   if(sRet == '')
      return false;
   else {
      sXML = "<QUESTIONNAIRE_SESSION><QUESTIONNAIRE id=\"" + this.id + "\"/>" +
	      "<SESSIONID></SESSIONID><CREATEDON></CREATEDON><MODIFIEDON></MODIFIEDON><SESSION_RESULTS>" +
         sRet + "</SESSION_RESULTS></QUESTIONNAIRE_SESSION>";
      //alert(sXML);
      document.frmSubmit.questXML.value = sXML;
      return true;
   }
}

function question(id, isRequired, minAnswers, maxAnswers, questionNumber)	
	{
	var m_answers = new Array();
	this.id = id;
	this.questionNumber=questionNumber;
	
	if (minAnswers=='')
		this.minAnswers=0;
	else
		this.minAnswers=parseInt(minAnswers,10);
	
	if (maxAnswers=='')
		this.maxAnswers=0;
	else
		this.maxAnswers=parseInt(maxAnswers,10);
	
	if(isRequired.toUpperCase() == "TRUE")
		this.isRequired = true;
	else
		this.isRequired = false;
		
	this.addAnswer=question_AddAnswer;
	this.checkTotalAnswers=question_CheckTotalAnswers;
	this.answers=m_answers;
	}
function question_AddAnswer(answer)
	{
	this.answers[this.answers.length]=answer;
	}

function question_CheckTotalAnswers()
	{
	for (answers in question)
		{

		}
	}

question.prototype.checkMinMaxAnswers = function()
{
}

function answer(helpText,minValue,maxValue,guiFormat,maxLength,isRequired,controlType,fieldID,id,sPosition)
	{
	this.helpText=helpText;
	if (minValue=='')
		this.minValue=0;
	else
		this.minValue=parseFloat(minValue);
	
	if(isRequired.toUpperCase() == "TRUE")
		this.isRequired = true;
	else
		this.isRequired = false;
		
	if (maxValue=='')
		this.maxValue=0;
	else
		this.maxValue=parseFloat(maxValue);
	
	this.fieldID=fieldID;
	
	if (guiFormat=='')
		this.guiFormat='TEXT';
	else
		this.guiFormat=guiFormat;
	
	if (maxLength=='')
		this.maxLength=0;
	else
		this.maxLength=maxLength;
	
	if (controlType=='')
		this.controlType='TEXTBOX';
	else
		this.controlType=controlType;
	
	this.id=id;
   this.answerNumber = sPosition;
	}

answer.prototype.showHelp = function()
	{
	window.status=this.helpText;
	};

answer.prototype.setAnswer = function(answerValue)
	{
	}
answer.prototype.getUserFormat = function()
{
}

answer.prototype.requiredValue =  function(){

}
answer.prototype.isValid = function(){

}
/**********************END GLOBALIZATION FUNCTIONS***************(stripChars(/\,/g,str))******************************/
/**********************BEGIN QUERYBOX FUNCTIONS**************************/

// this constant much match the one in pcCRP.clsCRP.getQueryBoxResults()
var CONST_QUERYBOX_MAX_RESULTS = 250;
var gbQBSearching = false;

function fnInitQueryBox() {
	var bSubmit = false;
	var sPrevCriteria = document.forms.frmSubmit.FILTERCRITERIA.value;

	if (sPrevCriteria.length > 0) {
		//this is a submit - fill in criteria from form		
		document.forms.frmSubmit.LOOKUP_CRITERIA.value = sPrevCriteria;
		document.forms.frmSubmit.LOOKUP_CRITERIA.focus();
		bSubmit = true;
	} else {
		//read value from calling form		
		var sFldCode = document.forms.frmSubmit.FIELDCODE.value;
		var oDisplayFld = window.opener.document.frmSubmit.elements[sFldCode + "_display"];

		if (typeof oDisplayFld != 'undefined') {
			//scrape the field value and tag the control so we can ensure that the page hasn't changed
			//on us once we actually select a domain list value
			//oDisplayFld.
			document.forms.frmSubmit.LOOKUP_CRITERIA.value = oDisplayFld.value;
			document.forms.frmSubmit.LOOKUP_CRITERIA.focus();	

		} else {
			//for some reason the field couldn't be found - user probably navigated
			//away from the window so just close the query box
			this.close();
			return;
		}

	}
		
	//Check if only one item returned - if so go ahead and select it by default
	var oResults = document.forms.frmSubmit.LOOKUP_RESULTS;
	if (oResults.options.length == 1)
		oResults.options.selectedIndex = 0;			
	
	//Check if no results returned
	else if (oResults.options.length == 0 && bSubmit) 
		AddOptionToList(oResults, MSG_NO_RESULTS, "NO_RESULTS", false, false);

	//Check to see if the list could have been truncated and warn user
	else if (oResults.options.length >= CONST_QUERYBOX_MAX_RESULTS)
		alert(MSG_NARROW_FILTER);
}

function fnShowQuestionnaireQueryBox(plDLId, psFieldCode, psValueField, psDisplayField) {

var lWinSize = 450;
var sFeatures;
var lXPos = (screen.width - lWinSize)/2;
var lYPos = (screen.height - lWinSize)/2;

	var sUrl = "QueryBox.xml?QUERYMODE=QUESTIONNAIRE&dlid=" + plDLId + "&FieldCode=" + 
		psFieldCode + "&dlvf=" + psValueField + "&dldf=" + psDisplayField +
		"&XMLSOURCE=VISION";
	
		//add session info if previous page using form variables for state handling
	if (typeof(document.frmSubmit.tempSessionId) != "undefined") 
		sUrl += '&tempSessionId='+document.frmSubmit.tempSessionId.value+'&sessionId='+document.frmSubmit.sessionId.value;
	
	if(rs_sBrowser == "NS4")
	   sFeatures = "screenX=" + lXPos + ",screenY=" + lYPos + ",width=" + lWinSize + ",height=" + lWinSize + ",resizable";
   else
		sFeatures = "left=" + lXPos + ",top=" + lYPos + ",width=" + lWinSize + ",height=" + lWinSize + ",resizable";
	var sret = window.open(sUrl, 'QUERYBOX', sFeatures);
	sret.focus();

}

function fnShowQueryBox(plDLId, psFieldCode, psSLPF, psSLCF, psCDCN, psDDCN) {
// The two params psSLPF & psSLCF are NOT booleans, they are strings and must be treated as such
   var sParentCode = "";
   var sParentVal = "";
   var lWinSize = 450;
   var lXPos = (screen.width - lWinSize)/2;
   var lYPos = (screen.height - lWinSize)/2;
   var oField, sFieldType, sFeatures, sXMLSource;

   /* If this field is a sub-list filter child, then we must capture the parent's
      code and value */
   if(psSLCF == "true") {
      /* the global array "slfChildParent" contains a list of all parent-child
         relationships for query box children in the format: [ChildDSO][ParentDSO] */
      for(var i=0;i<slfChildParent.length;i++) {
         if(psFieldCode == slfChildParent[i][0]) {
            sParentCode = slfChildParent[i][1];
            if(document.forms.frmSubmit.elements[sParentCode]) {
               oField = document.forms.frmSubmit.elements[sParentCode];
               sFieldType = oField.type;
               if(sFieldType.toLowerCase() == "hidden") // querybox
                  sParentVal = oField.value;
               else if(oField.selectedIndex > -1) { // select control
                  if(oField.options[oField.selectedIndex] != null) // for netscape
                     sParentVal = oField.options[oField.selectedIndex].value;
               }
            }
            break;
         }
      }
   }

	if(document.frmSubmit.XMLSOURCE)
		sXMLSource = document.frmSubmit.XMLSOURCE.value;
	else
		sXMLSource = "CRP";

   // the three sub-list filtering params are NOT used on questionnaires
	var sUrl = "QueryBox.xml?QUERYMODE=NORMAL&dlid=" + plDLId + "&FieldCode=" + psFieldCode +
		"&XMLSOURCE=" + sXMLSource +
      "&SLPF=" + psSLPF + "&PARENTCODE=" + sParentCode + 
		"&dlvf=" + psCDCN + "&dldf=" + psDDCN +
      "&PARENTVAL=" + escape(sParentVal).replace(/\+/g,"%2B");

	//add session info if previous page using form variables for state handling
	if (typeof(document.frmSubmit.tempSessionId) != "undefined") 
		sUrl += '&tempSessionId='+document.frmSubmit.tempSessionId.value+'&sessionId='+document.frmSubmit.sessionId.value;
	
   if(rs_sBrowser == "NS4")
	   sFeatures = "screenX=" + lXPos + ",screenY=" + lYPos + ",width=" + lWinSize + ",height=" + lWinSize + ",resizable";
   else
      sFeatures = "left=" + lXPos + ",top=" + lYPos + ",width=" + lWinSize + ",height=" + lWinSize + ",resizable";
	var sret = window.open(sUrl, 'QUERYBOX', sFeatures);
	sret.focus();
}

function fnSelectQueryBoxItem(lbutton) {
// lbutton is either 0 or 1: zero means clear the entry
   var sID, sSLPF;
   sSLPF = document.forms.frmSubmit.SLPF.value;
	var selIndex = document.forms.frmSubmit.LOOKUP_RESULTS.selectedIndex;
	var oResults = document.forms.frmSubmit.LOOKUP_RESULTS;
	var sFldCode = document.forms.frmSubmit.FIELDCODE.value;
	var oDataFld = window.opener.document.frmSubmit.elements[sFldCode];
	var oDisplayFld = window.opener.document.frmSubmit.elements[sFldCode + "_display"];

   rs_NS4qrybox = false;
   if ((selIndex < 0 || oResults.options[selIndex].value == 'NO_RESULTS') && lbutton == 1) {
   // error conditions
		alert(MSG_SELECT_LISTITEM);
		return;
	}
   else {
      if(lbutton == 0) {
      // clear the field on the calling page
		   oDisplayFld.value = '';
		   oDataFld.value = '';
	   }
      else {
		   oDisplayFld.value = oResults.options[selIndex].text;
		   oDataFld.value = oResults.options[selIndex].value;
      }
   
      // if this field is a sub-list filter parent...
      if(sSLPF == "true") {
         if(oDataFld.value == "") { // no need for RPC call here
            window.opener.rs_RecursiveClear(sFldCode);
         }
         else {
            if(rs_sBrowser == "NS4") rs_NS4qrybox = true;

            // get the user session - the order of these two tries is important
            sID = getStateValue("tempSessionId");
            if(sID == "") sID = getStateValue("sessionId");
            if(sID != "") {
               if(rs_NS4qrybox)
                  rs_ExecuteRPC(sID, sFldCode, oDataFld.value);
               else
                  window.opener.rs_ExecuteRPC(sID, sFldCode, oDataFld.value);
            }
         }
      }
	}
	if(!rs_NS4qrybox) window.close();
}

function fnRunQueryBoxSearch()
{

	if (gbQBSearching == true) {
		//already searching so ignore
		return;
	}
	
	//verify that the calling form hasn't changed
	
	gbQBSearching = true;
	
	//Validate that something has been entered in the searchbox
	//Disable all the buttons.. Swap the DIV for the SelectBox if applicable
	//Populate and submit form to itself. ???
	//document.forms.frmSubmit.filtercriteria
	
	//read form parameters - do NOT remove wildcards from search criteria
	var sFilter = document.frmSubmit.LOOKUP_CRITERIA.value;
	var sSearchMin = document.frmSubmit.SEARCH_CRITERIA_MIN.value
	document.frmSubmit.LOOKUP_CRITERIA.value = sFilter;

	if (sFilter.length < sSearchMin) {
		//replace with actual variable once generated
		
		sTmp = MSG_INVALID_CRITERIA.replace(/\[X\]/,sSearchMin);
		alert(sTmp);
		document.frmSubmit.LOOKUP_CRITERIA.focus();
		gbQBSearching = false;

	} else {	

		//clear out the previous items and notify user that we're searching
		var oList = document.forms.frmSubmit.LOOKUP_RESULTS;
		ClearList(oList);
		AddOptionToList(oList, MSG_BUSY_SEARCHING, "", false, false);
	
		//submit the form
		document.forms.frmSubmit.FILTERCRITERIA.value = sFilter;
		document.frmSubmit.submit();
	}

}

function DeleteOptionFromList(oList, lIndex)
{
	oList.options[lIndex] = null;
	oList.selectedIndex = -1;
}

function OptionExists(oList, sValue)
{
	var lLength = oList.options.length;
	var lIndex;
				
	for(lIndex=0; lIndex<lLength; lIndex++)
	{
		if (oList.options[lIndex].value == sValue)
		{
			return(true);
		}
	}
	return(false);
}

function AddOptionToList(oList, sText, sValue, bDefault, bIsSelected)
{
	if (!(OptionExists(oList, sValue)))
	{
		var oNewOption = new Option(sText, sValue, bDefault, bIsSelected);
		var lLength = oList.length;
			
		oList.options[lLength] = oNewOption;
		
		if (bIsSelected)
		{
			oList.selectedIndex = lLength;
		}
	}
}

function ClearList(oList)
{
	var lLength = oList.options.length;
	var lIndex;
	
	for(lIndex=oList.length - 1; lIndex>=0; lIndex--)
	{
		DeleteOptionFromList(oList, lIndex);
	}
	return;
}

/**********************END QUERYBOX FUNCTIONS****************************/

function CancelFormSubmit() {
/* 
	When added to the onsubmit() method of a form, this will cancel submission (except
	through javascript). The query box page currently uses this.
*/
	return false;
}

/**********************BEGIN COOKIE FUNCTIONS****************************/
// Attempt a write to the cookie for cookies enabled verification - KRB 6/24/2003
// Verification of cookies enabled for pages requiring cookies
// COOKIES_REQUIRED is added as a parameter to specific ASP pages
//  that require cookies enabled to function properly (i.e. appJobCart.asp) - KRB 6/24/2003
function checkCookieEnabled(){
	if(document.frmSubmit){
		if(document.frmSubmit.COOKIES_REQUIRED){
			document.cookie = "CookiesEnabled=T";
			if (document.cookie.indexOf("CookiesEnabled=T") == -1){
				document.location="CookieWarning.xml";
			}
		}
	}
}

// Retrieves particular cookie
function getCookie(sName) { // use: getCookie("name");
/*
	The CRP stores cookies in key-value pairs per NamedCookie. The NamedCookie
	is the client site code + the client folder name. The CRP will hold a NamedCookie 
	for each CRP site a user visits.
*/
	var sRet, oCookie, iFirst, iLast, sCRPCookie, oCrumb;

	sRet = "";
	sCRPCookie = "";
	oCookie = document.cookie.split("; ");
	
	// find the name of the NamedCookie for the current CRP site
	for(var i=0; i<oCookie.length; i++) {
		oCrumb = oCookie[i].split("=");
		if(oCrumb[0] == "CRPCookieName") {
			sCRPCookie = oCrumb[1];
			break;
		}
	}

	if(sCRPCookie == "") return "";

	for(var i=0; i<oCookie.length; i++) {
		oCrumb = oCookie[i].split("=");
		// find the NamedCookie and search for the key (sName)
		if(oCrumb[0] == sCRPCookie) {
			iFirst = oCookie[i].indexOf(sName + "=");
			if(iFirst >= 0) {
				iFirst += sName.length + 1;
				iLast = oCookie[i].indexOf("&", iFirst);
				if(iLast < 0) iLast = oCookie[i].length;
	
				sRet = oCookie[i].substring(iFirst, iLast);
			}
			break;
		}
	}
	return unescape(sRet);
}

//retrieves a browser state value from a cookie of a hidden form field if 
//no cookie value exists  
function getStateValue(sFldName) {
// The sub-list filtering feature uses this function
	var sRetVal = getCookie(sFldName);

	if(sRetVal == "") {		
		if(document.frmSubmit.elements[sFldName])
         sRetVal = document.frmSubmit.elements[sFldName].value;
	}
	return sRetVal;
}

/**********************END COOKIE FUNCTIONS****************************/

function rs_BrowserWarningCheck() {
/*
   SLF is only supported for later versions of IE and NS. If the browser is unknown,
   we must display a warning message to the user.
*/
   var sWin, sFeatures, lWinSize, lXPos, lYPos, sWarning;
   
   if(rs_sBrowser != "OTHER" || (rs_sBrowser == "OTHER" && slfChildParent.length == 0)) return true;

   // don't nag - show warning only once
   sWarning = getStateValue("BrowserWarning");
   if(sWarning != "") return true;
     
   lWinSize = 600;
   lXPos = (screen.width - lWinSize)/2;
   lYPos = (screen.height - lWinSize)/2;

   if(rs_sBrowser == "NS4")
	   sFeatures = "screenX=" + lXPos + ",screenY=" + lYPos + ",width=" + lWinSize + ",height=" + lWinSize + ",resizable,scrollbars";
   else
      sFeatures = "left=" + lXPos + ",top=" + lYPos + ",width=" + lWinSize + ",height=" + lWinSize + ",resizable,scrollbars";
	sWin = window.open("BrowserWarning.xml", "", sFeatures);
	//Users might not get the warning if they have a popup blocker. check to see if window is there - if not, redirect to same content.
	//AFW PI 13308
	//tested with Google popup blocker.
	if (!sWin || sWin.closed)
		document.location = "BrowserWarning.xml";
	else
		sWin.focus();
}

/*
Remote scripting client include file

Will only work for Internet Explorer or Netscape compatible browsers of version 4 or higher
*/

var rs_sBrowser = rs_SetBrowser();
var rs_oAgent = null;
var rs_NS4qrybox = false; // different processing route if executing SLf from a querybox in NS 4

function rs_Agent() {
// Constructor for Agent object

   // special props for NS ver 6.1
   this.netscapeCounter = 0;
   this.netscapeMaxAttempts = 5;

   this.busy = false;
   this.argList = null;
   this.transport = rs_CreateTransport();
   this.RPC = rs_AgentRPC;
   this.Init = rs_AgentInitialize;
   this.Refresh = rs_AgentReset;
}

function rs_AgentReset() {
// reset global object for another call

// unlock the parent field
   if(rs_sBrowser != "NS4") rs_EnableSLFParent(this.argList[1]);

   this.argList = null;
   this.busy = false;
   this.netscapeCounter = 0;

   // must clear the transport document or IE will load it again on a Back or Forward navigation
   if(rs_sBrowser == "IE4") this.transport.document.location.replace("about:blank");

   // RPC calls and SLF processing occurs on the query pop-up with NS ver 4
   if(rs_NS4qrybox) self.close();
}

function rs_AgentInitialize(oArgs) {
// the list of arguments is: 0 - session ID, 1 - parent field code, 2 - parent field value

   // global object now in use
   this.busy = true;
   this.argList = oArgs;

   // freeze the parent and child controls
   rs_ToggleSLFFields(false, this.argList[1]);
}

function rs_AgentRPC() {
// transfer data to server via remote scripting

   var sServerPath, sServerXMLPath, sData, obj;
   
   sServerPath = "/crp/library/scripts/rsServer.asp";
   sServerXMLPath = "/crp/library/scripts/rsServerXML.asp";
   
   sData = rs_CompileTransportParams(this.argList);
   
   switch(rs_sBrowser) {
   case "IE4":
   case "IE5MAC":
      this.transport.document.location.replace(sServerPath + sData);
      break;
    
   case "IE5":
      this.transport.open("POST", sServerXMLPath, true);
      this.transport.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      this.transport.onreadystatechange = rs_CallBackXML;
      this.transport.send(sData);
      break;

   case "NS4":
   case "NS5":
      this.transport.src = sServerPath + sData;
      break;
         
   case "NS6":
   // netscape requires a finite amount of time to recognize a newly created iframe element
      this.netscapeCounter += 1;
      if(this.transport.contentDocument)
      // try-catch blocks will hose NS 4
         this.transport.contentDocument.location.replace(sServerPath + sData);
      else { // "catch"
         // try again later, but don't get caught in a never ending loop
         if(this.netscapeCounter <= this.netscapeMaxAttempts) setTimeout("rs_oAgent.RPC()", 100);
      }
      break;

   case "NS62":
      obj = new DOMParser();
      this.transport.open("POST", sServerXMLPath, true);
      this.transport.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      this.transport.onreadystatechange = rs_CallBackXML;
      this.transport.send(obj.parseFromString(sData, "text/xml"));
      break;
   }
}

function rs_CreateTransport() {
/* 
   The Agent transport mechanism is dependent on the client:
   IE4, NS4, NS6 = a hidden inline frame or layer
   IE5, NS62     = xmlHttpRequest object
*/
   var oTransport = null;
   var oIframe, sHTML;
   var sName = "rsAgent1";

   switch(rs_sBrowser) {
   case "IE4":
   case "IE5MAC":
      sHTML = "<iframe name=\"" + sName + 
         "\" style=\"border:0px;height:0px;width:0px\" src=\"\"></iframe>";
      document.body.insertAdjacentHTML("beforeEnd", sHTML);
      oTransport = window.frames[sName];
      break;

   case "IE5":
      oTransport = new ActiveXObject("Microsoft.XMLHTTP");
      break;
   
   case "NS4":
      oTransport = new Layer(100);
      oTransport.name = sName;
      oTransport.visibility = "hidden";
      oTransport.width = "0px";
      oTransport.height = "0px";
      break;

   case "NS6":
   case "NS5":
      oIframe = document.createElement("iframe");
      oIframe.name = sName;
      oIframe.style.border = "0px";
      oIframe.style.height = "0px";
      oIframe.style.width = "0px";
      oTransport = document.body.appendChild(oIframe);
      break;
         
   case "NS62":
      oTransport = new XMLHttpRequest();
      break;
   }
   return oTransport;
}

function rs_CompileTransportParams(oList) {
   var i = 0;
   var sDataString = "";
   
   if(oList != null) {
      for(i=0;i<oList.length;i++) {
         switch(i) {
         case 0:
         // this is the user session id
            sDataString += rs_PackageParam(i, "sID", oList[i]);
            break;
         case 1:
         // this is the parent field code
            sDataString += rs_PackageParam(i, "sFieldCode", oList[i]);
            break;
         case 2:
         // this is the parent field selected value
            sDataString += rs_PackageParam(i, "sFieldVal", oList[i]);
            break;
         }
      }

      // identify the broswer type
      sDataString += rs_PackageParam(i, "browser", rs_sBrowser.substr(0,2));
    }

   // create a well formed xml doc - necessary even if there are no params
   if(rs_sBrowser == "NS62") sDataString = "<xmldata>" + sDataString + "</xmldata>";
   
   return sDataString;
}

function rs_PackageParam(lNum, sParam, sValue) {
   var sRet;
   
   if(rs_sBrowser == "NS62")
      sRet = "<" + sParam + ">" + escape(sValue).replace(/\+/g,"%2B") + "</" + sParam + ">";
   else {
      sRet = sParam + "=" + escape(sValue).replace(/\+/g,"%2B");
      if(lNum == 0) {
         if(rs_sBrowser != "IE5") sRet = "?" + sRet; // first QueryString param        
      }
      else
         sRet = "&" + sRet; // next QueryString param
   }
   return sRet;
}

function rs_ExecuteRPC() {
// this public function is called from the CRP screen
   var Args;
   // this functionality is not available to all browser types
   if(rs_sBrowser == "OTHER") return false;

   // create the global Agent object if it doesn't exist
   if(rs_oAgent == null) rs_oAgent = new rs_Agent();
   
   // get data from server only if Agent is free
   Args = arguments;
   if(!rs_oAgent.busy) {
      rs_oAgent.Init(Args);
      
      if(rs_sBrowser == "NS6")
      // netscape requires a finite amount of time to recognize a newly created iframe element
         setTimeout("rs_oAgent.RPC()", 10);
      else
         rs_oAgent.RPC();
   }
}

function rs_CallBack(bFlag) {
// first process the data retrieved, then reset the Agent object
   if(!bFlag) {
      rs_oAgent.Refresh();
      return;
   } 

   // fill the child controls
     rs_LoadChildFields();
     rs_oAgent.Refresh();
}

function rs_CallBackXML() {
// handles xmlHttpRequest call backs
   var oXML;

   if(rs_oAgent.transport.readyState != 4 || !rs_oAgent.busy) return;

   oXML = rs_oAgent.transport.responseXML;
   rs_oAgent.Refresh();
   // fill the child controls
   rs_LoadChildFieldsXML(oXML);
}

function rs_SetBrowser() {
/* 
   Remote scripting functionality is dependent on browser compatability. We are interested in
   detecting these particular versions:
   IE -> 4, 5.01 or higher
   NS -> 4, between 6 and 6.23, 6.23 or higher
   
   return values:
   OTHER = unsupported browser
   IE4   = Internet Explorer ver 4
   IE5   = Internet Explorer ver 5 or greater
   IE5MAC = Internet Explorer ver 5 or greater on Mac Platform
   NS4   = Netscape ver 4
   NS5   = Netscape ver 5, includes 6.2.3 and mozilla
   NS6   = Netscape ver 6, pre 6.2.3 release
   NS62  = Netscape ver 6.2.3 or greater
*/
   var oArray, sRet, bOS;

   oArray = rs_DetectBrowser();
   
   // bOS will be set to true if user is on Mac
   bOS = rs_DetectOS();
   
   sRet = "OTHER"; // set default
   if(oArray[0] == "IE") {
      if(oArray[2] != "") {
         if(oArray[2] >= 5.01){
            if(bOS)
               sRet = "IE5MAC";
            else
            	sRet = "IE5";
         }
         else
            sRet = "IE4";
      }
   }
   else if(oArray[0] == "NS") {
      if(oArray[2] != "") {
      	 if (oArray[2] < 5)
            sRet = "NS4";
         else if(oArray[2] < 6)
            sRet = "NS5";
         else if(oArray[2] < 6.23)
            sRet = "NS6";
         else
            sRet = "NS62";
      }
   }
   return sRet;
}

function rs_DetectOS() {
/*	
   Operating System Detection.  This only checks for Macintosh.
   Added 4/05/2004 by NDB.  
   Reason:  IE 5.2 on Mac acts differently than Windows versions.
   Must treat Mac IE 5.2 differently. 
*/
	var sPlatform;
	sPlatform = navigator.userAgent;
 	var isMac = false;
 	if (sPlatform.indexOf('Mac') != -1)
  		isMac = true;
	return isMac;
}

function rs_DetectBrowser() {
/*
   Quasi-generic browser detection routine. It only looks for IE or Netscape versions 4 and above.
   
   return values:
   A three element array containing 
   [0] - browser type {IE or NS}
   [1] - browser version as a string (Netscape uses multiple periods)
   [2] - browser version as a real number
   If any part of the detection fails, an empty string is returned.
*/
   var oBrowserDefs = new Array("", "", "");
   var sAgent, lAgentVersion, sRet, re, sTmp, lTmp, i;

   sAgent = navigator.userAgent.toLowerCase();
   lAgentVersion = parseInt(navigator.appVersion);
   if(isNaN(lAgentVersion)) lAgentVersion = 0; // safety check

   sTmp = null;
   
   // test for IE here
   if(sAgent.indexOf("msie") != -1) {
      oBrowserDefs[0] = "IE";

      if(lAgentVersion >= 4) {
         re = new RegExp("msie [0-9.]{1,10}"); // the version number falls after the string MSIE
         sTmp = sAgent.match(re);

         if(sTmp != null) {
            sTmp = sTmp.toString(); // only one element in match collection
            sTmp = sTmp.substr(5);
         }
      }
   }

   // test for NS here
   else if((sAgent.indexOf('mozilla') != -1) && (sAgent.indexOf('spoofer') == -1) 
      && (sAgent.indexOf('compatible') == -1) && (sAgent.indexOf('opera') == -1) 
      && (sAgent.indexOf('webtv') == -1)) {

      oBrowserDefs[0] = "NS";

      if(lAgentVersion == 4) {
         re = new RegExp("mozilla/[0-9.]{1,10}");
         sTmp = sAgent.match(re);

         if(sTmp != null) {
            sTmp = sTmp.toString(); // only one element in match collection
            sTmp = sTmp.substr(8);                                               
         }
      }

      else if(lAgentVersion > 4) {
	  	 //this drops any info contained in () at the end of the string, and trims it
		 //this used to be broken with Netscape 7.1 (the most recent version)
		 //For Pivotal 13308
		 sAgent = sAgent.substr(0, sAgent.lastIndexOf("("));
		 sAgent = sAgent.replace(/^\s+/, '').replace(/\s+$/, '').replace(/^\xA0+/, '').replace(/\xA0+$/, '');
		 
         re = new RegExp("/[0-9.]{1,10}$"); // the version number is at the end of the userAgent string
         sTmp = sAgent.match(re);
         
         if(sTmp != null) {
            sTmp = sTmp.toString(); // only one element in match collection
            sTmp = sTmp.substr(1);
         }
      }
   }

   // convert the version string to a decimal number by removing any extra periods
   if(sTmp != null) {
      oBrowserDefs[1] = sTmp;
                
      i = sTmp.indexOf(".");
      if(i >= 0) {
         sTmp2 = sTmp.substr(0, i); // grab the whole number
         sTmp = sTmp.substr(i+1);
         sTmp = sTmp.replace(/\./g, ""); // collapse all successive periods
         sTmp = sTmp2.concat(".", sTmp);
      }
      lTmp = parseFloat(sTmp);
      if(isNaN(lTmp)) lTmp = ""; // safety check
      oBrowserDefs[2] = lTmp;
   }
   return oBrowserDefs;
}

// **** client control refreshing code below *****

function rs_PrepChildField(oField) {
/*
   Preps the child field in a sub-list filter relationship by saving the field's 
   current data, then clearing the field.
*/
   var sFieldType, oDisplayField, oParent, sParentType;
   var oRet = new Array("", "");

   // unlock parent/child field
   
   rs_ToggleSLFFields(true, oField);

   /* The child field is either a query box or a SELECT control. A query box value field is
      a hidden control by definition. */
   sFieldType = oField.type;
   
   // capture the field's current state
   if(sFieldType.toLowerCase() == "hidden") { // querybox
      if(rs_NS4qrybox)
         oDisplayField = window.opener.document.forms["frmSubmit"].elements[oField.name + "_display"];
      else
         oDisplayField = document.forms["frmSubmit"].elements[oField.name + "_display"];
      oRet[0] = oField.value;
      oRet[1] = oDisplayField.value;
      oField.value = "";
      oDisplayField.value = "";
   }
   else { // select control
      if(oField.selectedIndex > -1) { 
         if(oField.options[oField.selectedIndex] != null) { // necessary for netscape
            oRet[0] = oField.options[oField.selectedIndex].value;
            oRet[1] = oField.options[oField.selectedIndex].text;
         }
      }
      ClearList(oField);
   }

   return oRet;
}

function rs_SetFieldValue(oField, iSelectedVal, iDefaultVal, sDefaultVal, sDefaultTxt, oSelectedData) {
/* 
   Set the child field value based on the following:
   1st - with the previously selected value
   2nd - with the default value
   3rd - empty value (text box) or first option in list (select control)
*/
   var sFieldType, oDisplayField;
   
   /* The child field is either a query box or a SELECT control. A query box value field is
      a hidden control by definition. */
   sFieldType = oField.type;

   if(sFieldType.toLowerCase() == "hidden") { // querybox
      if(rs_NS4qrybox)
         oDisplayField = window.opener.document.forms["frmSubmit"].elements[oField.name + "_display"];
      else
         oDisplayField = document.forms["frmSubmit"].elements[oField.name + "_display"];

      if(iSelectedVal > -1) {
         oField.value = oSelectedData[0];
         oDisplayField.value = oSelectedData[1];
      }
      else if(iDefaultVal > -1) {
         oField.value = sDefaultVal;
         oDisplayField.value = sDefaultTxt;
      }
   }
   else if(oField.options.length > 0) { // select control
      if(iSelectedVal > -1)
         oField.selectedIndex = iSelectedVal;
      else if(iDefaultVal > -1)
         oField.selectedIndex = iDefaultVal;
      else 
         oField.selectedIndex = 0;
   }
}

function rs_LoadChildFieldsXML(oXML) {
/* Unpackage the return data from the dom document and load the child controls. There may
   be multiple child fields (<fld>) and multiple list items (<opt>) in each field.
   The return data format:
   <rsdata>
      <fld code="">
         <opt val=""></opt>
         ...
         <defval/>
         <deftxt/>
         <blktxt/>
      </fld>
      ...
   </rsdata>
*/
   var domList, oNodeList, sChildFieldCode, oChildField, oFieldState, sDefaultVal, sDefaultTxt, sValue;
   var iSelectedVal, iDefaultVal, sFieldType, sBlankTxt, bBlankExists;
   
   domList = oXML.getElementsByTagName("fld");
   for(var i=0;i<domList.length;i++) {
      if(rs_sBrowser == "IE5" || rs_sBrowser == "IE5MAC")
         sChildFieldCode = domList.item(i).attributes.getNamedItem("code").text;
      else
         sChildFieldCode = domList[i].attributes["code"].value;
      
      // get the field default info
      oNodeList = domList[i].getElementsByTagName("defval");
      sDefaultVal = oNodeList[0].firstChild.nodeValue;
      oNodeList = domList[i].getElementsByTagName("deftxt");
      sDefaultTxt = oNodeList[0].firstChild.nodeValue;

		// blank display text is an optional node
      oNodeList = domList[i].getElementsByTagName("blktxt");
		if(oNodeList.length > 0) {
      sBlankTxt = oNodeList[0].firstChild.nodeValue;
			bBlankExists = true;
		}
		else {
			sBlankTxt = "";
			bBlankExists = false;
		}

      if(document.forms["frmSubmit"].elements[sChildFieldCode]) {
         oChildField = document.forms["frmSubmit"].elements[sChildFieldCode];
         oFieldState = rs_PrepChildField(oChildField);

         /* The child field is either a query box or a SELECT control. A query box value field is
            a hidden control by definition. */
         sFieldType = oChildField.type;

         // add the blank display text to the select control
         if(sFieldType.toLowerCase() != "hidden" && bBlankExists) 
            AddOptionToList(oChildField, sBlankTxt, "", false, false);
			else
				bBlankExists = false; // must turn this off for query boxes

         iSelectedVal = -1;
         iDefaultVal = -1;
         oNodeList = domList[i].getElementsByTagName("opt");
         for(var j=0;j<oNodeList.length;j++) {
            if(rs_sBrowser == "IE5" || rs_sBrowser == "IE5MAC")
               sValue = oNodeList.item(j).attributes.getNamedItem("val").text;
            else
               sValue = oNodeList[j].attributes["val"].value;

            if(sValue == oFieldState[0]) iSelectedVal = j;
            if(sValue == sDefaultVal) iDefaultVal = j;
            if(sFieldType.toLowerCase() != "hidden") // add items to select control
               AddOptionToList(oChildField, oNodeList[j].firstChild.nodeValue, sValue, false, false);
         }

         if(bBlankExists) { // if a match was found, bump up the index
            if(iSelectedVal > -1) iSelectedVal += 1;
            if(iDefaultVal > -1) iDefaultVal += 1;
         }
         rs_SetFieldValue(oChildField, iSelectedVal, iDefaultVal, sDefaultVal, sDefaultTxt, oFieldState);
      }
   }
}

function rs_LoadChildFields() {
/* Unpackage the return data from the hidden inline doc and load the child controls. There may
   be multiple child fields (denoted by the index "i") and multiple list items (<option>) in each field.
   The return data format:
   <input name="Ci" value="">  -- child field code
   <select name="Li">
      <option value=""></option>
      ...
   </select>
   <input name="Vi" value="">  -- default value
   <input name="Ti" value="">  -- default display text
   <input name="Bi" value="">  -- blank display text
*/
   var i, oForm, sChildFieldCode, oChildField, oList, sFieldType, sBlankTxt;
   var sDefaultVal, sDefaultTxt, oFieldState, iSelectedVal, iDefaultVal, bBlankExists;
   
   if(rs_sBrowser == "NS6" || rs_sBrowser == "NS5")
      oForm = rs_oAgent.transport.contentDocument.frmRSReturn;
   else
      oForm = rs_oAgent.transport.document.forms["frmRSReturn"];
      
   i = 0;
   while(true) {
      // exit when there are no new children
      if(!oForm.elements["C" + i.toString()]) break;

      // collect data for this child field
      sChildFieldCode = oForm.elements["C" + i.toString()].value;
      oList = oForm.elements["L" + i.toString()];
      sDefaultVal = oForm.elements["V" + i.toString()].value;
      sDefaultTxt = oForm.elements["T" + i.toString()].value;
      
		// blank display text is an optional node
		if(oForm.elements["B" + i.toString()]) {
      sBlankTxt = oForm.elements["B" + i.toString()].value;
			bBlankExists = true;
		}
		else {
			sBlankTxt = "";
			bBlankExists = false;
		}

      if(rs_NS4qrybox)
         oChildField = window.opener.document.forms["frmSubmit"].elements[sChildFieldCode];
      else
         oChildField = document.forms["frmSubmit"].elements[sChildFieldCode];

      if(oChildField) {
         oFieldState = rs_PrepChildField(oChildField);

         /* The child field is either a query box or a SELECT control. A query box value field is
            a hidden control by definition. */
         sFieldType = oChildField.type;
         
         // add the blank display text to the select control
         if(sFieldType.toLowerCase() != "hidden" && bBlankExists) 
            AddOptionToList(oChildField, sBlankTxt, "", false, false);
         else
				bBlankExists = false; // must turn this off for query boxes

         iSelectedVal = -1;
         iDefaultVal = -1;
         for(var j=0;j<oList.options.length;j++) {
            if(oList.options[j].value == oFieldState[0]) iSelectedVal = j;
            if(oList.options[j].value == sDefaultVal) iDefaultVal = j;
            if(sFieldType.toLowerCase() != "hidden") // add items to select control
               AddOptionToList(oChildField, oList.options[j].text, oList.options[j].value, false, false);
         }

         if(bBlankExists) { // if a match was found, bump up the index
            if(iSelectedVal > -1) iSelectedVal += 1;
            if(iDefaultVal > -1) iDefaultVal += 1;
         }
         rs_SetFieldValue(oChildField, iSelectedVal, iDefaultVal, sDefaultVal, sDefaultTxt, oFieldState);
      }
      i += 1;
   }

}

function rs_ToggleSLFFields(bEnable, vFld) {
/*
   Enables sub-list filter fields on rpc return from server; disables fields on rpc request.   
   if bEnable=True, vFld is a child field object
   if bEnable=False, vFld is a parent field code value
*/
   var oFld, sType, oArray;
   
   if(bEnable) {
      // parent field is unlocked during the agent refresh for safety reasons

      // unlock child field
      sType = vFld.type;
      if(sType.toLowerCase() == "hidden" && rs_sBrowser != "NS4") { // enable query button
         oFld = document.frmSubmit.elements[vFld.name + "_qry"];
         oFld.disabled = false;
      }
      else { // select control
      	
         if(rs_sBrowser == "NS4")
            // this destroys the onfocus event for this field!
            vFld.onfocus = fnEnableNetscapeControl;
         else
            vFld.disabled = false;
      }
   }

   else {
      if(rs_NS4qrybox)
         oFld = window.opener.document.frmSubmit.elements[vFld];
      else
         oFld = document.frmSubmit.elements[vFld];

      if(oFld) {
         sType = oFld.type;
         // disable the parent (doesn't effect NS 4)
         if(sType.toLowerCase() == "hidden" && rs_sBrowser != "NS4") { // disable query button
            oFld = document.frmSubmit.elements[vFld + "_qry"];
            oFld.disabled = true;
         }
         else  // select control
            oFld.disabled = true;
         
         if(rs_NS4qrybox)
            oArray = window.opener.slfChildParent;
         else
            oArray = slfChildParent;

         for(var i=0;i<oArray.length;i++) {
            if(oArray[i][1] == vFld) { // a parent may have many children
               if(rs_NS4qrybox)
                  oFld = window.opener.document.frmSubmit.elements[oArray[i][0]];
               else
                  oFld = document.frmSubmit.elements[oArray[i][0]];

               if(oFld) {
                  sType = oFld.type;

                  // disable the child control (doesn't effect NS 4), but don't clear
                  if(sType.toLowerCase() == "hidden" && rs_sBrowser != "NS4") { // disable query button
                     oFld = document.frmSubmit.elements[oArray[i][0] + "_qry"];
                     oFld.disabled = true;
                  }
                  else // select control
                     oFld.disabled = true;

                  rs_RecursiveClear(oArray[i][0]);
               }
            }
         }
      }
   }
}

function rs_RecursiveClear(sFld) {
/* 
   All fields that are grandchildren or great-grandchildren or etc., 
   must be cleared and disabled to prevent invalid data sets appearing
   in long SLF chains (P - C - GC - GGC).
   
   sFld is a parent field
*/
   var oFld, oDisplayFld, sType, oButton, oArray;

   if(rs_NS4qrybox)
      oArray = window.opener.slfChildParent;
   else
      oArray = slfChildParent;

   for(var i=0;i<oArray.length;i++) {
      if(oArray[i][1] == sFld) { // a parent may have many children
         if(rs_NS4qrybox)
            oFld = window.opener.document.frmSubmit.elements[oArray[i][0]];
         else
            oFld = document.frmSubmit.elements[oArray[i][0]];

         if(oFld) {
            sType = oFld.type;
            
            if(sType.toLowerCase() == "hidden") {
            // clear the query box; disable the button
               if(rs_NS4qrybox)
                  oDisplayFld = window.opener.document.frmSubmit.elements[oArray[i][0] + "_display"];
               else
                  oDisplayFld = document.frmSubmit.elements[oArray[i][0] + "_display"];
               
               oFld.value = "";
               oDisplayFld.value = "";
               if(rs_sBrowser != "NS4") {
                  oButton = document.frmSubmit.elements[oArray[i][0] + "_qry"];
                  oButton.disabled = true;
               }
            }
            else {
            // disable the select control and clear it
               ClearList(oFld);
               oFld.disabled = true; // (doesn't effect NS 4)
            }
            rs_RecursiveClear(oArray[i][0]); // continue to the next generation
         }
      }
   }
}

function rs_EnableSLFParent(sFld) {
// enable the SLF parent field
// this is never called when the browser is NS 4
   var oFld, sType;
   
   if(document.frmSubmit.elements[sFld]) {
      oFld = document.frmSubmit.elements[sFld];
      sType = oFld.type;
      if(sType.toLowerCase() == "hidden") { // enable the button
         oFld = document.frmSubmit.elements[sFld + "_qry"];
         oFld.disabled = false;
      }
      else // select control
         oFld.disabled = false;
   }
}
//KRL 12/04 added to support new Vision IR/Questionnaire XML
function getDLCheckboxXML(sAnsID, sForm, sFldID) {
	var objFld, objFldDisplay;
	var sXML="";
	
	objFld = document.forms[sForm].elements[sFldID];
	objFldDisplay = document.forms[sForm].elements[sFldID + '_display'];
	for(var i=0;i<objFld.length;i++) {
		if(objFld[i].checked){
			sXML += "<ANSWER id=\"" + sAnsID + "\" domainid=\"" + objFld[i].value + "\">";
			sXML += "<![CDATA[" + trim(objFldDisplay[i].value) + "]]></ANSWER>";
		}
	}
	return sXML;
}