var footerLoaded = false;

//Determines if dwellings exist for the project
var hasDwellings = false;

// used to pass an error range (full calc) if required, set this value within the init function on the required page
var globalErrorRange = "";

function setProjectType(myType) {
	if (myType == "detached") {
		parent.projectType = "detached";
	} else {
		parent.projectType = "multiunit";
	}
}

function getProjectType() {
	return parent.projectType;
}

function unCheckAll() {
// called from popups to uncheck all selected dwellings and master checkboxes on the individual dwelling summary index across all tabs.
	for (var i = 0; i < document.basix_form.elements.length; i++) {
		if (document.basix_form.elements[i].name.substr(0,9) == "dwelling_" && document.basix_form.elements[i].type == "checkbox") {
			document.basix_form.elements[i].checked = false;
			highlightRow(document.basix_form.elements[i].parentNode.parentNode.parentNode, false);
		} else {
			if (document.basix_form.elements[i].name.substr(0,12) == "masterChkbox") {
				document.basix_form.elements[i].checked = false;
			}
		}
	}
}


function isOn(myField) {
	// determine if myField is a valid radio option that is true or a valid select option that is not the first option
	myObj = document.basix_form.elements[myField];
	if (myObj != null) {
		if (isRadioOn(myObj, "true")) {
			return true;
		} else {
			if (myObj.type.toLowerCase() == "select" || myObj.type.toLowerCase() == "select-one") {
				if (myObj.options.selectedIndex == 0) {
					return false;
				} else {
					return true;
				}
			}
		}
	}
	return false;
}

function selectAll(myChkbox) {
	// select or deselect all unit checkboxes for individual pages only.
	var i=0;
	var rowNum = 0;
	var isChecked = false;
	if (myChkbox.checked) {
		isChecked = true;
	} else {
		isChecked = false;
	}
	var found = false;
	for (i=0; i < document.basix_form.elements.length; i++) {
		if (!found && document.basix_form.elements[i] == myChkbox) {
			// found originating masterChkbox.. so need to now just loop through checking or unchecking until next masterChkbox or end of checkboxes.
			found = true;
		} else {
			if (found) {
				// keep looping until next tab's master check box is found or end of elements.
				if (document.basix_form.elements[i].name.substr(0,12) == "masterChkbox") {
					// found next tab's masterchkbox element so no need to continue for this current tab.
					break;
				} else {
					if ((document.basix_form.elements[i].name.substr(0,8) == "dwelling" || document.basix_form.elements[i].name.substr(0,16) == "centralisedCheck" || document.basix_form.elements[i].name.substr(0,11) == "commonCheck") && document.basix_form.elements[i].type == "checkbox") {
						//rowNum = document.basix_form.elements[i].name.substr(9); //get dwelling number from checkbox name
						highlightRow(document.basix_form.elements[i].parentNode.parentNode.parentNode, isChecked);
						document.basix_form.elements[i].checked = isChecked;
					}
				}
			}
		
		}
	}
}

function deSelectAll(myChkbox) {
	// for individual index pages only.
	// if master select all check box is selected, deselect master select all checkbox.
   	var found = false;
    var masterChkbox;
   	for (i=0; i < document.basix_form.elements.length; i++) {
		if (document.basix_form.elements[i].name.substr(0,12) == "masterChkbox") {
		    masterChkbox = document.basix_form.elements[i];
		} else {
		    if (!found && document.basix_form.elements[i] == myChkbox) {
		        found = true;
		        break;
		    }
		}
	}
	//var rowNum = myChkbox.name.substr(9); //get dwelling number from checkbox name
	if (!myChkbox.checked) {
		// if check box is now deselected / unchecked then
		masterChkbox.checked = false;
	}

	// highlight row or dehighlight row.. pass back row object (using DOM) and whether to highlight or dehighlight.
	highlightRow(myChkbox.parentNode.parentNode.parentNode, myChkbox.checked);
}

function highlightRow(myRow, highlight) {
// myRow is the table row object to highlight or unhighlight (if that's a word).
	if (highlight) {
		if (myRow.className == "") {
			myRow.className = "highlightRow";
		} else if (myRow.className != "highlightRow") {
			myRow.className += " highlightRow";
		}
	} else {
		if (myRow.className == "highlightRow") {
			myRow.className = "";
		} else {
			myArray = myRow.className.split(" highlightRow");
			myRow.className = myArray.join("");
		}
		//myRow.style.backgroundColor = "";
	}
}

function highlightSelectedDwellings() {
// highlight all dwellings that may be selected.
	for (var i=0; i < document.basix_form.elements.length; i++) {
		if (document.basix_form.elements[i].name.substr(0,9) == "dwelling_") {
			if (document.basix_form.elements[i].checked) {
				highlightRow(document.basix_form.elements[i].parentNode.parentNode.parentNode, true);
			}
		}
	}
}


function selectDwellings(myDwellingList) {
// check all dwellings that are in mydwellinglist
	var dwellingArray = myDwellingList.split("|");
	for (var i=0; i < dwellingArray.length; i++) {
		try {
			myChkbox = document.getElementById("dwelling_" + dwellingArray[i]);
			myChkbox.checked = true;
		} catch (exception) {
		}
	}
}


