﻿(function($) {
    $.fn.validator = function(customOptions) {

        var options = {

            required: false,
            minChar: 1,
            compareWith: null,
            noticeText: "You need to fill the requirements.",
            containerClass: "errorMessage",
            callBackFunction: function(){return true;},
            noticeMessage: "<span class=\"[[CONTAINER]]\"><span class=\"errorMessageLeft\">" +
                            "</span><span class=\"errorMessageContent\"><p>[[TEXT]]</p></span>" +
                            "<span class=\"errorMessageRight\"></span></span>"

        };
        
        $.extend(options, customOptions);

        return this.each(function(index) {
            
            var obj = {
                    object: $(this),
	                value: $(this).val(),
	                position: $(this).width() + $(this).position().left // Position left to set the container next to the input field.

            };

            function init() {

                if(options.required == true){requiredField();}
                if(options.compareWith != null){compareFields();}
  
            }
            
            function requiredField()
            {
                if(obj.value.length < options.minChar)
                {

                    //alert("none valid " + options.containerClass + " " + obj.width);
                    
                    var tmp = options.noticeMessage.replace(/\[\[TEXT\]\]/, options.noticeText);
                    var tmp2 = tmp.replace(/\[\[CONTAINER\]\]/, options.containerClass);
                    
                    obj.object.removeClass("error").next("." + options.containerClass).remove();
                    obj.object.addClass("error").after(tmp2).next("." + options.containerClass).css("left", obj.position - 5).fadeIn();
                    $("." + options.containerClass).pngFix();

                }
                else
                {

                    //alert("valid " + options.containerClass + " " + obj.width);
                    
                    obj.object.removeClass("error").next("." + options.containerClass).fadeOut().remove();

                }

            };
            
            function compareFields()
            {
                var compareObjValue = $(options.compareWith).val(); // compares width a set class value.
                //var compareObjValue = obj.object.prev("input").val(); //compares with previous input field.
                
                if(obj.value != compareObjValue)
                {
                    
                    //alert("compare passed: (this.object: " + obj.value + " compare.object: " + compareObjValue + ")");
                    
                    var tmp = options.noticeMessage.replace(/\[\[TEXT\]\]/, options.noticeText);
                    var tmp2 = tmp.replace(/\[\[CONTAINER\]\]/, options.containerClass);
                    
                    obj.object.removeClass("error").next("." + options.containerClass).remove();
                    obj.object.addClass("error").after(tmp2).next("." + options.containerClass).css("left", obj.position - 5).fadeIn();
                    $("." + options.containerClass).pngFix();

                }
                else
                {
                    
                    //alert("compare passed: (this.object: " + obj.value + " compare.object: " + compareObjValue + ")");
 
                    obj.object.removeClass("error").next("." + options.containerClass).fadeOut().remove();

                }

            };
            
            init();

        });
    };
})(jQuery);

