
var not_validating_txt = "";
var errorsNum = 0;
var errors = 0;
var outerValidation = false;

// validates that the field value string has one or more characters in it
function isNotEmpty(elemObj){
var elem = elemObj["object"];
	var str = elem.value;
	var defaultStr = elemObj["defaultValue"];
    var re = /.+/;
    if(!str.match(re) || (defaultStr != '' && str == defaultStr)) {
		focusElement(elemObj);
    } else {
	    passedValidation(elem);
    }
}

function isZip(elemObj)
{
	var elem = elemObj["object"];
	var defaultStr = elemObj["defaultValue"];
	var str = elem.value;
	if(str.search(/^[0-9]{5}(-[0-9]{4})?$/) == -1 || (defaultStr != '' && str == defaultStr))
	{
		focusElement(elemObj);
	}
	else
	{
		passedValidation(elem);
	}
}

function isUSPhoneNumber(elemObj)
{		
	var elem = elemObj["object"];
	var defaultStr = elemObj["defaultValue"];
	var str = elem.value;
	if((str.search(/^\(?[0-9]{3}\)?[- ]?[0-9]{3}[- ]?[0-9]{4}$/) == -1 && str.search(/^\+?[0-9]{3}[- ]?[0-9]{3}[- ]?[0-9]{3}[- ]?[0-9]{3}$/) == -1) || (defaultStr != '' && str == defaultStr))
	{
		focusElement(elemObj);
	}
	else
	{
		passedValidation(elem);
	}
}

function isEmail(elemObj)
{
//\\w+([-+.\']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*
	var elem = elemObj["object"];
	var defaultStr = elemObj["defaultValue"];
	var str = elem.value;
	if(str.search(/^\w+([-+.\']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/) == -1 || (defaultStr != '' && str == defaultStr))
	{
		focusElement(elemObj);
	}
	else
	{
		passedValidation(elem);
	}
}

// validate that the user made a selection other than default
function isChecked(checkboxObj) {
var checkbox = checkboxObj["object"];
    var valid = false;
    if (!checkbox.checked) {
		focusElement(checkboxObj);
		checkbox.style.border="0px;"
    } else {
		passedValidation(checkbox);
	}
}

function isChosen(selectObj) {
var select = selectObj["object"];
    if (select.selectedIndex == 0) {
		focusElement(selectObj);
    } else {
	    passedValidation(select);
    }
}

function focusElement(elemObj) {
    failedValidation(elemObj["object"]);
    not_validating_txt = not_validating_txt + elemObj["label"] + "\n";
	errorsNum = errorsNum+1;
}

function failedValidation(failedObj){
    failedObj.style.borderColor = "#ff0000";
    failedObj.style.color = "#AF451B";
    failedObj.style.backgroundColor = "#FFF9F9";
    return true;
}

function passedValidation(passedObj){
    passedObj.style.borderColor = "#A7966D";
    passedObj.style.color = "#747474";
    passedObj.style.backgroundColor = "#ffffff";
    return true;
}

function setRequiredElementObj(formObj, element){
	element["object"] = document.getElementById(element["id"]);
	return true;
}

function activateRequiredGroup(groupToActivate){
    for(var j=0; j<requiredElements.length; j++){
        if(requiredElements[j]["group"]){
            if(requiredElements[j]["group"] == groupToActivate){
                requiredElements[j]["active"] = true;
            }else{
                requiredElements[j]["active"] = false;
            }
        }
    }
    return true;
}

function activateRequiredGroups(groupsToActivate){
    for(var j=0; j<requiredElements.length; j++){
		var active = false;
        if(requiredElements[j]["group"]){
			if (groupsToActivate)
			{
				for (var k=0; k < groupsToActivate.length; k++)
				{
					if(requiredElements[j]["group"] == groupsToActivate[k])
					{
						active = true;
						break;
					}
				}
				
				requiredElements[j]["active"] = active;
            }
        }
    }
    return true;
}


function isValid(elementToValidate){
    switch (elementToValidate["type"]) {
        case "txt": {
            isNotEmpty(elementToValidate);
            return true;
        }
        case "ddl": {
            isChosen(elementToValidate);
            return true;
        }
        case "chk": {
            isChecked(elementToValidate);
            return true;
        }
        case "zip":
        {
			isZip(elementToValidate);
			return true;
        }
        case "email":
        {
			isEmail(elementToValidate);
			return true;
        }
        case "phoneUS":
        {
			isUSPhoneNumber(elementToValidate);
			return true;
        }
        case "validRange":
        {
			isValidRange(elementToValidate);
			return true;
        }
        default: return false;
    }
}

function validateForm(form, pseudoForm) {
	for(var i=0; i<requiredElements.length; i++){
	  if(requiredElements[i]["form"] == pseudoForm){
        setRequiredElementObj(form, requiredElements[i]);
        if(requiredElements[i]["active"]){
            isValid(requiredElements[i]);
        } else {
            passedValidation(requiredElements[i]["object"]);
        }
      }
	}
	
	if (errorsNum==0){
		not_validating_txt = "";
		errors = 0;
	} else {
		alert("Returned with " +errorsNum+ " validation errors!\nPlease fill in the following required field(s): \n"+not_validating_txt);
		not_validating_txt = "";
		errors = errorsNum;
		errorsNum = 0;
    }
}

function isValidRange(elemObj)
{
	var minSelect = elemObj["object"];
	var maxSelect = document.getElementById(elemObj["maxSelectId"]);

	if (minSelect != null && maxSelect != null)
	{
		if (elemObj["ignoreFirstItem"])
		{
			if (minSelect.selectedIndex > 0 && maxSelect.selectedIndex > 0 && Number(minSelect.value) > Number(maxSelect.value))
			{
				focusElement(elemObj);
			}
			else
			{
				passedValidation(minSelect);
			}
		}
		else
		{
			if (minSelect.value > maxSelect.value)
			{
				focusElement(elemObj);
			}
			else
			{
				passedValidation(minSelect);
			}
		}
	}
}

function CheckRange(minId, maxId)
{
	var minSelect = document.getElementById(minId);
	var maxSelect = document.getElementById(maxId);
	alert(minId);
	alert(maxId);
	alert(minSelect);
	alert(maxSelect);
	if (minSelect == null || maxSelect == null)
		return;
		
	if (minSelect.selectedIndex > 0 && maxSelect.selectedIndex > 0 && minSelect.value > maxSelect.value)
	{
		alert("Invalid range. Minimum value is greater than maximum value.");
		return;
	}
}