var isStateCalc;
var isStateModify = false;
var isBacktoCalc = false;
var printpage = null;

var appl = '';

//hold the index of the element 
//from appliance list currently modified.
//used for NE4 to mimic disable list selection during Modification state
var modifiedIndex = -1;
var oDataElement = parent.fra_cal;
var LIST_WIDTH = 100;
if (!parent.isClientBrouserIE) {
	LIST_WIDTH = 95;
	if (parent.isClientBrouserNN47) {
		LIST_WIDTH = 95;
	}
}

var bgNotValid = "red";
var bgValid = "#EEF0ED";

function displayAppliance(i){
	//i -> appliance index - the value property of the dropdown list
	var oElement = oDataElement.document.frmCalc;
	if (i < 0 ) return;
	//set defaults
	oElement.selHD.selectedIndex = arrHD[i];
	oElement.selMD.selectedIndex = arrMD[i];
	oElement.selDM.selectedIndex = arrDM[i];

	oElement.txtQty.value = '1';
	oElement.lblPow.value= ''+arrPower[i]; 
	oElement.lblRate.value= ''+arrRate[i]; 

	if (isBacktoCalc) {oElement.lblRate.value=oldrate;alert('gothere');}
	oElement.lblTip.value= arrTip[i]; 
	computeCost();
}

function polulateSelect(oElement, maxNum){ //, defValue){
	var selected = 0;
	emptySelect(oElement);
	for (i=0; i <= maxNum; i++) {
		var option = new Option(i,i, true, true);
		if (top.isClientBrouserIE50x) 
			oDataElement.addOption(oElement,i,i,i);
		else
			oElement.options[i] = option;
	}
}

// ***************************************************************************************
// swapThreshold
// Changes the image with the given image.
// ***************************************************************************************
function swapThreshold(imgname, newImageSrc) {
	n = arguments[0].toString();
	eval("oDataElement.document." + n + ".src='images/" + newImageSrc + "'");
}

// ***************************************************************************************
// SetColor
// Changes the font color for the given html form element.
// ***************************************************************************************
function setColor(el, bg) {
	if (el.style) el.style.color = bg;
}

// ***************************************************************************************
// CheckThreshold
// Checks the users total kWh threshold -- Adjusts the rate accordingly.
// ***************************************************************************************
function checkThreshold() {
	if (top.applPowerTotal >= kWhThreshold) {
		currentRate = maxThresholdRate;
		swapThreshold("calc_exclamtion_light_grey", "calc_exclamtion.gif");
		swapThreshold("calc_exclamtion_dark_grey", "calc_dark_exclamtion.gif");
		setColor(oDataElement.document.frmCalc.lblkWhTotalHigh, bgNotValid);
	} else {
		currentRate = minThresholdRate;
		swapThreshold("calc_exclamtion_light_grey", "spacer.gif");
		swapThreshold("calc_exclamtion_dark_grey", "spacer.gif");
		setColor(oDataElement.document.frmCalc.lblkWhTotalHigh, bgValid);
	}
	oDataElement.document.frmCalc.lblRate.value = currentRate;
	for (i = 0; i < arrRate.length; i++) {
		arrRate[i] = currentRate;
	}
}