//Save button
function save_index(nextPageUrl) {
	waitDiv(true);
	if (document.basix_form != null) {
		//Standard basix form, submit before saving to ensure all data persisted
		document.basix_form.action.value = "save";
		document.basix_form.nextpage.value = nextPageUrl; //Send to self
		document.basix_form.submit();
	} else {
		//Non basix form, send simply save request
		var submitPageUrl = "";
		if (document.URL.indexOf('?') != -1) {
			submitPageUrl = document.URL.substring(0, document.URL.indexOf('?')) + "?action=save";
		} else {
			submitPageUrl = document.URL + "?action=save";
		}
		submitPageUrl = submitPageUrl + "&nextpage=" + escape(nextPageUrl); 
		document.location.href = submitPageUrl;
	}
}

//Save current page's index value
//var current_page_index_value = pageOrder(self.location.href);

//Determine a value even if the passed value is NaN
function GetNum(value) {
	if (isNaN(value)) {
		return 0;
	} else {
		return value;
	}
}

//Set frame page and size
function set_frameset(src) {
	//check for frameset exists.. required for mac ie 5.1 bug see index.jsp page for details.
	if (top.location == self.location) {
		top.location = "/basix.jsp?body=" + escape(location.pathname);
	} else {
		parent.frames[1].location.replace(src);
	}
}

function noRightClick(buttonClicked) {
	if (navigator.appName == 'Netscape' &&
	(buttonClicked.which == 2 || buttonClicked.which == 3))
	 return false;
	else if (navigator.appName == 'Microsoft Internet Explorer' &&
	(event.button == 3 || event.button == 2)) {
	 alert("Your Message Goes Here");
	return false;
	}
	return true;
}

function setFrameSize(size) {
	var currentFrameSize = parent.document.body.rows.substr(4);
	if ((currentFrameSize < size) || (currentFrameSize < 88))
		parent.document.body.rows = "*," + size;
}

// return window height of browser
function getHeight() {
	if (typeof(window.innerHeight) == 'number') {
		return window.innerHeight;
	}
	if (document.documentElement && document.documentElement.clientHeight) {
		return document.documentElement.clientHeight;
	}
	if (document.body && document.body.clientHeight) {
		return document.body.clientHeight;
	}
	return false;
}

function dom_browser() {
	// browser identification based on dom capabilities
	this.myNav = this.navigator;
	this.version = this.navigator.appVersion;
	this.name = this.navigator.appName;
	this.ns4 = (document.layers) ? true : false;
	this.ns6 = (this.navigator.userAgent.indexOf("Netscape6") != -1) ? true : false;
	this.dom = (document.getElementById) ? true : false;
	this.ie4 = (document.all) ? true : false;
	this.mac = (this.version.indexOf("Mac") != -1) ? true : false;
	this.ie = (this.version.indexOf("MSIE") != -1) ? true : false;
	this.windows = (this.version.indexOf("Windows") != -1) ? true : false;
	this.hasPlugins = (this.navigator.plugins) ? true : false;
	this.ie6 = (this.version.indexOf("MSIE") != -1 && this.version.indexOf("6") != -1) ? true : false; 
		// added for waitDiv_msg function - need to determine whether user is using IE version 6+
	this.ie7 = (this.version.indexOf("MSIE 7") != -1) ? true : false; 
		// added for waitDiv_msg function - need to determine whether user is using IE version 7+
}

dom_browser();

/* resize bug fix for mac ie 5.1 */
function globalResize() {
	if (document.body.clientWidth < 760) {
		document.getElementById("globalWrap").style.width = "760px";
	} else {
		document.getElementById("globalWrap").style.width = "auto";
	}
}

// resize fix for ns4
var origWidth, origHeight;
if (document.layers) {
	origWidth = window.innerWidth; origHeight = window.innerHeight;
	window.onresize = function() { if (window.innerWidth != origWidth || window.innerHeight != origHeight) history.go(0); }
}
/* end resize bug fixing */

function hide(myElement) {
	// hides element myElement with css.
	document.getElementById(myElement).style.visibility = "hidden";
	document.getElementById(myElement).style.display = "none";
}

function show(myElement) {
	// shows element myElement with css.
	document.getElementById(myElement).style.visibility = "visible";
	document.getElementById(myElement).style.display = "block";
}

/************ For energy centralised and common ***************/
// this function shows or hides the group of rows in the tab table for adding/removing systems.
function displayGroups(myTable, groupName, show) {
	var myTableObj = document.getElementById(myTable);
	// it iterates through the table looking for rows with the class name of: groupName.
	for (var i = 0; i < myTableObj.tBodies.length; i++ ) {
		for (var j = 0; j < myTableObj.tBodies[i].rows.length; j++ ) {
			if (myTableObj.tBodies[i].rows[j].className == groupName) {
				if (!show) {
					// hide table row contents
					myTableObj.tBodies[i].rows[j].style.display = "none";
				} else {
					// show table row contents
					if (myTableObj.tBodies[i].rows[j].style.display != "table-row") {
						if (this.ie && !this.mac) {
							// if ie on pc
							myTableObj.tBodies[i].rows[j].style.display = "block";
						} else {
							// if anything else
							myTableObj.tBodies[i].rows[j].style.display = "table-row";
						}
					}
				}
			}
		}
	}
}

function setFormFocus(myTable, groupName) {
	// to set focus on the first form element of the elected group in the selected table.
	// called from showNextGroup() function.
	var fieldsArray = new Array();
	fieldsArray = getFields(myTable, groupName.substr(5));
	// set focus on first form element within this group
	document.getElementById(fieldsArray[0]).focus(true);
}

