﻿function AddLoadEvent(func) {
    var oldonload = window.onload;
    window.onload = function() {
        if (oldonload && typeof (oldonload) == 'function') {
            oldonload();
        }
        if (typeof (func) != 'function') { eval(func); } else { func(); }
    }
}
function Feedback(Id, ClientId, ErrorInfo, ErrorMessages, SubmitId) {
    this.Id = Id;
    this.ClientId = ClientId;
    this.InitialQuestion = null;
    this.SubmitId = SubmitId;
    this.ChatOverlay = null;
    this.ErrorInfo = ErrorInfo;
    this.ErrorMessages = ErrorMessages;
    this.TextValidation = new Array();
    this.RadioValidation = new Array();
    this.ListValidation = new Array();
    this.PhoneValidation = new Array();
    this.EmailValidation = new Array();
    this.hidden = new Array();
    this.bottom = null;
    this.FormDisplayed = false;
    this.Invalid = false;
    return this;
}

Feedback.prototype.RegisterTextBoxValidation = function(FieldId, ErrorMessage, LabelId) {
    this.TextValidation[this.TextValidation.length] = { FieldId: FieldId, ErrorMessage: ErrorMessage, LabelId: LabelId };
}

Feedback.prototype.RegisterRadioButtonListValidation = function(FieldId, ErrorMessage, LabelId) {
    this.RadioValidation[this.RadioValidation.length] = { FieldId: FieldId, ErrorMessage: ErrorMessage, LabelId: LabelId };
}

Feedback.prototype.RegisterDropDownListValidation = function(FieldId, ErrorMessage, LabelId) {
    this.ListValidation[this.ListValidation.length] = { FieldId: FieldId, ErrorMessage: ErrorMessage, LabelId: LabelId }; ;
}

Feedback.prototype.RegisterPhoneValidation = function(FieldId1, FieldId2, FieldId3, ErrorMessage, LabelId) {
    this.PhoneValidation[this.PhoneValidation.length] = { FieldId1: FieldId1, FieldId2: FieldId2, FieldId3: FieldId3, ErrorMessage: ErrorMessage, LabelId: LabelId };
}

Feedback.prototype.RegisterEmailValidation = function(FieldId, ErrorMessage, LabelId) {
    this.EmailValidation[this.EmailValidation.length] = { FieldId: FieldId, ErrorMessage: ErrorMessage, LabelId: LabelId };
}

Feedback.prototype.Init = function() {
    AddLoadEvent(this.Id + '.OnLoad()');
}

Feedback.prototype.CloseChat = function(url) {
    if (this.ChatOverlay != null) {
        this.ChatOverlay.className = 'ChatOverlayHidden';
        this.ShowForm();
        if (this.Invalid)
            this.Validate();
        if (url != null)
            return true;
        return false;
    }
}

