var mandatoryConst = new String("mandatory");
var choiceConst = new String("choice");

/**
 * Register a validation handler for an input field.
 */
function registerValidationFunc(vType, action, field, func)
{
	if (field.validFuncs == null)
	{
		field.validFuncs = new Object();
	}

	var actionArray = field.validFuncs[action]
	if (actionArray == null)
	{
		actionArray = new Object();
		field.validFuncs[action] = actionArray;
	}


	var funcArray = actionArray[vType];
	if (funcArray == null)
	{
		funcArray = new Array();
		actionArray[vType] = funcArray;
	}

	funcArray[funcArray.length] = func;
	if (field.form.validateFields == null)
	{
		field.form.validateFields = new Array();
	}

	field.form.validateFields[field.form.validateFields.length] = field;
}

function callValidationFunc(form, action)
{
	if (form.validateFields == null)
		return true;

	var errors = new Array();
	var funcArray;
	var field;
	var l = form.validateFields.length;
	for (var i=0; i<l; i++)
	{
		field = form.validateFields[i];
		if ((field.validFuncs == null) || (field.doneManadatory != null))
			continue;

		field.doneManadatory = 'Y';

        actionArray = field.validFuncs[action];
		if (actionArray == null)
			continue;

        funcArray = actionArray[mandatoryConst];
		if (funcArray == null)
			continue;
		for (var j=0; j<funcArray.length; j++)
		{
			func = funcArray[j];
			var s = func(field);
			if (s.length > 0)
			{
				errors[errors.length] = ('\n' + s);
			}
		}
	}

	if (errors.length > 0)
	{
		alert("Errors on page:\n" + errors);
		clearValidations(form.validateFields);
		return false;
	}

	for (var i=0; i<l; i++)
	{
		field = form.validateFields[i];
		if ((field.validFuncs == null) || (field.doneChoice != null))
			continue;

		field.doneChoice = 'Y';
		if (field.validFuncs == null)
			continue;

        actionArray = field.validFuncs[action];
		if (actionArray == null)
			continue;

        funcArray = actionArray[choiceConst];
		if (funcArray == null)
			continue;
		for (var j=0; j<funcArray.length; j++)
		{
			func = funcArray[j];
			if (!func(field))
			{
				clearValidations(form.validateFields);
				return false;
			}
		}
	}

	clearValidations(form.validateFields);
	return true;
}

function clearValidations(fields)
{
	for (var i=0; i<fields.length; i++)
	{
		fields[i].doneManadatory = null;
		fields[i].doneChoice = null;
	}
}

// some useful validation functions
function validateRequired(field)
{
	var value = "";
	switch (field.type)
	{
	  case "select-one" :
		value = field.options[field.selectedIndex].value;
        break;
	  default:
		value = field.value;
        break;
	}

	if ((value == null) || (value.length <= 0))
		return (field.name + " is required");
	return "";
}

function validateIsNumber(field)
{
	if (isNaN(field.value))
		return (field.name + " must contain a numeric value");
}


var subscribers = new Array();
function addToSubscriberArray(field)
{

	if(field.selectedIndex<0) return "";
	var value = "";

	for(i=0;i<field.options.length;i++){
		if(field.options[i].selected){
			value = field.options[i].value;

			if(value!=null && value.length>0){
				subscribers[subscribers.length] = value;
			}
		}
	}

	return "";
}

function validateIsSelectedSubscriber(field)
{
	if(subscribers.length==0) return "";

	for(i=0;i<subscribers.length;i++){
		if (field.value == subscribers[i]) return "";
	}

	subscribers = new Array();
	return "You must select your subscriber as a Seller, Buyer, or Reviewer";
}

var feeMax = 999999999;
var feePctMax = 99999;
function validateCheckMaxFee(field)
{

	var val = field.value;
	var tempVal;
	var max =  feeMax;

	if ((isNaN(val)) || (val==null) ) return "";
	if (field.name!=null && field.name.indexOf("Pct")>0) max = feePctMax

	var decimalIndex = val.lastIndexOf(".");

	if(decimalIndex == 0){
		return "";
	}else if(decimalIndex < 0){
		if(val > max){
			return (getLabel(field.name) + " is too large of a value");
		}
	}else{
		tempVal = val.substr(0,decimalIndex);

		if(tempVal > max){
			return (getLabel(field.name) + " is too large of a value");
		}
	}
	return "";
}

function getLabel(fieldName){

	var label = "Fee";

	if(fieldName!=null){
		switch(fieldName){
			case "commision":
				label = "Commision Fee";
				break;
			case "laborFee":
				label = "Labor Fee";
				break;
			case "maintFee":
				label = "Maintanence Fee";
				break;
			case "patentFee":
				label = "Patent Fee";
				break;
			case "provFee":
				label = "Provisioning Fee";
				break;
			case "warrFee":
				label = "Warranty Fee";
				break;
			case "odcFee":
				label = "ODC Fee";
				break;
			case "subContrFee":
				label = "Subcontractor Fee";
				break;
			case "travelFee":
				label = "Travel Fee";
				break;
			case "otPremFee":
				label = "Overtime Premium Fee";
				break;
			case "matFee":
				label = "Material Fee";
				break;
			case "commisionPct":
				label = "Commision Pct";
				break;
			case "laborFeePct":
				label = "Labor Pct";
				break;
			case "maintFeePct":
				label = "Maintanence Pct";
				break;
			case "patentFeePct":
				label = "Patent Pct";
				break;
			case "provFeePct":
				label = "Provisioning Pct";
				break;
			case "warrFeePct":
				label = "Warranty Pct";
				break;
			case "odcFeePct":
				label = "ODC Pct";
				break;
			case "subContrFeePct":
				label = "Subcontractor Pct";
				break;
			case "travelFeePct":
				label = "Travel Pct";
				break;
			case "otPremFeePct":
				label = "Overtime Premium Pct";
				break;
			case "matFeePct":
				label = "Material Pct";
				break;
		}
	}

	return label;
}


function validateSubmittedForPricing(field)
{

	var val = field.value;
	if(val!=null) alert( "This has been submitted for pricing.  Any updates will need to be resubmitted for pricing.");
	return "";
}

function hasCheckedItem(field)
{
	if (field.form[field.name].length)
	{
		arr = field.form[field.name];
		l = arr.length;
		for (i = 0; i < l; i++)
		{
			if (arr[i].checked)
				return "";
		}
	} else
	{
		if (field.checked)
			return "";
	}
	return "Please check at least one box before pressing print";
}


function hasTwoCheckedItems(field)
{
	var j = 0;
	if (field.form[field.name].length)
	{
		arr = field.form[field.name];
		l = arr.length;
		for (i = 0; i < l; i++)
		{
			if (arr[i].checked)
				j++;
		}
	} 
	if (j == 2)
		return "";
	return "Please check two boxes before pressing compare";
}