function showNextGroup(myTable) {
	// it iterates through the table looking for rows with the class name of: group(number) where the row is hidden.
	// it then displays the row.
	
	var setFocus = false;  // flag to determine if focus is set or not
	
	// first check if there are the total number of groups already visible
	if (numVisibleGroups[myTable] != totalGroups) {
		
		myTableObj = document.getElementById(myTable);
		for (var i = 0; i < myTableObj.tBodies.length; i++ ) {
			for (var j = 0; j < myTableObj.tBodies[i].rows.length; j++ ) {
				if (myTableObj.tBodies[i].rows[j].className.search("group") != -1) {
					if (myTableObj.tBodies[i].rows[j].style.display == "none") {
						displayGroups(myTable, myTableObj.tBodies[i].rows[j].className, true);
						if (!setFocus) {
							setFormFocus(myTable, myTableObj.tBodies[i].rows[j].className);
							setFocus = true;
						}
						numVisibleGroups[myTable]++;
						break;
					}
				}
			}
		}
	} else {
		// total number of groups reached.. so can not view another group.
		alert("You may only have a maximum of " + totalGroups + " systems.");
		// may want to hide add button here?? ie. addBtn.style.display = "none"
	}
}

function hideGroup(myTable, groupNumber) {
    hideGroup_alert(myTable, groupNumber, true);
}

function hideGroup_alert(myTable, groupNumber, showAlert) {
	// loop through and move contents for other groups down.
	// ie. if groupNumber is 3 then the contents of 4 gets moved to 3, and 5 gets moved to 4 and then 5 gets hidden and cleared.
    if (showAlert && numVisibleGroups[myTable] != 1) {
        if (!confirm("If you remove this system, please note that it shall be removed from all dwellings that use it.\nAre you sure you would like to remove this system?")) {
            return false;   
        }
    }
	// firstly check that there is at least one group shown on the page.
	// alert("about to hide group " + groupNumber);
	if (!showAlert || (showAlert && numVisibleGroups[myTable] != 1)) {
		// if there is at least one group/system..
		// alert("hiding group " + groupNumber + " on table " + myTable);
		//for (var i=0; i < numVisibleGroups[myTable] - groupNumber; i++) {
			//alert("copying group: " + eval(groupNumber + i + 1) + " to group " + eval(groupNumber + i));
			//copyFormValues(myTable, groupNumber + i + 1, groupNumber + i);
		//}
		// hide and clear the last group..
		//alert("hiding and clearing group " + numVisibleGroups[myTable]);
		displayGroups(myTable, "group" +  groupNumber, false);			
		clearElements(myTable, groupNumber);
		numVisibleGroups[myTable]--;  // decrement the total number of visible groups.
	} else {
		alert("This system can not be removed as you must specify at least one system.");
	}
}

function tblFieldObj(tableName, groupNumber) {
	// prototype for the tblFieldObj.  It is an object capturing the fields associated to a group within a table.
	this.table = tableName;
	this.groupNumber = groupNumber;
	this.fields = new Array();  // array of fields for this table and this group number
	this.addField = function(fieldName) { // add a fieldName to the list of fields for this table and group combination.
		this.fields[this.fields.length] = fieldName;  // append fieldName to end of fields array.
	}
	this.addFields = function(fieldArray) { // adds an array of field names to replace the list of fields for this table and group combination.
		this.fields = fieldArray;
	}
}

function getFields(myTable, myGroupNumber) {
// returns the fields as an array belonging to a group for a particular table.
	for (var i=0; i < tblGroupFields.length; i++) {
		if (tblGroupFields[i].table == myTable && tblGroupFields[i].groupNumber == myGroupNumber) {
			return tblGroupFields[i].fields;
			break;
		}
	}
	//alert("return empty array");
	return new Array();  // could not find table/group combination so returning empty array.
}

function clearElements(myTable, groupNumber) {
	// clear elements for a particular table and group
	//alert("clearing elements");
	var tmpArray = getFields(myTable, groupNumber);
	for (var i=0; i < tmpArray.length; i++) {
		switch (document.getElementById(tmpArray[i]).type) {
			case "select-one":
			case "select":
				document.getElementById(tmpArray[i]).options.selectedIndex = 0;
				break;
			case "checkbox":
				document.getElementById(tmpArray[i]).checked = false;
				break;
			case "text":
				document.getElementById(tmpArray[i]).value = "";
				break;
			case "radio":
				alert("need to implement clearing for radio type");
				break;
			default:
				alert("clearing type of: " + document.getElementById(tmpArray[i]).type);
				document.getElementById(tmpArray[i]).value = "";
				
		}
	}
}

