/* Global variables */

var is_gecko = false;
var agt=navigator.userAgent.toLowerCase();
var arrLayer = new Array();

/* Constants */

var constNAME = 1;
//This is new -- do I want this -- could collide with NE
var constCONTENT = 2;	
var constSTATE = 3;
var constQUESTION_ID = 6;
var constQUESTION_DEPENDENCY = 7;
var constUI_TYPE_ID = 8;
var constDATA_TYPE_ID = 9
var constDISPLAY_RULE_ID = 10;
var constARR_GROUP_QUESTION_ID = 11;
var constINITIAL_ANSWER_VALUE = 12;			
var constVISIBLE = 1;
var constHIDDEN = 2;

/* UI_TYPE Constants */
var G_UI_CHECKBOX = 1;
var G_UI_COMBOBOX = 2;
var G_UI_RADIO_BUTTON = 3;
var G_UI_TEXTBOX = 4;
var G_UI_NARRATIVE = 5;
var G_UI_QUESTION_HEADER = 6;
var G_UI_PASSWORD = 7;
var G_UI_NO_EDIT = 8;
var G_UI_EXTERNAL_SOURCE = 9;
var G_UI_RADIO_HORIZONTAL = 10;
var G_UI_HIDDEN = 11;
var G_UI_CUSTOM = 12;
var G_UI_TEXTAREA = 13;
var G_UI_NARRATIVE_HIGHLIGHT = 14;
var G_UI_BANNER = 15;

/* DATA_TYPE Constants */
var G_DATA_TYPE_INTEGER = 1;
var G_DATA_TYPE_TEXT = 2;
var G_DATA_TYPE_BOOLEAN = 3;
var G_DATA_TYPE_CURRENCY = 4;
var G_DATA_TYPE_DOUBLE = 5;
var G_DATA_TYPE_DATE = 6;
var G_DATA_TYPE_INTEGER_ZERO_EVAL = 7;
var G_DATA_TYPE_CURRENCY_ZERO_EVAL = 8;
var G_MISSING_DATA_TOKEN = '-9999';
var G_EMPTY_STRING = '';


/* Browser Determination */
if (agt.indexOf('gecko') != -1) {
	is_gecko = true;
}

/****************************************
* ClearQuestionValue
*****************************************/						
function ClearQuestionValue(strQID,lngUIType) {
	var frmObj
	var lngUIType;
	var i;
		
	frmObj = eval('document.frmDisplay.' + strQID);
	if(frmObj != null) {	
			
		switch (lngUIType){   
			case G_UI_RADIO_BUTTON:
			case G_UI_RADIO_HORIZONTAL:     
				for(var j = 0 ; j < frmObj.length ; ++j) {
					frmObj[j].checked = false
				}
				break;  
								
			case G_UI_COMBOBOX:       
				frmObj.options[frmObj.selectedIndex].value = G_EMPTY_STRING;
				break;
				
			case G_UI_CHECKBOX:       
				frmObj.checked = false;
				break;   
					
			case G_UI_TEXTBOX:       
				frmObj.value = G_EMPTY_STRING;  
				break;   
		}
		SetfrmSubmitterValue(strQID,G_EMPTY_STRING);
		frmObj.name = 'Deleted';
	}//if
}		

/****************************************
* EvaluateDependencies
*****************************************/
function EvaluateDependencies(pintCurrentLayerIndex) {
	var i;
	var lngCountUpdateLayers;
	var lngOriginalState;
	var lngEvaledState;
	var blnDependencyChanged;
	var frmObj;
	var arrUpdateLayer = new Array();
	blnDependencyChanged = false;
	
	lngCountUpdateLayers = 0
	
	//if the layer below the current layer is not the last layer
	if(pintCurrentLayerIndex + 1 < arrLayer.length) {
		for(i=pintCurrentLayerIndex + 1; i<arrLayer.length; i++) {
			//If the question has a dependency evaluate it
			if(arrLayer[i][constQUESTION_DEPENDENCY] != G_EMPTY_STRING) {
				lngOriginalState = arrLayer[i][constSTATE];
				if((Evaluator(arrLayer[i][constQUESTION_DEPENDENCY])) == true) {
					lngEvaledState = constVISIBLE;
				}
				else {
					lngEvaledState = constHIDDEN;
				}
				if(lngOriginalState != lngEvaledState) {
					arrLayer[i][constSTATE] = lngEvaledState;
					UpdateLayerElements(i);
					arrUpdateLayer[lngCountUpdateLayers] = i;
					lngCountUpdateLayers = lngCountUpdateLayers + 1;
				}
			}
		}//for
		if(lngCountUpdateLayers > 0) {
			UpdateLayerState(arrUpdateLayer);
		}
	}
}

