﻿/*
* jQuery validation plug-in 1.7
*
* http://bassistance.de/jquery-plugins/jquery-plugin-validation/
* http://docs.jquery.com/Plugins/Validation
*
* Copyright (c) 2006 - 2008 Jörn Zaefferer
*
* $Id: jquery.validate.js 6403 2009-06-17 14:27:16Z joern.zaefferer $
*
* Dual licensed under the MIT and GPL licenses:
*   http://www.opensource.org/licenses/mit-license.php
*   http://www.gnu.org/licenses/gpl.html
*/


(function ($) {
    $.extend($.fn, { validate: function (options) { if (!this.length) { options && options.debug && window.console && console.warn("nothing selected, can't validate, returning nothing"); return; } var validator = $.data(this[0], 'validator'); if (validator) { return validator; } validator = new $.validator(options, this[0]); $.data(this[0], 'validator', validator); if (validator.settings.onsubmit) { this.find("input, button").filter(".cancel").click(function () { validator.cancelSubmit = true; }); if (validator.settings.submitHandler) { this.find("input, button").filter(":submit").click(function () { validator.submitButton = this; }); } this.submit(function (event) { if (validator.settings.debug) event.preventDefault(); function handle() { if (validator.settings.submitHandler) { if (validator.submitButton) { var hidden = $("<input type='hidden'/>").attr("name", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm); } validator.settings.submitHandler.call(validator, validator.currentForm); if (validator.submitButton) { hidden.remove(); } return false; } return true; } if (validator.cancelSubmit) { validator.cancelSubmit = false; return handle(); } if (validator.form()) { if (validator.pendingRequest) { validator.formSubmitted = true; return false; } return handle(); } else { validator.focusInvalid(); return false; } }); } return validator; }, valid: function () { if ($(this[0]).is('form')) { return this.validate().form(); } else { var valid = true; var validator = $(this[0].form).validate(); this.each(function () { valid &= validator.element(this); }); return valid; } }, removeAttrs: function (attributes) { var result = {}, $element = this; $.each(attributes.split(/\s/), function (index, value) { result[value] = $element.attr(value); $element.removeAttr(value); }); return result; }, rules: function (command, argument) { var element = this[0]; if (command) { var settings = $.data(element.form, 'validator').settings; var staticRules = settings.rules; var existingRules = $.validator.staticRules(element); switch (command) { case "add": $.extend(existingRules, $.validator.normalizeRule(argument)); staticRules[element.name] = existingRules; if (argument.messages) settings.messages[element.name] = $.extend(settings.messages[element.name], argument.messages); break; case "remove": if (!argument) { delete staticRules[element.name]; return existingRules; } var filtered = {}; $.each(argument.split(/\s/), function (index, method) { filtered[method] = existingRules[method]; delete existingRules[method]; }); return filtered; } } var data = $.validator.normalizeRules($.extend({}, $.validator.metadataRules(element), $.validator.classRules(element), $.validator.attributeRules(element), $.validator.staticRules(element)), element); if (data.required) { var param = data.required; delete data.required; data = $.extend({ required: param }, data); } return data; } }); $.extend($.expr[":"], { blank: function (a) { return !$.trim("" + a.value); }, filled: function (a) { return !!$.trim("" + a.value); }, unchecked: function (a) { return !a.checked; } }); $.validator = function (options, form) { this.settings = $.extend(true, {}, $.validator.defaults, options); this.currentForm = form; this.init(); }; $.validator.format = function (source, params) { if (arguments.length == 1) return function () { var args = $.makeArray(arguments); args.unshift(source); return $.validator.format.apply(this, args); }; if (arguments.length > 2 && params.constructor != Array) { params = $.makeArray(arguments).slice(1); } if (params.constructor != Array) { params = [params]; } $.each(params, function (i, n) { source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n); }); return source; }; $.extend($.validator, { defaults: { messages: {}, groups: {}, rules: {}, errorClass: "error", validClass: "valid", errorElement: "label", focusInvalid: true, errorContainer: $([]), errorLabelContainer: $([]), onsubmit: true, ignore: [], ignoreTitle: false, onfocusin: function (element) { this.lastActive = element; if (this.settings.focusCleanup && !this.blockFocusCleanup) { this.settings.unhighlight && this.settings.unhighlight.call(this, element, this.settings.errorClass, this.settings.validClass); this.errorsFor(element).hide(); } }, onfocusout: function (element) { if (!this.checkable(element) && (element.name in this.submitted || !this.optional(element))) { this.element(element); } }, onkeyup: function (element) { if (element.name in this.submitted || element == this.lastElement) { this.element(element); } }, onclick: function (element) { if (element.name in this.submitted) this.element(element); else if (element.parentNode.name in this.submitted) this.element(element.parentNode); }, highlight: function (element, errorClass, validClass) { $(element).addClass(errorClass).removeClass(validClass); }, unhighlight: function (element, errorClass, validClass) { $(element).removeClass(errorClass).addClass(validClass); } }, setDefaults: function (settings) { $.extend($.validator.defaults, settings); }, messages: { required: "This field is required.", remote: "Please fix this field.", email: "Please enter a valid email address.", url: "Please enter a valid URL.", date: "Please enter a valid date.", dateISO: "Please enter a valid date (ISO).", number: "Please enter a valid number.", digits: "Please enter only digits.", creditcard: "Please enter a valid credit card number.", equalTo: "Please enter the same value again.", accept: "Please enter a value with a valid extension.", maxlength: $.validator.format("Please enter no more than {0} characters."), minlength: $.validator.format("Please enter at least {0} characters."), rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."), range: $.validator.format("Please enter a value between {0} and {1}."), max: $.validator.format("Please enter a value less than or equal to {0}."), min: $.validator.format("Please enter a value greater than or equal to {0}.") }, autoCreateRanges: false, prototype: { init: function () { this.labelContainer = $(this.settings.errorLabelContainer); this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm); this.containers = $(this.settings.errorContainer).add(this.settings.errorLabelContainer); this.submitted = {}; this.valueCache = {}; this.pendingRequest = 0; this.pending = {}; this.invalid = {}; this.reset(); var groups = (this.groups = {}); $.each(this.settings.groups, function (key, value) { $.each(value.split(/\s/), function (index, name) { groups[name] = key; }); }); var rules = this.settings.rules; $.each(rules, function (key, value) { rules[key] = $.validator.normalizeRule(value); }); function delegate(event) { var validator = $.data(this[0].form, "validator"), eventType = "on" + event.type.replace(/^validate/, ""); validator.settings[eventType] && validator.settings[eventType].call(validator, this[0]); } $(this.currentForm).validateDelegate(":text, :password, :file, select, textarea", "focusin focusout keyup", delegate).validateDelegate(":radio, :checkbox, select, option", "click", delegate); if (this.settings.invalidHandler) $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler); }, form: function () { this.checkForm(); $.extend(this.submitted, this.errorMap); this.invalid = $.extend({}, this.errorMap); if (!this.valid()) $(this.currentForm).triggerHandler("invalid-form", [this]); this.showErrors(); return this.valid(); }, checkForm: function () { this.prepareForm(); for (var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++) { this.check(elements[i]); } return this.valid(); }, element: function (element) { element = this.clean(element); this.lastElement = element; this.prepareElement(element); this.currentElements = $(element); var result = this.check(element); if (result) { delete this.invalid[element.name]; } else { this.invalid[element.name] = true; } if (!this.numberOfInvalids()) { this.toHide = this.toHide.add(this.containers); } this.showErrors(); return result; }, showErrors: function (errors) { if (errors) { $.extend(this.errorMap, errors); this.errorList = []; for (var name in errors) { this.errorList.push({ message: errors[name], element: this.findByName(name)[0] }); } this.successList = $.grep(this.successList, function (element) { return !(element.name in errors); }); } this.settings.showErrors ? this.settings.showErrors.call(this, this.errorMap, this.errorList) : this.defaultShowErrors(); }, resetForm: function () { if ($.fn.resetForm) $(this.currentForm).resetForm(); this.submitted = {}; this.prepareForm(); this.hideErrors(); this.elements().removeClass(this.settings.errorClass); }, numberOfInvalids: function () { return this.objectLength(this.invalid); }, objectLength: function (obj) { var count = 0; for (var i in obj) count++; return count; }, hideErrors: function () { this.addWrapper(this.toHide).hide(); }, valid: function () { return this.size() == 0; }, size: function () { return this.errorList.length; }, focusInvalid: function () { if (this.settings.focusInvalid) { try { $(this.findLastActive() || this.errorList.length && this.errorList[0].element || []).filter(":visible").focus().trigger("focusin"); } catch (e) { } } }, findLastActive: function () { var lastActive = this.lastActive; return lastActive && $.grep(this.errorList, function (n) { return n.element.name == lastActive.name; }).length == 1 && lastActive; }, elements: function () { var validator = this, rulesCache = {}; return $([]).add(this.currentForm.elements).filter(":input").not(":submit, :reset, :image, [disabled]").not(this.settings.ignore).filter(function () { !this.name && validator.settings.debug && window.console && console.error("%o has no name assigned", this); if (this.name in rulesCache || !validator.objectLength($(this).rules())) return false; rulesCache[this.name] = true; return true; }); }, clean: function (selector) { return $(selector)[0]; }, errors: function () { return $(this.settings.errorElement + "." + this.settings.errorClass, this.errorContext); }, reset: function () { this.successList = []; this.errorList = []; this.errorMap = {}; this.toShow = $([]); this.toHide = $([]); this.currentElements = $([]); }, prepareForm: function () { this.reset(); this.toHide = this.errors().add(this.containers); }, prepareElement: function (element) { this.reset(); this.toHide = this.errorsFor(element); }, check: function (element) {
        element = this.clean(element); if (this.checkable(element)) { element = this.findByName(element.name)[0]; } var rules = $(element).rules(); var dependencyMismatch = false; for (method in rules) {
            var rule = { method: method, parameters: rules[method] }; try { var result = $.validator.methods[method].call(this, element.value.replace(/\r/g, ""), element, rule.parameters); if (result == "dependency-mismatch") { dependencyMismatch = true; continue; } dependencyMismatch = false; if (result == "pending") { this.toHide = this.toHide.not(this.errorsFor(element)); return; } if (!result) { this.formatAndAdd(element, rule); return false; } } catch (e) {
                this.settings.debug && window.console && console.log("exception occured when checking element " + element.id
+ ", check the '" + rule.method + "' method", e); throw e;
            } 
        } if (dependencyMismatch) return; if (this.objectLength(rules)) this.successList.push(element); return true;
    }, customMetaMessage: function (element, method) { if (!$.metadata) return; var meta = this.settings.meta ? $(element).metadata()[this.settings.meta] : $(element).metadata(); return meta && meta.messages && meta.messages[method]; }, customMessage: function (name, method) { var m = this.settings.messages[name]; return m && (m.constructor == String ? m : m[method]); }, findDefined: function () { for (var i = 0; i < arguments.length; i++) { if (arguments[i] !== undefined) return arguments[i]; } return undefined; }, defaultMessage: function (element, method) { return this.findDefined(this.customMessage(element.name, method), this.customMetaMessage(element, method), !this.settings.ignoreTitle && element.title || undefined, $.validator.messages[method], "<strong>Warning: No message defined for " + element.name + "</strong>"); }, formatAndAdd: function (element, rule) { var message = this.defaultMessage(element, rule.method), theregex = /\$?\{(\d+)\}/g; if (typeof message == "function") { message = message.call(this, rule.parameters, element); } else if (theregex.test(message)) { message = jQuery.format(message.replace(theregex, '{$1}'), rule.parameters); } this.errorList.push({ message: message, element: element }); this.errorMap[element.name] = message; this.submitted[element.name] = message; }, addWrapper: function (toToggle) { if (this.settings.wrapper) toToggle = toToggle.add(toToggle.parent(this.settings.wrapper)); return toToggle; }, defaultShowErrors: function () { for (var i = 0; this.errorList[i]; i++) { var error = this.errorList[i]; this.settings.highlight && this.settings.highlight.call(this, error.element, this.settings.errorClass, this.settings.validClass); this.showLabel(error.element, error.message); } if (this.errorList.length) { this.toShow = this.toShow.add(this.containers); } if (this.settings.success) { for (var i = 0; this.successList[i]; i++) { this.showLabel(this.successList[i]); } } if (this.settings.unhighlight) { for (var i = 0, elements = this.validElements(); elements[i]; i++) { this.settings.unhighlight.call(this, elements[i], this.settings.errorClass, this.settings.validClass); } } this.toHide = this.toHide.not(this.toShow); this.hideErrors(); this.addWrapper(this.toShow).show(); }, validElements: function () { return this.currentElements.not(this.invalidElements()); }, invalidElements: function () { return $(this.errorList).map(function () { return this.element; }); }, showLabel: function (element, message) { var label = this.errorsFor(element); if (label.length) { label.removeClass().addClass(this.settings.errorClass); label.attr("generated") && label.html(message); } else { label = $("<" + this.settings.errorElement + "/>").attr({ "for": this.idOrName(element), generated: true }).addClass(this.settings.errorClass).html(message || ""); if (this.settings.wrapper) { label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent(); } if (!this.labelContainer.append(label).length) this.settings.errorPlacement ? this.settings.errorPlacement(label, $(element)) : label.insertAfter(element); } if (!message && this.settings.success) { label.text(""); typeof this.settings.success == "string" ? label.addClass(this.settings.success) : this.settings.success(label); } this.toShow = this.toShow.add(label); }, errorsFor: function (element) { var name = this.idOrName(element); return this.errors().filter(function () { return $(this).attr('for') == name; }); }, idOrName: function (element) { return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name); }, checkable: function (element) { return /radio|checkbox/i.test(element.type); }, findByName: function (name) { var form = this.currentForm; return $(document.getElementsByName(name)).map(function (index, element) { return element.form == form && element.name == name && element || null; }); }, getLength: function (value, element) { switch (element.nodeName.toLowerCase()) { case 'select': return $("option:selected", element).length; case 'input': if (this.checkable(element)) return this.findByName(element.name).filter(':checked').length; } return value.length; }, depend: function (param, element) { return this.dependTypes[typeof param] ? this.dependTypes[typeof param](param, element) : true; }, dependTypes: { "boolean": function (param, element) { return param; }, "string": function (param, element) { return !!$(param, element.form).length; }, "function": function (param, element) { return param(element); } }, optional: function (element) { return !$.validator.methods.required.call(this, $.trim(element.value), element) && "dependency-mismatch"; }, startRequest: function (element) { if (!this.pending[element.name]) { this.pendingRequest++; this.pending[element.name] = true; } }, stopRequest: function (element, valid) { this.pendingRequest--; if (this.pendingRequest < 0) this.pendingRequest = 0; delete this.pending[element.name]; if (valid && this.pendingRequest == 0 && this.formSubmitted && this.form()) { $(this.currentForm).submit(); this.formSubmitted = false; } else if (!valid && this.pendingRequest == 0 && this.formSubmitted) { $(this.currentForm).triggerHandler("invalid-form", [this]); this.formSubmitted = false; } }, previousValue: function (element) { return $.data(element, "previousValue") || $.data(element, "previousValue", { old: null, valid: true, message: this.defaultMessage(element, "remote") }); } 
    }, classRuleSettings: { required: { required: true }, email: { email: true }, url: { url: true }, date: { date: true }, dateISO: { dateISO: true }, dateDE: { dateDE: true }, number: { number: true }, numberDE: { numberDE: true }, digits: { digits: true }, creditcard: { creditcard: true} }, addClassRules: function (className, rules) { className.constructor == String ? this.classRuleSettings[className] = rules : $.extend(this.classRuleSettings, className); }, classRules: function (element) { var rules = {}; var classes = $(element).attr('class'); classes && $.each(classes.split(' '), function () { if (this in $.validator.classRuleSettings) { $.extend(rules, $.validator.classRuleSettings[this]); } }); return rules; }, attributeRules: function (element) { var rules = {}; var $element = $(element); for (method in $.validator.methods) { var value = $element.attr(method); if (value) { rules[method] = value; } } if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) { delete rules.maxlength; } return rules; }, metadataRules: function (element) { if (!$.metadata) return {}; var meta = $.data(element.form, 'validator').settings.meta; return meta ? $(element).metadata()[meta] : $(element).metadata(); }, staticRules: function (element) { var rules = {}; var validator = $.data(element.form, 'validator'); if (validator.settings.rules) { rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {}; } return rules; }, normalizeRules: function (rules, element) { $.each(rules, function (prop, val) { if (val === false) { delete rules[prop]; return; } if (val.param || val.depends) { var keepRule = true; switch (typeof val.depends) { case "string": keepRule = !!$(val.depends, element.form).length; break; case "function": keepRule = val.depends.call(element, element); break; } if (keepRule) { rules[prop] = val.param !== undefined ? val.param : true; } else { delete rules[prop]; } } }); $.each(rules, function (rule, parameter) { rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter; }); $.each(['minlength', 'maxlength', 'min', 'max'], function () { if (rules[this]) { rules[this] = Number(rules[this]); } }); $.each(['rangelength', 'range'], function () { if (rules[this]) { rules[this] = [Number(rules[this][0]), Number(rules[this][1])]; } }); if ($.validator.autoCreateRanges) { if (rules.min && rules.max) { rules.range = [rules.min, rules.max]; delete rules.min; delete rules.max; } if (rules.minlength && rules.maxlength) { rules.rangelength = [rules.minlength, rules.maxlength]; delete rules.minlength; delete rules.maxlength; } } if (rules.messages) { delete rules.messages; } return rules; }, normalizeRule: function (data) { if (typeof data == "string") { var transformed = {}; $.each(data.split(/\s/), function () { transformed[this] = true; }); data = transformed; } return data; }, addMethod: function (name, method, message) { $.validator.methods[name] = method; $.validator.messages[name] = message != undefined ? message : $.validator.messages[name]; if (method.length < 3) { $.validator.addClassRules(name, $.validator.normalizeRule(name)); } }, methods: { required: function (value, element, param) { if (!this.depend(param, element)) return "dependency-mismatch"; switch (element.nodeName.toLowerCase()) { case 'select': var val = $(element).val(); return val && val.length > 0; case 'input': if (this.checkable(element)) return this.getLength(value, element) > 0; default: return $.trim(value).length > 0; } }, remote: function (value, element, param) { if (this.optional(element)) return "dependency-mismatch"; var previous = this.previousValue(element); if (!this.settings.messages[element.name]) this.settings.messages[element.name] = {}; previous.originalMessage = this.settings.messages[element.name].remote; this.settings.messages[element.name].remote = previous.message; param = typeof param == "string" && { url: param} || param; if (previous.old !== value) { previous.old = value; var validator = this; this.startRequest(element); var data = {}; data[element.name] = value; $.ajax($.extend(true, { url: param, mode: "abort", port: "validate" + element.name, dataType: "json", data: data, success: function (response) { validator.settings.messages[element.name].remote = previous.originalMessage; var valid = response === true; if (valid) { var submitted = validator.formSubmitted; validator.prepareElement(element); validator.formSubmitted = submitted; validator.successList.push(element); validator.showErrors(); } else { var errors = {}; var message = (previous.message = response || validator.defaultMessage(element, "remote")); errors[element.name] = $.isFunction(message) ? message(value) : message; validator.showErrors(errors); } previous.valid = valid; validator.stopRequest(element, valid); } }, param)); return "pending"; } else if (this.pending[element.name]) { return "pending"; } return previous.valid; }, minlength: function (value, element, param) { return this.optional(element) || this.getLength($.trim(value), element) >= param; }, maxlength: function (value, element, param) { return this.optional(element) || this.getLength($.trim(value), element) <= param; }, rangelength: function (value, element, param) { var length = this.getLength($.trim(value), element); return this.optional(element) || (length >= param[0] && length <= param[1]); }, min: function (value, element, param) { return this.optional(element) || value >= param; }, max: function (value, element, param) { return this.optional(element) || value <= param; }, range: function (value, element, param) { return this.optional(element) || (value >= param[0] && value <= param[1]); }, email: function (value, element) { 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); }, url: function (value, element) { 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); }, date: function (value, element) { return this.optional(element) || !/Invalid|NaN/.test(new Date(value)); }, dateISO: function (value, element) { return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value); }, number: function (value, element) { return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value); }, digits: function (value, element) { return this.optional(element) || /^\d+$/.test(value); }, creditcard: function (value, element) { if (this.optional(element)) return "dependency-mismatch"; if (/[^0-9-]+/.test(value)) return false; var nCheck = 0, nDigit = 0, bEven = false; value = value.replace(/\D/g, ""); for (var n = value.length - 1; n >= 0; n--) { var cDigit = value.charAt(n); var nDigit = parseInt(cDigit, 10); if (bEven) { if ((nDigit *= 2) > 9) nDigit -= 9; } nCheck += nDigit; bEven = !bEven; } return (nCheck % 10) == 0; }, accept: function (value, element, param) { param = typeof param == "string" ? param.replace(/,/g, '|') : "png|jpe?g|gif"; return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i")); }, equalTo: function (value, element, param) { var target = $(param).unbind(".validate-equalTo").bind("blur.validate-equalTo", function () { $(element).valid(); }); return value == target.val(); } }
    }); $.format = $.validator.format;
})(jQuery); ; (function ($) { var ajax = $.ajax; var pendingRequests = {}; $.ajax = function (settings) { settings = $.extend(settings, $.extend({}, $.ajaxSettings, settings)); var port = settings.port; if (settings.mode == "abort") { if (pendingRequests[port]) { pendingRequests[port].abort(); } return (pendingRequests[port] = ajax.apply(this, arguments)); } return ajax.apply(this, arguments); }; })(jQuery); ; (function ($) { if (!jQuery.event.special.focusin && !jQuery.event.special.focusout && document.addEventListener) { $.each({ focus: 'focusin', blur: 'focusout' }, function (original, fix) { $.event.special[fix] = { setup: function () { this.addEventListener(original, handler, true); }, teardown: function () { this.removeEventListener(original, handler, true); }, handler: function (e) { arguments[0] = $.event.fix(e); arguments[0].type = fix; return $.event.handle.apply(this, arguments); } }; function handler(e) { e = $.event.fix(e); e.type = fix; return $.event.handle.call(this, e); } }); }; $.extend($.fn, { validateDelegate: function (delegate, type, handler) { return this.bind(type, function (event) { var target = $(event.target); if (target.is(delegate)) { return handler.apply(target, arguments); } }); } }); })(jQuery);


