//forms API, handles arrayed fields
//JNL7/27/02
//DISABLE control problem hacked 11/22/02
//ADDED moreHelp function 2/4/03
//FIX WebTV '||' bug 'getFormFieldType' 9/14/05
var DEBUG=false;

function moreHelp(msg,helplink){
	var choice=confirm(msg + "\nDo you want open a window with more information from our help file?");
	if(choice) {
		var attr="titlebar=yes,scrollbars=yes,resizable=yes";
		var newWind = window.open(helplink,"subwindow",attr);
		newWind.focus();
	}
	return false;				 
}

function getFormFieldType(f){
//var info = (typeof(f.name)=='undefined') ? ('arrayed ' + f[0].name) : f.name;
//alert("DEBUG what is passed to 'getFormFieldType'\nname is " + info);
		return typeof(f.type)=='string' ? f.type : f[0].type; //some form fields e.g., radio are indexed
}

function isControlArray(o){
	return(typeof(o[0])!='undefined');
}

function isAtDefault(f){
	var type=getFormFieldType(f);		//buttons have not default so always true
	var indexed=isControlArray(f);
	if(type=="button" || type=="submit" || type=="reset" || type=="file" ) return true;
	if(indexed){						//if any in group not default return false
		if(type=="select-one" || type=="select-multiple"){
			for(var i=0; i<f.options.length; i++){
				if(f.options[i].selected!=f.options[i].defaultSelected) return false;
			}
		}
		else if(type=="checkbox" || type=="radio"){
			for(var i=0; i<f.length; i++){
				 if(f[i].checked!=f[i].defaultChecked) return false;
			}
		}	
		else	{
			for(var i=0; i<f.length; i++){
				if(f[i].value!=f[i].defaultValue) return false;
			}
		}
		return true;
	}
	else{
		if(type=="checkbox" || type=="radio") return(f.checked==f.defaultChecked);
		else return(f.value==f.defaultValue);
	}
}

function _getSV(f){
	return f.options[f.selectedIndex].value;
}

function _getSMVf(f){
	var a = new Array;
	var j=0;
	for(var i=0; i<f.options.length; i++){
		if(f.options[i].selected) a[j++]=f.options[i].value;
	}
	return a;		
}

function _getRV(f){
	for(var i=0; i<f.length; i++){
		if(f[i].checked) return f[i].value;
	}
}

function _getCV(f){
	var a = new Array;
	var j=0;
	for(var i=0; i<f.length; i++){
		if(f[i].checked) a[j++]=f[i].value;
	}
	return a;
}

function getFormFieldValue(f){
	var type=getFormFieldType(f);
	var indexed=isControlArray(f);
	if(indexed){
		if(type=="select-one") return _getSV(f);
		if(type=="select-multiple") return _getSMV(f);
		if(type=="radio") return _getRV(f);
		if(type=="checkbox") return _getCV(f);
		var a=new Array;
		var j=0;
		for(var i=0; i<f.length; i++) if(f[i].value) a[j++]=f[i].value;
		return a;	
	}
	else{
		if(type=="checkbox" || type=="radio"){
			if(f.checked) return f.value;
			else return "";
		}
		return f.value;
	}
}
					
function setFormFieldDefaultValue(f){
	var type=getFormFieldType(f);
	var indexed=isControlArray(f);
	if(type=="button" || type=="submit" || type=="reset" || type=="file" ) return;
	if(indexed){
		if(type=="select-one" || type=="select-multiple"){
			for(var i=0; i<f.options.length; i++) f.options[i].selected=f.options[i].defaultSelected;
		}
		else if(type=="checkbox" || type=="radio"){
			for(var i=0; i<f.length; i++) f[i].checked=f[i].defaultChecked;
		}	
		else	{
			for(var i=0; i<f.length; i++) f[i].value=f[i].defaultValue;
		}
	}
	else{
		if(type=="checkbox" || type=="radio") f.checked=f.defaultChecked;
		else f.value=f.defaultValue;
	}
}