/****************************************
* FillQuestionValue
*****************************************/						
function FillQuestionValue(pstrQID,plngUITypeID,pvarInitialAnswerValue) {
	var frmObj;
	var i;
	var varInitialAnswerValue;
	
	SetfrmSubmitterValue(pstrQID,pvarInitialAnswerValue);
	SetfrmDisplayValue(pstrQID,plngUITypeID,pvarInitialAnswerValue)	
}

/****************************************
* GetCurrentValue
*****************************************/		
function GetCurrentValue(pfrmObj) {
	if(pfrmObj.type == 'select-one')
		return pfrmObj.options[pfrmObj.selectedIndex].value;
	else if(pfrmObj.type == 'checkbox') {
		if(pfrmObj.checked)
			return 'Y';
		else
			return 'N';
	}
	else
		return pfrmObj.value;
}	

/****************************************
* GetfrmSubmitterValue
*****************************************/		
function GetfrmSubmitterValue(pstrQID) {
	return eval('document.frmSubmitter.' + pstrQID + '.value');
}

/****************************************
* GetObject
*****************************************/
function GetObject(pstrObjName) {
	var objLayer;
		
	if(is_gecko)
		objLayer = document.getElementById(pstrObjName);
	else
		objLayer = eval('document.all.' + pstrObjName);

	return objLayer;
}	
		
/****************************************
* GetPreviousVisibleLayer
*****************************************/		
function GetPreviousVisibleLayer(pintLayerIndex) {
	
	var intPreviousLayerIndex;
	
	intPreviousLayerIndex = pintLayerIndex - 1;
	while((intPreviousLayerIndex > 0) && (IsVisible(arrLayer[intPreviousLayerIndex][constNAME]) == false)) {
		intPreviousLayerIndex = intPreviousLayerIndex - 1;
	}
	return intPreviousLayerIndex;
}

/****************************************
* HideLayer
*****************************************/
function HideLayer(plngLayerIndex) {
	var objLayer;
				
	objLayer = GetObject(arrLayer[plngLayerIndex][constNAME]);
//	arrLayer[plngLayerIndex][constCONTENT] = objLayer.innerHTML;
	objLayer.innerHTML = G_EMPTY_STRING;
}

/****************************************
* IsDisplayOnly
*****************************************/ 
function IsDisplayOnly(plngUIType) {
	if((plngUIType == G_UI_NARRATIVE) || (plngUIType == G_UI_HIDDEN) || (plngUIType == G_UI_NARRATIVE_HIGHLIGHT) || (plngUIType == G_UI_BANNER))
		return true;
	else
		return false;
}

/****************************************
* IsEmpty
*****************************************/ 
function IsEmpty(pvarValue) {
	if(pvarValue == G_EMPTY_STRING)
		return true;
	else
		return false;
}

/****************************************
* IsGroupHeader
*****************************************/ 
function IsGroupHeader(plngUIType) {
	if(plngUIType == G_UI_QUESTION_HEADER)
		return true;
	else
		return false;
}

/****************************************
* IsVisible
*****************************************/ 
function IsVisible(pobjLayer) {
	if (pobjLayer[constSTATE] == constVISIBLE)
		return true;
	else
		return false;
}

/****************************************
* JumpToQuestion
*****************************************/
function JumpToQuestion(plngQID) {
	var frmObj;
	
				
	frmObj = eval('document.frmDisplay.Q' + plngQID);
	
	if(frmObj != null) {
		switch (frmObj.type){   
			case 'radio':       
				frmObj[0].focus();
				break;  
													
			case 'select-one' :       
				frmObj.focus();  
				break;   
						
			case 'checkbox' :       
				frmObj.focus();  
				break;   
							
			case 'text':
			case 'password':
			case 'textarea':
				frmObj.focus();
				frmObj.select();  
				break;   
		}
		return false;
	}
}


