

/***************************************
   =Simple jQuery Validation Plugin
************************************** */

;(function($) { 

$.fn.tinyvalidate = function(options) {
  var errCount = 0, timer, currentFieldset = null; 

  var corerules = {
    required:     {
                    ruleClass: 'required',
                    rule: function(r) {
                      return (/\S+/).test(r);
                    },
                    text: '',
                    check: 'value'
                  },
    email:        {
                    ruleClass: 'email',
                    rule: function(r) {
                      return (/^\S+[@]\w+(\.[a-zA-Z0-9]{2,4}){1,4}/).test(r) || r == '';
                    },
                    text: '',
                    check: 'value'
                  },
    requiredzip:  {
                    ruleClass: 'zip',
                    rule: function(r) {
                     return (/^\d{5}(-\d{4})?$/).test(r);
                    },
                    text: '&laquo; incorrect ZIP code',
                    check: 'value'
                  }
  };
  var rules = $.extend({},corerules, $.tinyvalidate.morerules || {});

  return this.each(function() {
    
    var errCount = 0, 
      errMsg = '',
      $form = $(this);
    
    
    var opts = $.extend({}, $.fn.tinyvalidate.defaults, options || {}, $.metadata ? $form.metadata() : $.meta ? $form.data() : {});
    
    function validate(evt) {
      errMsg = '';
      errCount = 0;
      $.each(rules, function(rulename, val) {

        $('.' + val.ruleClass, $form)[evt != 'submit' ? evt : 'each'](function() {
          var $field = $(this);

          var $errElement = (/(radio|checkbox)/).test(rulename) ? $field : $field.parents('div:first');

          $errElement.removeClass(opts.errorClass).find(opts.noticeElement + '.' + opts.noticeClass).remove();
          var arg = val.check == 'element' ? $field : $field.val();
          if (!val.rule(arg) && $field.is(':visible')) {
            errCount++;
            var postype = opts.positionType;
            if (opts.positionElement.join().match('inline')) {

              if ( (/(input|select|textarea)/i).test(this.nodeName) ) {
                if (postype == 'append') {
                  postype = 'after';
                } else if (postype == 'prepend') {
                  postype = 'before';
                }
              }
              $(this)[postype]('<' + opts.noticeElement + ' class="' + opts.noticeClass + '">' + val.text + '</' + opts.noticeElement + '>');
              $errElement.addClass(opts.errorClass);
            } 
            if (opts.submitDetails === true) {
              var detailText = $field.is('fieldset') ? $field.children(':first').text() : $field.prev().text().replace(/\*$/,'');
              errMsg += '<' + opts.noticeElement + ' class="' + opts.noticeClass + '">' + detailText + ' ' + val.text + '</' + opts.noticeElement + '>';            
            }
          }       
        });
    
      });
    }
  
    if (opts.primaryEvent == 'submit') {

      $form.bind('submit', function() {

        validate(opts.primaryEvent);
        insertMessage();
        if (errCount) return false;
      });
      
    } else {
      validate(opts.primaryEvent);
    }
    if (opts.secondaryEvent && opts.secondaryEvent == 'submit') {
      $form.bind('submit', function() {
        validate(opts.secondaryEvent);
        insertMessage();        
        if (errCount) return false;
      }); 
    } else if (opts.secondaryEvent) {
      validate(opts.secondaryEvent);
    }

    function insertMessage() {
      if (errCount) {
        $('#submiterror').remove();
        var $errorElement = $(opts.wrapper), 
          pel = opts.positionElement;  
        if (pel[0] == 'inline') pel = pel.slice(1).join();
        if (pel == 'form') pel = $form[0];
        $errorElement.addClass(opts.errorClass).attr('id','submiterror').html(opts.preNotice + errMsg + opts.postNotice);
        $(pel)[opts.positionType]($errorElement);
      }
    }
    
  }); //end return this.each
}; // end $.fn.tinyvalidate

$.tinyvalidate = {};

// validation defaults

$.fn.tinyvalidate.defaults = {
  positionType: 'append', 
  positionElement: ['inline'],
  submitDetails: true,
  wrapper: '<div></div>',
  noticeElement: 'span',
  noticeClass: 'notice',
  preNotice: 'There was an error processing your request. Please correct the above highlighted fields and try again. Thank you.',
  postNotice: '',
  errorClass: 'error',
  primaryEvent: 'blur',
  secondaryEvent: 'submit'
};

$.tinyvalidate.morerules = {
  date:          {
                    ruleClass: 'date',
                    rule: function(r) {
                      // var thisYear = new Date().getFullYear();
                      return (/(0\d|1[0-2])\/([0-2]\d|3[0-1])\/[1-2]\d{3}/).test(r);
                      // && (+r.slice(-4) < +thisYear-10);
                    },
                    text: '&laquo; incorrect date',
                    check: 'value'
                  },
 
  requiredradio:{
                  ruleClass: 'choose-one',
                  rule: function(el) {
                    if (el.constructor == Object) {
                      return el.find(':checked').length;
                    }
                  },
                  text: '',
                  check: 'element'
                },
    cemail:     {
                  ruleClass: 'cemail',
                  rule: function(r) {
                    return $('#res-contact-email').is(':checked') ?   
                      (/^\S+[@]\w+(\.[a-zA-Z0-9]{2,4}){1,4}/).test(r) :
                      true;
                  },
                  text: '',
                  check: 'value'
                },
    cphone:     {
                  ruleClass: 'cphone',
                  rule: function(r) {
                    return $('#res-contact-phone').is(':checked') ? 
                      (/\(?\d{3}\)?[\. -]?\d{3}[\. -]?\d{4}/).test(r) : 
                      true;
                  },
                  text: '',
                  check: 'value'
                }
                  
  
};

 
})(jQuery);