// ***************************************************************************************
// displayTotals
// Displays the kWh grand total and the money grand total.
// ***************************************************************************************
function displayTotals() {
	var oElement = oDataElement.document.frmCalc.lstAppl;
	
	//show total 
	oDataElement.document.frmCalc.lblTotal.value = "$" + convert2Money(''+ top.applTotal);

	// ***************************************************************************************
	// March 16, 2004 - iStudio - KH. Display the total kWh
	// April 19, 2006 - Hydro One - total kWh changed to 600 for summer season 
	// Oct 18, 2007 - Hydro One - total kWh changed to 1000 for winter season 
	if (top.applPowerTotal >= kWhThreshold) {
		oDataElement.document.frmCalc.lblkWhTotalLow.value = kWhThreshold;
		if ( ((Math.round(top.applPowerTotal-kWhThreshold)) <= 0) && (oElement.length != 0) ) {
			oDataElement.document.frmCalc.lblkWhTotalHigh.value = "< 1";
		} else {
			oDataElement.document.frmCalc.lblkWhTotalHigh.value = Math.round(top.applPowerTotal-kWhThreshold);
		}
	} else {
		if ( (Math.round(top.applPowerTotal) <= 0) && (oElement.length != 0) ) {
			oDataElement.document.frmCalc.lblkWhTotalLow.value = "< 1";
		} else {
			oDataElement.document.frmCalc.lblkWhTotalLow.value = Math.round(top.applPowerTotal);
		}
		oDataElement.document.frmCalc.lblkWhTotalHigh.value = "";
	}
	// ***************************************************************************************
}

function addListElement(i){
	if (i < 0 ) return;
	var oElement = oDataElement.document.frmCalc.lstAppl;
	var oElement1 = oDataElement.document.frmCalc;
	
	// ***************************************************************************************
	// March 16, 2004 - iStudio - KH. Compute the kWh for the new appliance
	var kWh = computekWh();
	var dispkWh = Math.round(kWh);

	if (dispkWh <= 0) {
		dispkWh =  ' < 1';
	} else {
		dispkWh = ' ' + dispkWh;
	}
	
	// March 16, 2004 - iStudio - KH. Compute the applPowerTotal
	top.applPowerTotal = top.applPowerTotal + kWh;
	
	// March 16, 2004 - iStudio - KH. Check if the total kWh is max/min threshold -- change rate before cost calculation.
	checkThreshold();
	
	var cost = computeCost();
	var dispCost = ' $' + cost;

	var kwhSpacer = 7;
	var costSpacer = 7;

	if (dispkWh.length <= 7) {
		kwhSpacer = kwhSpacer-dispkWh.length;
	} else { 
		kwhSpacer=0;
	}
	
	if (dispCost.length <= 7) {
		costSpacer = costSpacer-dispCost.length;
	} else { 
		costSpacer;
	}

	var totalData = spacer(kwhSpacer) +  dispkWh + 'kWh' + spacer((LIST_WIDTH * 0.2)-dispCost.length) + dispCost;
	//compute total
	top.applTotal = top.applTotal + parseFloat(cost);

	// tabulate layout
	var row =  arrAppl[i].substr(0,35) + spacer(LIST_WIDTH);
	row = row.substr(0, (LIST_WIDTH * 0.4)); // sixty % the width should be used.
	row = row + spacer((LIST_WIDTH * 0.4)- totalData.length) + totalData;
	// March 16, 2004 - iStudio - KH. Add the kWh to the row to be displayed
	// ***************************************************************************************
	
	// add appliance 2 list
	var oOption = new Option(row,i, true, true);
	if (oElement.options[0]!= null){
		if (top.isClientBrouserIE50x) 
			oDataElement.addOption(oElement,row,i,oElement.options.length);
		else
			oElement.options[oElement.options.length] = oOption;
	}
	else {
		if (top.isClientBrouserIE50x) { 
			oDataElement.addOption(oElement,row,i,0);
		} else { 
			oElement.options[0] = oOption;
		}
	}   
	// store in cache
	top.storeElement(i,
					oElement.options.length-1, 
					cost,
					oElement1.txtQty.value,
					oElement1.selHD.selectedIndex,
					oElement1.selMD.selectedIndex,
					oElement1.selDM.selectedIndex,
					oElement1.selMY.value,
					oElement1.lblPow.value,
					oElement1.lblRate.value);
	
	//point to last (NE!)
	oElement.selectedIndex = oElement.options.length - 1;
	
	// display the total money and kWh values in the html form
	displayTotals();
}