function copyFormValues(myTable, fromGroup, toGroup) {
    var myVal=0;
// depending on type of form element, copy the values from the fromGroup to the toGroup	
	var fromTmpArray = getFields(myTable, fromGroup);
	var toTmpArray = getFields(myTable, toGroup);
	for (var i=0; i < fromTmpArray.length; i++) {
		switch (document.getElementById(fromTmpArray[i]).type) {
			case "select-one":
				document.getElementById(toTmpArray[i]).options.selectedIndex = eval(document.getElementById(fromTmpArray[i]).options.selectedIndex);
				break;
			case "select":
				//document.getElementById(toTmpArray[i]).options.selectedIndex = document.getElementById(fromTmpArray[i]).options.selectedIndex;
				document.getElementById(toTmpArray[i]).options.selectedIndex = eval(document.getElementById(fromTmpArray[i]).options.selectedIndex);
				break;
			case "checkbox":
				if (document.getElementById(fromTmpArray[i]).checked) {
					document.getElementById(toTmpArray[i]).checked = true;
				} else {
					document.getElementById(toTmpArray[i]).checked = false;
				}
				break;
			case "radio":
				alert("need to implement copying for radio...");
				break;
			case "text":
				document.getElementById(toTmpArray[i]).value = document.getElementById(fromTmpArray[i]).value;
				break;
			default:
				alert("need to implement copying for to-type of " + document.getElementById(toTmpArray[i]).type + " from type of " + document.getElementById(fromTmpArray[i]).type);	
		}
	}
}

function hideEmptyGroups() {
	// loops through all fields in the tblgroupfields list for each table and group and 
	// determines whether field values have been set for that group. if none set then hides the group
	// for that table.
	var isset = false;
	for (var i = tblGroupFields.length - 1; i > -1; i--) { // work backwards starting from last group to group 1.
		isset = false;
		for (var j=0; j < tblGroupFields[i].fields.length; j++) {
		//alert(document.getElementById(tblGroupFields[i].fields[j]));
		//alert(tblGroupFields[i].fields[j]);
			myElement = document.getElementById(tblGroupFields[i].fields[j]);
			switch (myElement.type) {
				case 'select':
				case 'select-one':
					if (myElement.options.selectedIndex != 0) {
						isset = true;
					}
					break;
    			case "checkbox":
    				//if (!myElement.checked) {
                    if (myElement.checked) {
    					isset = true;
    				}
    				break;
    			case "radio":
    				alert("need to implement for radio..." + myElement.value + " - " + myElement.checked);
    				break;
    			case "text":
    				// need to check if value could be a default value...?
    				if (myElement.value != "") {
    					isset = true;
    				}
    				break;
    			default:
    				if (myElement.value != "") {
    					isset = true;
    				}
			}
		}
		if (!isset) {
			// no values set for that group and table so need to hide it.
			// as long as there is at least one system for that table then hide..
			//alert("here");
			if ((eval(i % totalGroups) != 0) && (numVisibleGroups[tblGroupFields[i].table] > 1)) {
				//alert("hiding group i = " + i + " = " + tblGroupFields[i].groupNumber + " field j = " + j);
				hideGroup_alert(tblGroupFields[i].table, tblGroupFields[i].groupNumber, false);
			}
		}
	}
}

/******** end for energy centralised and common **********/


/******* Disable the calculate button  *********/

function disableCalculate() {
	if (parent.frames[1] && parent.frames[1].document.getElementById("calculateBtn")) {
		parent.frames[1].document.getElementById("calculateBtn").className = "disabledBtn";
		parent.frames[1].document.getElementById("calculateBtnLink").href = "#";
		parent.frames[1].document.getElementById("calculateBtnLink").disabled = true;
	} else {
		if (document.getElementById("calculateBtn")) {
			document.getElementById("calculateBtn").className = "disabledBtn";
			document.getElementById("calculateBtnLink").href = "#";
			document.getElementById("calculateBtnLink").disabled = true;
		}
	}
}

function enableCalculate() {
	if (parent.frames[1] && parent.frames[1].location.href.search("calc=0") == -1 && parent.frames[1].document.getElementById("calculateBtn")) {
		parent.frames[1].document.getElementById("calculateBtn").className = "generalBtn";
		parent.frames[1].document.getElementById("calculateBtnLink").href = "javascript: calc();";
		parent.frames[1].document.getElementById("calculateBtnLink").disabled = false;
	} else {
		if (location.href.search("calc=0") == -1 && document.getElementById("calculateBtn")) {
			document.getElementById("calculateBtn").className = "generalBtn";
			document.getElementById("calculateBtnLink").href = "javascript: calc();";
			document.getElementById("calculateBtnLink").disabled = false;
		}
	}
}

function disableSave() {
	if (parent.frames[1] && parent.frames[1].document.getElementById("saveBtn")) {
		parent.frames[1].document.getElementById("saveBtn").className = "disabledBtn";
		parent.frames[1].document.getElementById("saveBtnLink").href = "#";
		parent.frames[1].document.getElementById("saveBtnLink").disabled = true;
	} else {
		if (document.getElementById("saveBtn")) {
			document.getElementById("saveBtn").className = "disabledBtn";
			document.getElementById("saveBtnLink").href = "#";
			document.getElementById("saveBtnLink").disabled = true;
		}
	}
}

function enableSave() {
	if (parent.frames[1] && parent.frames[1].document.getElementById("saveBtn")) {
		parent.frames[1].document.getElementById("saveBtn").className = "generalBtn";
		parent.frames[1].document.getElementById("saveBtnLink").href = "javascript: save();";
		parent.frames[1].document.getElementById("saveBtnLink").disabled = false;
	} else {
		if (document.getElementById("saveBtn")) {
			document.getElementById("saveBtn").className = "generalBtn";
			document.getElementById("saveBtnLink").href = "javascript: save();";
			document.getElementById("saveBtnLink").disabled = false;
		}
	}
}

function disableNewProjectBtn() {
	var myLink;
	if (document.getElementById("newProjectBtn")) {
		document.getElementById("newProjectBtn").className = "disabledBtn_green";
		document.getElementById("newProjectBtnLink").href = "javascript: void(0);";
	}
}

