var msg;
var error = new Array(); //customized error message for individual controls
var validated = false;   // tool tip is to be displayed only if page is validated at least once
var controlValidated = new Array(); //if a control has multiple validations ... its error-color shall be maintained 
var checkBoxGroup = new Array();
var count;
var mode;
var errFontColor = 'red';
var errFontSize = '11px';
var errFontFace = 'arial';
var focusControl;

function ValidateForm(frm, mode) {
    this.mode = mode.toUpperCase();

    validated = true;
    var flag = true;
    msg = "";
    count = 0;
    focusControl = undefined;
    var elem;

    for (var i = 0; i < frm.elements.length; i++) {
        elem = frm.elements[i];  // accessing each element of the form
        controlValidated[elem.id] = true;
        var valid = elem.getAttribute("validate"); // getting the validate value of the element

        var errorMessage = elem.getAttribute("errorMessage"); //ErrorMessage;
        var elementValue = elem.value;
        elementValue = elementValue.trim();

        if (valid != undefined && elem.disabled == false) // check if validate attribute is present in each element
        {
            if (elem.type == "text" || elem.type == "password" || elem.type == "textarea" || elem.type == "hidden" && elem.disabled == false) // check if element type is text and enabled
            {
                var valid_array = valid.split(":"); // split validate contents
                var errorMessages = errorMessage.split(":"); //split error messages
                for (var j = 0; j < valid_array.length; j++) {
                    var valid_contents = valid_array[j].split("="); //split the contents of each value of the validate attribute

                    switch (valid_contents[0].toLowerCase()) {
                        case "alphabet":
                            if (!checkAlphabet(elementValue)) {
                                msg += "<li>" + getErrormessage(errorMessages[j]) + "<br>";
                                error[elem.id] = getErrormessage(errorMessages[j]);
                                controlValidated[elem.id] = false;
                                flag = false;
                            }
                            break;

                        case "numeric":
                            if (!checkNumeric(elementValue)) {
                                msg += "<li>" + getErrormessage(errorMessages[j]) + "<br>"; //errorMessages[j]);
                                error[elem.id] = getErrormessage(errorMessages[j]);
                                controlValidated[elem.id] = false;
                                flag = false;
                            }
                            break;

                        case "alphanumeric":
                            if (!checkAlphanumeric(elementValue)) {
                                msg += "<li>" + getErrormessage(errorMessages[j]) + "<br>";
                                error[elem.id] = getErrormessage(errorMessages[j]);
                                controlValidated[elem.id] = false;
                                flag = false;
                            }
                            break;

                        case "alphanumericspecial":
                            if (!checkAlphanumericSpecial(elementValue)) {
                                msg += "<li>" + getErrormessage(errorMessages[j]) + "<br>";
                                error[elem.id] = getErrormessage(errorMessages[j]);
                                controlValidated[elem.id] = false;
                                flag = false;
                            }
                            break;
                        case "alphabetspecial":
                            if (!checkAlphaSpecial(elementValue)) {
                                msg += "<li>" + getErrormessage(errorMessages[j]) + "<br>";
                                error[elem.id] = getErrormessage(errorMessages[j]);
                                controlValidated[elem.id] = false;
                                flag = false;
                            }
                            break;

                        case "maxlength":
                            if (!checkMaxlength(elementValue, valid_contents[1])) {
                                msg += "<li>" + getErrormessage(errorMessages[j]) + "<br>";
                                error[elem.id] = getErrormessage(errorMessages[j]);
                                controlValidated[elem.id] = false;
                                flag = false;
                            }
                            break;

                        case "minlength":
                            if (!checkMinlength(elementValue, valid_contents[1])) {
                                msg += "<li>" + getErrormessage(errorMessages[j]) + "<br>";
                                error[elem.id] = getErrormessage(errorMessages[j]);
                                controlValidated[elem.id] = false;
                                flag = false;
                            }
                            break;

                        case "phone":
                            if (!checkPhone(elementValue)) {
                                msg += "<li>" + getErrormessage(errorMessages[j]) + "<br>";
                                error[elem.id] = getErrormessage(errorMessages[j]);
                                controlValidated[elem.id] = false;
                                flag = false;
                            }
                            break;

                        case "phonewithextension":
                            var controlExtension = valid_contents[1];
                            var secondElement = frm.elements[controlExtension];

                            if (!checkPhone(elementValue)) {
                                msg += "<li>" + getErrormessage(errorMessages[j]) + "<br>";
                                error[elem.id] = getErrormessage(errorMessages[j]);
                                controlValidated[elem.id] = false;
                                flag = false;
                            }
                            else {
                                if (elementValue == "" && elementValue == undefined && secondElement.value.trim() != "") {
                                    msg += "<li>" + getErrormessage(errorMessages[j]) + "<br>";
                                    error[elem.id] = getErrormessage(errorMessages[j]);
                                    controlValidated[elem.id] = false;
                                    flag = false;
                                    focusControl = secondElement;
                                }
                            }

                            break;

                        case "zip":
                            if (!checkZipcode(elementValue)) {
                                msg += "<li>" + getErrormessage(errorMessages[j]) + "<br>";
                                error[elem.id] = getErrormessage(errorMessages[j]);
                                controlValidated[elem.id] = false;
                                flag = false;
                            }
                            break;

                        case "date":

                            if (elementValue != "" && !checkDate(elementValue)) {
                                msg += "<li>" + getErrormessage(errorMessages[j]) + "<br>";
                                error[elem.id] = getErrormessage(errorMessages[j]);
                                controlValidated[elem.id] = false;
                                flag = false;
                            }
                            break;

                        case "email":
                            if (!checkEmail(elementValue)) {
                                msg += "<li>" + getErrormessage(errorMessages[j]) + "<br>";
                                error[elem.id] = getErrormessage(errorMessages[j]);
                                controlValidated[elem.id] = false;
                                flag = false;
                            }
                            break;

                        case "required":
                            if (!checkNonempty(elementValue)) {
                                msg += "<li>" + getErrormessage(errorMessages[j]) + "<br>";
                                error[elem.id] = getErrormessage(errorMessages[j]);
                                controlValidated[elem.id] = false;
                                flag = false;
                            }
                            break;

                        case "taxid":
                            if (!checkTaxId(elementValue)) {
                                msg += "<li>" + getErrormessage(errorMessages[j]) + "<br/>";
                                error[elem.id] = getErrormessage(errorMessages[j]);
                                controlValidated[elem.id] = false;
                                flag = false;
                            }
                            break;

                        case "webaddress":
                            if (!checkWebAddress(elementValue)) {
                                msg += "<li>" + getErrormessage(errorMessages[j]) + "<br>";
                                error[elem.id] = getErrormessage(errorMessages[j]);
                                controlValidated[elem.id] = false;
                                flag = false;
                            }
                            break;

                        case "compare":
                            var controlToCompare = GetClientId(valid_contents[1]);
                            var secondElement = frm.elements[controlToCompare];
                            if (!matchStrings(elementValue, secondElement.value.trim())) {
                                msg += "<li>" + getErrormessage(errorMessages[j]) + "<br>";
                                error[elem.id] = getErrormessage(errorMessages[j]);
                                controlValidated[elem.id] = false;
                                flag = false;
                            }

                            break;
                        case "default":
                            if (hasAngleBracket(elementValue)) {
                                msg += "<li>" + getErrormessage(errorMessages[j]) + "<br/>";
                                error[elem.id] = getErrormessage(errorMessages[j]);
                                controlValidated[elem.id] = false;
                                flag = false;
                            }

                            break;
                    } //end switch
                } //end for each validations for a control 
                displayControlErrors(elem);
            } // end type
            else if (elem.type == "select-one" && elem.disabled == false) // enabled drop down lists
            {
                var errorMessages = errorMessage.split(":"); //split error messages
                var valid_array = valid.split(":"); // split validate contents
                for (var j = 0; j < valid_array.length; j++) {
                    var valid_contents = valid_array[j].split("="); //split the contents of each value of the validate attribute
                    switch (valid_contents[0].toLowerCase()) {
                        case "default":
                            if (!checkSelection(valid_contents[1], elem.options[elem.selectedIndex].value)) {
                                msg += "<li>" + getErrormessage(errorMessages[j]) + "<br>";
                                error[elem.id] = getErrormessage(errorMessages[j]);
                                controlValidated[elem.id] = false;
                                flag = false;
                            }
                            break;
                    } //end switch
                } //end for
                displayControlErrors(elem);
            } //end type
        } //end if not undefined
        else if (elem.type == "checkbox") {
            totalCheckBoxes = 0;
            var parent = elem.parentNode;

            valid = parent.getAttribute("validate");
            if (valid != undefined) {
                //repeatdirection = vertical
                if ((parent.childNodes.length + 1) % 3 == 0)
                    totalCheckBoxes = (parent.childNodes.length + 1) / 3;
                else  //repeatdirection = horizontal
                    totalCheckBoxes = parent.childNodes.length / 2
                errorMessage = parent.getAttribute("ErrorMessage");
                if (count == 0) {
                    checkBoxGroup[parent.id] = 0;
                    count = 1;
                }
                else
                    count++;
                valid = valid.split("=");
                if (elem.checked) {
                    checkBoxGroup[parent.id] = checkBoxGroup[parent.id] + 1;
                }
                chkmsg = "";

                if (checkBoxGroup[parent.id] < valid[1]) {
                    chkmsg = "<li>" + getErrormessage(errorMessage) + "<br>";
                    error[parent.id] = getErrormessage(errorMessage);
                }
                else {
                    chkmsg = "";
                    error[parent.id] = '';
                }
                if (count >= totalCheckBoxes && checkBoxGroup[parent.id] < valid[1]) {
                    msg += chkmsg;
                    controlValidated[parent.id] = false;
                    flag = false;
                    displayControlErrors(parent);
                }
                else if (count >= totalCheckBoxes && checkBoxGroup[parent.id] >= valid[1]) {
                    controlValidated[parent.id] = true;
                    displayControlErrors(parent);
                }
            }
        } //checkbox

        if (controlValidated[elem.id] != null && focusControl == undefined && controlValidated[elem.id] == false) {
            focusControl = elem;
        }        
    }
    if (!flag) {
        if (mode == 'SUMMARY') {
            document.all.errSummary.style.color = errFontColor;
            document.all.errSummary.style.fontSize = errFontSize;
            document.all.errSummary.style.fontFamily = errFontFace;
            document.all.errSummary.innerHTML = "<b>Error Message:</b> <br>" + msg;
            document.all.errSummary.style.visibility = "visible";
        }
        else if (mode == 'ALERT') {
            msg = msg.replace(/\<br\>/g, "").replace(/\<li\>/g, "");
            alert(msg);
        }
        else if (mode != 'CONTROL') {
            if (document.all.errSummary != null) {
                document.all.errSummary.style.color = errFontColor;
                document.all.errSummary.style.fontSize = errFontSize;
                document.all.errSummary.style.fontFamily = errFontFace;
                document.all.errSummary.innerHTML = "Error Message <br>" + msg;
                document.all.errSummary.style.visibility = "visible";
            }
            else {
                msg = msg.replace(/\<br\>/g, "").replace(/\<li\>/g, "");
                alert(msg);
            }
        }
    }

    if (focusControl != undefined)
        focusControl.focus();

    return flag;
}

