//::  Uporaba:
//::  * HTML:
//::  * <form id="test-form">
//::        //::  v data-fv-params morajo biti vrednosti nujno znotraj dvojnih narekovajev, drugače ne dela json
//::  * 	<input  type="text"  data-fv-params='{"warningSelector":"nameWarning","valArgs":"req alp"}'/><span data-fv-warning="nameWarning"></span>
//::  * </form>
//::  * 
//::  * JS
//::  * $('form#test-form').skFormValidator({ sProcessURL: 'process.sk.form.validation.php' });
//:: 
//::  * OPOMBE:
//::  * Če ne definiramo posebej, mora password input vedno imeti ime password
//::  * Parametri in ključi v atributu data-fv-params morajo biti vedno v dvojnih narekovajih zaradi jsona!



(function($){
   var FormValidator = function(element, options) {
      var PASS_DELIMITER = '~';
      var oForm = $(element);
      var obj = this;
      var settings = $.extend({
            sProcessURL: '', //::  Mandatory
            iRemoveWarningTimeout: 0,
            sElementsSelector: 'data-fv-params',
            //::  Če ne definiramo posebej, mora password input vedno imeti ime password
            sPasswordSelector: 'password',
            sWarningSelectorAttr: 'data-fv-warning',
            sWarningWrapper: ''
      }, options || {});
      
      
       
      if(oForm) { //::  Preverim, če forma sploh obstaja                    
         oForm.find('['+settings.sElementsSelector+']').focusout(function(){
            //var oInputField = $(this); var sInputColor = oInputField.css('color'); 
            var sInputName = $(this).attr('name');
            var sInputString=$(this).val();
                          
            //::  Parametri in ključi morajo biti vedno v dvojnih narekovajih zarad jsona!
            var sElementMetaData = $(this).attr(settings.sElementsSelector);
            var sElementMetaData = jQuery.parseJSON(sElementMetaData);
            var sValidationArgs = sElementMetaData.valArgs;            
            var sWarningSelector = '['+settings.sWarningSelectorAttr+'='+sElementMetaData.warningSelector+']';
            var oWarningContainer = oForm.find(sWarningSelector);
            
            
            
            if(sValidationArgs.match('passrep')) {
               var sFirstPass = oForm.find('[name='+settings.sPasswordSelector+']').val();
               sInputString = sFirstPass+PASS_DELIMITER+sInputString;
            }
                   
            sPostParams =  'sValidationArgs='+sValidationArgs+'&sInputString='+sInputString+'&sErrorIndex='+sInputName;
            
            //::  Custom parametri za posamezen element
            var sCustomInputArgs = sElementMetaData.customArgs;
            if(sCustomInputArgs) { sPostParams += '&sCustomElementArgs='+sCustomInputArgs; }
            
            //::  Custom atributi za celotno formo
            if(oForm.attr('data-fv-form-params')) { sPostParams += '&sCustomFormArgs='+oForm.attr('data-fv-form-params'); }
            
            $.ajax({
               type: 'post',
               url: settings.sProcessURL,
               dataType: 'json',
               data: sPostParams,
               success: function(aErrors) {
                  if(aErrors['warning']) {
                    //oInputField.after('<span style="color: red;">*</span>');
                    //oInputField.css('color', 'red');
                    var sWarning = aErrors['warning'];
                    
                    //::  Wapper lahko uporabiš za oblikovanje tooltipov al pa da wrapperju nastavlaš odmike itd
                    if(settings.sWarningWrapper) { 
                        var sWarningWrapper = settings.sWarningWrapper.replace('{TARGET}',sWarning);
                        oWarningContainer.html(sWarningWrapper).css('color','red');     
                    }
                    else { oWarningContainer.html(sWarning).css('color','red'); }
                     
                     
                     // Se izvrši se samo, če definiraš število sekund za izbris errorja               
                     if(settings.iRemoveWarningTimeout) { setInterval(function(){ oWarningContainer.html(''); }, settings.iRemoveWarningTimeout); }      
                  } else {oWarningContainer.html(''); }
               }
            });
                    
            return false;
         });
      }
   };

   $.fn.skFormValidator = function(options) {
       return this.each(function() {
           var element = $(this);
                    
           // Return early if this element already has a plugin instance
           if (element.data('skFormValidator')) return;

           // pass options to plugin constructor
           var oFormValidator = new FormValidator(this, options);

           // Store plugin object in this element's data
           element.data('skFormValidator', oFormValidator);
 
       });
   };
})(jQuery);

