// JScript File

var ValidateFormUtils = {
    trim: function(str) {
        return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
    }
};

function ajax_get(url, callback) {
    var xmlHttp = ajax.xmlHttp();
    xmlHttp.open('GET', url, false);
    xmlHttp.send(null)
    if (xmlHttp.status == 200) {
        var serverResponse = xmlHttp.responseText;
        if (callback) {
            callback(serverResponse);
        }
        return serverResponse;
    }
}

function reset() {
    var elems = document.getElementsByTagName("*");
    for (var i = 0; i < elems.length; i++) {
        if (elems[i].getAttribute("Validate") == "true") {
            var obj = (elems[i].getAttribute("ErrorElement") ? document.getElementById(elems[i].getAttribute("ErrorElement")) : elems[i]);
            obj.className = "";
        }
    }

    var error = document.getElementById("error");
    error.style.visibility = "hidden";
    var ul = error.getElementsByTagName("ul")[0];
    removeChildNodes(ul);
}

function validate(validateType) {
    valid = true;
    reset();
    
    var re = /\/national\/footernav\/contact.aspx/;
    var url = window.location.href.toLowerCase();

    // minimum required number of semi-optional fields
    var semiOptFieldReqCount = 0;
    // actual number of semi-optional fields that have been filled in
    var semiOptFieldSpecifiedCount = 0;
    
    var elems = document.getElementsByTagName("*");
    for (var i = 0; i < elems.length; i++) {
        if (elems[i].getAttribute("Validate") == "true") {
            var obj = (elems[i].getAttribute("ErrorElement") ? document.getElementById(elems[i].getAttribute("ErrorElement")) : elems[i]);

            var thisValid = true;
            var val;
            if (elems[i].type.indexOf("select") >= 0) {
                val = elems[i].options[elems[i].selectedIndex].value;
            }
            else if (elems[i].type == "radio") {
                val = getRadioValue(elems[i].name);
            }
            else {
                val = elems[i].value;
            }
            
            var isSemiOptional = elems[i].getAttribute("SemiOptional") == "true";
            if (!isSemiOptional && (elems[i].getAttribute("Required") != "false")) {
                if (ValidateFormUtils.trim(val) == "") {
                    obj.className = "form_error";
                    thisValid = thisValid && false;
                }
            }

            if (elems[i].getAttribute("ValidationType") == "pulldown") {
                if (val == "") {
                    obj.className = "form_error";
                    thisValid = thisValid && false;
                    addErrorMessage("Please make sure you have filled in values for all Required dropdown menus.");
                }
            }
            
            if (isSemiOptional) {
                var countElem = document.getElementById("semiOptFieldReqCount");
                semiOptFieldReqCount = !countElem ? semiOptFieldReqCount : countElem.value;
                
                if (ValidateFormUtils.trim(val) != "") {
                    semiOptFieldSpecifiedCount += 1;
                }
            }

            if (val.length > 0) {
                switch (elems[i].getAttribute("ValidationType")) {
                case "phone":
                    if (!isValidPhone(val)) {
                        obj.className = "form_error";
                        thisValid = thisValid && false;
                    }
                    break;
                case "complementaryticketbarcode":
                    if (!isValidcomplementaryticketbarcode(val)) {
                        obj.className = "form_error";
                        thisValid = thisValid && false;
                    }
                    break;
                case "barcode_check":
                    if (!isValidbarcode_check(val)) {
                        obj.className = "form_error";
                        thisValid = thisValid && false;
                    }
                    break;
                case "email":
                    if (!isValidEmail(val)) {
                        obj.className = "form_error";
                        thisValid = thisValid && false;
                    }
                    break;
                case "zip":
                    if (!isValidZip(val)) {
                        obj.className = "form_error";
                        thisValid = thisValid && false;
                    }
                    break;
                case "check":
                    if (!isSel(val)) {
                        obj.className = "form_error";
                        thisValid = thisValid && false;
                    }
                    break;
                case "extension":
                    if (!isValidExtension(val)) {
                        obj.className = "form_error";
                        thisValid = thisValid && false;
                    }
                    break;
                case "age":
                case "number":
                    if (!isValidAge(val)) {
                        obj.className = "form_error";
                        thisValid = thisValid && false;
                    }
                    break;
                default:
                    break;
                }
            }
            
            valid = valid && thisValid;
        }
    }

    if (semiOptFieldSpecifiedCount < semiOptFieldReqCount) {
        valid = false;
        addErrorMessage("Please fill in at least " + semiOptFieldReqCount + " non-required fields.");
    }

    if (valid && validateType) {
        switch (validateType) {
        case "checkAge":
            var now = new Date();
            var birthDate = new Date(
                document.getElementById("form_birthMonth").value + "/" + 
                document.getElementById("form_birthDay").value + "/" + 
                document.getElementById("form_birthYear").value
            )
            var age = (now - birthDate) / (1000 * 60 * 60 * 24 * 365.25);
            if (age < 13) {
                location.href = "underthirteen.aspx";
                return false;
            }
            break;
        }
    }

    var error = document.getElementById("error");
    if (!valid) {
        error.style.visibility = "visible";
    }

    if (valid && url.match(re)) {
        ajax_get("/national/global/asp/code/VerifyIpAddress.aspx",
        function(success) {
            var form = document.getElementById("ctl00");
            var table = form.getElementsByTagName("tbody")[0];
            if (table.firstChild.id == "error-row") {
                table.removeChild(table.firstChild);
                //.innerHTML = "";
            }
            if (parseInt(success) == 0) {
                // failure
                var errorRow = document.createElement("tr");
                var errorCell = document.createElement("td");
                errorCell.setAttribute("colspan", 2);
                errorCell.innerHTML = "You have exceeded the number of submissions that can be sent in a day.";
                errorCell.className = "form-error";
                errorCell = errorRow.appendChild(errorCell);
                errorRow.id = "error-row";
                errorRow = table.insertBefore(errorRow, table.firstChild);
                valid = valid && false;
            }
        });
    }
    return valid;
}