/****************************************
* MaintainDisplayFormValues
*****************************************/
function MaintainDisplayFormValues() {
	var i;
	var varSubmitterValue;

	for (i=1;i<arrLayer.length;i++) {
		if (IsVisible(arrLayer[i])) {
			if(IsGroupHeader(arrLayer[i][constUI_TYPE_ID])) {
				for(var j=1;j<arrLayer[i][constARR_GROUP_QUESTION_ID].length;j++) {
					if(!(IsDisplayOnly(arrLayer[i][constARR_GROUP_QUESTION_ID][j][constUI_TYPE_ID])))  {
						varSubmitterValue = GetfrmSubmitterValue(arrLayer[i][constARR_GROUP_QUESTION_ID][j][constQUESTION_ID]);
						SetfrmDisplayValue(arrLayer[i][constARR_GROUP_QUESTION_ID][j][constQUESTION_ID],arrLayer[i][constARR_GROUP_QUESTION_ID][j][constUI_TYPE_ID],varSubmitterValue);	
					}//if
				}//for
			}//if				
			else {
				if(!(IsDisplayOnly(arrLayer[i][constUI_TYPE_ID])))  {
					varSubmitterValue = GetfrmSubmitterValue(arrLayer[i][constQUESTION_ID]);
					SetfrmDisplayValue(arrLayer[i][constQUESTION_ID],arrLayer[i][constUI_TYPE_ID],varSubmitterValue);	
				}//if
			}//else
		}//if
	}//for
}

/****************************************
* MonthYearDependency
*****************************************/
function MonthYearDependency(strYearQID,strMonthQID) {
	if(IsEmpty(GetfrmSubmitterValue(strYearQID))) {
		SetfrmSubmitterValue(strYearQID,0)
	}
	if(IsEmpty(GetfrmSubmitterValue(strMonthQID))) {
		SetfrmSubmitterValue(strMonthQID,0)
	}
	EvaluateDependencies(0);
}

/****************************************
* RetrieveQuestionDataType
*****************************************/						
function RetrieveQuestionDataType(lngQID) {
		
	var lngLayerNum;
	var strQID;
	var blnFound;
	var lngDataType;
	var i;
	var j;
		
	strQID = "Q" + lngQID;
	blnFound = false;
	lngLayerNum = 0;
		
	//Find the Q_ID's layer
		for (i=1;i<arrLayer.length;i++) {
			if(arrLayer[i][constUI_TYPE_ID] == G_UI_QUESTION_HEADER) {
				for(j=1;j<arrLayer[i][constARR_GROUP_QUESTION_ID].length;j++) {
					if(arrLayer[i][constARR_GROUP_QUESTION_ID][j][constQUESTION_ID] == strQID){
						lngDataType = arrLayer[i][constARR_GROUP_QUESTION_ID][j][constDATA_TYPE_ID];
						blnFound = true;
					}//if
				}//for
			}//if				
			else {
				if(arrLayer[i][constQUESTION_ID] == strQID) {
					lngDataType = arrLayer[i][constDATA_TYPE_ID];
					blnFound = true;
				}	 
			} //else
		} //for
		return lngDataType;
}

/****************************************
* RetrieveQuestionLayer
*****************************************/						
function RetrieveQuestionLayer(strQID) {
		
	var lngLayerNum;
	var blnFound;
	var i;
	var j;
		
	blnFound = false;
	lngLayerNum = 0;
		
	//Find the Q_ID's layer
		for (i=1;i<arrLayer.length;i++) {
			if(arrLayer[i][constUI_TYPE_ID] == G_UI_QUESTION_HEADER) {
				for(j=1;j<arrLayer[i][constARR_GROUP_QUESTION_ID].length;j++) {
					if(arrLayer[i][constARR_GROUP_QUESTION_ID][j][constQUESTION_ID] == strQID){
						lngLayerNum = i;
						blnFound = true;
					}//if
				}//for
			}//if				
			else {
				if(arrLayer[i][constQUESTION_ID] == strQID) {
					lngLayerNum = i;
					blnFound = true;
				}	 
			} //else
		} //for
		return lngLayerNum;
}

/****************************************
* SetDependencyTrue
*****************************************/
function SetDependencyTrue(pstrQID) {
	var lngLayerIndex;
					
	lngLayerIndex = RetrieveQuestionLayer(pstrQID);
	arrLayer[lngLayerIndex][constQUESTION_DEPENDENCY] = 'true';
}

/****************************************
* SetfrmSubmitterValue
*****************************************/				
function SetfrmSubmitterValue(pstrQID,pvarValue) {
	eval('document.frmSubmitter.' + pstrQID + '.value = pvarValue');
}

