  new function() {
    $.fn.validate = {
      init: function(o, pattern) {
        /*
        alert( o );
        alert( pattern );
        */
      if(pattern == 'string') { return this.str(o); };
      if(pattern == 'verify') { return this.verify(o); };
      if(pattern == 'email') { return this.email(o); };

      },
      str: function(o) {
        var pattern = /[(\*\+\/\?\:\;\'\"\`\~\\#\$\%\&\<\>)+]/;
        if (!o.value.match(pattern) && (o.value.length >= 2 && o.value != o.name) ) {
          doSuccess(o);
          return true;
        } else {
          doError(o, 'Erroria pukkaa');
          return false;
        };
      },
      verify: function(o) {
        var d = new Date();
        var pattern = d.getFullYear();
        if ( o.value.match(pattern) ) {
          doSuccess(o);
          return true;
        } else {
          doError(o, 'Erroria pukkaa');
          return false;
        };
      },
      pwd1: function(o) {
        var pattern = /[(\*\(\)\[\]\+\.\,\/\?\:\;\'\"\`\~\\#\$\%\^\&\<\>)+]/;
        if (!o.value.match(pass)) {
          doValidate(o);
        } else {
          doError(o,'no special characters allowed');
        };
      },
      agree: function(o) {
        if($("#agree").attr("checked")==true){
          doSuccess(o);
        } else {
          doError(o,'please accept terms');
        };
      },
      email: function(o) {
        var pattern  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
        if (o.value.match(pattern)) {
          doSuccess(o);
        } else {
          doError(o,'Erroria pukkaa');
        };
      }
    };

    function doSuccess(o) {
      $(o).removeClass("error");
      $(o).addClass("success");
    }

    function doError(o, errorMessage) {
      $(o).removeClass("success");
      $(o).addClass("error");
     }

  }