/*
Masked Input plugin for jQuery
Copyright (c) 2007-2011 Josh Bush (digitalbush.com)
Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) 
Version: 1.3
*/
(function (a) { var b = (a.browser.msie ? "paste" : "input") + ".mask", c = window.orientation != undefined; a.mask = { definitions: { 9: "[0-9]", a: "[A-Za-z]", "*": "[A-Za-z0-9]" }, dataName: "rawMaskFn" }, a.fn.extend({ caret: function (a, b) { if (this.length != 0) { if (typeof a == "number") { b = typeof b == "number" ? b : a; return this.each(function () { if (this.setSelectionRange) this.setSelectionRange(a, b); else if (this.createTextRange) { var c = this.createTextRange(); c.collapse(!0), c.moveEnd("character", b), c.moveStart("character", a), c.select() } }) } if (this[0].setSelectionRange) a = this[0].selectionStart, b = this[0].selectionEnd; else if (document.selection && document.selection.createRange) { var c = document.selection.createRange(); a = 0 - c.duplicate().moveStart("character", -1e5), b = a + c.text.length } return { begin: a, end: b} } }, unmask: function () { return this.trigger("unmask") }, mask: function (d, e) { if (!d && this.length > 0) { var f = a(this[0]); return f.data(a.mask.dataName)() } e = a.extend({ placeholder: "_", completed: null }, e); var g = a.mask.definitions, h = [], i = d.length, j = null, k = d.length; a.each(d.split(""), function (a, b) { b == "?" ? (k--, i = a) : g[b] ? (h.push(new RegExp(g[b])), j == null && (j = h.length - 1)) : h.push(null) }); return this.trigger("unmask").each(function () { function v(a) { var b = f.val(), c = -1; for (var d = 0, g = 0; d < k; d++) if (h[d]) { l[d] = e.placeholder; while (g++ < b.length) { var m = b.charAt(g - 1); if (h[d].test(m)) { l[d] = m, c = d; break } } if (g > b.length) break } else l[d] == b.charAt(g) && d != i && (g++, c = d); if (!a && c + 1 < i) f.val(""), t(0, k); else if (a || c + 1 >= i) u(), a || f.val(f.val().substring(0, c + 1)); return i ? d : j } function u() { return f.val(l.join("")).val() } function t(a, b) { for (var c = a; c < b && c < k; c++) h[c] && (l[c] = e.placeholder) } function s(a) { var b = a.which, c = f.caret(); if (a.ctrlKey || a.altKey || a.metaKey || b < 32) return !0; if (b) { c.end - c.begin != 0 && (t(c.begin, c.end), p(c.begin, c.end - 1)); var d = n(c.begin - 1); if (d < k) { var g = String.fromCharCode(b); if (h[d].test(g)) { q(d), l[d] = g, u(); var i = n(d); f.caret(i), e.completed && i >= k && e.completed.call(f) } } return !1 } } function r(a) { var b = a.which; if (b == 8 || b == 46 || c && b == 127) { var d = f.caret(), e = d.begin, g = d.end; g - e == 0 && (e = b != 46 ? o(e) : g = n(e - 1), g = b == 46 ? n(g) : g), t(e, g), p(e, g - 1); return !1 } if (b == 27) { f.val(m), f.caret(0, v()); return !1 } } function q(a) { for (var b = a, c = e.placeholder; b < k; b++) if (h[b]) { var d = n(b), f = l[b]; l[b] = c; if (d < k && h[d].test(f)) c = f; else break } } function p(a, b) { if (!(a < 0)) { for (var c = a, d = n(b); c < k; c++) if (h[c]) { if (d < k && h[c].test(l[d])) l[c] = l[d], l[d] = e.placeholder; else break; d = n(d) } u(), f.caret(Math.max(j, a)) } } function o(a) { while (--a >= 0 && !h[a]); return a } function n(a) { while (++a <= k && !h[a]); return a } var f = a(this), l = a.map(d.split(""), function (a, b) { if (a != "?") return g[a] ? e.placeholder : a }), m = f.val(); f.data(a.mask.dataName, function () { return a.map(l, function (a, b) { return h[b] && a != e.placeholder ? a : null }).join("") }), f.attr("readonly") || f.one("unmask", function () { f.unbind(".mask").removeData(a.mask.dataName) }).bind("focus.mask", function () { m = f.val(); var b = v(); u(); var c = function () { b == d.length ? f.caret(0, b) : f.caret(b) }; (a.browser.msie ? c : function () { setTimeout(c, 0) })() }).bind("blur.mask", function () { v(), f.val() != m && f.change() }).bind("keydown.mask", r).bind("keypress.mask", s).bind(b, function () { setTimeout(function () { f.caret(v(!0)) }, 0) }), v() }) } }) })(jQuery);


