/*! 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() { 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
    //
    processform = function(element, opts) {
        $this = $(element);
        // build element specific options
        var o = $.metadata ? $.extend({}, opts, $this.metadata()) : 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(fc).blur(bl);

        //Add watermarks if neccessary
        $(":text, :password, textarea", $this).each(function(){ addWaterMark(this, o) })

        //select input contents on focus
        $(":text, :password", $this).focus(function() { this.select() });

        //keypress events to submit form
        $(":text, :password", $this).data("form", $this).keypress(keypress);


        //remove watermarks when form submitted
        $(".default", $this).data("form", $this).click( submitForm );


        //Disable form buttons when clicked ** TODO ** workaround for not sending the button id
        //$(":button, :submit", $this).click(function() { this.disabled = true});

       
        var clearerror = function() {
            var field = $(this).closest(".field, .field-group");
            field.removeClass("field-error");
            $(".error-message", field).remove();
        }

        $(".error", $this)
			.removeClass("error").addClass("error-message")
			.closest(".field, .field-group").addClass("field-error")
			.find(":input")
			.bind("blur", clearerror);
	};


    //
    // Tools
    //
    addWaterMark = function(e, o) {
		
		$e = $(e);
		
		
		//first try to get hidden label
		var watermark = $("[for=" + e.id + "]").css("display") == "none" && o.addWatermarksForHiddenLabels ? $("[for=" + e.id + "]").text() : "";
		
		var watermark = $e.metadata().watermark || watermark;
		
		//then check against metadata (i.e. class="{watermark: 'watermark value'}")
		if($e.closest(".field").length > 0){
			watermark = $e.closest(".field").metadata().watermark || watermark;
		}
		
        //set watermark
        if ($e.val() == "" || $e.val() == watermark) $e.addClass("watermark").val(watermark);
        $e.data("watermark", watermark);

        //setup events within closure
        var watermarkfocus = function() {
			$this = $(this);
            var w = $this.data("watermark");
            if ($this.val() == w)$this.removeClass("watermark").val("");
        }

        var watermarkblur = function() {
			$this = $(this);
            var w = $this.data("watermark");
            if ($this.val() == "")$this.addClass("watermark").val(w);
        }

        //add events to remove watermark when focused
        $e.blur(watermarkblur).focus(watermarkfocus);

    }

    //
    // Events
    //

    fc = function(e) {
        $(this).addClass("focus").closest(".field-group").addClass("focus");
    }

    bl = function(e) {
        $(this).removeClass("focus").closest(".field-group").removeClass("focus");

        //$.fn.nvforms.validateField(this);
    }

    keypress = function(e) {

        if (e.which != 13) return;
        return submitForm( e );
		
    }

    submitForm = function(e) {

		var t = e.target;

		var f = $(t).data("form");
        clearwatermark(f);

		//target is a input[type=button]
		//we do nothing for now, just let the click happen...
		if( t.tagName.toLowerCase() == "input" && t.type.toLowerCase() == "button" )return;
			
		//target is an href
		//we bundle the fields into a querystring and set the window.location
		if( t.tagName.toLowerCase() == "a"){
			window.location = createQuery( $(t), f);
			return false;
		}
		
		var d = $(".default", f);
		if(d.attr("href") != undefined){
			window.location = createQuery( d, f);
			return false;
		}

		return true;

    }
	
	createQuery = function(a, f) {
		var query = a.attr("href") + "?";
		$(":input", f).each( function(index){
			query += index != 0 ? "&" : "";
			query += $(this).attr("name") + "=" + encodeURI( $(this).val() );
			});
		
		return query;
	}

    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 **
    //
    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,
        addWatermarksForHiddenLabels: 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);