Feedback.prototype.Validate = function() {
    var valid = true;
    var msgs = document.getElementById(this.ErrorMessages);
    msgs.innerHTML = '';

    for (i = 0; i < this.ListValidation.length; i++) {
        var select = document.getElementById(this.ListValidation[i].FieldId);
        var lbl = document.getElementById(this.ListValidation[i].LabelId);
        if (select.selectedIndex < 1) {
            if (this.ListValidation[i].Invalid != true) {
                select.className += 'Error';
                lbl.className = 'FormLabelError';
                this.ListValidation[i].Invalid = true;
            }
            msgs.innerHTML += this.ListValidation[i].ErrorMessage + '<br/>';
            valid = false;
        } else {
            this.ListValidation[i].Invalid = false;
            if (select.className.indexOf('Error') > -1)
                select.className = select.className.substring(0, select.className.indexOf('Error'));
            lbl.className = 'FormLabel';
        }
    }

    for (i = 0; i < this.RadioValidation.length; i++) {
        var select = document.getElementById(this.RadioValidation[i].FieldId);
        var lbl = document.getElementById(this.RadioValidation[i].LabelId);
        var options = select.getElementsByTagName("input");
        var radioChecked = false;
        for (var x = 0; x < options.length; x++) {
            if (options[x].checked) {
                radioChecked = true;
                break;
            }
        }
        if (!radioChecked) {
            if (this.RadioValidation[i].Invalid != true) {
                select.className += 'Error';
                lbl.className = 'FormLabelError';
                this.RadioValidation[i].Invalid = true;
            }
            msgs.innerHTML += this.RadioValidation[i].ErrorMessage + '<br/>';
            valid = false;
        } else {
            this.RadioValidation[i].Invalid = false;
            if (select.className.indexOf('Error') > -1)
                select.className = select.className.substring(0, select.className.indexOf('Error'));
            lbl.className = 'FormLabel';
        }
    }

    for (i = 0; i < this.TextValidation.length; i++) {
        var input = document.getElementById(this.TextValidation[i].FieldId);
        var lbl = document.getElementById(this.TextValidation[i].LabelId);

        if (input.value == '' || (input.maxLength != 'undefined' && input.maxLength <= 5 && input.value.length != input.maxLength)) {
            if (this.TextValidation[i].Invalid != true) {
                input.className += 'Error';
                lbl.className = 'FormLabelError';
                this.TextValidation[i].Invalid = true;
            }
            msgs.innerHTML += this.TextValidation[i].ErrorMessage + '<br/>';
            valid = false;
        } else {
            this.TextValidation[i].Invalid = false;
            if (input.className.indexOf('Error') > -1)
                input.className = input.className.substring(0, input.className.indexOf('Error'));
            lbl.className = 'FormLabel';
        }
    }

    for (i = 0; i < this.PhoneValidation.length; i++) {
        var input1 = document.getElementById(this.PhoneValidation[i].FieldId1);
        var input2 = document.getElementById(this.PhoneValidation[i].FieldId2);
        var input3 = document.getElementById(this.PhoneValidation[i].FieldId3);
        var lbl = document.getElementById(this.PhoneValidation[i].LabelId);
        var errorAdded = false;

        var regularExpressionCode1 = /^[1-9]\d{2}$/;

        if ((input1.maxLength != 'undefined' && input1.maxLength <= 5 && input1.value.length != input1.maxLength || input1.value.search(regularExpressionCode1) == -1)) {
            if (this.PhoneValidation[i].Invalid1 != true) {
                lbl.className = 'FormLabelError';
                this.PhoneValidation[i].Invalid1 = true;
            }
            if (!errorAdded) {
                msgs.innerHTML += this.PhoneValidation[i].ErrorMessage + '<br/>';
                errorAdded = true;
            }
            valid = false;
        }

        if ((input2.maxLength != 'undefined' && input2.maxLength <= 5 && input2.value.length != input2.maxLength || input2.value.search(regularExpressionCode1) == -1)) {
            if (this.PhoneValidation[i].Invalid2 != true) {
                lbl.className = 'FormLabelError';
                this.PhoneValidation[i].Invalid2 = true;
            }
            if (!errorAdded) {
                msgs.innerHTML += this.PhoneValidation[i].ErrorMessage + '<br/>';
                errorAdded = true;
            }
            valid = false;
        }

        if ((input3.maxLength != 'undefined' && input3.maxLength <= 5 && input3.value.length != input3.maxLength)) {
            if (this.PhoneValidation[i].Invalid3 != true) {
                lbl.className = 'FormLabelError';
                this.PhoneValidation[i].Invalid3 = true;
            }
            if (!errorAdded) {
                msgs.innerHTML += this.PhoneValidation[i].ErrorMessage + '<br/>';
                errorAdded = true;
            }
            valid = false;
        }

        if (!errorAdded) {
            this.PhoneValidation[i].Invalid1 = false;
            this.PhoneValidation[i].Invalid2 = false;
            this.PhoneValidation[i].Invalid3 = false;
            if (input1.className.indexOf('Error') > -1) 
                input1.className = input1.className.substring(0, input1.className.indexOf('Error'));
            if (input2.className.indexOf('Error') > -1)
                input2.className = input2.className.substring(0, input2.className.indexOf('Error'));
            if (input3.className.indexOf('Error') > -1)
                input3.className = input3.className.substring(0, input3.className.indexOf('Error'));
            lbl.className = 'FormLabel';
        }
        else {
            if (input1.className.indexOf('Error') == -1)
                input1.className += 'Error';
            if (input2.className.indexOf('Error') == -1)
                input2.className += 'Error';
            if (input3.className.indexOf('Error') == -1)
                input3.className += 'Error';
        }
    }

    for (i = 0; i < this.EmailValidation.length; i++) {
        var input = document.getElementById(this.EmailValidation[i].FieldId);
        var lbl = document.getElementById(this.EmailValidation[i].LabelId);

        if (checkEmail(input) == false) {
            if (this.EmailValidation[i].Invalid != true) {
                input.className += 'Error';
                lbl.className = 'FormLabelError';
                this.EmailValidation[i].Invalid = true;
            }
            msgs.innerHTML += this.EmailValidation[i].ErrorMessage + '<br/>';
            valid = false;
        } else {
            this.EmailValidation[i].Invalid = false;
            if (input.className.indexOf('Error') > -1)
                input.className = input.className.substring(0, input.className.indexOf('Error'));
            lbl.className = 'FormLabel';
        }
    }

    if (!valid) {
        document.getElementById(this.ErrorInfo).className = 'ErrorInfo';

        if ((document.compatMode) && (document.compatMode == 'CSS1Compat') && (document.documentElement)) {
            document.documentElement.scrollTop = 0;
        } else if (document.body) {
            document.body.scrollTop = 0;
        }
        msgs.style.display = 'block';
        this.Invalid = true;
    } else {
        this.Invalid = false;
    }

    return valid;
}

