﻿//variables
//***global???***
//default first zone controls prefix
var control_prefix = "ctl00_ContentPlaceHolder1_ctl00_SSLControl_";
var zone_prefix = "ctl00_ContentPlaceHolder1_ctl00_SSLZone_";

//***global***
//get a client side ID for a relative ID
function GetID(relativeControlID) 
{
	return control_prefix + relativeControlID;
}

//get a client side ID based on a zone number
function GetIDByZoneNumber(zoneNumber, relativeControlID) 
{
	zoneNumber = zoneNumber - 1;
	if(zoneNumber < 10) 
	{
		//adding zero if only one digit
		//zoneNumber from number to string
		zoneNumber = "0" + zoneNumber; 
	}
	var this_control_prefix = "ctl00_ContentPlaceHolder1_ctl" + zoneNumber + "_SSLControl_";
	//alert(this_control_prefix + relativeControlID);
	return this_control_prefix + relativeControlID;
}

//get a client side ID based on a zone number
function GetZoneIDByZoneNumber(zoneNumber, relativeZoneID) 
{
	zoneNumber = zoneNumber - 1;
	if(zoneNumber < 10) 
	{
		zoneNumber = "0" + zoneNumber; 
	}
	var this_zone_prefix = "ctl00_ContentPlaceHolder1_ctl" + zoneNumber + "_SSLZone_";

	return this_zone_prefix + relativeZoneID;
}

//***global***
//control change set other controls visibility
function SetControlsVisibilityOnChange(dependControlIDList, 
									affectControlIDList, 
									logicalOperatorList, 
									relationalOperatorList, 
									compareValueList, 
									compareTypeList)
{
	
	var affectControlPropertyNameList = new Array();
	var trueValueList = new Array();
	var falseValueList = new Array();
	
	//removes gap placeholder
	//.style.display = 'block' / 'none'
	
	//retain gap of the controls
	//.style.visibility = 'visible' / 'hidden'
	
	for(index in affectControlIDList) 
	{
		affectControlPropertyNameList[index] = "style.display";
		trueValueList[index] = "block";
		falseValueList[index] = "none";
	}
	
	//-------------------------------------------------
	//using generic property setting method
	SetControlsPropertyOnChange(dependControlIDList, 
									affectControlIDList, 
									logicalOperatorList, 
									relationalOperatorList, 
									compareValueList, 
									compareTypeList,
									affectControlPropertyNameList,
									trueValueList,
									falseValueList);
	//-------------------------------------------------
}

//***global***
//control change set other controls visibility
function SetControlsPropertyOnChange(dependControlIDList, 
									affectControlIDList, 
									logicalOperatorList, 
									relationalOperatorList, 
									compareValueList, 
									compareTypeList,
									affectControlPropertyNameList,
									trueValueList,
									falseValueList)
{
	//might use array push method to further simplty code
	//http://www.w3schools.com/jsref/jsref_push.asp
	
	var nextDependControlID; 
    var control;
	
	for(index in dependControlIDList) 
	{
		nextDependControlID = dependControlIDList[index];
		
    	control = document.getElementById(nextDependControlID);
		
    	if (navigator.appName=="Microsoft Internet Explorer")
    	{
        	control.attachEvent("onchange", SetControlsPropertyOnChangeEventHandler);
		}
    	else //other than IE
    	{
			control.addEventListener("change", SetControlsPropertyOnChangeEventHandler, false);
    	}
	
		var theControlsPropertyParameters = new ControlsPropertyParameters();
		theControlsPropertyParameters.DependControlIDs = dependControlIDList;
		theControlsPropertyParameters.AffectControlIDs = affectControlIDList;
		theControlsPropertyParameters.LogicalOperators = logicalOperatorList;
		theControlsPropertyParameters.RelationalOperators = relationalOperatorList;
		theControlsPropertyParameters.CompareValues = compareValueList;
		theControlsPropertyParameters.CompareTypes = compareTypeList;
		theControlsPropertyParameters.AffectControlPropertyNames = affectControlPropertyNameList;
		theControlsPropertyParameters.TrueValues = trueValueList;
		theControlsPropertyParameters.FalseValues = falseValueList;
		
		control.propertyParameters = theControlsPropertyParameters;
	}
	
	//first call after all setup done, do set default
	nextDependControlID = dependControlIDList[0];
    control = document.getElementById(nextDependControlID);
	if (navigator.appName=="Microsoft Internet Explorer")
    {
        control.fireEvent('onChange');
	}
    else //other than IE
    {
		//Firefox do not have equivalent of fireEvent
		//control.change();
    }
}

