/*
 * Form Validation: jQuery form validation plug-in v1.1
 *
 * http://bassistance.de/jquery-plugins/jquery-plugin-validation/
 *
 * Copyright (c) 2006 Jörn Zaefferer
 *
 * $Id: jquery.validate.js 2133 2007-06-21 18:50:13Z 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
 */
jQuery.extend(jQuery.fn,{validate:function(b){var c=new jQuery.validator(b,this[0]);if(c.settings.onsubmit){this.find("input.cancel:submit").click(function(){this.form.cancel=true});this.submit(function(a){if(c.settings.debug)a.preventDefault();if(this.cancel||c.form()){this.cancel=false;if(c.settings.submitHandler){c.settings.submitHandler(c.currentForm);return false}return true}else{c.focusInvalid();return false}})}c.settings.onblur&&c.elements.blur(function(){});c.settings.onkeyup&&c.elements.keyup(function(){});var d=jQuery([]);c.elements.each(function(){if(c.checkable(this))d.push(c.checkableGroup(this))});c.settings.onchange&&d.click(function(){c.settings.onchange.call(c,this)});return c},push:function(t){return this.setArray(jQuery.merge(this.get(),t))}});jQuery.extend(jQuery.expr[":"],{blank:"!jQuery.trim(a.value)",filled:"!!jQuery.trim(a.value)",unchecked:"!a.checked"});String.format=function(b,c){if(arguments.length==1)return function(a){return String.format(b,a)};if(arguments.length>2)c=jQuery.makeArray(arguments).slice(1);if(c.constructor!=Array)c=[c];jQuery.each(c,function(i,n){b=b.replace(new RegExp("\\{"+i+"\\}"),n)});return b};jQuery.validator=function(a,b){this.settings=jQuery.extend({},jQuery.validator.defaults,a);this.currentForm=b;this.labelContainer=this.settings.errorLabelContainer;this.errorContext=this.labelContainer.length&&this.labelContainer||jQuery(b);this.containers=this.settings.errorContainer.add(this.settings.errorLabelContainer);this.submitted={};this.reset();this.refresh()};jQuery.extend(jQuery.validator,{defaults:{messages:{},errorClass:"error",errorElement:"label",focusInvalid:true,errorContainer:jQuery([]),errorLabelContainer:jQuery([]),onsubmit:true,ignore:[],onblur:function(a){if(!this.checkable(a)&&(a.name in this.submitted||!this.required(a))){this.element(a)}},onkeyup:function(a){if(a.name in this.submitted||a==this.lastElement){this.element(a)}},onchange:function(a){if(a.name in this.submitted)this.element(a)}},setDefaults:function(a){jQuery.extend(jQuery.validator.defaults,a)},messages:{required:"This field is required.",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).",dateDE:"Bitte geben Sie ein gültiges Datum ein.",number:"Please enter a valid number.",numberDE:"Bitte geben Sie eine Nummer ein.",digits:"Please enter only digits",creditcard:"Please enter a valid credit card.",equalTo:"Please enter the same value again.",accept:"Please enter a value with a valid extension.",maxLength:String.format("Please enter a value no longer than {0} characters."),minLength:String.format("Please enter a value of at least {0} characters."),rangeLength:String.format("Please enter a value between {0} and {1} characters long."),rangeValue:String.format("Please enter a value between {0} and {1}."),maxValue:String.format("Please enter a value less than or equal to {0}."),minValue:String.format("Please enter a value greater than or equal to {0}.")},prototype:{form:function(){this.prepareForm();for(var i=0,element;element=this.elements[i];i++){this.check(element)}jQuery.extend(this.submitted,this.errorMap);return this.valid()},element:function(a){a=this.clean(a);this.lastElement=a;this.prepareElement(a);var b=this.check(a);this.showErrors();return b},showErrors:function(b){if(b){jQuery.extend(this.errorMap,b);for(name in b){this.errorList.push({message:b[name],element:jQuery("[@name="+name+"]:first",this.currentForm)[0]})}this.successList=jQuery.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){if(jQuery.fn.resetForm)jQuery(this.currentForm).resetForm();this.prepareForm();this.hideErrors();this.elements.removeClass(this.settings.errorClass)},hideErrors:function(){this.addWrapper(this.toHide).hide()},valid:function(){this.showErrors();return this.errorList.length==0},focusInvalid:function(){if(this.settings.focusInvalid){try{jQuery(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus()}catch(e){}}},findLastActive:function(){var a=this.lastActive;return a&&jQuery.grep(this.errorList,function(n){return n.element.name==a.name}).length==1&&a},refresh:function(){var a=this;a.rulesCache={};this.elements=jQuery(this.currentForm).find("input, select, textarea, button").not(":submit").not(":reset").not(this.settings.ignore).filter(function(){!this.name&&a.settings.debug&&window.console&&console.error("%o has no name assigned",this);if(this.name in a.rulesCache||!a.rules(this).length)return false;a.rulesCache[this.name]=a.rules(this);return true});this.elements.focus(function(){a.lastActive=this;if(a.settings.focusCleanup){jQuery(this).removeClass(a.settings.errorClass);a.errorsFor(this).hide()}})},clean:function(a){return jQuery(a)[0]},errors:function(){return jQuery(this.settings.errorElement+"."+this.settings.errorClass,this.errorContext)},reset:function(a){this.successList=[];this.errorList=[];this.errorMap={};this.toShow=jQuery([]);this.toHide=jQuery([])},prepareForm:function(){this.reset();this.toHide=this.errors().push(this.containers)},prepareElement:function(a){this.reset();this.toHide=this.errorsFor(this.clean(a))},check:function(a){a=this.clean(a);jQuery(a).removeClass(this.settings.errorClass);var b=this.rulesCache[a.name];for(var i=0,rule;rule=b[i++];){try{var c=jQuery.validator.methods[rule.method].call(this,jQuery.trim(a.value),a,rule.parameters);if(c===-1)break;if(!c){jQuery(a).addClass(this.settings.errorClass);this.formatAndAdd(rule,a);return false}}catch(e){this.settings.debug&&window.console&&console.error("exception occured when checking element "+a.id+", check the '"+rule.method+"' method");throw e;}}if(b.length&&this.settings.success)this.successList.push(a);return true},message:function(a,b){var m=this.settings.messages[a];return m&&(m.constructor==String?m:m[b])},formatAndAdd:function(a,b){var c=this.message(b.name,a.method)||b.title||jQuery.validator.messages[a.method]||"<strong>Warning: No message defined for "+b.name+"</strong>";if(typeof c=="function")c=c.call(this,a.parameters,b);this.errorList.push({message:c,element:b});this.errorMap[b.name]=c;this.submitted[b.name]=c},addWrapper:function(a){if(this.settings.wrapper)a.push(a.parents(this.settings.wrapper));return a},defaultShowErrors:function(){for(var i=0,error;error=this.errorList[i];i++){this.showLabel(error.element,error.message)}if(this.errorList.length){this.toShow.push(this.containers)}for(var i=0,element;element=this.successList[i];i++){this.showLabel(element)}this.toHide=this.toHide.not(this.toShow);this.hideErrors();this.addWrapper(this.toShow).show()},showLabel:function(a,b){var c=this.errorsFor(a);if(c.length){c.removeClass().addClass(this.settings.errorClass);if(this.settings.overrideErrors||c.attr("generated")){c.html(b)}}else{c=jQuery("<"+this.settings.errorElement+">").attr({"for":this.idOrName(a),generated:true}).addClass(this.settings.errorClass).html(b||"");if(this.settings.wrapper){c=c.hide().show().wrap("<"+this.settings.wrapper+">").parent()}if(!this.labelContainer.append(c).length)this.settings.errorPlacement?this.settings.errorPlacement(c,jQuery(a)):c.insertAfter(a)}if(!b&&this.settings.success){c.text("");typeof this.settings.success=="string"?c.addClass(this.settings.success):this.settings.success(c)}this.toShow.push(c)},errorsFor:function(a){return this.errors().filter("[@for="+this.idOrName(a)+"]")},idOrName:function(a){return this.checkable(a)?a.name:a.id||a.name},rules:function(c){var d=this.data(c);if(!d)return[];var e=[];if(typeof d=="string"){var f={};f[d]=true;d=f}jQuery.each(d,function(a,b){e[e.length]={method:a,parameters:b}});return e},data:function(a){return this.settings.rules?this.settings.rules[a.name]:this.settings.meta?jQuery(a).data()[this.settings.meta]:jQuery(a).data()},checkable:function(a){return/radio|checkbox/i.test(a.type)},checkableGroup:function(a){return jQuery(a.form||document).find('[@name="'+a.name+'"]')},getLength:function(a,b){switch(b.nodeName.toLowerCase()){case'select':return jQuery("option:selected",b).length;case'input':if(this.checkable(b))return this.checkableGroup(b).filter(':checked').length}return a.length},depend:function(a,b){return this.dependTypes[typeof a]?this.dependTypes[typeof a](a,b):true},dependTypes:{"boolean":function(a,b){return a},"string":function(a,b){return!!jQuery(a,b.form).length},"function":function(a,b){return a(b)}},required:function(a){return!jQuery.validator.methods.required.call(this,jQuery.trim(a.value),a)}},methods:{required:function(a,b,c){if(!this.depend(c,b))return-1;switch(b.nodeName.toLowerCase()){case'select':var d=jQuery("option:selected",b);return d.length>0&&(b.type=="select-multiple"||(jQuery.browser.msie&&!(d[0].attributes['value'].specified)?d[0].text:d[0].value).length>0);case'input':if(this.checkable(b))return this.getLength(a,b)>0;default:return a.length>0}},minLength:function(a,b,c){return this.required(b)||this.getLength(a,b)>=c},maxLength:function(a,b,c){return this.required(b)||this.getLength(a,b)<=c},rangeLength:function(a,b,c){var d=this.getLength(a,b);return this.required(b)||(d>=c[0]&&d<=c[1])},minValue:function(a,b,c){return this.required(b)||a>=c},maxValue:function(a,b,c){return this.required(b)||a<=c},rangeValue:function(a,b,c){return this.required(b)||(a>=c[0]&&a<=c[1])},email:function(a,b){return this.required(b)||/^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/i.test(a)},url:function(a,b){return this.required(b)||/^(https?|ftp):\/\/[A-Z0-9](\.?[A-Z0-9ÄÜÖ][A-Z0-9_\-ÄÜÖ]*)*(\/([A-Z0-9ÄÜÖ][A-Z0-9_\-\.ÄÜÖ]*)?)*(\?([A-Z0-9ÄÜÖ][A-Z0-9_\-\.%\+=&ÄÜÖ]*)?)?$/i.test(a)},date:function(a,b){return this.required(b)||!/Invalid|NaN/.test(new Date(a))},dateISO:function(a,b){return this.required(b)||/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(a)},dateDE:function(a,b){return this.required(b)||/^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(a)},number:function(a,b){return this.required(b)||/^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(a)},numberDE:function(a,b){return this.required(b)||/^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(a)},digits:function(a,b){return this.required(b)||/^\d+$/.test(a)},creditcard:function(a,b){if(this.required(b))return true;var c=0,e=0,bEven=false;a=a.replace(/\D/g,"");for(n=a.length-1;n>=0;n--){var d=a.charAt(n);var e=parseInt(d,10);if(bEven){if((e*=2)>9)e-=9}c+=e;bEven=!bEven}return(c%10)==0},accept:function(a,b,c){c=typeof c=="string"?c:"png|jpe?g|gif";return this.required(b)||a.match(new RegExp(".("+c+")$"))},equalTo:function(a,b,c){return a==jQuery(c).val()}},addMethod:function(a,b,c){jQuery.validator.methods[a]=b;jQuery.validator.messages[a]=c}});