/*

* Price Format jQuery Plugin
* By Eduardo Cuducos
* cuducos [at] gmail [dot] com
* Version: 1.1
* Release: 2009-02-10

* original char limit by Fl�vio Silveira <http://flaviosilveira.com>
* original keydown event attachment by Kaihua Qi
* keydown fixes by Thasmo <http://thasmo.com>

* alterado por Paulo Daniel pois no teclado convencional(não numerico) repete os números
*/

(function ($) { $.fn.priceFormat = function (options) { var defaults = { prefix: 'US$ ', centsSeparator: '.', thousandsSeparator: ',', limit: false, centsLimit: 2 }; var options = $.extend(defaults, options); return this.each(function () { var obj = $(this); var is_number = /[0-9]/; var prefix = options.prefix; var centsSeparator = options.centsSeparator; var thousandsSeparator = options.thousandsSeparator; var limit = options.limit; var centsLimit = options.centsLimit; function to_numbers(str) { var formatted = ''; for (var i = 0; i < (str.length); i++) { char = str.charAt(i); if (formatted.length == 0 && char == 0) char = false; if (char && char.match(is_number)) { if (limit) { if (formatted.length < limit) formatted = formatted + char; } else { formatted = formatted + char; } } } return formatted; } function fill_with_zeroes(str) { while (str.length < (centsLimit + 1)) str = '0' + str; return str; } function price_format(str) { var formatted = fill_with_zeroes(to_numbers(str)); var thousandsFormatted = ''; var thousandsCount = 0; var centsVal = formatted.substr(formatted.length - centsLimit, centsLimit); var integerVal = formatted.substr(0, formatted.length - centsLimit); formatted = integerVal + centsSeparator + centsVal; if (thousandsSeparator) { for (var j = integerVal.length; j > 0; j--) { char = integerVal.substr(j - 1, 1); thousandsCount++; if (thousandsCount % 3 == 0) char = thousandsSeparator + char; thousandsFormatted = char + thousandsFormatted; } if (thousandsFormatted.substr(0, 1) == thousandsSeparator) thousandsFormatted = thousandsFormatted.substring(1, thousandsFormatted.length); formatted = thousandsFormatted + centsSeparator + centsVal; } if (prefix) formatted = prefix + formatted; return formatted; } function key_check(e) { var code = (e.keyCode ? e.keyCode : e.which); var typed = String.fromCharCode(code); var functional = false; var str = obj.val(); var newValue = price_format(str + typed); if (code >= 96 && code <= 105) functional = true; if (code >= 48 && code <= 57) functional = true; if (code == 8) functional = true; if (code == 9) functional = true; if (code == 13) functional = true; if (code == 37) functional = true; if (code == 39) functional = true; if (!functional) { e.preventDefault(); e.stopPropagation(); if (str != newValue) obj.val(newValue); } } function price_it() { var str = obj.val(); var price = price_format(str); if (str != price) obj.val(price); } $(this).bind('keydown', key_check); $(this).bind('keyup', price_it); if ($(this).val().length > 0) price_it(); }); }; })(jQuery);

