[ Index ]

PHP Cross Reference of vtigercrm-6.1.0

title

Body

[close]

/libraries/jquery/multiplefileupload/ -> jquery.validate.js (source)

   1  /**

   2   * jQuery Validation Plugin 1.9.0

   3   *

   4   * http://bassistance.de/jquery-plugins/jquery-plugin-validation/

   5   * http://docs.jquery.com/Plugins/Validation

   6   *

   7   * Copyright (c) 2006 - 2011 Jörn Zaefferer

   8   *

   9   * Dual licensed under the MIT and GPL licenses:

  10   *   http://www.opensource.org/licenses/mit-license.php

  11   *   http://www.gnu.org/licenses/gpl.html

  12   */
  13  
  14  (function($) {
  15  
  16  $.extend($.fn, {
  17      // http://docs.jquery.com/Plugins/Validation/validate

  18      validate: function( options ) {
  19  
  20          // if nothing is selected, return nothing; can't chain anyway

  21          if (!this.length) {
  22              options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" );
  23              return;
  24          }
  25  
  26          // check if a validator for this form was already created

  27          var validator = $.data(this[0], 'validator');
  28          if ( validator ) {
  29              return validator;
  30          }
  31  
  32          // Add novalidate tag if HTML5.

  33          this.attr('novalidate', 'novalidate');
  34  
  35          validator = new $.validator( options, this[0] );
  36          $.data(this[0], 'validator', validator);
  37  
  38          if ( validator.settings.onsubmit ) {
  39  
  40              var inputsAndButtons = this.find("input, button");
  41  
  42              // allow suppresing validation by adding a cancel class to the submit button

  43              inputsAndButtons.filter(".cancel").click(function () {
  44                  validator.cancelSubmit = true;
  45              });
  46  
  47              // when a submitHandler is used, capture the submitting button

  48              if (validator.settings.submitHandler) {
  49                  inputsAndButtons.filter(":submit").click(function () {
  50                      validator.submitButton = this;
  51                  });
  52              }
  53  
  54              // validate the form on submit

  55              this.submit( function( event ) {
  56                  if ( validator.settings.debug )
  57                      // prevent form submit to be able to see console output

  58                      event.preventDefault();
  59  
  60  				function handle() {
  61                      if ( validator.settings.submitHandler ) {
  62                          if (validator.submitButton) {
  63                              // insert a hidden input as a replacement for the missing submit button

  64                              var hidden = $("<input type='hidden'/>").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm);
  65                          }
  66                          validator.settings.submitHandler.call( validator, validator.currentForm );
  67                          if (validator.submitButton) {
  68                              // and clean up afterwards; thanks to no-block-scope, hidden can be referenced

  69                              hidden.remove();
  70                          }
  71                          return false;
  72                      }
  73                      return true;
  74                  }
  75  
  76                  // prevent submit for invalid forms or custom submit handlers

  77                  if ( validator.cancelSubmit ) {
  78                      validator.cancelSubmit = false;
  79                      return handle();
  80                  }
  81                  if ( validator.form() ) {
  82                      if ( validator.pendingRequest ) {
  83                          validator.formSubmitted = true;
  84                          return false;
  85                      }
  86                      return handle();
  87                  } else {
  88                      validator.focusInvalid();
  89                      return false;
  90                  }
  91              });
  92          }
  93  
  94          return validator;
  95      },
  96      // http://docs.jquery.com/Plugins/Validation/valid

  97      valid: function() {
  98          if ( $(this[0]).is('form')) {
  99              return this.validate().form();
 100          } else {
 101              var valid = true;
 102              var validator = $(this[0].form).validate();
 103              this.each(function() {
 104                  valid &= validator.element(this);
 105              });
 106              return valid;
 107          }
 108      },
 109      // attributes: space seperated list of attributes to retrieve and remove

 110      removeAttrs: function(attributes) {
 111          var result = {},
 112              $element = this;
 113          $.each(attributes.split(/\s/), function(index, value) {
 114              result[value] = $element.attr(value);
 115              $element.removeAttr(value);
 116          });
 117          return result;
 118      },
 119      // http://docs.jquery.com/Plugins/Validation/rules

 120      rules: function(command, argument) {
 121          var element = this[0];
 122  
 123          if (command) {
 124              var settings = $.data(element.form, 'validator').settings;
 125              var staticRules = settings.rules;
 126              var existingRules = $.validator.staticRules(element);
 127              switch(command) {
 128              case "add":
 129                  $.extend(existingRules, $.validator.normalizeRule(argument));
 130                  staticRules[element.name] = existingRules;
 131                  if (argument.messages)
 132                      settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages );
 133                  break;
 134              case "remove":
 135                  if (!argument) {
 136                      delete staticRules[element.name];
 137                      return existingRules;
 138                  }
 139                  var filtered = {};
 140                  $.each(argument.split(/\s/), function(index, method) {
 141                      filtered[method] = existingRules[method];
 142                      delete existingRules[method];
 143                  });
 144                  return filtered;
 145              }
 146          }
 147  
 148          var data = $.validator.normalizeRules(
 149          $.extend(
 150              {},
 151              $.validator.metadataRules(element),
 152              $.validator.classRules(element),
 153              $.validator.attributeRules(element),
 154              $.validator.staticRules(element)
 155          ), element);
 156  
 157          // make sure required is at front

 158          if (data.required) {
 159              var param = data.required;
 160              delete data.required;
 161              data = $.extend({required: param}, data);
 162          }
 163  
 164          return data;
 165      }
 166  });
 167  
 168  // Custom selectors

 169  $.extend($.expr[":"], {
 170      // http://docs.jquery.com/Plugins/Validation/blank

 171      blank: function(a) {return !$.trim("" + a.value);},
 172      // http://docs.jquery.com/Plugins/Validation/filled

 173      filled: function(a) {return !!$.trim("" + a.value);},
 174      // http://docs.jquery.com/Plugins/Validation/unchecked

 175      unchecked: function(a) {return !a.checked;}
 176  });
 177  
 178  // constructor for validator

 179  $.validator = function( options, form ) {
 180      this.settings = $.extend( true, {}, $.validator.defaults, options );
 181      this.currentForm = form;
 182      this.init();
 183  };
 184  
 185  $.validator.format = function(source, params) {
 186      if ( arguments.length == 1 )
 187          return function() {
 188              var args = $.makeArray(arguments);
 189              args.unshift(source);
 190              return $.validator.format.apply( this, args );
 191          };
 192      if ( arguments.length > 2 && params.constructor != Array  ) {
 193          params = $.makeArray(arguments).slice(1);
 194      }
 195      if ( params.constructor != Array ) {
 196          params = [ params ];
 197      }
 198      $.each(params, function(i, n) {
 199          source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n);
 200      });
 201      return source;
 202  };
 203  
 204  $.extend($.validator, {
 205  
 206      defaults: {
 207          messages: {},
 208          groups: {},
 209          rules: {},
 210          errorClass: "error",
 211          validClass: "valid",
 212          errorElement: "label",
 213          focusInvalid: true,
 214          errorContainer: $( [] ),
 215          errorLabelContainer: $( [] ),
 216          onsubmit: true,
 217          ignore: ":hidden",
 218          ignoreTitle: false,
 219          onfocusin: function(element, event) {
 220              this.lastActive = element;
 221  
 222              // hide error label and remove error class on focus if enabled

 223              if ( this.settings.focusCleanup && !this.blockFocusCleanup ) {
 224                  this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
 225                  this.addWrapper(this.errorsFor(element)).hide();
 226              }
 227          },
 228          onfocusout: function(element, event) {
 229              if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) {
 230                  this.element(element);
 231              }
 232          },
 233          onkeyup: function(element, event) {
 234              if ( element.name in this.submitted || element == this.lastElement ) {
 235                  this.element(element);
 236              }
 237          },
 238          onclick: function(element, event) {
 239              // click on selects, radiobuttons and checkboxes

 240              if ( element.name in this.submitted )
 241                  this.element(element);
 242              // or option elements, check parent select in that case

 243              else if (element.parentNode.name in this.submitted)
 244                  this.element(element.parentNode);
 245          },
 246          highlight: function(element, errorClass, validClass) {
 247              if (element.type === 'radio') {
 248                  this.findByName(element.name).addClass(errorClass).removeClass(validClass);
 249              } else {
 250                  $(element).addClass(errorClass).removeClass(validClass);
 251              }
 252          },
 253          unhighlight: function(element, errorClass, validClass) {
 254              if (element.type === 'radio') {
 255                  this.findByName(element.name).removeClass(errorClass).addClass(validClass);
 256              } else {
 257                  $(element).removeClass(errorClass).addClass(validClass);
 258              }
 259          }
 260      },
 261  
 262      // http://docs.jquery.com/Plugins/Validation/Validator/setDefaults

 263      setDefaults: function(settings) {
 264          $.extend( $.validator.defaults, settings );
 265      },
 266  
 267      messages: {
 268          required: "This field is required.",
 269          remote: "Please fix this field.",
 270          email: "Please enter a valid email address.",
 271          url: "Please enter a valid URL.",
 272          date: "Please enter a valid date.",
 273          dateISO: "Please enter a valid date (ISO).",
 274          number: "Please enter a valid number.",
 275          digits: "Please enter only digits.",
 276          creditcard: "Please enter a valid credit card number.",
 277          equalTo: "Please enter the same value again.",
 278          accept: "Please enter a value with a valid extension.",
 279          maxlength: $.validator.format("Please enter no more than {0} characters."),
 280          minlength: $.validator.format("Please enter at least {0} characters."),
 281          rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."),
 282          range: $.validator.format("Please enter a value between {0} and {1}."),
 283          max: $.validator.format("Please enter a value less than or equal to {0}."),
 284          min: $.validator.format("Please enter a value greater than or equal to {0}.")
 285      },
 286  
 287      autoCreateRanges: false,
 288  
 289      prototype: {
 290  
 291          init: function() {
 292              this.labelContainer = $(this.settings.errorLabelContainer);
 293              this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);
 294              this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer );
 295              this.submitted = {};
 296              this.valueCache = {};
 297              this.pendingRequest = 0;
 298              this.pending = {};
 299              this.invalid = {};
 300              this.reset();
 301  
 302              var groups = (this.groups = {});
 303              $.each(this.settings.groups, function(key, value) {
 304                  $.each(value.split(/\s/), function(index, name) {
 305                      groups[name] = key;
 306                  });
 307              });
 308              var rules = this.settings.rules;
 309              $.each(rules, function(key, value) {
 310                  rules[key] = $.validator.normalizeRule(value);
 311              });
 312  
 313  			function delegate(event) {
 314                  var validator = $.data(this[0].form, "validator"),
 315                      eventType = "on" + event.type.replace(/^validate/, "");
 316                  validator.settings[eventType] && validator.settings[eventType].call(validator, this[0], event);
 317              }
 318              $(this.currentForm)
 319                     .validateDelegate("[type='text'], [type='password'], [type='file'], select, textarea, " +
 320                          "[type='number'], [type='search'] ,[type='tel'], [type='url'], " +
 321                          "[type='email'], [type='datetime'], [type='date'], [type='month'], " +
 322                          "[type='week'], [type='time'], [type='datetime-local'], " +
 323                          "[type='range'], [type='color'] ",
 324                          "focusin focusout keyup", delegate)
 325                  .validateDelegate("[type='radio'], [type='checkbox'], select, option", "click", delegate);
 326  
 327              if (this.settings.invalidHandler)
 328                  $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler);
 329          },
 330  
 331          // http://docs.jquery.com/Plugins/Validation/Validator/form

 332          form: function() {
 333              this.checkForm();
 334              $.extend(this.submitted, this.errorMap);
 335              this.invalid = $.extend({}, this.errorMap);
 336              if (!this.valid())
 337                  $(this.currentForm).triggerHandler("invalid-form", [this]);
 338              this.showErrors();
 339              return this.valid();
 340          },
 341  
 342          checkForm: function() {
 343              this.prepareForm();
 344              for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) {
 345                  this.check( elements[i] );
 346              }
 347              return this.valid();
 348          },
 349  
 350          // http://docs.jquery.com/Plugins/Validation/Validator/element

 351          element: function( element ) {
 352              element = this.validationTargetFor( this.clean( element ) );
 353              this.lastElement = element;
 354              this.prepareElement( element );
 355              this.currentElements = $(element);
 356              var result = this.check( element );
 357              if ( result ) {
 358                  delete this.invalid[element.name];
 359              } else {
 360                  this.invalid[element.name] = true;
 361              }
 362              if ( !this.numberOfInvalids() ) {
 363                  // Hide error containers on last error

 364                  this.toHide = this.toHide.add( this.containers );
 365              }
 366              this.showErrors();
 367              return result;
 368          },
 369  
 370          // http://docs.jquery.com/Plugins/Validation/Validator/showErrors

 371          showErrors: function(errors) {
 372              if(errors) {
 373                  // add items to error list and map

 374                  $.extend( this.errorMap, errors );
 375                  this.errorList = [];
 376                  for ( var name in errors ) {
 377                      this.errorList.push({
 378                          message: errors[name],
 379                          element: this.findByName(name)[0]
 380                      });
 381                  }
 382                  // remove items from success list

 383                  this.successList = $.grep( this.successList, function(element) {
 384                      return !(element.name in errors);
 385                  });
 386              }
 387              this.settings.showErrors
 388                  ? this.settings.showErrors.call( this, this.errorMap, this.errorList )
 389                  : this.defaultShowErrors();
 390          },
 391  
 392          // http://docs.jquery.com/Plugins/Validation/Validator/resetForm

 393          resetForm: function() {
 394              if ( $.fn.resetForm )
 395                  $( this.currentForm ).resetForm();
 396              this.submitted = {};
 397              this.lastElement = null;
 398              this.prepareForm();
 399              this.hideErrors();
 400              this.elements().removeClass( this.settings.errorClass );
 401          },
 402  
 403          numberOfInvalids: function() {
 404              return this.objectLength(this.invalid);
 405          },
 406  
 407          objectLength: function( obj ) {
 408              var count = 0;
 409              for ( var i in obj )
 410                  count++;
 411              return count;
 412          },
 413  
 414          hideErrors: function() {
 415              this.addWrapper( this.toHide ).hide();
 416          },
 417  
 418          valid: function() {
 419              return this.size() == 0;
 420          },
 421  
 422          size: function() {
 423              return this.errorList.length;
 424          },
 425  
 426          focusInvalid: function() {
 427              if( this.settings.focusInvalid ) {
 428                  try {
 429                      $(this.findLastActive() || this.errorList.length && this.errorList[0].element || [])
 430                      .filter(":visible")
 431                      .focus()
 432                      // manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find

 433                      .trigger("focusin");
 434                  } catch(e) {
 435                      // ignore IE throwing errors when focusing hidden elements

 436                  }
 437              }
 438          },
 439  
 440          findLastActive: function() {
 441              var lastActive = this.lastActive;
 442              return lastActive && $.grep(this.errorList, function(n) {
 443                  return n.element.name == lastActive.name;
 444              }).length == 1 && lastActive;
 445          },
 446  
 447          elements: function() {
 448              var validator = this,
 449                  rulesCache = {};
 450  
 451              // select all valid inputs inside the form (no submit or reset buttons)

 452              return $(this.currentForm)
 453              .find("input, select, textarea")
 454              .not(":submit, :reset, :image, [disabled]")
 455              .not( this.settings.ignore )
 456              .filter(function() {
 457                  !this.name && validator.settings.debug && window.console && console.error( "%o has no name assigned", this);
 458  
 459                  // select only the first element for each name, and only those with rules specified

 460                  if ( this.name in rulesCache || !validator.objectLength($(this).rules()) )
 461                      return false;
 462  
 463                  rulesCache[this.name] = true;
 464                  return true;
 465              });
 466          },
 467  
 468          clean: function( selector ) {
 469              return $( selector )[0];
 470          },
 471  
 472          errors: function() {
 473              return $( this.settings.errorElement + "." + this.settings.errorClass, this.errorContext );
 474          },
 475  
 476          reset: function() {
 477              this.successList = [];
 478              this.errorList = [];
 479              this.errorMap = {};
 480              this.toShow = $([]);
 481              this.toHide = $([]);
 482              this.currentElements = $([]);
 483          },
 484  
 485          prepareForm: function() {
 486              this.reset();
 487              this.toHide = this.errors().add( this.containers );
 488          },
 489  
 490          prepareElement: function( element ) {
 491              this.reset();
 492              this.toHide = this.errorsFor(element);
 493          },
 494  
 495          check: function( element ) {
 496              element = this.validationTargetFor( this.clean( element ) );
 497  
 498              var rules = $(element).rules();
 499              var dependencyMismatch = false;
 500              for (var method in rules ) {
 501                  var rule = { method: method, parameters: rules[method] };
 502                  try {
 503                      var result = $.validator.methods[method].call( this, element.value.replace(/\r/g, ""), element, rule.parameters );
 504  
 505                      // if a method indicates that the field is optional and therefore valid,

 506                      // don't mark it as valid when there are no other rules

 507                      if ( result == "dependency-mismatch" ) {
 508                          dependencyMismatch = true;
 509                          continue;
 510                      }
 511                      dependencyMismatch = false;
 512  
 513                      if ( result == "pending" ) {
 514                          this.toHide = this.toHide.not( this.errorsFor(element) );
 515                          return;
 516                      }
 517  
 518                      if( !result ) {
 519                          this.formatAndAdd( element, rule );
 520                          return false;
 521                      }
 522                  } catch(e) {
 523                      this.settings.debug && window.console && console.log("exception occured when checking element " + element.id
 524                           + ", check the '" + rule.method + "' method", e);
 525                      throw e;
 526                  }
 527              }
 528              if (dependencyMismatch)
 529                  return;
 530              if ( this.objectLength(rules) )
 531                  this.successList.push(element);
 532              return true;
 533          },
 534  
 535          // return the custom message for the given element and validation method

 536          // specified in the element's "messages" metadata

 537          customMetaMessage: function(element, method) {
 538              if (!$.metadata)
 539                  return;
 540  
 541              var meta = this.settings.meta
 542                  ? $(element).metadata()[this.settings.meta]
 543                  : $(element).metadata();
 544  
 545              return meta && meta.messages && meta.messages[method];
 546          },
 547  
 548          // return the custom message for the given element name and validation method

 549          customMessage: function( name, method ) {
 550              var m = this.settings.messages[name];
 551              return m && (m.constructor == String
 552                  ? m
 553                  : m[method]);
 554          },
 555  
 556          // return the first defined argument, allowing empty strings

 557          findDefined: function() {
 558              for(var i = 0; i < arguments.length; i++) {
 559                  if (arguments[i] !== undefined)
 560                      return arguments[i];
 561              }
 562              return undefined;
 563          },
 564  
 565          defaultMessage: function( element, method) {
 566              return this.findDefined(
 567                  this.customMessage( element.name, method ),
 568                  this.customMetaMessage( element, method ),
 569                  // title is never undefined, so handle empty string as undefined

 570                  !this.settings.ignoreTitle && element.title || undefined,
 571                  $.validator.messages[method],
 572                  "<strong>Warning: No message defined for " + element.name + "</strong>"
 573              );
 574          },
 575  
 576          formatAndAdd: function( element, rule ) {
 577              var message = this.defaultMessage( element, rule.method ),
 578                  theregex = /\$?\{(\d+)\}/g;
 579              if ( typeof message == "function" ) {
 580                  message = message.call(this, rule.parameters, element);
 581              } else if (theregex.test(message)) {
 582                  message = jQuery.format(message.replace(theregex, '{$1}'), rule.parameters);
 583              }
 584              this.errorList.push({
 585                  message: message,
 586                  element: element
 587              });
 588  
 589              this.errorMap[element.name] = message;
 590              this.submitted[element.name] = message;
 591          },
 592  
 593          addWrapper: function(toToggle) {
 594              if ( this.settings.wrapper )
 595                  toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
 596              return toToggle;
 597          },
 598  
 599          defaultShowErrors: function() {
 600              for ( var i = 0; this.errorList[i]; i++ ) {
 601                  var error = this.errorList[i];
 602                  this.settings.highlight && this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
 603                  this.showLabel( error.element, error.message );
 604              }
 605              if( this.errorList.length ) {
 606                  this.toShow = this.toShow.add( this.containers );
 607              }
 608              if (this.settings.success) {
 609                  for ( var i = 0; this.successList[i]; i++ ) {
 610                      this.showLabel( this.successList[i] );
 611                  }
 612              }
 613              if (this.settings.unhighlight) {
 614                  for ( var i = 0, elements = this.validElements(); elements[i]; i++ ) {
 615                      this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass );
 616                  }
 617              }
 618              this.toHide = this.toHide.not( this.toShow );
 619              this.hideErrors();
 620              this.addWrapper( this.toShow ).show();
 621          },
 622  
 623          validElements: function() {
 624              return this.currentElements.not(this.invalidElements());
 625          },
 626  
 627          invalidElements: function() {
 628              return $(this.errorList).map(function() {
 629                  return this.element;
 630              });
 631          },
 632  
 633          showLabel: function(element, message) {
 634              var label = this.errorsFor( element );
 635              if ( label.length ) {
 636                  // refresh error/success class

 637                  label.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );
 638  
 639                  // check if we have a generated label, replace the message then

 640                  label.attr("generated") && label.html(message);
 641              } else {
 642                  // create label

 643                  label = $("<" + this.settings.errorElement + "/>")
 644                      .attr({"for":  this.idOrName(element), generated: true})
 645                      .addClass(this.settings.errorClass)
 646                      .html(message || "");
 647                  if ( this.settings.wrapper ) {
 648                      // make sure the element is visible, even in IE

 649                      // actually showing the wrapped element is handled elsewhere

 650                      label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent();
 651                  }
 652                  if ( !this.labelContainer.append(label).length )
 653                      this.settings.errorPlacement
 654                          ? this.settings.errorPlacement(label, $(element) )
 655                          : label.insertAfter(element);
 656              }
 657              if ( !message && this.settings.success ) {
 658                  label.text("");
 659                  typeof this.settings.success == "string"
 660                      ? label.addClass( this.settings.success )
 661                      : this.settings.success( label );
 662              }
 663              this.toShow = this.toShow.add(label);
 664          },
 665  
 666          errorsFor: function(element) {
 667              var name = this.idOrName(element);
 668              return this.errors().filter(function() {
 669                  return $(this).attr('for') == name;
 670              });
 671          },
 672  
 673          idOrName: function(element) {
 674              return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name);
 675          },
 676  
 677          validationTargetFor: function(element) {
 678              // if radio/checkbox, validate first element in group instead

 679              if (this.checkable(element)) {
 680                  element = this.findByName( element.name ).not(this.settings.ignore)[0];
 681              }
 682              return element;
 683          },
 684  
 685          checkable: function( element ) {
 686              return /radio|checkbox/i.test(element.type);
 687          },
 688  
 689          findByName: function( name ) {
 690              // select by name and filter by form for performance over form.find("[name=...]")

 691              var form = this.currentForm;
 692              return $(document.getElementsByName(name)).map(function(index, element) {
 693                  return element.form == form && element.name == name && element  || null;
 694              });
 695          },
 696  
 697          getLength: function(value, element) {
 698              switch( element.nodeName.toLowerCase() ) {
 699              case 'select':
 700                  return $("option:selected", element).length;
 701              case 'input':
 702                  if( this.checkable( element) )
 703                      return this.findByName(element.name).filter(':checked').length;
 704              }
 705              return value.length;
 706          },
 707  
 708          depend: function(param, element) {
 709              return this.dependTypes[typeof param]
 710                  ? this.dependTypes[typeof param](param, element)
 711                  : true;
 712          },
 713  
 714          dependTypes: {
 715              "boolean": function(param, element) {
 716                  return param;
 717              },
 718              "string": function(param, element) {
 719                  return !!$(param, element.form).length;
 720              },
 721              "function": function(param, element) {
 722                  return param(element);
 723              }
 724          },
 725  
 726          optional: function(element) {
 727              return !$.validator.methods.required.call(this, $.trim(element.value), element) && "dependency-mismatch";
 728          },
 729  
 730          startRequest: function(element) {
 731              if (!this.pending[element.name]) {
 732                  this.pendingRequest++;
 733                  this.pending[element.name] = true;
 734              }
 735          },
 736  
 737          stopRequest: function(element, valid) {
 738              this.pendingRequest--;
 739              // sometimes synchronization fails, make sure pendingRequest is never < 0

 740              if (this.pendingRequest < 0)
 741                  this.pendingRequest = 0;
 742              delete this.pending[element.name];
 743              if ( valid && this.pendingRequest == 0 && this.formSubmitted && this.form() ) {
 744                  $(this.currentForm).submit();
 745                  this.formSubmitted = false;
 746              } else if (!valid && this.pendingRequest == 0 && this.formSubmitted) {
 747                  $(this.currentForm).triggerHandler("invalid-form", [this]);
 748                  this.formSubmitted = false;
 749              }
 750          },
 751  
 752          previousValue: function(element) {
 753              return $.data(element, "previousValue") || $.data(element, "previousValue", {
 754                  old: null,
 755                  valid: true,
 756                  message: this.defaultMessage( element, "remote" )
 757              });
 758          }
 759  
 760      },
 761  
 762      classRuleSettings: {
 763          required: {required: true},
 764          email: {email: true},
 765          url: {url: true},
 766          date: {date: true},
 767          dateISO: {dateISO: true},
 768          dateDE: {dateDE: true},
 769          number: {number: true},
 770          numberDE: {numberDE: true},
 771          digits: {digits: true},
 772          creditcard: {creditcard: true}
 773      },
 774  
 775      addClassRules: function(className, rules) {
 776          className.constructor == String ?
 777              this.classRuleSettings[className] = rules :
 778              $.extend(this.classRuleSettings, className);
 779      },
 780  
 781      classRules: function(element) {
 782          var rules = {};
 783          var classes = $(element).attr('class');
 784          classes && $.each(classes.split(' '), function() {
 785              if (this in $.validator.classRuleSettings) {
 786                  $.extend(rules, $.validator.classRuleSettings[this]);
 787              }
 788          });
 789          return rules;
 790      },
 791  
 792      attributeRules: function(element) {
 793          var rules = {};
 794          var $element = $(element);
 795  
 796          for (var method in $.validator.methods) {
 797              var value;
 798              // If .prop exists (jQuery >= 1.6), use it to get true/false for required

 799              if (method === 'required' && typeof $.fn.prop === 'function') {
 800                  value = $element.prop(method);
 801              } else {
 802                  value = $element.attr(method);
 803              }
 804              if (value) {
 805                  rules[method] = value;
 806              } else if ($element[0].getAttribute("type") === method) {
 807                  rules[method] = true;
 808              }
 809          }
 810  
 811          // maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs

 812          if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) {
 813              delete rules.maxlength;
 814          }
 815  
 816          return rules;
 817      },
 818  
 819      metadataRules: function(element) {
 820          if (!$.metadata) return {};
 821  
 822          var meta = $.data(element.form, 'validator').settings.meta;
 823          return meta ?
 824              $(element).metadata()[meta] :
 825              $(element).metadata();
 826      },
 827  
 828      staticRules: function(element) {
 829          var rules = {};
 830          var validator = $.data(element.form, 'validator');
 831          if (validator.settings.rules) {
 832              rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {};
 833          }
 834          return rules;
 835      },
 836  
 837      normalizeRules: function(rules, element) {
 838          // handle dependency check

 839          $.each(rules, function(prop, val) {
 840              // ignore rule when param is explicitly false, eg. required:false

 841              if (val === false) {
 842                  delete rules[prop];
 843                  return;
 844              }
 845              if (val.param || val.depends) {
 846                  var keepRule = true;
 847                  switch (typeof val.depends) {
 848                      case "string":
 849                          keepRule = !!$(val.depends, element.form).length;
 850                          break;
 851                      case "function":
 852                          keepRule = val.depends.call(element, element);
 853                          break;
 854                  }
 855                  if (keepRule) {
 856                      rules[prop] = val.param !== undefined ? val.param : true;
 857                  } else {
 858                      delete rules[prop];
 859                  }
 860              }
 861          });
 862  
 863          // evaluate parameters

 864          $.each(rules, function(rule, parameter) {
 865              rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter;
 866          });
 867  
 868          // clean number parameters

 869          $.each(['minlength', 'maxlength', 'min', 'max'], function() {
 870              if (rules[this]) {
 871                  rules[this] = Number(rules[this]);
 872              }
 873          });
 874          $.each(['rangelength', 'range'], function() {
 875              if (rules[this]) {
 876                  rules[this] = [Number(rules[this][0]), Number(rules[this][1])];
 877              }
 878          });
 879  
 880          if ($.validator.autoCreateRanges) {
 881              // auto-create ranges

 882              if (rules.min && rules.max) {
 883                  rules.range = [rules.min, rules.max];
 884                  delete rules.min;
 885                  delete rules.max;
 886              }
 887              if (rules.minlength && rules.maxlength) {
 888                  rules.rangelength = [rules.minlength, rules.maxlength];
 889                  delete rules.minlength;
 890                  delete rules.maxlength;
 891              }
 892          }
 893  
 894          // To support custom messages in metadata ignore rule methods titled "messages"

 895          if (rules.messages) {
 896              delete rules.messages;
 897          }
 898  
 899          return rules;
 900      },
 901  
 902      // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}

 903      normalizeRule: function(data) {
 904          if( typeof data == "string" ) {
 905              var transformed = {};
 906              $.each(data.split(/\s/), function() {
 907                  transformed[this] = true;
 908              });
 909              data = transformed;
 910          }
 911          return data;
 912      },
 913  
 914      // http://docs.jquery.com/Plugins/Validation/Validator/addMethod

 915      addMethod: function(name, method, message) {
 916          $.validator.methods[name] = method;
 917          $.validator.messages[name] = message != undefined ? message : $.validator.messages[name];
 918          if (method.length < 3) {
 919              $.validator.addClassRules(name, $.validator.normalizeRule(name));
 920          }
 921      },
 922  
 923      methods: {
 924  
 925          // http://docs.jquery.com/Plugins/Validation/Methods/required

 926          required: function(value, element, param) {
 927              // check if dependency is met

 928              if ( !this.depend(param, element) )
 929                  return "dependency-mismatch";
 930              switch( element.nodeName.toLowerCase() ) {
 931              case 'select':
 932                  // could be an array for select-multiple or a string, both are fine this way

 933                  var val = $(element).val();
 934                  return val && val.length > 0;
 935              case 'input':
 936                  if ( this.checkable(element) )
 937                      return this.getLength(value, element) > 0;
 938              default:
 939                  return $.trim(value).length > 0;
 940              }
 941          },
 942  
 943          // http://docs.jquery.com/Plugins/Validation/Methods/remote

 944          remote: function(value, element, param) {
 945              if ( this.optional(element) )
 946                  return "dependency-mismatch";
 947  
 948              var previous = this.previousValue(element);
 949              if (!this.settings.messages[element.name] )
 950                  this.settings.messages[element.name] = {};
 951              previous.originalMessage = this.settings.messages[element.name].remote;
 952              this.settings.messages[element.name].remote = previous.message;
 953  
 954              param = typeof param == "string" && {url:param} || param;
 955  
 956              if ( this.pending[element.name] ) {
 957                  return "pending";
 958              }
 959              if ( previous.old === value ) {
 960                  return previous.valid;
 961              }
 962  
 963              previous.old = value;
 964              var validator = this;
 965              this.startRequest(element);
 966              var data = {};
 967              data[element.name] = value;
 968              $.ajax($.extend(true, {
 969                  url: param,
 970                  mode: "abort",
 971                  port: "validate" + element.name,
 972                  dataType: "json",
 973                  data: data,
 974                  success: function(response) {
 975                      validator.settings.messages[element.name].remote = previous.originalMessage;
 976                      var valid = response === true;
 977                      if ( valid ) {
 978                          var submitted = validator.formSubmitted;
 979                          validator.prepareElement(element);
 980                          validator.formSubmitted = submitted;
 981                          validator.successList.push(element);
 982                          validator.showErrors();
 983                      } else {
 984                          var errors = {};
 985                          var message = response || validator.defaultMessage( element, "remote" );
 986                          errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message;
 987                          validator.showErrors(errors);
 988                      }
 989                      previous.valid = valid;
 990                      validator.stopRequest(element, valid);
 991                  }
 992              }, param));
 993              return "pending";
 994          },
 995  
 996          // http://docs.jquery.com/Plugins/Validation/Methods/minlength

 997          minlength: function(value, element, param) {
 998              return this.optional(element) || this.getLength($.trim(value), element) >= param;
 999          },
1000  
1001          // http://docs.jquery.com/Plugins/Validation/Methods/maxlength

1002          maxlength: function(value, element, param) {
1003              return this.optional(element) || this.getLength($.trim(value), element) <= param;
1004          },
1005  
1006          // http://docs.jquery.com/Plugins/Validation/Methods/rangelength

1007          rangelength: function(value, element, param) {
1008              var length = this.getLength($.trim(value), element);
1009              return this.optional(element) || ( length >= param[0] && length <= param[1] );
1010          },
1011  
1012          // http://docs.jquery.com/Plugins/Validation/Methods/min

1013          min: function( value, element, param ) {
1014              return this.optional(element) || value >= param;
1015          },
1016  
1017          // http://docs.jquery.com/Plugins/Validation/Methods/max

1018          max: function( value, element, param ) {
1019              return this.optional(element) || value <= param;
1020          },
1021  
1022          // http://docs.jquery.com/Plugins/Validation/Methods/range

1023          range: function( value, element, param ) {
1024              return this.optional(element) || ( value >= param[0] && value <= param[1] );
1025          },
1026  
1027          // http://docs.jquery.com/Plugins/Validation/Methods/email

1028          email: function(value, element) {
1029              // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/

1030              return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(value);
1031          },
1032  
1033          // http://docs.jquery.com/Plugins/Validation/Methods/url

1034          url: function(value, element) {
1035              // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/

1036              return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
1037          },
1038  
1039          // http://docs.jquery.com/Plugins/Validation/Methods/date

1040          date: function(value, element) {
1041              return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
1042          },
1043  
1044          // http://docs.jquery.com/Plugins/Validation/Methods/dateISO

1045          dateISO: function(value, element) {
1046              return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value);
1047          },
1048  
1049          // http://docs.jquery.com/Plugins/Validation/Methods/number

