function toString() {
	var str = "Name=" + this.name + "\n";
	str += "Value=" + this.value + "\n";
	str += "Type=" + this.type + "\n";

	if (this.type == "radio" || this.type == "checkbox") {
		str += "checked = " + this.checked;
	}

	return str;
}

function compareTo(formElem) {
	if (formElem == null) {
	  return true;
	}
	if (formElem.name == this.name) {
		if (formElem.value != this.value) {
		  return false;
		}
		if (formElem.type == "checkbox" || formElem.type == "radio") {
			if (formElem.checked != this.checked) {
			  return false;
			}
		}
	}
	return true;
}

function formElement (name, value, type, checked,size) {
	this.name = name;
	this.value = value;
	this.type = type;
	if (type == "radio" || type == "checkbox") {
		this.checked = checked;
	} else {
		this.checked = "";
	}
	this.toString = toString;
	this.compareTo = compareTo;
//customized by suresh to get the number of items in the select box
	if (type == "select-multiple" || type == "select-one") {
		this.size = size;
	} else {
		this.size = "";
	}
}

function getFormData(form) {
	var elements = new Array(form.elements.length);
	var index = 0;

	for (var i = 0; i < form.elements.length; i++) {
		var element = form.elements[i];
		if (element.type.toLowerCase() == "text" 
		  || element.type.toLowerCase() == "textarea" 
		  || element.type.toLowerCase() == "select-one" 
		  || element.type.toLowerCase() == "select-multiple" 
		  || element.type.toLowerCase() == "checkbox" 
		  || element.type.toLowerCase() == "radio" 
		  || element.type.toLowerCase() == "hidden"
		  || element.type.toLowerCase() == "file") {
			elements[index++] = new formElement(element.name, element.value, element.type, element.checked,element.length);
		}
	}

	return elements;
}

function isFormDirty(elementToAvoid) {
	elementToAvoid=elementToAvoid+",searchSubType,quickSearchKeyword,searchword";
	if(elementToAvoid == "undefined") {
		elementToAvoid = "";
	}
	if (this.currForm == null 
	  || (this.currForm != null && this.currForm.elements["promptForSave"] == null)) {
	  return false;
	}

	if (this.currForm.elements["promptForSave"].value != "true") {
	  return false;
	}

	if(this.modifiedByOtherMeans == true) {
	  return true;
	}

	if (this.isFormChanged(elementToAvoid)) {
		return true;
	}
	return false;
}

function isFormChanged(elementToAvoid) {
	elementToAvoid = ","+elementToAvoid +",";
	var currData    = getFormData(this.currForm);
	var formChanged = false;
	for (var i = 0; i < currData.length; i++) {
		
		var tmpElementName = ","+currData[i].name+",";
		if (currData[i] != null && currData[i].type != "hidden" 
		  && !currData[i].compareTo(this.formData[i]) &&(elementToAvoid.indexOf(tmpElementName) == -1)) {
			formChanged = true;
		}
	}

	for (var i = 0; i < currData.length; i++) {
		currData[i] = null;
	}

	return formChanged;
}

function initialize(form) {
	this.formData = getFormData(form);
	this.currForm = form;
	this.modifiedByOtherMeans = false;
}

function showPrompt() {
	return window.confirm("You may have some unsaved data on this page. Do you want to go back and save?");
}

function reset() {
	this.currForm = null;
	if (this.formData == null) {
	  return;
	}

	for (var i = 0; i < this.formData.length; i++) {
		this.formData[i] = null;
	}
}

function AutoSave() {
	this.formData             = null;
	this.currForm             = null;
	this.modifiedByOtherMeans = false;
	this.initialize           = initialize;
	this.isFormDirty          = isFormDirty;
	this.isFormChanged        = isFormChanged;
	this.showPrompt           = showPrompt;
	this.reset                = reset;
	//customized
	this.elementName          = null;
}

//create a global object
var autoSave = new AutoSave();

function promptForSave() {
	if (autoSave != null) {
		if (autoSave.isFormDirty() && autoSave.showPrompt() == true) {
			return false;
		} else {
			autoSave.reset();
		}
	}
	return true;
}

function takeFormSnapshot(form, noCompare) {
	if (autoSave != null) {
		if (noCompare != 'true') {
			autoSave.initialize(form);
		} else {
			autoSave.currForm = form;
			this.modifiedByOtherMeans = false;
		}
	}
}

//customized function added by suresh for checking individual component changed or not
function elementValueChanged(elementName){
		elementNames = elementName.split(",");
		var currData    = getFormData(this.currForm);
		var elementChanged = false;
		for (var i = 0; i < elementNames.length && elementChanged == false; i++) {
			for (var j = 0; j < currData.length; j++) {
				tmpElementName = currData[j].name;
				if(tmpElementName == elementNames[i]) {
					if (currData[j] != null && currData[j].type != "hidden" 
					  && !currData[j].compareTo(this.formData[j])) {
						elementChanged = true;
					}
					if(currData[j].size != this.formData[j].size) {
						elementChanged = true;
					}
				}
			}
		}
		for (var i = 0; i < currData.length; i++) {
			currData[i] = null;
		}
	return elementChanged;
}
