text: function Demo(config){
    this.config = config;
    this.config.development = config.development || false;
  
    this.paymentForm = $('#' + config.formID);
    this.inputs = $('input[type=text], input[type=email], input[type=tel]');
    this.button = this.paymentForm.find('.button');
  
    this.states = {
      'show' : 'active',
      'wait' : 'loading'
    };
    this.focusClass = "has-focus";
    this.valueClass = "has-value";
  
    this.initialize();
  }
  
  
  Demo.prototype.initialize = function(){
    var self = this;
  
    this.events();
    this.inputs.each(function(index, element){
      self.labelHander($(element));
    });
    this.notify('error');
  };
  
  
  Demo.prototype.events = function(){
    var self = this;
  
    this.inputs.on('focus', function(){
        $(this).closest('label').addClass(self.focusClass);
        self.labelHander($(this));
      }).on('keydown', function(){
        self.labelHander($(this));
      }).on('blur', function(){
        $(this).closest('label').removeClass(self.focusClass);
        self.labelHander($(this));
    });
  };
  
  
  Demo.prototype.labelHander = function(element){
    var self = this;
    var input = element;
    var label = input.closest('label');
  
    window.setTimeout(function(){
      var hasValue = (input.val().length > 0) ? true : false ;
  
      if (hasValue) {
        label.addClass(self.valueClass);
      } else {
        label.removeClass(self.valueClass);
      }
    }, 10);
  };
  
  
  Demo.prototype.notify = function(status){
    var self = this;
    var notice = $('.notice-' + status );
    var delay = (this.config.development === true) ? 18000 : 14000;
  
    notice.show()
  
    window.setTimeout(function(){
      notice.addClass('show');
      self.button.removeClass(self.states.wait);
  
      window.setTimeout(function(){
        notice.removeClass('show');
        window.setTimeout(function(){
          notice.hide();
        }, 4000);
      }, delay);
    }, 10);
  };
  