1050          number: function(value, element) {
1051              return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value);
1052          },
1053  
1054          // http://docs.jquery.com/Plugins/Validation/Methods/digits

1055          digits: function(value, element) {
1056              return this.optional(element) || /^\d+$/.test(value);
1057          },
1058  
1059          // http://docs.jquery.com/Plugins/Validation/Methods/creditcard

1060          // based on http://en.wikipedia.org/wiki/Luhn

1061          creditcard: function(value, element) {
1062              if ( this.optional(element) )
1063                  return "dependency-mismatch";
1064              // accept only spaces, digits and dashes

1065              if (/[^0-9 -]+/.test(value))
1066                  return false;
1067              var nCheck = 0,
1068                  nDigit = 0,
1069                  bEven = false;
1070  
1071              value = value.replace(/\D/g, "");
1072  
1073              for (var n = value.length - 1; n >= 0; n--) {
1074                  var cDigit = value.charAt(n);
1075                  var nDigit = parseInt(cDigit, 10);
1076                  if (bEven) {
1077                      if ((nDigit *= 2) > 9)
1078                          nDigit -= 9;
1079                  }
1080                  nCheck += nDigit;
1081                  bEven = !bEven;
1082              }
1083  
1084              return (nCheck % 10) == 0;
1085          },
1086  
1087          // http://docs.jquery.com/Plugins/Validation/Methods/accept