Feedback.prototype.ShowChat = function() {
    this.HideForm();
    if (this.ChatOverlay == null) {
        var divs = document.getElementsByTagName('div');
        for (i = 0; i < divs.length; i++) {
            if (divs[i].className == 'ChatOverlayHidden' || divs[i].className == 'ChatOverlay') {
                this.ChatOverlay = divs[i];
                i = divs.length;
            }
        }
    }
    if (this.ChatOverlay != null) {
        this.ChatOverlay.className = 'ChatOverlay';
    }
    if(this.Invalid)
        document.getElementById(this.ErrorInfo).className = 'ErrorInfoHidden';
}

Feedback.prototype.HideForm = function() {
    if (this.FormDisplayed) {
        for (i = 0; i < this.hidden.length; i++) {
            this.hidden[i].className = this.hidden[i].className += 'Hidden';
        }
        this.bottom.className = 'ContainerBottomFirst';
        document.getElementById(this.SubmitId).className = 'SubmitButtonHidden';
        this.FormDisplayed = false;
    }
}

Feedback.prototype.ShowForm = function() {
    if (!this.FormDisplayed) {
        this.FormDisplayed = true;
        this.CloseChat();
        var divs = document.getElementsByTagName('div');
        if (this.bottom == null) {
            for (i = 0; i < divs.length; i++) {
                if (divs[i].className == 'ContainerHidden' || divs[i].className == 'FormStepHidden') {
                    this.hidden[this.hidden.length] = divs[i];
                }
                if (divs[i].className == 'ContainerBottomFirst') {
                    this.bottom = divs[i];
                }
            }
        }

        for (i = 0; i < this.hidden.length; i++) {
            if (this.hidden[i].className.indexOf('Hidden') > 0)
                this.hidden[i].className = this.hidden[i].className.substring(0, this.hidden[i].className.indexOf('Hidden'));
        }

        if (this.bottom != null) {
            this.bottom.className = 'ContainerBottom';
        }

        document.getElementById(this.SubmitId).className = 'SubmitButton';
    }
}

Feedback.prototype.OnLoad = function() {
    var objs = document.getElementsByTagName('input');
    var first = true;
    for (i = 0; i < objs.length; i++) {
        if (objs[i].id.indexOf(this.InitialQuestion) > -1) {
            var labels = document.getElementsByTagName('label');
            var label;
            for (j = 0; j < labels.length; j++) {
                if (labels[j].htmlFor == objs[i].id) {
                    label = labels[j];
                    j = labels.length;
                }
            }

            objs[i].setAttribute('Feedback', this.Id);
            label.setAttribute('Feedback', this.Id);

            if (first) {
                objs[i].onmouseup = function() {
                    eval(this.getAttribute('Feedback') + '.ShowForm()');
                    return true;
                }
                label.onmouseup = function() {
                    eval(this.getAttribute('Feedback') + '.ShowForm()');
                    return true;
                }
                first = false;
            } else {
                objs[i].onmouseup = function() {
                    eval(this.getAttribute('Feedback') + '.ShowChat()');
                    return true;
                }
                label.onmouseup = function() {
                    eval(this.getAttribute('Feedback') + '.ShowChat()');
                    return true;
                }
            }
        }
    }
    if (this.PhoneValidation.length > 0) {

    }
}