//***global***
//get parameter object for a event handler
//http://www.captain.at/howto-addeventlistener-attachevent-parameters.php
function GetEvtData(evt, parameters) 
{
	//alert(parameters);
	var e_out;
	var ie_var = "srcElement";
	var moz_var = "target";
	var prop_var = parameters;
	// "target" for Mozilla, Netscape, Firefox et al. ; "srcElement" for IE
	
	evt[moz_var] ? e_out = evt[moz_var][prop_var] : e_out = evt[ie_var][prop_var];
	return (e_out);
}

//***global***
//class to wrap a list of parameters for event handler
function ControlsPropertyParameters() //this is a class
{
	//1. depend controlids
	//2. list of affecting control ids
	//3. relational operators 	
	//		>		GreaterThan			Number
	//		<		LessThan			Number
	//		>=		GreaterThanOrEqual	Number
	//		<=		LessThanOrEqual		Number
	//		==		Equal				String/Number
	//		!=		NotEqual			String/Number
	//4. logical operators 	
	//		AND 
	//		OR
	//5. the values to compare
	//6. type compare 			
	//		string
	//		number
	//7. the value to set if compare result true, this value could be false
	//e.f. if(true) then false etc
	
	var DependControlIDs; 
	var AffectControlIDs;
	var LogicalOperators;
	var RelationalOperators;
	var CompareValues;
	var CompareTypes;
	var AffectControlPropertyNames;
	var TrueValues;
	var FalseValues;
}

function getLogicalOperator(logicalOperator) 
{
	logicalOperator = logicalOperator.toLowerCase();
	var resultValue;
	
	//		>		GreaterThan			Number
	//		<		LessThan			Number
	//		>=		GreaterThanOrEqual	Number
	//		<=		LessThanOrEqual		Number
	//		==		Equal				String/Number
	//		!=		NotEqual			String/Number
	
	switch(logicalOperator) 
	{
		case "greaterthan":			resultValue = ">"; 	break;
		case "lessthan": 			resultValue = "<";	break;
		case "greaterthanorequal": 	resultValue = ">=";	break;
		case "lessthanorequal": 	resultValue = "<=";	break;
		case "equal": 				resultValue = "==";	break;
		case "notequal": 			resultValue = "!=";	break;
		
		default: 					resultValue = "==";	break;
	}
	return resultValue;
}

function getRelationalOperator(relationalOperator) 
{
	relationalOperator = relationalOperator.toLowerCase();
	var resultValue;
	
	//		&&		AND			
	//		||		OR			
	
	switch(relationalOperator) 
	{
		case "and":			resultValue = "&&"; break;
		case "or": 			resultValue = "||";	break;
		
		default: 			resultValue = "&&";	break;
	}
	return resultValue;
}

//***global***
//set a list of controls visible property depend on ValueForVisible
//worls with ControlsVisibilityParameters
function SetControlsPropertyOnChangeEventHandler(evt) 
{
	var parameters = GetEvtData(evt, "propertyParameters");

	var nextDependControlID; //dependent control ids
	var nextAffectControlID; //next affect control id
	
    var nextDependControl;
	
	var nextLogicalOperator;
	var nextRelationalOperator;
	
	var nextCompareValue;
	var nextCompareType;
	
	var inputValue; //ddl selected value
	var controlType; //text(Textbox) or select-one(Dropdownlist) etc
	var evalValue;
	
	var DependControlIDInputValues = new Array();
	
	for(index in parameters.DependControlIDs) 
	{
		nextDependControlID = parameters.DependControlIDs[index];
		nextDependControl = document.getElementById(nextDependControlID);
		controlType = nextDependControl.type; //typeof control; //gives 'object'
	
		if(controlType == 'text') //textbox
		{
			inputValue = nextDependControl.value.toLowerCase();
		}
		else if(controlType == 'select-one') //dropdownlist
		{
			inputValue = nextDependControl[nextDependControl.selectedIndex].value.toLowerCase();
		}
		else if(controlType == 'checkbox') //checkbox checked or value?
		{
			inputValue = "" + nextDependControl.checked; //boolean in string 
		}
		DependControlIDInputValues[index] = inputValue;
	}
	
	var evalCode;
	var result;
	var boolConditions = new Array();
	
	for(index in DependControlIDInputValues) 
	{
		inputValue = DependControlIDInputValues[index].toLowerCase();
		nextCompareValue = parameters.CompareValues[index].toLowerCase();
		
		evalcode = "if(inputValue " + getLogicalOperator(parameters.LogicalOperators[index]) + " nextCompareValue) result = true; else result = false;";
		
		eval(evalcode);
		
		boolConditions[index] = result;
	}
	
	evalCode = "result = ("; //build a list of true and false. e.g. "true || false && true && false"
	for(index in boolConditions) 
	{
		if(index == 0) 
		{
			evalCode += boolConditions[index];
		}
		else // > 0
		{
			evalCode += " " + getRelationalOperator(parameters.RelationalOperators[index-1]) + " " + boolConditions[index];
		}
	}
	evalCode += ")";

	evalValue = eval(evalCode);
	
	//loop all affecting controls and set teh visible value
	for(index in parameters.AffectControlIDs) 
	{
    	nextID = parameters.AffectControlIDs[index];
		control = document.getElementById(nextID);

		if(control != null) 
		{
			if(evalValue) 
			{
				result = parameters.TrueValues[index];
			}
			else 
			{
				result = parameters.FalseValues[index];
			}
	
			//need browser detection? as code might be different in IE to other Browsers
			evalCode =  "control." + parameters.AffectControlPropertyNames[index] + " = result;";
			eval(evalCode);
		}
	}
	
	CheckAffectControlsIsHiddenThenClearData(parameters.AffectControlIDs) 
}

