

// Used when there are several form elements with the same name
function _getFormElementIndex(fField){
	var myForm = document.getElementById('tabForm');
	var j = 0;
	for (var i = 0; i < myForm.elements.length; i++) {
		if(myForm.elements[i] == fField)
			return j;
		
		if( myForm.elements[i].name == fField.name )
			j++;
	}
	return -1;
}


// Changes a comma-delimited string to an array of values corresponding to the existing form elements
function processDBFormValues(myFormValues){
	writeLog( "processDBFormValues()");

	var myForm = document.getElementById('tabForm');
	for (var i = 0; i < myForm.elements.length; i++) {
		var myElement = myForm.elements[i];
		var fieldName = myElement.name;
		if(fieldName.length < 1) { continue; }
		var fieldType = myElement.type;
		if( fieldType == 'submit' || fieldType.indexOf('select') > -1 ){ continue; }
		if( !myForm[fieldName].length ){ continue; }
		
		if(myFormValues && myFormValues[fieldName] && typeof(myFormValues[fieldName]) == 'string' ){
			var myValues = myFormValues[fieldName].split(',');
			writeLog( "    processing " + fieldName + ":" + myFormValues[fieldName]);
			myFormValues[fieldName] = new Array();
			for (var j = 0; j < myForm[fieldName].length; j++) {
				var val = "";
				for (var k = 0; k < myValues.length; k++) {
					if( myForm[fieldName][j].value == myValues[k] ){
						val = myValues[k];
						break;
					}
				}
				writeLog( "    -- adding element(" + fieldName + ")[" + j + "]: " + val);
				myFormValues[fieldName][j] = val;
			}
		}
	}
}

// Sets field values and validation handlers
function prepareFormFields(tName){
	writeLog( "prepareFormFields('" + tName + "')");
	var myFormValues = appManager.getTabByName(tName).values;
	if(!myFormValues){
		myFormValues = getFormValues(tName);
		appManager.getTabByName(tName).values = myFormValues;
		writeLog( "storing form values for " + tName );
	}else if( appManager.getTabByName(tName).needsDBParse ){
		processDBFormValues( myFormValues );
		appManager.getTabByName(tName).needsDBParse = false;
	}
	
	var myFormRequired = appManager.getTabByName(tName).required;
	var myFormValidators = appManager.getTabByName(tName).validators;


	var myForm = document.getElementById('tabForm');
	for (var i = 0; i < myForm.elements.length; i++) {
		var myElement = myForm.elements[i];
		var fieldName = myElement.name;
		if(fieldName.length < 1) { continue; }
		var fieldType = myElement.type;
		if( fieldType == 'submit' ){ continue; }
		
		if(myFormValues && myFormValues[fieldName]){
			var myValue = myFormValues[fieldName];
			if( typeof(myValue) == 'object' && myValue.length ){
				var vIdx = _getFormElementIndex(myElement);
				myValue = myValue[vIdx];
			}
			if(myValue){
				if( (fieldType.indexOf('radio') > -1) || (fieldType.indexOf('checkbox') > -1) ){
					myElement.checked = (myValue == myElement.value) ? "checked" : "";
				} else if( fieldType.indexOf('select') > -1 ) {
					for (var j = 0; j < myElement.length; j++) {
						if( myElement[j].value == myValue ){
							myElement[j].selected = "selected";
							break;
						}
					}
				}else{
					myElement.value = myValue;
				}
			}
		}
		
		if(myFormRequired && myFormRequired[fieldName]){
			var myRequired = myFormRequired[fieldName];
			if( typeof(myRequired) == 'object' && myRequired.length ){
				var vIdx = _getFormElementIndex(myElement);
				myRequired = myRequired[vIdx];
			}
			if(myRequired){
				myElement.required = true;
				markFieldRequired(myElement);
			}
		}
		
		if(myFormValidators && myFormValidators[fieldName]){
			var myValidator = myFormValidators[fieldName];
			if( typeof(myValidator) == 'object' && myValidator.length ){
				var vIdx = _getFormElementIndex(myElement);
				myValidator = myValidator[vIdx];
			}
			if(myValidator)
				myElement.validate = myValidator;
		}
		
		myElement.onchange = formFieldChanged;
	}
		
	updateNavigation();
	hideLoadingDialog();	
}

function markFieldRequired(elem){
	if(elem.nextSibling && elem.nextSibling.tagName == "A" && elem.nextSibling.innerHTML == "*")
		return;
		
	function showReqMsg(){
		showMessage("REQUIRED", "Fields denoted with * are required.");
	};
	
	var mark = document.createElement('a');
	mark.innerHTML = "*";
	mark.className = 'required';
	mark.title = 'Required Field';
	mark.onclick = showReqMsg;
	if( elem.parentNode.childNodes.length == 1 ){
		elem.parentNode.appendChild(mark);	
	}else{
		elem.parentNode.insertBefore(mark, elem.nextSibling);
	}

}

