//General Javascript Functions
var ie6 = (jQuery.browser.msie && parseInt(jQuery.browser.version) < 7);
var util;
(function($){
    util = {
        autoTab: function(el,key) {
            if(key !== 9 && key !== 16){
                if(el.value.length >= el.maxLength)
                    $(el).next().focus();
            }
        },
        dateFormat: function(el,key) {
            if(key > 31 && (key < 48 || key > 57) && key !== 191 && key !== 8){
                el.value = el.value.substr(0,el.value.length-1);
            }
            else if(key !== 8) {
                if(el.value.match(/^\d{2}$/)) el.value += "/";
                else if(el.value.match(/^\d{2}\/\d{2}$/)) el.value += "/";
                else if(el.value.match(/^\d\/$/)) el.value = "0" + el.value;
                else if(el.value.match(/^\d{2}\/\d{1}\/$/)) el.value = el.value.substr(0,3)+"0"+el.value.substr(3,4);
                else if(el.value.match(/\/\//g)) el.value = el.value.substr(0,el.value.length-1);
            }
        },
        timeFormat: function(el,key) {
            if(key > 31 && (key < 48 || key > 57) && key !== 59 && key !== 8 && key !== 16){
                el.value = el.value.substr(0,el.value.length-1);
            }
            else if(key !== 8) {
                if(el.value.match(/^\d{2}$/)) el.value += ":";
                else if(el.value.match(/^\d\:$/)) el.value = "0" + el.value;
                else if(el.value.match(/\:\:/g)) el.value = el.value.substr(0,el.value.length-1);
            }
        },
        //Form Validation Javascript
        setupValidateEvents: function() {
            $("input._email").blur(function(){
                util.validateEmail(this);
            });
            $("input._no_spaces").blur(function(){
                util.validateNoSpaces(this);
            });
            $("input._password").blur(function(){
                util.validatePassword(this);
            });
            $("input._password_verify").blur(function(){
                util.validateVerifyPassword(this);
            });
            $("input._numeric_only").blur(function(){
                util.validateNumericOnly(this);
            });
            $("input._integer_only").blur(function(){
                util.validateNumericOnly(this,true);
            });
            $("input._floating_only").blur(function(){
                util.validateNumericOnly(this,false,true);
            });
            $("input._not_greater").blur(function(){
                util.validateNotGreater(this);
            });
            $("input._required, select._required, textarea._required").blur(function(){
                if(this.errorCode) util.validateRequiredFields(this);
            });
            $("form").submit(function(e){
                util.formValidateSubmit(e, this)
            });
            $("input._autotab").keyup(function(e){
                util.autoTab(e.target, e.keyCode);
            });
            $("input._date").keyup(function(e){
                util.dateFormat(e.target, e.keyCode);
            }).blur(function(e){
                if(this.value.match(/^\d{2}\/\d{2}\/\d{2}$/)){
                    this.value = this.value.substr(0,6)+"20"+this.value.substr(6,8);
                }
            });
            $("input._time").keyup(function(e){
                util.timeFormat(e.target, e.keyCode);
            }).blur(function(e){
                if(this.value.match(/^\d{2}\:?$/)){
                    this.value = this.value.match(/\:/g) ? this.value.substr(0,3)+"00" : this.value.substr(0,2)+":00";
                }
            });
        },
        formValidateSubmit: function(e, el){
            this.validateAll(el);
            var errorsExist = ($(el).find(".formError").get(0)) ? true : false;
            if(errorsExist){
                alert("Your form has errors, please fix these before you continue");
                e.preventDefault();
            }
        },
        validateAll: function(el){
            if($(el).find("input._email").get(0)) this.validateEmail($("._email").get(0));
            if($(el).find("input._password").get(0)) this.validatePassword($("._password").get(0));
            if($(el).find("input._password_verify").get(0)) this.validateVerifyPassword($("._password_verify").get(0));
            $(el).find("input._numeric_only").each(function(){
                util.validateNumericOnly(this);
            });
            $(el).find("input._integer_only").each(function(){
                util.validateNumericOnly(this,true);
            });
            $(el).find("input._floating_only").each(function(){
                util.validateNumericOnly(this,false,true);
            });
            
            if($(el).find("textarea._termsOfService").get(0)) this.validateTermsOfService($("._termsOfService").get(0));
            $(el).find("input._not_greater").each(function(){
                util.validateNotGreater(this)
            });
            $(el).find("input._no_spaces").each(function(){
                util.validateNoSpaces(this);
            });
            this.validateRequiredFields(false, el);
        },
        validateRequiredFields: function(el, parentEl){
            function validate(el){
                if(el.errorCode !== 2 && el.style.display !== "none"){
                    if(el.value != "" && el.value != "0.0" && el.value != "0" && el.value !="MM/DD/YYYY")
                        util.resolveError(el);
                    else
                        util.generateError(el,"This field is required");
                    el.errorCode = 1;
                }
            }
            if(el){
                validate(el);
            }
            else {
                $(parentEl).find("input._required, select._required, textarea._required").each(function(){
                    validate(this);
                });
            }
        },
        validateNoSpaces: function(el){
            if(el.value.match(/ /)){
                this.generateError(el,"This field cannot have spaces");
                el.errorCode = 2;
            }
            else{
                this.resolveError(el);
            }
        },
        validateNotGreater: function(el){
            var c = $("input[alt="+el.alt+"]").not("._not_greater").get(0);
            if(parseFloat(el.value) > parseFloat(c.value)){
                var t = $(c).prevAll("label").text();
                this.generateError(el,"This value cannot be greater than "+t);
                el.errorCode = 2;
            }
            else{
                this.resolveError(el);
            }
        },
        validateTermsOfService: function(){
            var terms = $("textarea._termsOfService").get(0);
            if(terms){
                if(!terms.checked){
                    util.generateError(terms,"You must agree to the Terms and Service");
                    terms.errorCode = 2;
                } else util.resolveError(terms);
            }
        },
        validatePassword: function(el){
            if(this.validateMinLength(el.value,6)) this.resolveError(el);
            else {
                this.generateError(el,"Password must be 6 or more characters");
                el.errorCode = 2;
            }
            this.validateNoSpaces(el);
        },
        validateVerifyPassword: function(el){
            if(el.value === $("input._password").val()) this.resolveError(el);
            else {
                this.generateError(el,"Your passwords do not match");
                el.errorCode = 2;
            }
        },
        validateNumericOnly: function(el, isInteger, isFloating){
            if(el.value.match(",")) el.value = el.value.replace(",","");
            var val = el.value;
            var regex;
            
            if(isFloating) regex = /^[0-9\-\.][0-9]*?[0-9\.]?[0-9]*$/;
            else if(isInteger) regex = /^[1-9][0-9]*$/;
            else regex = /^[0-9]*$/;
            
            if(val.match(regex) || val === "" || val === "0" || val === "0.0"){
                this.resolveError(el);
            }
            else {
                if(isInteger || isFloating) {
                    this.generateError(el,"Please enter a valid number");
                }
                else {
                    this.generateError(el,"This field can only contain numbers");
                }
                el.errorCode = 2;
            }
        },
        validateEmail: function(el){
            var regex = /^.+@.+\..+/;
            if(el.value.match(regex) || el.value.length == 0){
                this.resolveError(el);
            }
            else {
                this.generateError(el,"Not a valid email address");
                el.errorCode = 2;
            }
        },
        validateMinLength: function(text,len){
            return (text.length >= len || text.length == 0);
        },
        generateError: function(el,text){ //generates an error after an input field
            el.errorCode = 2;
            
            var last = $(el).nextAll("input:last, select:last").get(0);
            if(last){
                while(last.style.display === "none"){
                    last = $(last).prev("input, select").get(0);
                }
                el = last;
            }
            if(el.errorElem) $(el.errorElem).remove();
            var error = document.createElement("div");
            error.className = "formError";
            error.innerHTML = text;
            el.style.border = "#FFFF00 2px solid";
            el.style.color = "#FFFF00";
            $(el).parent().append(error);
            el.errorElem = error;
            $(el).siblings("input, select").each(function(){
                this.style.border = "#FFFF00 2px solid";
                this.style.color = "#FFFF00";
            });
        },
        resolveError: function(el){
            el.errorCode = 0; var resolve = true;
            
            $(el).siblings("input, select").each(function(){
                if(this.errorCode && this.errorCode == "2"){
                    resolve = false;
                    return false;
                }
            });
            
            if(resolve){
                var last = $(el).nextAll("input:last, select:last").get(0);
                if(last){
                    while(last.style.display === "none"){
                        last = $(last).prev("input, select").get(0);
                    }
                    el = last;
                }
                if(el.errorElem) $(el.errorElem).remove();
                el.style.border = ($.browser.msie) ? "#ccc 2px solid" : "";
                el.style.color = "";
                $(el).siblings("input").each(function(){
                    this.style.border = ($.browser.msie) ? "#ccc 2px solid" : "";
                    this.style.color = "";
                });
            }
        }
    }
    // allow <a> default functionality when wrapping buttons in msie 6-7
    $(document).ready(function(){
        if($.browser.msie) {
            $('button').click(function(e){
                var a = $(this).parent().get(0);
                if(a && a.href) document.location = a.href;
            });
            $("label.req, p.req, span.req").prepend('<span style="color: red;">*</span>');
        }
    });
})(jQuery);