//enableNewProjectBtn
function enableNewProjectBtn() {
	var myLink;
	if (document.getElementById("newProjectBtn")) {
		document.getElementById("newProjectBtn").className = "generalBtn_green";
		document.getElementById("newProjectBtnLink").href = "javascript: projectNew();";
	}
}

function getFormFieldsByTableId(myTable) {
    // iterate through a table of given id and return an array of form elements within that table.
    var formFields = Array();
    myTableObj = document.getElementById(myTable);
    for (var i = 0; i < myTableObj.tBodies.length; i++ ) {
        for (var j = 0; j < myTableObj.tBodies[i].rows.length; j++ ) {
            //for each row
            for (var k=0; k < myTableObj.tBodies[i].rows[j].childNodes.length; k++) {
                //for each element within each row
                if (myTableObj.tBodies[i].rows[j].childNodes[k].nodeType == 1) {
                    // if element is a HTML element
                    if (typeof(myTableObj.tBodies[i].rows[j].childNodes[k].childNodes[0]) != "undefined") {
                        // if there exists an element with in that html element
                        for (var l=0; l < myTableObj.tBodies[i].rows[j].childNodes[k].childNodes.length; l++) {
                            //for each element with in that html element
                            if (myTableObj.tBodies[i].rows[j].childNodes[k].childNodes[l].nodeType == 1) {
                                //if it is an html element
                                if (myTableObj.tBodies[i].rows[j].childNodes[k].childNodes[l].nodeName == "INPUT" || myTableObj.tBodies[i].rows[j].childNodes[k].childNodes[l].nodeName == "SELECT") {
                                    //if it is a input box or select element, disable it if not the original radio button
                                    formFields[formFields.length] = myTableObj.tBodies[i].rows[j].childNodes[k].childNodes[l];
                                } else {
                                    //alert("need to add node name = " + myTableObj.tBodies[i].rows[j].childNodes[k].childNodes[l].nodeName);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    if (formFields.length > 0) {
        return formFields;
    } else {
        return false;
    }
}

function setReadOnlyField(myField) {
    if (myField.type == "select-one" || myField.type == "radio") {
        myField.disabled = true;
    } else {
        myField.readOnly= true;
    }
    _disableField(myField);
}

function setNotReadOnlyField(myField) {
    if (myField.type == "select-one" || myField.type == "radio") {
        // if not radio buttons then..
        myField.disabled = false;
    } else {
        myField.readOnly = false;
    }
    _enableField(myField);
}

function disableField(myField) {
    myField.disabled = true;
    _disableField(myField);
}

function enableField(myField) {
    myField.disabled = false;
    _enableField(myField);
}

function _disableField(myField) {
    if (myField.type == "checkbox") {
		myField.style.background = "none";
	} else if (myField.type != "radio" && myField.type != "checkbox") {
        // if not radio buttons then..
        myField.style.background = "#CCC";
    }
}

function _enableField(myField) {
    if (myField.type == "checkbox") {
		myField.style.background = "none";
	} else if (myField.type != "radio" && myField.type != "checkbox") {
        // if not radio buttons then..
        myField.style.background = "#FFF";
    }
}

function isRadioOn(myObj, myMatch) {
    // check given object whether is radio button.
    // if radio button, then if value is true and the option is checked then return true
    // else return false.
    if (myObj.length && myObj[0].type == "radio") {
        for (var i = 0; i < myObj.length; i++) {
            if (myObj[i].value.toLowerCase() == myMatch && myObj[i].checked) {
                return true;
            }
        }
    } else {
		if (myObj.type == "radio") {
			if (myObj.value.toLowerCase() == myMatch && myObj.checked) {
				return true;
			}
		}
	}
    return false;
}

function selectSystem(myTable, myField, groupNum, valueToMatch) {
	// Depending whether the myField field is active or not, this function
	// enables/disables form fields identified by one of two methods:
	// 1. if myTable is given and not groupNum, then the method used uses DOM to iterate through the table and retrieve all fields from it.
	// 2. if myTable is given and groupNum is given, then the method used uses the array of field names identified in the index page which lists the fields specifically.
	// myField must either be a name of a select box or the name of a radio button list.

    var disable = false;
    myObj = document.basix_form.elements[myField];

	//alert("groupnum = " + groupNum + " - " + myTable);
	if (groupNum == "" && myTable != "") {
		var myFields = getFormFieldsByTableId(myTable);
	} else {
		var myFieldNames = getFields(myTable, groupNum);
		var myFields = Array();
		for (var i=0; i < myFieldNames.length; i++) {
			myFields[myFields.length] = document.basix_form.elements[myFieldNames[i]];
		}
	}
	if (!myFields) {
	    alert("could not get form fields");
	    return false;
	}

    if (myObj[0].type == "radio") {
        // must be radio button to select
        if (isRadioOn(myObj, valueToMatch)) {  // assumes that the first radio button is the true case.. should check value and whether checked
            // enable
            for (var i=0; i < myFields.length; i++) {
                enableField(myFields[i]);
            }
        } else {
            // disable
            for (var i=0; i < myFields.length; i++) {
            //alert(myFields[i].name + " == " + myObj[0].name);
                if (myFields[i].name != myObj[0].name) {
                    disableField(myFields[i]);
                } else {
                    enableField(myFields[i]);
                }
            }
        }
    } else {
        // must be select box
        if (myObj.options[myObj.options.selectedIndex].value != 1) {  // assumes that the default please select option has a value of 1..
            // enable
            for (var i=0; i < myFields.length; i++) {
                enableField(myFields[i]);
            }
        } else {
            // disable
            for (var i=0; i < myFields.length; i++) {
            //alert(myFields[i].name + " == " + myObj[0].name);
                if (myFields[i].name != myObj.name) {
                    disableField(myFields[i]);
                } else {
                    enableField(myFields[i]);
                }
            }
        }
    }
    return false;
}

function selectSystemWithFields(myField, myEffectedFields, valueToMatch, clearValuesOnDisable) {
	return globalSelectSystemWithFields(myField, myEffectedFields, valueToMatch, clearValuesOnDisable);
} 

function clearValue(myField) {
// remove the value from a form element based on type of myField.
	switch (myField.type) {
		case "select-one":
		case "select":
			myField.options.selectedIndex = 0;
			break;
		case "checkbox":
			myField.checked = false;
			break;
		case "text":
			myField.value = "";
			break;
		case "radio":
			myField.checked = false;
			break;
		default:
			debugAlert("clearing type of: " + myField.type);
			myField.value = "";
	}
}

function rememberSelect(myFieldName) {
/* to get around a bug with IE label tag for select boxes:
   if you select an item in a select box and then click the label
   associated to it, the selected index for the select box is reset.
   This function when put on the onclick event of the the label tag, 
   captures the current selected index and retains it after the focus
   has been given back to the selectbox. funky eh? */
   // nb. can't be put into modal windows as destroys the modal focus event.
   // could be adapted though.
	var myObj = document.basix_form.elements[myFieldName];
	if (myObj != null) {
		var myIndex = myObj.options.selectedIndex;
		myObj.onfocus = function() {
				myObj.options.selectedIndex = myIndex;
				myObj.onfocus = "";  //reset onfocus event.
			}
	}
}

function trim(str) {
// removes white spaces from beginning and end of given string, str.
	return str.replace(/^\s*|\s*$/g,"");	
}

function getAllDwellingList() {
	
	var dwellings = "";
	var found = false;
	
	for (var i=0; i < document.basix_form.elements.length; i++) {
		if (document.basix_form.elements[i].type == "checkbox" && document.basix_form.elements[i].name.substr(0,8) == "dwelling") {
			// if dwelling checkbox and is checked add to list of dwellings to edit.
			// since element name = "dwelling_" + something like a row number, then add the something (row number) to the dwelling variable to be passed to the popup.
			dwellings += document.basix_form.elements[i].name.substr(9) + "|";
		}
	}
	
	rpcDwellingList = "|" + dwellings; //Save it in the variable incase we need.
//top.window.status = rpcDwellingList;
	return dwellings;
}

function getDwellingList() {
	
	var dwellings = "";
	var found = false;
	
	for (var i=0; i < document.basix_form.elements.length; i++) {
		if (document.basix_form.elements[i].type == "checkbox" && document.basix_form.elements[i].checked && document.basix_form.elements[i].name.substr(0,8) == "dwelling") {
			// if dwelling checkbox and is checked add to list of dwellings to edit.
			// since element name = "dwelling_" + something like a row number, then add the something (row number) to the dwelling variable to be passed to the popup.
			dwellings += document.basix_form.elements[i].name.substr(9) + "|";
		}
	}
	
	rpcDwellingList = "|" + dwellings; //Save it in the variable incase we need.
	return dwellings;
}

function disableApply() {
	if (document.getElementById("applyBtn")) {
		document.getElementById("applyBtn").className = "disabledBtn";
		document.getElementById("applyBtnLink").href = "javascript: void(0);";
		document.getElementById("applyBtnLink").disabled = true;
	}
}

function enableApply() {
	if (document.getElementById("applyBtn")) {
		document.getElementById("applyBtn").className = "generalBtn";
		document.getElementById("applyBtnLink").href = "javascript: apply();";
		document.getElementById("applyBtnLink").disabled = false;	
	}
}

function disableCancel() {
	if (document.getElementById("cancelBtn")) {
		document.getElementById("cancelBtn").className = "disabledBtn";
		document.getElementById("cancelBtnLink").href = "javascript: void(0);";
		document.getElementById("cancelBtnLink").disabled = true;	
	}
}

function enableCancel() {
	if (document.getElementById("cancelBtn")) {
		document.getElementById("cancelBtn").className = "generalBtn";
		document.getElementById("cancelBtnLink").href = "javascript: cancel();";
		document.getElementById("cancelBtnLink").disabled = false;	
	}
}

function disableButtons() {
	if (document.getElementById("applyBtn"))
		disableApply();
	if (document.getElementById("cancelBtn"))
		disableCancel();
}

function enableButtons() {
	if (document.getElementById("applyBtn"))
		enableApply();
	if (document.getElementById("cancelBtn"))
		enableCancel();
}

function disableBtn(/*String*/idBtn) {
    disableBtnWithClass(idBtn, "disabledBtn");
}

function enableBtn(/*String*/idBtn, /*String*/href) {
    enableBtnWithClass(idBtn, "generalBtn", href);
}

function disableBtnWithClass(/*String*/idBtn, /*String*/clsName) {
    dojo.byId(idBtn).className = clsName;
    dojo.byId(idBtn + "Link").href = "#";
    dojo.byId(idBtn + "Link").disabled = true;
}

function enableBtnWithClass(/*String*/idBtn, /*String*/clsName, /*String*/href) {
    dojo.byId(idBtn).className = clsName;
    dojo.byId(idBtn + "Link").href = href;
    dojo.byId(idBtn + "Link").disabled = false;
}


function getQueryStringValue(myUrl, myKey) {
	var myTempArray = myUrl.split("?");
	if (myTempArray.length > 1) {
		var myTemp2Array = myTempArray[1].split("&");
		var myTemp3Array = Array();
		for (var i=0; i < myTemp2Array.length; i++) {
			myTemp3Array = myTemp2Array[i].split("=");
			if (myTemp3Array[0] == myKey) {
				return myTemp3Array[1];
			}
		}
		return "";
	} else {
		return null;
	}
}

function calculatePage() {
	var myValue = getQueryStringValue(location.href, "calc");
	if (myValue != null) {
		if (parseInt(myValue) == 1) {
			// has not already calculated page so need to calculate and reload page.
			calc();
			// page will reload in the apply_extras() function that gets called after a calculate occurs on a page.
			return true;
		} else {
			// has already calculated so no need to refresh page.
			return false;
		}
	} else {
		// has already calculated so no need to refresh page.
		return false;
	}
}

function reloadIfCalculated(myUrl) {
	var tempArray = myUrl.split("calc=1");
	if (tempArray.length > 1) {
		location.href = tempArray[0] + "calc=0" + tempArray[1];
	}
}

function addOptions(selectId, optionsList) {
	var mySelectObj = document.getElementById(selectId);
	//alert('mySelectObj != null' + (mySelectObj != null));
	if (mySelectObj != null) {
		var selected = document.getElementById(selectId + "_dd");
		mySelectObj.options.length = 0;  // remove existing options
		for (var i=0; i < optionsList.length; i+=2) {
			mySelectObj.options[mySelectObj.options.length] = new Option(optionsList[i], optionsList[i+1]);
			//alert(optionsList[i+1]);
			if (optionsList[i+1] == selected.value) {
				mySelectObj.options[mySelectObj.options.length - 1].selected = true;
			}
		}
	}
}

/**
* For use for both the popup.js and this js script.
*/
function globalSelectSystemWithFields(myField, myEffectedFields, valueToMatch, clearValuesOnDisable) {
	// enables or disables fields in the myEffectedFields array, depending on if myField is a select box then it depends on the 
	// first option of myField being the selectedIndex or not.

	var i = 0;
    var disable = false;
    var myObj = document.getElementById(myField);
    
	if (myObj.type == "text") {
        // must be a text box
        if (myObj.value != valueToMatch) {
            // enable fields..
    		for (i=0; i < myEffectedFields.length; i++) {
				myFieldObj = document.getElementById(myEffectedFields[i]);
    			if (myFieldObj != myObj && myFieldObj.type != "submit" && myFieldObj.type != "button") {
                    enableField(myFieldObj);
    			}
    		}
        } else {
            // disable fields..
    		for (i=0; i < myEffectedFields.length; i++) {
				myFieldObj = document.getElementById(myEffectedFields[i]);
    			if (myFieldObj != myObj && myFieldObj.type != "submit" && myFieldObj.type != "button") {
					if (clearValuesOnDisable) {
						clearValue(myFieldObj);
					}
                    disableField(myFieldObj);
    			}
    		}
        }
    } else if (myObj.type == "checkbox") {
        // must be a checkbox
         if (myObj.checked == valueToMatch) {
            // enable fields..
    		for (i=0; i < myEffectedFields.length; i++) {
				myFieldObj = document.getElementById(myEffectedFields[i]);
    			if (myFieldObj != myObj && myFieldObj.type != "submit" && myFieldObj.type != "button") {
                    enableField(myFieldObj);
    			}
    		}

         } else {

            // disable fields..
    		for (i=0; i < myEffectedFields.length; i++) {
				myFieldObj = document.getElementById(myEffectedFields[i]);
    			if (myFieldObj != myObj && myFieldObj.type != "submit" && myFieldObj.type != "button") {
					if (clearValuesOnDisable) {
						clearValue(myFieldObj);
					}
                    disableField(myFieldObj);
    			}
    		}
         }
        
    } else {
	    if (myObj.type == "radio") {
	        // must be radio button to select
	        if (isRadioOn(myObj, valueToMatch)) {
	            // enable fields..
	    		for (i=0; i < myEffectedFields.length; i++) {
					myFieldObj = document.getElementById(myEffectedFields[i]);
	    			if (myFieldObj.name != myObj.name && myFieldObj.type != "submit" && myFieldObj.type != "button") {
	                    enableField(myFieldObj);
	    			}
	    		}
	        } else {
	            // disable fields..
	    		for (i=0; i < myEffectedFields.length; i++) {
					myFieldObj = document.getElementById(myEffectedFields[i]);
	    			if (myFieldObj.name != myObj.name && myFieldObj.type != "submit" && myFieldObj.type != "button") {
						if (clearValuesOnDisable) {
							clearValue(myFieldObj);
						}
	                    disableField(myFieldObj);
	    			}
	    		}
	        }
		} else {
	        // must be select box
			if (myObj.options.selectedIndex == 0) {  // if first option selected..
	            // disable fields..
	    		for (i=0; i < myEffectedFields.length; i++) {
					myFieldObj = document.getElementById(myEffectedFields[i]);
	    			if (myFieldObj != myObj && myFieldObj.type != "submit" && myFieldObj.type != "button" && myFieldObj.id != "filter") {
						if (clearValuesOnDisable) {
							clearValue(myFieldObj);
						}
	                    disableField(myFieldObj);
	    			}
	    		}
	        } else {
	           // enable fields..
	    		if (typeof(valueToMatch) == "object") {
	    			var found = false;
	            	for (var j=0; j < valueToMatch.length; j++) {
	            		if (myObj.options[myObj.options.selectedIndex].value == valueToMatch[j]) {
							// enable fields since value to match exists in the selected option value..
							for (i=0; i < myEffectedFields.length; i++) {
								myField = document.getElementById(myEffectedFields[i]);
				    			if (myField != myObj && myField.type != "submit" && myField.type != "button" && myField.id != "filter") {
				                    enableField(myField);
				    			}
				    		}
				    		found = true;
				    		break;
				    	}
				    }
				    if (!found) {
				    	// disable fields..
			            for (i=0; i < myEffectedFields.length; i++) {
							myField = document.getElementById(myEffectedFields[i]);
			    			if (myField != myObj && myField.type != "submit" && myField.type != "button" && myField.id != "filter") {
			                    if (clearValuesOnDisable) {
									clearValue(myField);
								}
								disableField(myField);
			    			}
			    		}
				    }
				} else {
					// enable fields since no array of values to match..
					for (i=0; i < myEffectedFields.length; i++) {
						myField = document.getElementById(myEffectedFields[i]);
		    			if (myField != myObj && myField.type != "submit" && myField.type != "button" && myField.id != "filter") {
		                    enableField(myField);
		    			}
		    		}
				}

	        }
		}
    }
    
    return false;
}

function getTopLeft(elmId)
{

    var elm = document.getElementById(elmId);
    
    if(elm == null){
        return {Top:"-", Left: "-"};
    }
    
    var x, y = 0;

    //set x to elm's offsetLeft
    x = elm.offsetLeft;

    //set y to elm's offsetTop
    y = elm.offsetTop;

    //set elm to its offsetParent
    elm = elm.offsetParent;

    //use while loop to check if elm is null
    // if not then add current elm's offsetLeft to x
    //offsetTop to y and set elm to its offsetParent

    while(elm != null)
     {
        x = parseInt(x) + parseInt(elm.offsetLeft);
        y = parseInt(y) + parseInt(elm.offsetTop);
        elm = elm.offsetParent;
     }

    //here is interesting thing
    //it return Object with two properties
    //Top and Left
    return {Top:y, Left: x};

}

/**
 * Search for rows within a table -> tbody with ids that begin with idPrefix
 * and show or hide the row depending the value of show.
 * 
 * @param tableElementId - table element id to find rows to toggle.
 * @param idPrefix - prefix pattern row ids to search for.
 * @param show - true/false.
 */
function toggleRows(tableElementId, idPrefix, show){
	var prefix = idPrefix;
	if(prefix == null && prefix.length == 0){
		return;
	}

	var rows = document.getElementById(tableElementId).getElementsByTagName('tbody')[0].getElementsByTagName('tr')
	var prefixLength = prefix.length;
	
	for (var i=0; i < rows.length; i++) {
		var myElement = rows[i]; 
		if ( myElement.id != null && myElement.id.substr(0,prefixLength) == prefix) {
			if(show){
				myElement.style.visibility = "visible";
				if(ie && !mac){
					myElement.style.display = "block";						
				} else {
					myElement.style.display = "table-row";						
				}
				toggleFieldsInElement(myElement.id, true)
			} else {
				myElement.style.visibility = "hidden";
				myElement.style.display = "none";
				toggleFieldsInElement(myElement.id, false)
			}
		}
	}
}
/**
* Obtain checkbox with id checkBoxId and show element with toggleElementId if checkbox is checked.
* @return 1 if checked is checked, 0 otherwise.
**/
function toggleElement(checkBoxId, toggleElementId) {
	var element = document.getElementById(checkBoxId);
	var checked = false;
	if(checkboxChecked(checkBoxId)){
		show(toggleElementId);
		toggleFieldsInElement(toggleElementId, true)
		return 1;
	} else {
		hide(toggleElementId);
		toggleFieldsInElement(toggleElementId, false)
		return 0;
	}
}

function checkboxChecked(checkBoxId){
	var element = document.getElementById(checkBoxId);
	
	if(element != null){
		if(element.type == "checkbox"){
			return element.checked;
		}		
	}
	return false;
}

/**
 * Disable all child elements that are input fields 
 * @param parentElementId
 * @return
 */
function toggleFieldsInElement(parentElementId, enable){
	var parentElement = document.getElementById(parentElementId);
	var inputs = parentElement.getElementsByTagName('input');
	if(inputs != null){
		for (var i=0; i < inputs.length; i++) {
			var myInput = inputs[i];
			//alert("before : " + myInput.type + " : " + myInput.id + ":" + myInput.name + ":" + myInput.disabled);
			if(enable){
				enableField(myInput);	
			} else {
				disableField(myInput);
			}
			//alert("after : " + myInput.type + " : " + myInput.id + ":" + myInput.name + ":" + myInput.disabled);
		}
	}
	
}