// Loads a javascript cache from the form field values
function getFormValues(tName){
	writeLog( "getFormValues('" + tName + "')");
	var myFormValues = new Object();
	var myForm = document.getElementById('tabForm');
	for (var i = 0; i < myForm.elements.length; i++) {
		var myElement = myForm.elements[i];
		var fieldName = myElement.name;
		if(fieldName.length < 1) { continue; }
		var fieldType = myElement.type;
		if( fieldType == 'submit' ){ continue; }
		
		var fieldValue = "";
		if( fieldType == 'radio' || fieldType == 'checkbox' ){
			if(myElement.checked)
				fieldValue =  myElement.value;
		} else if( fieldType.indexOf('select') > -1 ) {
			fieldValue = myElement.options[myElement.selectedIndex].value;
		}else{
			fieldValue =  myElement.value;
		}
		
		if( !fieldValue || typeof(fieldValue) == 'undefined' )
			fieldValue = "";
		
		if( myForm[fieldName].length ){
			if(!myFormValues[fieldName])
				myFormValues[fieldName] = new Array();
			myFormValues[fieldName][myFormValues[fieldName].length] = fieldValue;
		}else{
			myFormValues[fieldName] = fieldValue;
		}

	}
	return myFormValues;
}


// Gets form field values
function getFormValuesString(tName){
	writeLog( "getFormValuesString(" + tName + ")");
	var resStr = "";
	var myFormValues = getFormValues(tName);
	for( var x in myFormValues ){
		var myValue = myFormValues[x];
		if(resStr!= "")
			resStr += "&";
		resStr += x + "=";
		if( typeof(myValue) == 'object' ){
			var lVals = "";
			for (var i = 0; i < myValue.length; i++) {
				if( !myValue[i] ){continue;}
				if(lVals != "")
					lVals += ",";
				lVals += escape(myValue[i]);
			}
			resStr += lVals;
		}else{
			resStr += escape(myValue);
		}
	}
	return resStr;
}


function validateTab(){
	var resStr = "";
	var reqStr = "";
	var valStr = "";
	try{
		var myForm = document.getElementById('tabForm');
		for (var i = 0; i < myForm.elements.length; i++) {
			var myElement = myForm.elements[i];
			if(myElement.validate){
				var mVal = myForm.elements[i].validate();
				if(mVal && valStr.indexOf("<li>" + mVal + "</li>") < 0 )
					valStr += "<li>" + mVal + "</li>";
			}
			if(myElement.required){
				if( myElement.type == 'radio' || myElement.type == 'checkbox' ){
					if(!myElement.checked){
						myElement.className = "validationError";
						reqStr += "<li>" + appManager.getCurrentTab().getDescription(myElement) + "</li>";
					}
				}else{
					if( !myElement.value ){
						myElement.className = "validationError";
						reqStr += "<li>" + appManager.getCurrentTab().getDescription(myElement) + "</li>";
					}
				}
			}
		}
	} catch(e) { 
		showMessage("ERROR", "Error: could not validate the page: " + e.message);
	}
	if( valStr != "" ){
		resStr += "<strong>Validation Errors:</strong><ul>" + valStr + "</ul>";
	}
	if( reqStr != "" ){
		resStr += "<strong>Required Fields:</strong><ul>" + reqStr + "</ul>";
	}
	return (resStr != "") ? resStr : null;
}

/* NEW TAB MACHINE */

function Tab( name, label ){
	this.name = name;
	this.label = label;
	this.validators = null;
	this.descriptions = null;
	this.required = null;
	this.html = null;
	this.values = null;
	this.saved = false;
	this.dirty = false;
	this.validate = function(){
		return validateTab();
	};
	this.setRequired = function(fName){
		if(!this.required)
			this.required = new Object();
		if(typeof(fName) == 'object'){
			for (var i = 0; i < fName.length; i++) {
				this.required[fName[i]] = true;
			}
		}else{
			this.required[fName] = true;
		}
	};
	this.setValidator = function(fName, fFunc){
		if(!this.validators)
			this.validators = new Object();

		this.validators[fName] = fFunc;
	};
	this.setDescription = function(fName, fDesc){
		if(!this.descriptions)
			this.descriptions = new Object();

		this.descriptions[fName] = fDesc;
	};
	this.getDescription = function(elem){
		if(this.descriptions && this.descriptions[elem.name])
			return this.descriptions[elem.name];
		else
			return elem.name;
	};
	return this;
}

function AppManager(){
	this.TABS = new Array();
	this.SESSION_ID = "";
	this.CURRENT_TAB = 0;
	
	this.getTabIndex = function(tName){
		for(var i=0;i<this.TABS.length;i++){
			if ( this.getTabName(i) == tName ) {
				return i;
			}
		}
		return -1;
	};
	this.getTabName = function(tIdx){
		return this.TABS[tIdx].name;
	};
	this.getCurrentTabName = function(){
		return this.TABS[this.CURRENT_TAB].name;
	};
	this.getTabByName = function(tName){
		return this.TABS[this.getTabIndex(tName)];
	};
	this.getTab = function(tIdx){
		return this.TABS[tIdx];
	};
	this.getCurrentTab = function(){
		return this.TABS[this.CURRENT_TAB];
	};
	this.addTab = function( tab ){
		this.TABS[this.TABS.length] = tab;
	};
	this.highestCompletedTab = function(){
		var idx = -1;
		for(var i=0;i<this.TABS.length;i++){
			if ( this.TABS[i].saved ) {
				idx = i;
			}
		}
		return idx;
	};
	this.writeBreadcrumbs = function(div){
		var resHTML = "<ul>";
		for(var i=0;i<this.TABS.length;i++){
			resHTML += "<li><a class=\"inactiveTab\" id=\"nav_" + this.TABS[i].name + "\" href=\"javascript:clickTab('" + this.TABS[i].name + "')\">" + this.TABS[i].label + "</a></li>";
		}		
		resHTML += "</ul>";
		document.getElementById(div).innerHTML = resHTML;
	};
	
	return this;
}