1088          accept: function(value, element, param) {
1089              param = typeof param == "string" ? param.replace(/,/g, '|') : "png|jpe?g|gif";
1090              return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i"));
1091          },
1092  
1093          // http://docs.jquery.com/Plugins/Validation/Methods/equalTo

1094          equalTo: function(value, element, param) {
1095              // bind to the blur event of the target in order to revalidate whenever the target field is updated

1096              // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead

1097              var target = $(param).unbind(".validate-equalTo").bind("blur.validate-equalTo", function() {
1098                  $(element).valid();
1099              });
1100              return value == target.val();
1101          }
1102  
1103      }
1104  
1105  });
1106  
1107  // deprecated, use $.validator.format instead

1108  $.format = $.validator.format;
1109  
1110  })(jQuery);
1111  
1112  // ajax mode: abort

1113  // usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});

1114  // if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()

1115  ;(function($) {
1116      var pendingRequests = {};
1117      // Use a prefilter if available (1.5+)

1118      if ( $.ajaxPrefilter ) {
1119          $.ajaxPrefilter(function(settings, _, xhr) {
1120              var port = settings.port;
1121              if (settings.mode == "abort") {
1122                  if ( pendingRequests[port] ) {
1123                      pendingRequests[port].abort();
1124                  }
1125                  pendingRequests[port] = xhr;
1126              }
1127          });
1128      } else {
1129          // Proxy ajax

1130          var ajax = $.ajax;
1131          $.ajax = function(settings) {
1132              var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
1133                  port = ( "port" in settings ? settings : $.ajaxSettings ).port;
1134              if (mode == "abort") {
1135                  if ( pendingRequests[port] ) {
1136                      pendingRequests[port].abort();
1137                  }
1138                  return (pendingRequests[port] = ajax.apply(this, arguments));
1139              }
1140              return ajax.apply(this, arguments);
1141          };
1142      }
1143  })(jQuery);
1144  
1145  // provides cross-browser focusin and focusout events

