//General Javascript Functions
var $ie6 = (jQuery.browser.msie && parseInt(jQuery.browser.version) < 7);
var $wmsurl = "http://www.vexray.com/geoserver/wms";
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);
            });
            $("input._date").blur(function(){
                util.validateDate(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._date").each(function(){
                util.validateDate(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("input._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.errorCode !== 4 && 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 = 4;
            }
            else if(el.errorCode == 4) {
                this.resolveError(el);
            }
        },
        validateTermsOfService: function(){
            var terms = $("input._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.validateMaxLength(el.value,15)) 
            {
                this.resolveError(el);
                this.validateNoSpaces(el);
            }
            else 
            {
                this.generateError(el,"Password must be between 6 and 15 characters");
                el.errorCode = 2;
            }
        },
        
        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(/,/g,"");
            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;
            }
        },
        validateDate: function(el){
            var regex = /^(\d{2})\/(\d{2})\/(\d{4})$/;
            if(el.value.match(regex) || el.value.length == 0){
                this.resolveError(el);
            }
            else {
                this.generateError(el,"Date must be in MM/DD/YYYY format");
                el.errorCode = 2;
            }
        },
        validateMinLength: function(text,len){
            return (text.length >= len || text.length == 0);
        },
        
        validateMaxLength : function(text, len)
        {
            return (text.length <= len);
        },
        
        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 = "#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(){
        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);