function spacer(n){
	var result='';
	var i;
	for (i=0; i<n; i++)
	result = result + '.';
	return result;
}

function computeCost(){
	var oField = oDataElement.document.frmCalc;
	var result;
	var kwh =   (parseInt(oField.selHD.options[oField.selHD.selectedIndex].text) +  parseFloat(oField.selMD.options[oField.selMD.selectedIndex].text) / 60) *
				parseInt(oField.selDM.options[oField.selDM.selectedIndex].text) *
				parseInt(oField.selMY.value) *
				parseFloat(oField.lblPow.value);
	
	// ***************************************************************************************
	// March 16, 2004 - iStudio - KH. Remove option to change months/year. Now an hidden input type
	//              parseInt(oField.selMY.options[oField.selMY.selectedIndex].text) *
	// ***************************************************************************************
	
	// Cost for electricity:   rate X kwh's used X 1.092 [[[divided by 100]]]
	var cost1 = (parseFloat(oField.lblRate.value) / 100) * kwh * 1.092;
	
	// Delivery:  1.817 X kwh's used divided by 100
	// NOV 2002 UPDATE: Low Voltage Update: 1.817 -> 1.890
	// March 16, 2004 - iStudio - KH: Update 1.890 -> 1.97
	// April 19, 2006 - Hydro One: Update 1.97 -> 3.62 some Regulatory charges added, plus 4.8% OEB-approved increase
	var cost2 = 3.63 * kwh / 100;
	
	// Regulatory charges:  1.600 X kwh's used X 1.092 divided by 100
	// April 19, 2006 - Hydro One: Update 1.600 -> 0.680 some regulatory charges moved to Delivery above
	// Oct 19, 2007 - Hydro One: Updated 0.680 -> 0.620 to correct rate X line loss
	var cost3 = 0.620 * kwh * 1.092 / 100;
	
	//  Debt Retirement Charge:  0.7 X kwh's used divided by 100.
	var cost4 = 0.7 * kwh / 100;
	
	// add it all up
	var cost = (cost1 + cost2 + cost3 + cost4) * parseInt(oField.txtQty.value);
		
	// OLD Formula
	//var cost =  parseInt(oField.txtQty.value) * 
	//           (parseInt(oField.selHD.options[oField.selHD.selectedIndex].text) +
	//            parseFloat(oField.selMD.options[oField.selMD.selectedIndex].text) / 60) *
	//                  parseInt(oField.selDM.options[oField.selDM.selectedIndex].text) *
	//            parseInt(oField.selMY.options[oField.selMY.selectedIndex].text) *
	//            parseFloat(oField.lblRate.value) * 
	//            parseFloat(oField.lblPow.value);
	
	result = convert2Money(''+ cost);
	oField.lblCost.value = result;
	return result;
}

function computekWh() {
	var oField = oDataElement.document.frmCalc;
	
	var kwh =   (parseInt(oField.selHD.options[oField.selHD.selectedIndex].text) +  parseFloat(oField.selMD.options[oField.selMD.selectedIndex].text) / 60) *
				parseInt(oField.selDM.options[oField.selDM.selectedIndex].text) *
				parseInt(oField.selMY.value) *
				parseFloat(oField.lblPow.value);

//alert(kwh + " x " + oField.txtQty.value + " = " + kwh * parseInt(oField.txtQty.value));

	if (kwh <= 1) {
		kwh = Math.round(kwh * parseInt(oField.txtQty.value));
	} else {
		kwh = Math.round(kwh) * parseInt(oField.txtQty.value);
	}

	return kwh;
}

function computekWhByElement(index) {
	var hd = top.applListHD[index];
	var md = top.applListMD[index];
	var dm = top.applListDM[index];
	var my = top.applListMY[index];
	var power = top.applListPower[index];
	var qty = top.applListQty[index];
	
	var kwh =   (parseInt(hd) + parseFloat(md) / 60) *
				parseInt(dm) *
				parseInt(my) *
				parseFloat(power);
	
	if (kwh <= 1) {
		kwh = Math.round(kwh * parseInt(qty));
	} else {
		kwh = Math.round(kwh) * parseInt(qty);
	}

	return kwh;
}