function setFieldFocus(f){
	if(f.focus){
		f.focus();
		f.focus();
		if(f.select) { f.select(); }
	}
	else{
		f[0].focus();
		if(f[0].select) {  f[0].select(); }
	}
}

function charLimit(me, limit, prompt){
	if(me.value.length>limit){
		me.value=me.value.substring(0, limit);
		if(prompt){
			var msg='You have exceeded the ' + limit;
			msg+=' for this field, your entry has been truncated';
			alert(msg);
		}
	}
}

/* ======== ENABLE/DISABLE FUNCTIONS ======== */
function NN4Disable(me, fDisabled){	
	//NN4 doesn't support disable this is a hack workaround
	//put on the 'onfocus' handler
	if((typeof(me.disabled)=='undefined') && fDisabled) me.blur();	//Only do it for NN4 that does not support disabled
}						//This check prevents blur on supporting browsers ei FF that causes an error

function disableFormField(form, fieldName){
	var f=form.elements[fieldName];
	var ctype=getFormFieldType(f); //NS4 does not disable so reset to defaults
	setFormFieldDefaultValue(f)
	if( typeof(f.disabled)!='undefined' ) f.disabled=true;	//don't try on NN4x	
}

function enableFormField(form, fieldName, gainFocus){
	var f=form.elements[fieldName];
	if(!f) alert("DEV ERROR: \'" + fieldName + "\' does not exist on this form");
	
	//DOES NOT WORK FOR LIST BOXES ON NEW BROWSERS LISTS AS INDEXED....
	//var indexed=isControlArray(f);
	//if(indexed){
	//	for(var i=0; i<f.length; i++) f[0].disabled=false;
	//}
	//else f.disabled=false;
	
	if( typeof(f.disabled)!='undefined' ) f.disabled=false; //don't try on NN4x
	if(gainFocus||0) setFieldFocus(f);	
	if(DEBUG) alert( f.name + " is currently disabled = " + f.disabled );
}

function slaveByIndex(master, index, disable){	//for Select objects
//	disable=true: on index slaves DISABLED, else ENABLED on all others values
//	disable=false: on index slaves ENABLED, else DISABLED on all others values
//	returns true when enabling and false when disabling to set var for NS4
	
	var form=master.form;
	if((master.selectedIndex == index) == disable){
		for(var i=3; i<slaveByIndex.arguments.length; i++){
		if(DEBUG)alert( master.name + " is disabling " + slaveByIndex.arguments[i]);
			disableFormField(form, slaveByIndex.arguments[i]);
		}
		return false;
	}
	else {
		for(var i=3; i<slaveByIndex.arguments.length; i++){
			var getFocus=(i==(slaveByIndex.arguments.length-1));	//put focus on last field in list
			if(DEBUG)alert( master.name + " is enabling " + slaveByIndex.arguments[i] +  " and get focus is " + getFocus);
			enableFormField(form, slaveByIndex.arguments[i], getFocus);
		}
		return true;
	}
	
}

function slaveByValue(master, value, disable){
//	disable=true: on value slaves DISABLED, else ENABLED on all others values
//	disable=false: on value slaves ENABLED, else DISABLED on all others values
//	returns true when enabling and false when disabling to set var for NS4
	
	var form=master.form;
	if((getFormFieldValue(master) == value) == disable){
		for(var i=3; i<slaveByValue.arguments.length; i++){
			if(DEBUG)alert( master.name + " is disabling " + slaveByValue.arguments[i]);
			disableFormField(form, slaveByValue.arguments[i]);
		}
		return false;
	}
	else {
		for(var i=3; i<slaveByValue.arguments.length; i++){
			var getFocus=(i==(slaveByValue.arguments.length-1));	//put focus on last field in list
			if(DEBUG)alert( master.name + " is enabling " + slaveByValue.arguments[i] +  " and get focus is " + getFocus);
			enableFormField(form, slaveByValue.arguments[i], getFocus);
		}
	return true;
	}	
}


 