1146  // IE has native support, in other browsers, use event caputuring (neither bubbles)

1147  
1148  // provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation

1149  // handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target

1150  ;(function($) {
1151      // only implement if not provided by jQuery core (since 1.4)

1152      // TODO verify if jQuery 1.4's implementation is compatible with older jQuery special-event APIs

1153      if (!jQuery.event.special.focusin && !jQuery.event.special.focusout && document.addEventListener) {
1154          $.each({
1155              focus: 'focusin',
1156              blur: 'focusout'
1157          }, function( original, fix ){
1158              $.event.special[fix] = {
1159                  setup:function() {
1160                      this.addEventListener( original, handler, true );
1161                  },
1162                  teardown:function() {
1163                      this.removeEventListener( original, handler, true );
1164                  },
1165                  handler: function(e) {
1166                      arguments[0] = $.event.fix(e);
1167                      arguments[0].type = fix;
1168                      return $.event.handle.apply(this, arguments);
1169                  }
1170              };
1171  			function handler(e) {
1172                  e = $.event.fix(e);
1173                  e.type = fix;
1174                  return $.event.handle.call(this, e);
1175              }
1176          });
1177      };
1178      $.extend($.fn, {
1179          validateDelegate: function(delegate, type, handler) {
1180              return this.bind(type, function(event) {
1181                  var target = $(event.target);
1182                  if (target.is(delegate)) {
1183                      return handler.apply(target, arguments);
1184                  }
1185              });
1186          }
1187      });
1188  })(jQuery);


Generated: Fri Nov 28 20:08:37 2014 Cross-referenced by PHPXref 0.7.1