/*! NV Forms v3 <http://nvinteractive.co.nz>
	Copyright (c) NV Interactive
	
	References:
		jquery-1.3.x.js
		
	Release Notes:
		3.0 rewrote as a jquery plugin
*/


//
// create closure
//
(function($) {

    //
    // plugin definition
    //
    $.fn.nvforms = function(options) {
        debug(this);
        // build main options before element iteration
        var opts = $.extend({}, $.fn.nvforms.defaults, options);

        // iterate and reformat each matched element
        return this.each(function() { $.fn.nvforms.processform(this, opts) });
    };

    //
    // private function for debugging
    //
    function debug($obj) {
        if (window.console && window.console.log)
            window.console.log('nvforms selection count: ' + $obj.size());
    };

    //
    // define and expose our format function
    //
    $.fn.nvforms.processform = function(element, opts) {
        $this = $(element);
        // build element specific options
        var o = $.meta ? $.extend({}, opts, $this.data()) : opts;

        //Add custom css classes to form elements - mostly to distinguish things like <input type=text> from an <input type="radio">
        for (var c in o.cssClasses) {
            $(":" + c, $this).addClass(o.cssClasses[c]);
        }

        //Add focus events to all inputs
        $(":input", $this).focus($.fn.nvforms.focus).blur($.fn.nvforms.blur);

        //Add watermarks if neccessary
        $(":text, :password", $this).each($.fn.nvforms.addWaterMark)

        //select input contents on focus
        $(":text, :password", $this).focus(function() { this.select() });

        //keypress events to submit form
        $(":text, :password", $this).data("form", $this).keypress($.fn.nvforms.keypress);


        //remove watermarks when form submitted
        $(".default", $this).click(function() { $.fn.nvforms.clearwatermark($this) });


        //Disable form buttons when clicked ** TODO ** workaround for not sending the button id
        //$(":button, :submit", $this).click(function() { this.disabled = true});

        //** TODO - shift to validation code
        /* Form errors */
        var showerror = function() {
            var field = $(this).closest(".field, .field-group");
            $(".error-message", field).show(100);
        }

        var hideerror = function() {
            var field = $(this).closest(".field, .field-group");
            $(".error-message", field).hide(100);
        }

        var clearerror = function() {
            var field = $(this).closest(".field, .field-group");
            field.removeClass("field-error");
            $(".error-message, .error-marker", field).remove();
        }

        $(".error", $this)
			.addClass("error-message")
			.append("<span class='pointer'></span>")
			.closest(".field, .field-group")
			.addClass("field-error")
			.find("label").append("<span class='error-marker'>&nbsp;</span>")
			.end()
			.find(".error-marker").hover(showerror, hideerror)
			.end()
			.find(".text, select, textarea").blur(clearerror);

    };


    //
    // Tools
    //
    $.fn.nvforms.addWaterMark = function() {

        if ($("[for=" + this.id + "]").css("display") != "none") return;

        var watermark = $("[for=" + this.id + "]").text();

        //set watermark
        if (this.value == "") this.value = watermark
        $(this).data("watermark", watermark);

        //setup events within closure
        var watermarkfocus = function() {
            var w = $(this).data("watermark");
            if (this.value == w)
                this.value = "";
        }

        var watermarkblur = function() {
            var w = $(this).data("watermark");
            if (this.value == "")
                this.value = w;
        }

        //add events to remove watermark when focused
        $(this).blur(watermarkblur).focus(watermarkfocus);

    }

    //
    // Events
    //

    $.fn.nvforms.focus = function(e) {
        $(this).addClass("focus");
    }

    $.fn.nvforms.blur = function(e) {
        $(this).removeClass("focus");

        //$.fn.nvforms.validateField(this);
    }

    $.fn.nvforms.keypress = function(e) {

        if (e.which != 13) return;

        //var f = $(this).closest(".form");
        var f = $(this).data("form");

        $.fn.nvforms.submit(f);

        $(".default", f).click();

        return false;

    }

    $.fn.nvforms.submit = function(form) {

        $.fn.nvforms.clearwatermark(f);

    }

    $.fn.nvforms.clearwatermark = function(form) {

        //remove watermarks
        $(":text", form).each(
	function() {
	    var w = $(this).data("watermark");
	    if (w == undefined) return;
	    if (this.value == w)
	        this.value = "";
	});
    }

    //
    //Validation ** TODO **
    //
    $.fn.nvforms.validateField = function(e) {

        var input = $(e);
        var field = input.closest(".field");

        var isRequired = field.hasClass("required");

        if (!isRequired) return;

        var inputValTrimmed = input.val().replace(/^\s+|\s+$/ig, "");

        if (inputValTrimmed.length == 0) {
            field.addClass("field-error");
            $("label", field).append($.fn.nvforms.defaults.errorHtml);
        } else {
            field.removeClass("field-error");
        }


    }


    //
    // plugin defaults
    //
    $.fn.nvforms.defaults = {
        debug: false,
        addWatermarks: true,
        cssClasses: {
            text: "text",
            password: "text",
            radio: "radio",
            checkbox: "checkbox",
            button: "button",
            submit: "submit",
            file: "file"
        },
        errorHtml: '<div class="error-marker"><div class="error error-message">{message}<span class="pointer"></span></div></div>',
        errorMessages: {
            required: "This field is required and must be entered."
        }

    };
    //
    // end of closure
    //
})(jQuery);