function CheckAffectControlsIsHiddenThenClearData(affectControlIDList) 
{
	//check is affecting controls are invisible (hidden), then try clear data
	var controlType;
	var nextAffectingControlID;
	var nextAffectingControl;
	
	for(index in affectControlIDList) 
	{
		nextAffectingControlID = affectControlIDList[index];
		nextAffectingControl = document.getElementById(nextAffectingControlID);
		//alert(nextAffectingControl.style.visibility);
		if(nextAffectingControl.style.visibility == "hidden") 
		{
			controlType = nextAffectingControl.type; //typeof control; //gives 'object'
			
			if(controlType == 'text') //textbox
			{
				nextAffectingControl.value = "";
			}
			else if(controlType == 'select-one') //dropdownlist
			{
				nextAffectingControl.selectedIndex = 0;
			}
			else if(controlType == 'checkbox') //checkbox checked or value?
			{
				nextAffectingControl.checked = false;
			}
		}
	}
}

function SUMOnChange(addingControlIDList, theSumControlID) 
{
    var nextAddingControlID;
    var control;

    for (index in addingControlIDList)
    {
		nextAddingControlID = addingControlIDList[index];
		//alert(nextAddingControlID);
        control = document.getElementById(nextAddingControlID);
		
        if (navigator.appName=="Microsoft Internet Explorer")
        {
            control.attachEvent("onchange", SUMHandler);
        }
        else //firefox?
        {
            control.addEventListener("change", SUMHandler, false);
        }
		
		var theSUMParameters = new SUMParameters();
		theSUMParameters.AddingControlIDs = addingControlIDList;
		theSUMParameters.SumControlID = theSumControlID;
		control.sumParameters = theSUMParameters;
    }
	//first call after all setup done, do set default
	nextAddingControlID = addingControlIDList[0];
    control = document.getElementById(nextAddingControlID);
	if (navigator.appName=="Microsoft Internet Explorer")
    {
        control.fireEvent('onChange');
	}
    else //other than IE
    {
		//Firefox do not have equivalent of fireEvent
		//control.change();
    }
}

//a class to hold SUM parameter used by SUM event handler
function SUMParameters()
{
	var AddingControlIDs;
	var SumControlID;
}

function SUMHandler(evt)
{
	var parameters = GetEvtData(evt, "sumParameters");
	
    var sumControl = document.getElementById(parameters.SumControlID);

    var total = 0;
    var nextAddingControlID;
    var control;
    var floatValue;
	var controlType;

    for(index in parameters.AddingControlIDs)
    {
		//alert(index);
		nextAddingControlID = parameters.AddingControlIDs[index];
        control = document.getElementById(nextAddingControlID);               

        if (isNaN(control.value) == true)
        {
            control.value = "0";
		}
		
		controlType = control.type; 
		
		if(controlType == 'text') //textbox
		{
			floatValue = parseFloat(control.value);
		}
		else if(controlType == 'select-one') //dropdownlist
		{
			floatValue = parseFloat(nextDependControl[nextDependControl.selectedIndex].value);
		}
		else if(controlType == 'checkbox') //checkbox checked or value?
		{
			floatValue = parseFloat(control.value);
		}           
        total += floatValue;
    }
    sumControl.value = total.toString();
}