function composeListElement(applName, applCost){
	convert2Money(applCost);
}

function convert2Money(applCost){
	//requires string
	
	var iCost = Math.floor (parseFloat(applCost));  
	//get decimal part  
	var dCost = applCost.substring (applCost.indexOf('.')+1);
	if (applCost.indexOf('.') > -1) {
		//round to 2 digits
		//shift by 2 .->.->. (*100) and round
		if (dCost.length == 1){ 
			//handle trailing zero
			dCost = dCost + '0';
		}
		dCost = Math.round (parseFloat(dCost.substring(0,2) + '.' + dCost.substring(2)));
		if (dCost == 0){ 
			dCost = '00';
		}
		else if (dCost > 99){ 
			//handle overflow
			dCost = '00';
			iCost = parseInt(iCost) + 1;
		}
		else if (dCost < 10){ 
			//handle leading zero
			dCost = '0' + dCost;
		}
	}
	else
		dCost = '00';
	//combine... i+d    
	return iCost + '.' + dCost;
}


function deleteListElement(i){
	var oElement = oDataElement.document.frmCalc.lstAppl;
	if (i < 0 ) return;
	
	// ***************************************************************************************
	// March 16, 2004 - iStudio - KH. Get the kWh parameters and calculate kWh:
	var kwh = computekWhByElement(i);
	
	if (oElement.options[i]!= null)
		oElement.options[i]=null; //remove option!!! 
	
	//re-compute and update total
	// March 16, 2004 - added round function to prevent negative values where 1.299 - 1.3
	top.applTotal = (Math.round((top.applTotal- top.applListCostArr[i])*100)/100);
	 
	// March 16, 2004 - Remove the list element's kWh from the running total.   
	top.applPowerTotal = top.applPowerTotal - kwh;
	
	// March 16, 2004 - iStudio - KH. Check if the total kWh is max/min threshold -- change rate before cost calculation.
	checkThreshold();
	
	// display the total money and kWh values in the html form
	displayTotals();
	
	top.removeElement(i); //from cache
}

function fillAppliances(){
	var oIdx = 0;
	var oElement = oDataElement.document.frmCalc.selAppl;
	// reset select box
	emptySelect(oElement);

	//fill from array
	for (i = 0; i < arrAppl.length; i++) {
		var option = new Option(arrAppl[i],i, true, true);
		if (top.isClientBrouserIE50x) oDataElement.addOption(oElement,arrAppl[i],i,oIdx);           
		else oElement.options[oIdx] = option;
		oIdx = oIdx + 1; 
	}
	
	//position to first
	oElement.options[0].selected = true;
	displayAppliance(oElement.options[0].value);
}

function emptySelect(oElement){
	var last = oElement.options.length - 1;
	for (i = last; i >=0; i--) {
		oElement.options[i]=null; //remove option
	}
}