/****************************************
* SetfrmDisplayValue
*****************************************/				
function SetfrmDisplayValue(pstrQID,plngUITypeID,pvarValue) {
	var frmObj;
		
	frmObj = eval('document.frmDisplay.' + pstrQID);
	
	if(frmObj != null) {	
		switch (plngUITypeID){
			
			case G_UI_EXTERNAL_SOURCE:
			case G_UI_CUSTOM:
				switch(frmObj.type) {
					
					case 'radio':
						for(var j = 0 ; j < frmObj.length ; ++j) {
							if(frmObj[j].value == pvarValue) {
								frmObj[j].checked = true;
								break;
							}
						}
						break;
				
				 case 'checkbox':
					if(pvarValue == 'Y') {
						frmObj.checked = true;
					}
					break;			
				
					case 'select-one':
						for(var k=0; k < frmObj.options.length; k++) {
							if(frmObj.options[k].value == pvarValue) {
								frmObj.selectedIndex = k;
								frmObj.options[k].selected = true;
								break;
							}
						}
						break;
						
					case 'text':
					case 'textarea':
						frmObj.value = pvarValue;
						break;									
				}//switch
				break;
		  
		  case G_UI_RADIO_HORIZONTAL:
			case G_UI_RADIO_BUTTON:     
				for(var j = 0 ; j < frmObj.length ; ++j) {
					if(frmObj[j].value == pvarValue) {
						frmObj[j].checked = true;
						break;
					}
				}
				break;
								
			case G_UI_COMBOBOX:  
				for(var k=0; k < frmObj.options.length; k++) {
					if(frmObj.options[k].value == pvarValue) {
						frmObj.selectedIndex = k;
						frmObj.options[k].selected = true;
						break;
					}
				}
				break;
				
			case G_UI_CHECKBOX:      
				if(pvarValue == 'Y') {
					frmObj.checked = true;
				}
				break;			
					
			case G_UI_TEXTBOX:     
			case G_UI_TEXTAREA:  
				frmObj.value = pvarValue;  
				break;
				   
		}//switch
	}//if
}//function

/****************************************
* ShowLayer
*****************************************/
function ShowLayer(plngLayerIndex) {
	var objLayer;
				
	objLayer = GetObject(arrLayer[plngLayerIndex][constNAME]);
	objLayer.innerHTML = arrLayer[plngLayerIndex][constCONTENT];
}

/****************************************
* SubmitForm
*****************************************/
function SubmitForm() {
	var i;			
	var j;
	var frmSubmitterObj;	
	
	for (i=1;i<arrLayer.length;i++) {
		if (!(IsDisplayOnly(arrLayer[i][constUI_TYPE_ID]))) {
			//Set hidden Question to missing data token
			if(IsVisible(arrLayer[i]) == false){
				if(arrLayer[i][constUI_TYPE_ID] == G_UI_QUESTION_HEADER) {
					for(j=1;j<arrLayer[i][constARR_GROUP_QUESTION_ID].length;j++) {
						if (!(IsDisplayOnly(arrLayer[i][constARR_GROUP_QUESTION_ID][j][constUI_TYPE_ID])))  {
							SetfrmSubmitterValue(arrLayer[i][constARR_GROUP_QUESTION_ID][j][constQUESTION_ID],G_MISSING_DATA_TOKEN)
							}
					}//for
				}				
				else {
					SetfrmSubmitterValue(arrLayer[i][constQUESTION_ID],G_MISSING_DATA_TOKEN);
				} //else
			} //if
		} //if
	} //for
	document.frmSubmitter.submit();
} //function


/****************************************
* UpdateForm
*****************************************/
function UpdateForm(pfrmObj,plngLayerIndex) {
	var frmSubmitterObj;
	
	frmSubmitterObj = eval('document.frmSubmitter.' + pfrmObj.name);
	frmSubmitterObj.value = GetCurrentValue(pfrmObj);
	EvaluateDependencies(plngLayerIndex);
}

