
function Frm( el ){
  var self = this;
  self.init( el );
}
Frm.prototype = {
  init: function( el ) {
    var self = this;
        self.$el = el;
    this.addRequired();
    this.attachFrmHandler();
    self.$el.find(':text:first').focus();
  },
  addRequired: function() {
    $j('form .group h2.required').each(function(){
      $j(this).append('<span class="required">&nbsp;*</span>');
    });
  },
  attachFrmHandler: function(){
    var self = this;
    self.$el.submit(function(){
      //if($j('#email').length > 0) { console.log(checkEmail( $j('#email').val())) };
      return self.validateFrm();
    });
    self.$el.find(':input[required="yes"],:checkbox[required="yes"]').bind('blur', function(){
      if($j(this).val() != ''||$j(this).val() != 0||this.checked){
        $j(this).removeClass('failed');
        $j(this).parent().removeClass('failed');
      }
    });
  },
  validateFrm: function(){
    var self = this;
    var proceed = true;
    var frm = self.$el;
    
    // text fields
    frm.find(':text[required="yes"],:password[required="yes"]').each(function(){
      if($j(this).val() == ''){
        $j(this).addClass('failed');
        proceed = false;
      } else {
        var tvalidates = true;
        if( $j(this).attr('validate') != undefined ){
          var t = $j(this).attr('validate');
          var v = $j(this).val();
          tvalidates = self.validateType( t,v );
        }
        if( tvalidates ){
          $j(this).removeClass('failed');
        } else {
          $j(this).addClass('failed');
          proceed = false;
        }
      }
    });
    
    // select lists
    frm.find('select[required="yes"]').each(function(){
      if($j(this).val() == ''||$j(this).val() == 0){
        $j(this).addClass('failed');
        proceed = false;
      } else {
        $j(this).removeClass('failed');
      }
    });
    
    // radio options
    frm.find('.radio-wrapper').each(function(){
      var pass = false;
      $j(this).find('input[type="radio"]').each(function(){
        if(this.checked == true){
          pass = true;
        }
      });
      if(!pass){
        $j(this).addClass('failed');
        proceed = false;
      } else {
        $j(this).removeClass('failed');
      }
    });

    // checkboxes
    frm.find(':checkbox[required="yes"]').each(function(){
      if(this.checked == false){
        $j(this).parent().addClass('failed');
        proceed = false;
      } else {
        $j(this).parent().removeClass('failed');
      }
    });
    
    if(!proceed){
      alrt('You must properly fill out the fields highlighted below in order to continue.');
      self.validationMsging();
    }
    return proceed;
  },
  validateType: function( t,v ){
    var proceed = true;
    switch( t )
    {
      case 'zip':
        var regx = /^\d{5}([\-]\d{4})?$/;
        proceed = (regx.test(v));
        break;   
      case 'email':
        var regx = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
        proceed = (regx.test(v));
        break;   
      case 'phone':
        var regx = /^\(?\d{3}(\)|\.|-|\s)?\d{3}(-|\.|\s)?\d{4}/;
        proceed = (regx.test(v));
        break;  
      case 'float':
        var regx = /^\d*(\.)?(\d){0,2}$/;
        proceed = (regx.test(v));
        break;
      case 'uint':
        var regx = /^\d+$/;
        proceed = (regx.test(v));
        break; 
      case 'currency':
        var regx = /^[$]?[\d]+([\.]?[\d]{1,2}|)$/;
        // if the regex matches we should format the input to match our currency
        if( regx.test(v) ){
          var nval = v.replace('$','');
          if( v.match('.') ) nval = nval.split('.')[0];
          $input.val( nval );
        }
        proceed = (regx.test(v));
        break;
      case 'ccnum':
        var regx = /^[X]{4,}[\d]{4}$/;
        if( regx.test(v) ){
          // skip ccnum validation if the user has XXXXXXXXXXXX1234 in the field.
          proceed = true;
        } else {
          proceed = self.validateCCNum( v );
        }
        break;
      case 'address':
        var regx = /^[A-Za-z\d.\s_-]+$/;
        proceed = (regx.test(v));
        break;
      default:
        
    }
    return proceed;
  },
  validationMsging: function(){
    var self = this;
    var frm = self.$el;
    frm.find(':input.failed').each( function(){
      $j(this).attr('title', $j(this).attr('message') );
      $j(this).tooltip({
      	track: true,
      	delay: 0,
      	showURL: false,
      	showBody: " - ",
        extraClass: "failed",
      	fade: 250
      });
    });
  }
}