function restoreList(){
	var arrLength = top.applListNameArr.length;
	var oElement = oDataElement.document.frmCalc.lstAppl;
	var cost;
	var dispCost;
	var row;
	var kwh;
	var dispkWh;
	
	if (arrLength>0){
		emptySelect(oElement)
		for (i = 0; i <  arrLength ; i++) {
	
			kwh = computekWhByElement(i);
			dispkWh = Math.round(kwh);

			if (dispkWh <= 0) {
				dispkWh =  ' < 1';
			} else {
				dispkWh = ' ' + dispkWh;
			}
	
			cost = top.applListCostArr[i];
			dispCost = ' $' + cost; 
			
			var kwhSpacer = 7;
			var costSpacer = 7;
		
			if (dispkWh.length <= 7) {
				kwhSpacer = kwhSpacer-dispkWh.length;
			} else { 
				kwhSpacer=0;
			}
			
			if (dispCost.length <= 7) {
				costSpacer = costSpacer-dispCost.length;
			} else { 
				costSpacer;
			}
		
			var totalData = spacer(kwhSpacer) +  dispkWh + 'kWh' + spacer((LIST_WIDTH * 0.2)-dispCost.length) + dispCost;

			// tabulate layout
			var row =  arrAppl[top.applListNameArr[i]].substr(0,35) + spacer(LIST_WIDTH);
			row = row.substr(0, (LIST_WIDTH * 0.4)); // % the width should be used.
			row = row + spacer((LIST_WIDTH * 0.4)- totalData.length) + totalData;
		
			// add appliance 2 list
			var oOption = new Option(row,top.applListNameArr[i], true, true);
			if (top.isClientBrouserIE50x) 
						oDataElement.addOption(oElement,row,top.applListNameArr[i],i);      
			else oElement.options[i] = oOption;
			
		}
		//point to last (NE!)
		oElement.selectedIndex = oElement.options.length - 1;
		
		// display the total money and kWh values in the html form
		displayTotals();
	
	} else {
		doReset();
		return;
	}
}

//state management procedures
function checkStateModify() {
	if (isStateModify) {
		alert("Please finish modifying your appliance details and click the blue OK button.");
		return true;
	}
	return false;
}

function setStateModify(){
	var oElement = oDataElement.document.frmCalc;
	swapThreshold("button3", "calc_button_ok.gif");
	
	//store this index to disable selection while in modify state (NE)
	modifiedIndex = oElement.lstAppl.selectedIndex; 
	isStateCalc = false;
	isStateModify = true;
}

function setStateCalc(){
	var oElement = oDataElement.document.frmCalc;
	swapThreshold("button3", "calc_button_modify.gif");
	var isBacktoCalc = true;

	if (typeof(oDataElement.document.frmCalc) == "object") {
		var oElement = oDataElement.document.frmCalc;
		oElement.selAppl.disabled=false;
		oElement.lstAppl.disabled=false;
	} else {
		//load calculator in data frame
		var returnflag = true;
		modifiedIndex = -1;
		isStateCalc = true;
		isStateModify = false;
	}
	
	modifiedIndex = -1;
	isStateCalc = true;
	isStateModify = false;

}

// menu buttons onclick event handlers
function doAdd(){
	if (typeof(oDataElement.document.frmCalc) != "object") return;
	if (checkStateModify()) return;
	var oElement = oDataElement.document.frmCalc.selAppl;
	if (oElement.selectedIndex < 0 ) return;
	addListElement(oElement.options[oElement.selectedIndex].value );
}

function doDelete(){
	if (typeof(oDataElement.document.frmCalc) != "object") return;
	if (checkStateModify()) return;
	var idx = oDataElement.document.frmCalc.lstAppl.selectedIndex;
	deleteListElement(idx);
}

function doReset(){
	if (typeof(oDataElement.document.frmCalc) != "object") return;
	if (checkStateModify()) return;
	emptySelect(oDataElement.document.frmCalc.lstAppl)
	top.applTotal = 0.00;
	top.applPowerTotal = 0;
	parent.resetCache();
	
	oDataElement.document.frmCalc.lblTotal.value = "$0.00";
	oDataElement.document.frmCalc.lblkWhTotalLow.value = "0";
	oDataElement.document.frmCalc.lblkWhTotalHigh.value = "";
	checkThreshold();
}

