/**
*   Плагин jquery.live_input.js 
*   
*   @author Isaev Roman ( romis.bbx@gmail.com )
*   @firma BlackBox ( http://www.blackbox.ru/ )
*   @modufy_date 3.08.10
*   @version 1.1 beta
*   
*/

(function($) { 
    
	// constructor ( jel - JqueryELement )
	function Live_input(jel, ops) 
  {          
      var self = this;
      var change_timer = 0;
      var value = null;
      var message_timer = 0;
      var val_min = null;
      var val_max = null;
      var val_chag = null;
      						
      jel.init = function()
  		{            
          self.set_min(ops.min);
          self.set_max(ops.max);
          self.set_chag(ops.chag);
          
          jel.keydown(function(event){
              clearInterval( change_timer );
              change_timer = setInterval(function()
              {
                  jel.process( jel.val() );
              }, 1000); 
          });
  
  		}
  		  		
      jel.process = function(new_value)
  		{
          new_value = jel.get_val(new_value);
          if ( new_value == null )
          {
              jel.hideMessage('er_min');
              jel.hideMessage('er_max');
              jel.showMessage('Поле ввода должно содержать только цифры , "." и ",".<br />Если у вас возникли вопросы - <a href="#fos" class="fos_open">свяжитесь с нами</a>.', 'er_value');
              new_value = 0;  
          } else {
              jel.hideMessage('er_value');            
          }                               
          
          //if ( (value !== null) && (value != new_value) )
          if (value != new_value) 
          { 
              var change_flag = true;
              
              // min
              if(val_min !== null){
                  if(new_value < val_min){
                      jel.showMessage('Этот размер меньше рекомендованного,<br />минимальный размер - ' + val_min + 'м!<br />Если у вас возникли вопросы - <a href="#fos" class="fos_open">свяжитесь с нами</a>.', 'er_min', function(){
                          jel.val(val_min);
                      });
                      new_value = val_min;
                      change_flag = false;                   
                  } else {
                      jel.hideMessage('er_min');
                  }
              }
              
              // max
              if(val_max !== null){
                  if(new_value > val_max){
                      jel.showMessage('Этот размер больше рекомендованного,<br />максимальный размер - ' + val_max + 'м!<br />Если у вас возникли вопросы - <a href="#fos" class="fos_open">свяжитесь с нами</a>.', 'er_max', function(){
                          jel.val(val_max);
                      });
                      new_value = val_max;
                      change_flag = false;                   
                  } else {
                      jel.hideMessage('er_max');
                  }
              } 
              
              // chag
              if( (val_chag !== null) && (val_min !== null) )
              {
                  //var cel_del = (new_value - val_min) % val_chag;
                  var cel_del = new_value % val_chag;
                  if( cel_del != 0 )
                  {
                      if ( cel_del <  val_chag/2){
                          new_value = new_value - cel_del;
                      } else {
                          new_value = new_value - cel_del + val_chag;
                      }
                      change_flag = false;
                      jel.showMessage('Размер должен быть кратным: ' + val_chag + '!<br />Если у вас возникли вопросы - <a href="#fos" class="fos_open">свяжитесь с нами</a>.', 'er_chag', function(){
                          jel.val(new_value);
                      });
                  } else {
                      jel.hideMessage('er_chag');
                  }
              }              
              
              if ( $.isFunction(ops.onChange) && change_flag ){
                ops.onChange(new_value);
              }  
          }
          value = new_value;        
  		}
  		
      jel.process_stealth = function(new_value)
  		{
          new_value = jel.get_val(new_value);
          if ( new_value == null )
          {
              new_value = 0;  
          }                             
          
          if (value != new_value) 
          { 
              // min
              if(val_min !== null){
                  if(new_value < val_min){
                      new_value = val_min;                  
                  }
              }
              
              // max
              if(val_max !== null){
                  if(new_value > val_max){
                      new_value = val_max;                  
                  }
              } 
              
              // chag
              if( (val_chag !== null) && (val_min !== null) )
              {
                  //var cel_del = (new_value - val_min) % val_chag;
                  var cel_del = new_value % val_chag;
                  if( cel_del != 0 )
                  {
                      if ( cel_del <  val_chag/2){
                          new_value = new_value - cel_del;
                      } else {
                          new_value = new_value - cel_del + val_chag;
                      }
                  }
              }              
              
              jel.val(new_value);
              /*if ( $.isFunction(ops.onChange) ){
                ops.onChange(new_value);
              }*/  
          }
          value = new_value;
          return value;        
  		}
  		
  		jel.showMessage = function(message, er_class, onHide)
  		{
          if ( ops.messageBox != '' ){
              if ( $(ops.messageBox).is(':hidden') )
              {
                  $(ops.messageBox)
                    .data('er_class', er_class)
                    .html(message)
                    .fadeIn(500);
                    
                  if ( $.isFunction(ops.onShowMessage) ){
                    ops.onShowMessage();
                  } 
                    
                  message_timer = setTimeout(function()
                  {
                      $(ops.messageBox)
                        .fadeOut(500)
                        .data('er_class', '');
                      if ( $.isFunction(onHide) ){
                        onHide();
                      }
                      if ( $.isFunction(ops.onChange) ){
                        ops.onChange(value);
                      } 
                  }, ops.messageTimeout); 
              } 
          }       
      }
      
  		jel.hideMessage = function(er_class)
  		{
          if ( ops.messageBox != '' ){
              if ( $(ops.messageBox).data('er_class') == er_class ){
                  clearTimeout(message_timer);
                  $(ops.messageBox).fadeOut(500);
              } 
          }       
      }
      
  		jel.get_val = function(val)
  		{
          if (val !== null){
              if( typeof(val) == 'string' ){
                  if (val.length != 0){
                      val = val.replace(/,/g, ".");
                      val = (isNaN(val)) ? null : parseFloat(val);
                  }else{
                      val = null;
                  } 
              }
          }
          return val;                 
      }
      
  		// methods
  		$.extend(this, {
  		
    			getOptions: function() {
            return ops;	
    			},
          
          setVal: function(val) {
            jel.val(val);
          },
          
          setVal_stealth: function(val) {
            return jel.process_stealth(val);
          },
          
          set_min: function(val)
      		{ 
              val_min = jel.get_val(val);  		
      		},
      		
          set_max: function(val)
      		{ 
              val_max = jel.get_val(val); 		
      		},
         
          set_chag: function(val)
      		{ 
              val_chag = jel.get_val(val); 		
      		},
          
          change: function()
      		{ 
              value = null;
              jel.keydown();	
      		}                   
                                        
  		}); 
		
  		jel.init(); 
						          		
	}

  // jQuery plugin implementation
  $.fn.live_input = function(ops)
  {  
  		var el = this.eq(0).data('live_input');
  		if (el) { return el; }
      
      // default settings
      var ops = $.extend({
          min: null,
          max: null,
          chag: null,
          onChange: null, // function(val){  }
          onShowMessage: null, // function(){  }
          messageBox: '',
          messageTimeout: 5000
      },ops);
          
  		this.each(function() {			
  			el = new Live_input($(this), ops);
  			$(this).data('live_input', el);	
  		});
  		
  		return this;    
  };

})(jQuery);