/* galeria de imagens da página inicial
Efetuar o minifyer
 */
$(function () {
    var jqImageGallery = {
        Time: 5000,
        Interval: new Array(),
        Init: function (jSelGallery, listaGallery) {
            if (listaGallery.length > 0) {
                var objGal = $(jSelGallery);

                objGal.data('totalItens', listaGallery.length);
                jqImageGallery.ConfigImages(objGal);
                jqImageGallery.ConfigButtons(objGal);

                jqImageGallery.Interval[jSelGallery] = '';
                jqImageGallery.SetItem(jSelGallery, 0, listaGallery, false);
            }
        },
        ConfigImages: function (jObjGallery) {
            //Seta o id do item doom
            for (var i = 0; i < 3; i++)
                var imgItem = jObjGallery.find('.img' + i.toString()).data('imgId', i.toString());

            jObjGallery.find('.img2').show();
        },
        ConfigButtons: function (jObjGallery) {
            var btnPrev = jObjGallery.find('.divPrev');
            var btnNext = jObjGallery.find('.divNext');

            btnPrev.mouseover(function () { $(this).fadeTo('fast', 1.0); });
            btnNext.mouseover(function () { $(this).fadeTo('fast', 1.0); });
            btnPrev.mouseout(function () { $(this).fadeTo('fast', 0.2); });
            btnNext.mouseout(function () { $(this).fadeTo('fast', 0.2); });
        },
        //Seta o intervalo para a apresentação
        SetInterval: function (jSelGallery, listaGallery) {
            clearInterval(jqImageGallery.Interval[jSelGallery]);

            jqImageGallery.Interval[jSelGallery] = setInterval(function () {
                var itemAtual = $(jSelGallery).data('itemAtual');
                var nestItemPos = jqImageGallery.NextItemPos(jSelGallery, itemAtual);
                jqImageGallery.SetItem(jSelGallery, nestItemPos, listaGallery, true);
            }, jqImageGallery.Time);
        },
        //Seta o item atual
        SetItem: function (jSelGallery, itemPos, listaGallery, showFade) {
            var objGal = $(jSelGallery);
            objGal.data('itemAtual', itemPos);

            //Seleciona os botões de navegação e remove os eventos
            var btnPrev = objGal.find('.divPrev');
            var btnNext = objGal.find('.divNext');
            btnPrev.unbind('click');
            btnNext.unbind('click');

            //Seta o src do item anterior para a imagem atual
            var imgShow = objGal.find('.imgGal:visible');
            var prevItemPos = jqImageGallery.PrevItemPos(jSelGallery, itemPos);
            imgShow.attr('src', listaGallery[prevItemPos].ImagemSrc);

            var idAtual = imgShow.data('imgId');

            //Seta o src do próxima item para a imagem anterior da atual
            var imgPrev = objGal.find('.img' + jqImageGallery.PrevImgId(idAtual));
            var nextItemPos = jqImageGallery.NextItemPos(jSelGallery, itemPos);
            imgPrev.attr('src', listaGallery[nextItemPos].ImagemSrc);

            //Seta o src do item atual para a próxima imagem 
            var imgNext = objGal.find('.img' + jqImageGallery.NextImgId(idAtual));
            imgNext.attr('src', listaGallery[itemPos].ImagemSrc);

            var divDesc = objGal.find('.divDescription');
            divDesc.unbind('showFade');

            //Seta o evento de click do item
            divDesc.bind('showFade', function () {
                btnPrev.click(function () { jqImageGallery.SetItem(jSelGallery, prevItemPos, listaGallery, true); });
            });

            //Seta o evento de click do item
            divDesc.bind('showFade', function () {
                btnNext.click(function () { jqImageGallery.SetItem(jSelGallery, nextItemPos, listaGallery, true); });
            });

            jqImageGallery.SetDescription(divDesc, listaGallery[itemPos], showFade);
            jqImageGallery.ShowHideImg(imgPrev, false, false);
            jqImageGallery.ShowHideImg(imgShow, false, showFade);
            jqImageGallery.ShowHideImg(imgNext, true, showFade);
            jqImageGallery.SetInterval(jSelGallery, listaGallery);
        },
        //Seta a descrição do item atual e executa o evento de transição
        SetDescription: function (jObjDivDesc, itemCurrent, showFade) {
            if (showFade) {
                jObjDivDesc.show();
                jObjDivDesc.slideToggle('slow', function () {
                    jObjDivDesc.hide();
                    jObjDivDesc.find('h2 a').html(itemCurrent.Titulo);
                    jObjDivDesc.find('p a').html(itemCurrent.Descricao);
                    jObjDivDesc.slideToggle('slow', function () { $(this).trigger('showFade'); });
                });
            }
            else {
                jObjDivDesc.find('h2 a').html(itemCurrent.Titulo);
                jObjDivDesc.find('p a').html(itemCurrent.Descricao);
                jObjDivDesc.trigger('showFade');
            }
        },
        //Exibe ou oculta a imagem
        ShowHideImg: function (jObj, show, showFade) {
            if (show)
                if (showFade)
                    jObj.fadeTo('slow', 1.0, function () { $(this).show(); });
                else
                    jObj.show();
            else
                if (showFade)
                    jObj.fadeTo('slow', 0.0, function () { $(this).hide(); });
                else
                    jObj.hide();
        },
        //Retorna a posição do próximo item
        NextItemPos: function (jSelGallery, itemPos) {
            itemPos = parseInt(itemPos);
            if (itemPos == (parseInt($(jSelGallery).data('totalItens')) - 1))
                return 0;
            else
                return itemPos + 1;
        },
        //Retorna a posição do próximo item
        PrevItemPos: function (jSelGallery, itemPos) {
            itemPos = parseInt(itemPos);
            if (itemPos == 0)
                return (parseInt($(jSelGallery).data('totalItens')) - 1);
            else
                return itemPos - 1;
        },
        //Retorna o id da próxima imagem
        NextImgId: function (imgAtual) {
            imgAtual = parseInt(imgAtual);
            if (imgAtual == 2)
                return 0;
            else
                return imgAtual + 1;
        },
        //Retorna o id da imagem anterior
        PrevImgId: function (imgAtual) {
            imgAtual = parseInt(imgAtual);
            if (imgAtual == 0)
                return 2;
            else
                return imgAtual - 1;
        }
    };

    $.fn.imageGallery = function (jSonListaGallery) {
        jqImageGallery.Init($(this).selector, jSonListaGallery);
    };
});