function isValidEmail(txt) {
    var regEx = /^[a-zA-Z0-9._-]+(@)[a-zA-Z0-9-._]+(\.)[a-zA-Z0-9]{2,4}$/;

    if (txt.match(regEx)) {
        return true;
    }
    else {
        addErrorMessage("Email is incorrect.");
        return false;
    }

}

function isSel(txt) {
    if (txt > 0) {
        return true;
    }
    else {
        return false;
    }

}

function isValidPhone(txt) {
    // var regEx = /^[(]?\d{3}\D*\d{3}\D*\d{4}$/
    //var regEx = /^(\d|-){10,17}$/;
    var regEx = /^[0-9]{10,17}$/;
    if (txt.match(regEx)) {
        return true;
    }
    else {
        addErrorMessage("Phone number must be between 10 and 17 digits without any special characters.");
        return false;
    }
}

function isValidcomplementaryticketbarcode(txt) {
    //var regEx = /^[(]?\d{3}\D*\d{3}\D*\d{4}$/
    var regEx = /^(\d|-){14,14}$/;
    if (txt.match(regEx)) {
        return true;
    }
    else {
        addErrorMessage("Complementary Ticket Barcode must be 14 characters.");
        return false;
    }
}

function isValidbarcode_check(txt) {
    var regEx = /^(\d|-){12,12}$/;
    var myArray = ['884912129710', '884912129741', '884912129512', '884912129659', '884912111715', '884912111814', '884912025098', '884912103703', '884912117625', '884912017413', '884912129789', '884912029119', '043000129784', '043000029114'];

    if (txt.match(regEx))

    {
        for (var i = 0; i <= 13; i++)
        {
            if ((txt == myArray[i]))
            {
                return true;
            }
        }
        addErrorMessage("Please double-check the UPC on the bottom of box and enter again.");
    }
    else
    {
        addErrorMessage("UPC Barcode must be 12 digits.");
        return false;
    }
}


function isValidExtension(txt) {
    //var regEx = /^[(]?\d{3}\D*\d{3}\D*\d{4}$/;
    var regEx = /^\d{0,5}$/;
    if (txt.match(regEx)) {
        return true;
    }
    else {
        addErrorMessage("Extensions can only contain numbers.");
        return false;
    }
}

function isValidZip(txt) {
    var regEx = /(\d|\w|-){5,15}$/;
    if (txt.match(regEx)) {
        return true;
    }
    else {
        addErrorMessage("Zipcode must be between 5 and 15 characters.");
        return false;
    }
}

function isValidAge(txt) {
    var regEx = /^\d+$/;
    if (txt.match(regEx)) {
        return true;
    }
    
    addErrorMessage("Age can only contain numbers.");
    return false;
}

function getRadioValue(name) {
    var val = "";
    var elems = document.getElementsByName(name);
    for (var i = 0; i < elems.length; i++) {
        if (elems[i].checked) {
            val = elems[i].value;
            break;
        }
    }

    return val;
}

function addErrorMessage(text) {
    var div = document.getElementById("error");
    var ul = div.getElementsByTagName("ul")[0];
    var li = document.createElement("li");
    li.appendChild(document.createTextNode(text));
    ul.appendChild(li);
}

function removeChildNodes(node) {
    while (node.childNodes[0]) {
        node.removeChild(node.childNodes[0]);
    }
}