function NumericOnly(evt, obj) {
    var charCode = (evt.which ? evt.which : event.keyCode);

    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;

    return true;
}

function CheckValue(obj) {
    if (obj.value.length == obj.maxLength)
        obj.select();
}

function _() { }

// Checks for the validity of the Email Address
function checkEmail(emailFld) {

    var email = emailFld.value;

    // The following variable tells the rest of the function whether or not
    // to verify that the address ends in a two-letter country or well-known
    // TLD.  1 means check it, 0 means don't.
    var checkTLD = 1;
    var knownDomsPat = /^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
    var emailPat = /^(.+)@(.+)$/;

    //	Prohibit: `~!#$%^&*()=+{}[]|\'?		Only allow alphanumerics, dash, 
    // underscore, @, and periods.
    var specialChars = "\\(\\) `~!#$%^&\*\+=\|\/\}'\? ><@,;:\\\\\\\"\\.\\[\\]";
    var validChars = "\[^\\s" + specialChars + "\]";

    // The following pattern applies if the "user" is a quoted string (in
    // which case, there are no rules about which characters are allowed
    // and which aren't; anything goes).  E.g. "jiminy cricket"@disney.com
    // is a legal e-mail address.
    var quotedUser = "(\"[^\"]*\")";

    // The following pattern applies for domains that are IP addresses,
    // rather than symbolic names.  E.g. joe@[123.124.233.4] is a legal
    // e-mail address. NOTE: The square brackets are required.
    var ipDomainPat = /^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;

    var atom = validChars + '+';
    var word = "(" + atom + "|" + quotedUser + ")";
    var userPat = new RegExp("^" + word + "(\\." + word + ")*$");

    // The following pattern describes the structure of a normal symbolic
    // domain, as opposed to ipDomainPat, shown above.
    var domainPat = new RegExp("^" + atom + "(\\." + atom + ")*$");

    var matchArray = email.match(emailPat);
    if (matchArray == null) {
        return false;
    }

    var user = matchArray[1];
    var domain = matchArray[2];

    // Start by checking that only basic ASCII characters are in the strings (0-127).
    for (i = 0; i < user.length; i++) {
        if (user.charCodeAt(i) > 127) {
            return false;
        }
    }

    // Check domain
    for (i = 0; i < domain.length; i++) {
        if (domain.charCodeAt(i) > 127) {
            return false;
        }
    }

    // Check user
    if (user.match(userPat) == null) {
        return false;
    }

    // If the e-mail address is at an IP address (as opposed to a symbolic
    // host name) make sure the IP address is valid.
    var IPArray = domain.match(ipDomainPat);
    if (IPArray != null) {
        for (var i = 1; i <= 4; i++) {
            if (IPArray[i] > 255) {
                return false;
            }
        }
        return true;
    }

    // Domain is symbolic name.  Check if it's valid.
    var atomPat = new RegExp("^" + atom + "$");
    var domArr = domain.split(".");
    var len = domArr.length;
    for (i = 0; i < len; i++) {
        if (domArr[i].search(atomPat) == -1) {
            return false;
        }
    }

    // domain name seems valid, but now make sure that it ends in a
    // known top-level domain (like com, edu, gov) or a two-letter word,
    // representing country (uk, nl).
    if (checkTLD && domArr[domArr.length - 1].length != 2 &&
		domArr[domArr.length - 1].search(knownDomsPat).ignoreCase == -1) {
        return false;
    }

    // Make sure there's a host name preceding the domain.
    if (len < 2) {
        return false;
    }

    // Email Address is a valid one
    return true;
}

//// Tabs to the next phone field while entering
//// the phone number
function TabNext(obj, event, len, next_field) {
    var next_field_id = document.getElementById(next_field);
    var phone_field_length = 0;
    if (event == "down") {
        phone_field_length = obj.value.length;
    }
    else if (event == "up") {
        if (obj.value.length != phone_field_length) {
            phone_field_length = obj.value.length;
            if (phone_field_length == len) {
                next_field_id.focus();
            }
        }
    }
}