function displayControlErrors(elem) {
    if (controlValidated[elem.id] == true) {

        error[elem.id] = "";
        if (mode == 'CONTROL') {
            errControl = document.getElementById("err" + getControlName(elem.id));
            if (errControl != null) {
                errControl.innerHTML = ''

                errControl.style.visibility = "hidden";
            }
        }
    } //end if
    else {
        if (mode == 'CONTROL') {
            errControl = document.getElementById("err" + getControlName(elem.id));


            if (errControl != null) {
                errControl.style.color = errFontColor;
                errControl.style.fontSize = errFontSize;
                errControl.style.fontFamily = errFontFace;
                errControl.innerHTML = error[elem.id] + "<br>";
                errControl.style.visibility = "visible";
            }
        } //end CONTROL
        //elem.style.backgroundColor = 'pink';
    } //end else
}

//introduced to work with ASP NET 2.0 with master page
function getControlName(longId) {
    strings = longId.split("_");
    tmpStr = strings[strings.length - 1];
    strLen = tmpStr.length;
    tmpChar = tmpStr.substring(0, 1).toUpperCase();
    postString = tmpStr.substring(1, strLen);
    tmpStr = tmpChar + postString;
    return tmpStr;
}

// Declaring valid date character, minimum year and maximum year
// Updated by AM on 12/29/2005
// Old checkDate() function is deprecated
var dtCh = "/";
var minYear = 1900;
var maxYear = 2100;