/****************************************
* UpdateLayerElements
*****************************************/
function UpdateLayerElements(plngLayerIndex) {
	var objLayer;
	var j;
			
	objLayer = GetObject(arrLayer[plngLayerIndex][constNAME]);
	
	if(arrLayer[plngLayerIndex][constSTATE] == constVISIBLE) {
		objLayer.innerHTML = arrLayer[plngLayerIndex][constCONTENT];
		if(IsGroupHeader(arrLayer[plngLayerIndex][constUI_TYPE_ID])) {
			for(j=1;j<arrLayer[plngLayerIndex][constARR_GROUP_QUESTION_ID].length;j++) {
				if(!(IsDisplayOnly(arrLayer[plngLayerIndex][constARR_GROUP_QUESTION_ID][j][constUI_TYPE_ID])))  {
					if(IsEmpty(GetfrmSubmitterValue(arrLayer[plngLayerIndex][constARR_GROUP_QUESTION_ID][j][constQUESTION_ID]))) {	
						FillQuestionValue(arrLayer[plngLayerIndex][constARR_GROUP_QUESTION_ID][j][constQUESTION_ID],arrLayer[plngLayerIndex][constARR_GROUP_QUESTION_ID][j][constUI_TYPE_ID],arrLayer[plngLayerIndex][constARR_GROUP_QUESTION_ID][j][constINITIAL_ANSWER_VALUE]);
					}//if
				}//if
			}//for
		}//if
		else {
			if (!(IsDisplayOnly(arrLayer[plngLayerIndex][constUI_TYPE_ID]))) {
				if(IsEmpty(GetfrmSubmitterValue(arrLayer[plngLayerIndex][constQUESTION_ID]))) {
					FillQuestionValue(arrLayer[plngLayerIndex][constQUESTION_ID],arrLayer[plngLayerIndex][constUI_TYPE_ID],arrLayer[plngLayerIndex][constINITIAL_ANSWER_VALUE]);
				} //if
			} //if
		} //else
	}//if
	else {
		//if the question is part of a group, must clear out the member
		if(IsGroupHeader(arrLayer[plngLayerIndex][constUI_TYPE_ID])) {
			for(j=1;j<arrLayer[plngLayerIndex][constARR_GROUP_QUESTION_ID].length;j++) {
				if (!(IsDisplayOnly(arrLayer[plngLayerIndex][constARR_GROUP_QUESTION_ID][j][constUI_TYPE_ID]))) {
					ClearQuestionValue(arrLayer[plngLayerIndex][constARR_GROUP_QUESTION_ID][j][constQUESTION_ID],arrLayer[plngLayerIndex][constARR_GROUP_QUESTION_ID][j][constUI_TYPE_ID]);
				}
			}//for
		}
		else {
			if (!(IsDisplayOnly(arrLayer[plngLayerIndex][constUI_TYPE_ID])))
				ClearQuestionValue(arrLayer[plngLayerIndex][constQUESTION_ID],arrLayer[plngLayerIndex][constUI_TYPE_ID]);
		}
	}//else	
	
}//function


/****************************************
* UpdateLayers
*****************************************/
function UpdateLayerState(parrUpdateLayer) {
	var i;
	var lngLayerIndex;
	
	for (i=0;i<parrUpdateLayer.length;i++) {
		lngLayerIndex = parrUpdateLayer[i]; 
		if(arrLayer[lngLayerIndex][constSTATE] == constVISIBLE)
			ShowLayer(lngLayerIndex);
		else
			HideLayer(lngLayerIndex);
	}
	MaintainDisplayFormValues();
}

function DisplayForm() {

	var i;
	var str;
	for (i=0;i<document.frmSubmitter.elements.length;i++) {
		str = str + document.frmSubmitter.elements[i].name + ': ' + document.frmSubmitter.elements[i].value + '\n';  
	}//for 
	alert(str);
}
function PopulateLenderDetails(pLenderData,pLenderQID,pAccountQID,pAmountQID,pBalanceQID) {
    var sLender;
    var sLenderID;
    var sAccount;
    var sPayment;
    var sBalance;
    var sLenderData;
    var aLenders;
    var objTextBox;
    
    sLenderID = 0;
    sLender = '';
    sAccount = '';
    sPayment = '';
    sBalance = '';
    
    var pos = pLenderData.indexOf('~');
    if ((pLenderData != null) && (pos >= 0)) {
		    var aTMP = pLenderData.split( '~' );
		    sLenderID = aTMP[0];
		    sLender = aTMP[1];
            sAccount = aTMP[2];
            sPayment = aTMP[3];
            sBalance = aTMP[4];
	    }

    var txtBoxes = document.frmSubmitter.getElementsByTagName("INPUT");
    for(var i = 0; i < txtBoxes.length; i++){
        if(txtBoxes[i].name == pLenderQID)
          FillQuestionValue(pLenderQID,4, sLender);
        if(txtBoxes[i].name == pAccountQID)
          FillQuestionValue(pAccountQID,4, sAccount);
        if(txtBoxes[i].name == pAmountQID)
          FillQuestionValue(pAmountQID,4, sPayment);
        if(txtBoxes[i].name == pBalanceQID)
          FillQuestionValue(pBalanceQID,4, sBalance);
          
      };
      
       
      objTextBox = document.getElementById(pLenderQID);
      if(objTextBox != null) {
        if (sLenderID > 0) {
            objTextBox.disabled = true;
        }else{
            objTextBox.disabled = false;
        }
      
      }
      
       
}
