//General Javascript Functions
var $ie6 = (jQuery.browser.msie && parseInt(jQuery.browser.version) < 7);
var util;
(function($){
    util = {
        inputShowHide: function(el,text) {
            if(!el.$defaultValue) {
                el.$defaultValue = text || el.value;
                if(el.value === "") {
                    el.value = el.$defaultValue;
                    $(el).css({fontStyle: "italic", color: "#999"})
                }
            }
            $(el).blur(function(){
                if(this.value === ""){
                    this.value = el.$defaultValue;
                    $(this).css({fontStyle: "italic", color: "#999"})
                }
            }).focus(function(){
                if(this.value === el.$defaultValue){
                    this.value = "";
                    $(this).css({fontStyle: "", color: ""})
                }
            });
        },
        autoTab: function(el) {
            if(el.value.length >= el.maxLength)
                $(el).next().focus();
        },
        //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)});
        },
        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("span");
            error.className = "formError";
			error.style.color = "red";
            error.innerHTML = text;
            el.style.border = "#FF3D3D 2px solid";
            el.style.color = "#FF3D3D";
            $(el).parent().append(error);
            el.errorElem = error;
            $(el).siblings("input, select").each(function(){
                this.style.border = "#FF3D3D 2px solid";
                this.style.color = "#FF3D3D";
            });
        },
        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 1px solid" : "";
                el.style.color = "";
                $(el).siblings("input").each(function(){
                    this.style.border = ($.browser.msie) ? "#ccc 1px solid" : "";
                    this.style.color = "";
                });
            }
        }
    }
    // allow <a> default functionality when wrapping buttons in msie 6-7
    $(function(){
		$('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);