function isInteger(text) {
    var i;
    for (i = 0; i < text.length; i++) {
        // Check that current character is number.
        var digit = text.charAt(i);
        if (((digit < "0") || (digit > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}




function stripCharsInBag(string, bag) {
    var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < string.length; i++) {
        var newCharacter = string.charAt(i);
        if (bag.indexOf(newCharacter) == -1) returnString += newCharacter;
    }
    return returnString;
}

function daysInFebruary(year) {
    // February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ((!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28);
}

function DaysArray(numberOfMonths) {
    for (var i = 1; i <= numberOfMonths; i++) {
        this[i] = 31
        if (i == 4 || i == 6 || i == 9 || i == 11) { this[i] = 30 }
        if (i == 2) { this[i] = 29 }
    }
    return this
}


function checkDate(dateString) {
    var daysInMonth = DaysArray(12)
    var pos1 = dateString.indexOf(dtCh)
    var pos2 = dateString.indexOf(dtCh, pos1 + 1)
    var strMonth = dateString.substring(0, pos1)
    var strDay = dateString.substring(pos1 + 1, pos2)
    var strYear = dateString.substring(pos2 + 1)
    strYr = strYear
    if (strDay.charAt(0) == "0" && strDay.length > 1) strDay = strDay.substring(1)
    if (strMonth.charAt(0) == "0" && strMonth.length > 1) strMonth = strMonth.substring(1)
    for (var i = 1; i <= 3; i++) {
        if (strYr.charAt(0) == "0" && strYr.length > 1) strYr = strYr.substring(1)
    }
    month = parseInt(strMonth)
    day = parseInt(strDay)
    year = parseInt(strYr)
    if (pos1 == -1 || pos2 == -1) {
        //alert("The date format should be : mm/dd/yyyy")
        return false
    }
    if (strMonth.length < 1 || month < 1 || month > 12) {
        //alert("Please enter a valid month")
        return false
    }
    if (strDay.length < 1 || day < 1 || day > 31 || (month == 2 && day > daysInFebruary(year)) || day > daysInMonth[month]) {
        //alert("Please enter a valid day")
        return false
    }
    if (strYear.length != 4 || year == 0 || year < minYear || year > maxYear) {
        //alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
        return false
    }
    if (dateString.indexOf(dtCh, pos2 + 1) != -1 || isInteger(stripCharsInBag(dateString, dtCh)) == false) {
        //alert("Please enter a valid date")
        return false
    }
    return true
}

String.prototype.trim = function() {
    return this.replace(/^\s*(\b.*\b|)\s*$/, "$1");
}

function getErrormessage(message) // function to get the relevant error message
{
    if (message != undefined)
        return "\n" + message;
    else
        return "\nInvalid data entered";
}

//use to replace RequiredFieldValidator of DotNet
function checkNonempty(fieldContent) {
    if (fieldContent == "")
        return false;
    else
        return true;
}


function checkSelection(defaultVal, currentVal)//function to check whether something is selected in dropdown list
{
    if (defaultVal == currentVal)
        return false;
    else
        return true;
}
function checkAlphabet(value) // function to check alphabet
{
    var alphabetPattern = /^([a-z]|[A-Z])+$/;
    if (value != "" && value.match(alphabetPattern) == null)
        return false;
    else
        return true;
}

function checkNumeric(value) // function to check number
{
    var numberPattern = /^([0-9]+)?$/;
    if (value != "" && value.match(numberPattern) == null)
        return false;
    else
        return true;
}
function checkAlphanumeric(value) // function to check alpha numeric value
{
    var AlphaNumPattern = /^([a-z]|[A-Z]|[0-9])+$/;
    if (value != "" && value.match(AlphaNumPattern) == null)
        return false;
    else
        return true;
}

function checkAlphanumericSpecial(value) // function to check alpha numeric value
{
    var AlphaNumPattern = /^([a-z]|[A-Z]|[0-9]|\-|\,|\'|\ )+$/;
    if (value != "" && value.match(AlphaNumPattern) == null)
        return false;
    else
        return true;
}

function checkAlphaSpecial(value) // function to check alpha numeric value
{
    var AlphaNumPattern = /^([a-z]|[A-Z])+([a-z]|[A-Z]|\-|\,|\'|\ )*$/;
    if (value != "" && value.match(AlphaNumPattern) == null)
        return false;
    else
        return true;
}

function checkPhone(value) // function to check phone number
{
    var PhonePattern = /^\d{3}-\d{3}-\d{4}$/;
    if (value != "" && value.match(PhonePattern) == null)
        return false;
    else
        return true;
}

function checkMaxlength(value, length) // function to check max length
{
    if (value.length <= length)
        return true;
    else
        return false;
}
function checkMinlength(value, length) // function to check min length
{
    if (value.length >= length)
        return true;
    else
        return false;
}
function checkEmail(email) // function to check email
{
    var txtEmailPattern = /^([a-zA-Z0-9''_]+)([a-zA-Z0-9''_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/;

    if (email != "" && email.match(txtEmailPattern) == null)
        return false;
    else
        return true;
}

function checkTaxId(taxId) // function to check the tax Id
{
    //var TaxIdPattern = /^(\d{2}-\d{7})$/;
    var TaxIdPattern = /^(\d{2}-\d{7}(-\d{2})?)$/;
    if (taxId != "" && taxId.match(TaxIdPattern) == null)
        return false;
    else
        return true;
}


function checkZipcode(zip) // function to check the zip code
{
    var ZipPattern = /^(\d{5}|\d{5}-\d{4})$/;
    if (zip != "" && zip.match(ZipPattern) == null)
        return false;
    else
        return true;
}

function matchStrings(str1, str2) // function to check if two strings are equal
{
    if (str1 != str2)
        return false;
    else
        return true;
}

function hasAngleBracket(text) {
    if (text.indexOf('<') > -1 || text.indexOf('>') > -1)
        return true
    else
        return false;
}

function checkWebAddress(address) //validating a web address
{
    var webPattern = /^(http|https):\/\/([\w-]+\.)+[\w-]+(\/[\w-.\/?%&=]*)?$/;
    if (address != "" && address.match(webPattern) == null)
        return false;
    else
        return true;
}

function showToolTip(current, e) {

    if (validated && document.all && document.readyState == "complete") {
        document.all.toolTipText.innerHTML = '<style="border:1px solid black">' + error[current.id]
        document.all.toolTipText.style.pixelLeft = event.clientX + document.body.scrollLeft + 10
        document.all.toolTipText.style.pixelTop = event.clientY + document.body.scrollTop + 10
        document.all.toolTipText.style.width = error[current.id].length * 6;
        document.all.toolTipText.style.visibility = "visible"
    }
}

function hideToolTip() {
    if (document.all)
        document.all.toolTipText.style.visibility = "hidden"
}


function ValidateOrganization(selectedToCheck, control, errorControl) {
    var orgname = document.getElementById(control.id + "_Input");
    var errormsg = errorControl;

    if (orgname != null && !orgname.isDisabled) {
        if (selectedToCheck && (orgname.value == '' || orgname.value == '-1' || orgname.value == '----SELECT----' || orgname.value == 'Select Organization' || orgname.value == 'Please type your organization' || orgname.value == '' || orgname.value == ' ')) {
            errormsg.style.display = "block";
            errormsg.innerText = "Please select organization";
            return false;
        }
        else {
            errormsg.style.display = "none";
            errormsg.innerText = "";
            return true;
        }     
    }
    return true;
}

function ValidateSupervisor(selectedToCheck, control, errorControl) {
    var supname = document.getElementById(control.id + "_Input");
    var errormsg = errorControl;
    
    if (supname != null && !supname.isDisabled) {
        if (selectedToCheck && (supname.value == '' || supname.value == '-1' || supname.value == '----SELECT----' || supname.value == 'Please type your supervisor last name' || supname.value == ' ' || supname.value == '')) {
            errormsg.style.display = "block";
            errormsg.innerText = "Please select supervisor";
            return false;
        }
        else {
            errormsg.style.display = "none";
            errormsg.innerText = "";
            return true;
        }
    }
    return true;
}