function doModify(){
	if (typeof(oDataElement.document.frmCalc) != "object") return;
	var oElement = oDataElement.document.frmCalc;
	if (oElement.lstAppl.selectedIndex < 0) return;
	var idx = oElement.lstAppl.selectedIndex;
	var i = oElement.lstAppl.options[idx].value;
	if (isStateModify) {
	//end modify
		modifiedIndex = -1;
	// store in cache
		top.storeElement(i,idx, computeCost(),
					oElement.txtQty.value,
					oElement.selHD.selectedIndex,
					oElement.selMD.selectedIndex,
					oElement.selDM.selectedIndex,
					oElement.selMY.value,
					oElement.lblPow.value,
					oElement.lblRate.value);
	
		// calculate the new kWh total
		top.applPowerTotal = 0; // - Reset the kWh running total.
		var arrLength = top.applListNameArr.length;
		var kwh;
	
		for (i = 0; i <  arrLength ; i++) {
			kwh = computekWhByElement(i);
			top.applPowerTotal = top.applPowerTotal + kwh;
			checkThreshold();
		}
	
		// ***************************************************************************************
		
		//re-compute & show total 
		top.computeTotal();

		//update list row
		restoreList(); 

		setStateCalc();

		return;
	}

	//start modify
	setStateModify();
	//check major/minor
	var major = false
	if (arrMajMin[i]>0){
		major= true;
	}
	fillAppliances();
	
	
	//show data from cache
	if (idx < 0) return;
	var idxValue = oElement.lstAppl.options[oElement.lstAppl.selectedIndex].value ;
	
	//set right pannel data
	oElement.txtQty.value = top.applListQty[idx];
	oElement.selHD.selectedIndex = top.applListHD[idx];
	oElement.selMD.selectedIndex = top.applListMD[idx];
	oElement.selDM.selectedIndex = top.applListDM[idx];
	oElement.selMY.value = top.applListMY[idx];
	oElement.lblPow.value = top.applListPower[idx];
	oElement.lblRate.value = top.applListRate[idx];     
	
	computeCost();
	
	//find index in selAppl
	for (i=0; i<oElement.selAppl.options.length; i++){
		if (oElement.selAppl.options[i].value == idxValue){
			oElement.selAppl.selectedIndex = i;
			return;
		}
	}
}

function doPrint(){
	if (typeof(oDataElement.document.frmCalc) != "object") return;
	if (checkStateModify()) return;
	var oElement = oDataElement.document.frmCalc;
	
	//used to mimic disable list selection for NE4  
	modifiedIndex = -1;
	isStateCalc = false;
	isStateModify = false;
	
	//prepare appliance list to print
	passAppliances();
	
	//load printable page in new window
	printpage = window.open ('calc_print.asp', 'printpage', 'location=0,resizable=no,scrollbars=1,width=760,height=470,top=20,left=0');
}
/////////////////////////////////////////////

//pass tabulated html string to the printing page
function passAppliances(){
	appl = '';  
	var dispkWh;
	var kWh;

	appl = appl + '<table border="0" cellpadding="0" cellspacing="0" width="100%">';
	for (i = 0; i < top.applListNameArr.length; i++) {
		appl = appl + '<tr><td width="50%" valign="middle" class="blackNoBackgroundSmall">';
		appl = appl + "" + arrAppl[top.applListNameArr[i]] + "<\/td>"; 
		appl = appl + '<td width="20%" align="right" class="blackNoBackgroundSmall">';

		kWh = computekWhByElement(i)
		dispkWh = Math.round(kWh);

		if (dispkWh <= 0) {
			dispkWh =  ' < 1';
		}
		appl = appl + "" + dispkWh + " kWh<\/td>"; 

		appl = appl + '<td width="20%" align="right" class="blackNoBackgroundSmall">';
		appl = appl + "$" + top.applListCostArr[i] + "<\/td><\/tr>";
		appl = appl + '<tr><td colspan="3"><hr></td></tr>';
	}
	appl = appl + '</table>';
}

function init(){
	//if data frame not loaded yet let the top frame do the job 
	//if (oDataElement.document.frmCalc == undefined) return; 
	//alert("load menu");
	setStateCalc();
	//restoreList();
}