/*

Vitrine de vendas
By Paulo Daniel

*/
$(function () {
    var vitrine = {
        //Inicialização assicrona
        Init: function (jSel, config) {
            setTimeout(function () {
                vitrine.InitAsync(jSel, config);
            }, 0)
        },
        //Configura a vitrine selecionada
        InitAsync: function (jSel, config) {
            var divOverflow = $(jSel + " .divCommerceContent .divOverflow");

            $(jSel).data('qtdPanels', divOverflow.find('.divPainel').length);
            $(jSel).data('wDefault', config.WidthDefault);

            divOverflow.css("width", (vitrine.GetWidthFull(jSel)).toString() + "px");

            vitrine.ConfigWidths(jSel);
            var i = 0; //Counter for a
            $(jSel + " .divCommerceNav .divNavItem").each(function () {
                var a = $(this).find("a");
                a.data('idCounter', i.toString());
                $(this).find("a").click(function () {
                    vitrine.ClickNavItem(jSel, divOverflow, this);
                });

                i++;
            });
        },
        //Configura a largura dos objetos
        ConfigWidths: function (jSel) {
            var wNavItem = parseInt(vitrine.GetwDefault(jSel) / parseInt($(jSel).data('qtdPanels'))).toString() + "px";
            $(jSel + " .divCommerceNav .navPos").css("width", wNavItem);
            $(jSel + " .divCommerceNav .divNavItem").css("width", wNavItem);

            var wNav = $(jSel + " .divCommerceNav .navPos").width();
            var wNavLeft = $(jSel + " .divCommerceNav .navPos .left").width();
            var wNavRight = $(jSel + " .divCommerceNav .navPos .right").width();
            var wNavCenter = (wNav - wNavLeft - wNavRight).toString() + "px";
            var wNavRight = $(jSel + " .divCommerceNav .navPos .center").css("width", wNavCenter);
        },
        //evento de click no painel de navegação
        ClickNavItem: function (jSel, divOverflow, obj) {
            var idCounter = parseInt($(obj).data('idCounter'));
            var width = vitrine.GetWidth(jSel, idCounter);

            setTimeout(function () {
                divOverflow.animate({ "marginLeft": '-' + width + 'px' }, 500);
            }, 0);

            var qtdPanels = parseInt($(jSel).data('qtdPanels'));
            var widthNavItem = parseInt(vitrine.GetwDefault(jSel) / qtdPanels);
            var posNavItem = widthNavItem * idCounter;
                        
            setTimeout(function () {
                $(jSel + " .divCommerceNav .navPos").animate({ "left": posNavItem }, 500);
            }, 0);
        },
        //Resgata o tamanho total da vitrine
        GetWidthFull: function (jSel) {
            var qtdPaineis = parseInt($(jSel).data('qtdPanels'));
            return qtdPaineis * vitrine.GetwDefault(jSel);
        },
        //Restaga o tamanho pela quantidade de paineis
        GetWidth: function (jSel, qtdPaineis) {
            return qtdPaineis * vitrine.GetwDefault(jSel);
        },
        //Restaga o tamanho padrão
        GetwDefault: function (jSel) {
            return parseInt($(jSel).data('wDefault'));
        }
    };

    $.fn.configVitrine = function (options) {
        vitrine.Init($(this).selector, options);
    };
});
