

;(function($){

var $$;


/**
 * 
 * @desc Convert images from a simple html <ul> into a thumbnail gallery
 * @author David Hellsing
 * @version 1.0
 *
 * @name Galleria
 * @type jQuery
 *
 * @cat plugins/Media
 * 
 * @example $('ul.gallery').galleria({options});
 * @desc Create a a gallery from an unordered list of images with thumbnails
 * @options
 *   insert:   (selector string) by default, Galleria will create a container div before your ul that holds the image.
 *             You can, however, specify a selector where the image will be placed instead (f.ex '#main_img')
 *   history:  Boolean for setting the history object in action with enabled back button, bookmarking etc.
 *   onImage:  (function) a function that gets fired when the image is displayed and brings the jQuery image object.
 *             You can use it to add click functionality and effects.
 *             f.ex onImage(image) { image.css('display','none').fadeIn(); } will fadeIn each image that is displayed
 *   onThumb:  (function) a function that gets fired when the thumbnail is displayed and brings the jQuery thumb object.
 *             Works the same as onImage except it targets the thumbnail after it's loaded.
 *
**/

$$ = $.fn.galleria = function($options) {
	
	// check for basic CSS support
	if (!$$.hasCSS()) { return false; }
	
	// init the modified history object
	$.historyInit($$.onPageLoad);
	
	// set default options
	var $defaults = {
		insert      : '.galleria_container',
		history     : true,
		clickNext   : true,
		onImage     : function(image,caption,thumb) {},
		onThumb     : function(thumb) {}
	};
	

	// extend the options
	var $opts = $.extend($defaults, $options);
	
	// bring the options to the galleria object
	for (var i in $opts) {
		$.galleria[i]  = $opts[i];
	}
	
	// if no insert selector, create a new division and insert it before the ul
	var _insert = ( $($opts.insert).is($opts.insert) ) ? 
		$($opts.insert) : 
		jQuery(document.createElement('div')).insertBefore(this);
		
	// create a wrapping div for the image
	var _div = $(document.createElement('div')).addClass('galleria_wrapper');
	
	// create a caption span
	var _span = $(document.createElement('span')).addClass('caption');
	
	// inject the wrapper in in the insert selector
	_insert.addClass('galleria_container').append(_div).append(_span);
	
	//-------------
	
	return this.each(function(){
		
		// add the Galleria class
		$(this).addClass('galleria');
		
		// loop through list
		$(this).children('li').each(function(i) {
			
			// bring the scope
			var _container = $(this);
			                
			// build element specific options
			var _o = $.meta ? $.extend({}, $opts, _container.data()) : $opts;
			
			// remove the clickNext if image is only child
			_o.clickNext = $(this).is(':only-child') ? false : _o.clickNext;
			
			// try to fetch an anchor
			var _a = $(this).find('a').is('a') ? $(this).find('a') : false;
			
			// reference the original image as a variable and hide it
			var _img = $(this).children('img').css('display','none');
			
			// extract the original source
			var _src = _a ? _a.attr('href') : _img.attr('src');
			
			// find a title
			//var _title = _a ? _a.attr('title') : _img.attr('title');
			var _title ='';
			// create loader image            
			var _loader = new Image();
			
			// check url and activate container if match
			if (_o.history && (window.location.hash && window.location.hash.replace(/\#/,'') == _src)) {
				_container.siblings('.active').removeClass('active');
				_container.addClass('active');
			}
		
			// begin loader
			$(_loader).load(function () {
				
				// try to bring the alt
				$(this).attr('alt',_img.attr('alt'));
				
				//-----------------------------------------------------------------
				// the image is loaded, let's create the thumbnail
				
				var _thumb = _a ? 
					_a.find('img').addClass('thumb noscale').css('display','none') :
					_img.clone(true).addClass('thumb').css('display','none');
				
				if (_a) { _a.replaceWith(_thumb); }
				
				if (!_thumb.hasClass('noscale')) { // scaled tumbnails!
					var w = Math.ceil( _img.width() / _img.height() * _container.height() );
					var h = Math.ceil( _img.height() / _img.width() * _container.width() );
					if (w < h) {
						_thumb.css({ height: 'auto', width: _container.width(), marginTop: -(h-_container.height())/2 });
					} else {
						_thumb.css({ width: 'auto', height: _container.height(), marginLeft: -(w-_container.width())/2 });
					}
				} else { // Center thumbnails.
					// a tiny timer fixed the width/height
					window.setTimeout(function() {
						_thumb.css({
							marginLeft: -( _thumb.width() - _container.width() )/2, 
							marginTop:  -( _thumb.height() - _container.height() )/2
						});
					}, 1);
				}
				
				// add the rel attribute
				_thumb.attr('rel',_src);
				
				// add the title attribute
				_thumb.attr('title',_title);
				
				// add the click functionality to the _thumb
				_thumb.click(function() {
					$.galleria.activate(_src);
					endpoint = _src.indexOf('&');
					newsrc = _src.substr(0,endpoint)
					//alert(newsrc)
					$('#dota').attr("href", newsrc);
					$('#main_image').attr("href", newsrc);
;
				});
				
				// hover classes for IE6
				_thumb.hover(
					function() { $(this).addClass('hover'); },
					function() { $(this).removeClass('hover'); }
				);
				_container.hover(
					function() { _container.addClass('hover'); },
					function() { _container.removeClass('hover'); }
				);

				// prepend the thumbnail in the container
				_container.prepend(_thumb);
				
				// show the thumbnail
				_thumb.css('display','block');
				
				// call the onThumb function
				_o.onThumb(jQuery(_thumb));
				
				// check active class and activate image if match
				if (_container.hasClass('active')) {
					$.galleria.activate(_src);
					//_span.text(_title);
				}
				
				//-----------------------------------------------------------------
				
				// finally delete the original image
				_img.remove();
				
			}).error(function () {
				
				// Error handling
			    _container.html('<span class="error" style="color:red">Error loading image: '+_src+'</span>');
			
			}).attr('src', _src);
		});
	});
};

/**
 *
 * @name NextSelector
 *
 * @desc Returns the sibling sibling, or the first one
 *
**/

$$.nextSelector = function(selector) {
	return $(selector).is(':last-child') ?
		   $(selector).siblings(':first-child') :
    	   $(selector).next();
    	   
};

/**
 *
 * @name previousSelector
 *
 * @desc Returns the previous sibling, or the last one
 *
**/

$$.previousSelector = function(selector) {
	return $(selector).is(':first-child') ?
		   $(selector).siblings(':last-child') :
    	   $(selector).prev();
    	   
};

/**
 *
 * @name hasCSS
 *
 * @desc Checks for CSS support and returns a boolean value
 *
**/

$$.hasCSS = function()  {
	$('body').append(
		$(document.createElement('div')).attr('id','css_test')
		.css({ width:'1px', height:'1px', display:'none' })
	);
	var _v = ($('#css_test').width() != 1) ? false : true;
	$('#css_test').remove();
	return _v;
};

/**
 *
 * @name onPageLoad
 *
 * @desc The function that displays the image and alters the active classes
 *
 * Note: This function gets called when:
 * 1. after calling $.historyInit();
 * 2. after calling $.historyLoad();
 * 3. after pushing "Go Back" button of a browser
 *
**/

$$.onPageLoad = function(_src) {	
	
	// get the wrapper
	var _wrapper = $('.galleria_wrapper');
	
	// get the thumb
	var _thumb = $('.galleria img[@rel="'+_src+'"]');
	
	if (_src) {
		
		// new hash location
		if ($.galleria.history) {
			window.location = window.location.href.replace(/\#.*/,'') + '#' + _src;
		}
		
		// alter the active classes
		_thumb.parents('li').siblings('.active').removeClass('active');
		_thumb.parents('li').addClass('active');
	
		// define a new image
		var _img   = $(new Image()).attr('src',_src).addClass('replaced');

		// empty the wrapper and insert the new image
		_wrapper.empty().append(_img);

		// insert the caption
		_wrapper.siblings('.caption').text(_thumb.attr('title'));
		
		// fire the onImage function to customize the loaded image's features
		$.galleria.onImage(_img,_wrapper.siblings('.caption'),_thumb);
		
		// add clickable image helper
		if($.galleria.clickNext) {
			_img.css('cursor','pointer').click(function() { $.galleria.next(); })
		}
		
	} else {
		
		// clean up the container if none are active
		_wrapper.siblings().andSelf().empty();
		
		// remove active classes
		$('.galleria li.active').removeClass('active');
	}

	// place the source in the galleria.current variable
	$.galleria.current = _src;
	
}

/**
 *
 * @name jQuery.galleria
 *
 * @desc The global galleria object holds four constant variables and four public methods:
 *       $.galleria.history = a boolean for setting the history object in action with named URLs
 *       $.galleria.current = is the current source that's being viewed.
 *       $.galleria.clickNext = boolean helper for adding a clickable image that leads to the next one in line
 *       $.galleria.next() = displays the next image in line, returns to first image after the last.
 *       $.galleria.prev() = displays the previous image in line, returns to last image after the first.
 *       $.galleria.activate(_src) = displays an image from _src in the galleria container.
 *       $.galleria.onImage(image,caption) = gets fired when the image is displayed.
 *
**/

$.extend({galleria : {
	current : '',
	onImage : function(){},
	activate : function(_src) { 
		if ($.galleria.history) {
			$.historyLoad(_src);
		} else {
			$$.onPageLoad(_src);
		}
	},
	next : function() {
		var _next = $($$.nextSelector($('.galleria img[@rel="'+$.galleria.current+'"]').parents('li'))).find('img').attr('rel');
		$.galleria.activate(_next);
		
	},
	prev : function() {
		var _prev = $($$.previousSelector($('.galleria img[@rel="'+$.galleria.current+'"]').parents('li'))).find('img').attr('rel');
		$.galleria.activate(_prev);
	}
}
});

})(jQuery);


/**
 *
 * Packed history extension for jQuery
 * Credits to http://www.mikage.to/
 *
**/


jQuery.extend({historyCurrentHash:undefined,historyCallback:undefined,historyInit:function(callback){jQuery.historyCallback=callback;var current_hash=location.hash;jQuery.historyCurrentHash=current_hash;if(jQuery.browser.msie){if(jQuery.historyCurrentHash==''){jQuery.historyCurrentHash='#'}$("body").prepend('<iframe id="jQuery_history" style="display: none;"></iframe>');var ihistory=$("#jQuery_history")[0];var iframe=ihistory.contentWindow.document;iframe.open();iframe.close();iframe.location.hash=current_hash}else if($.browser.safari){jQuery.historyBackStack=[];jQuery.historyBackStack.length=history.length;jQuery.historyForwardStack=[];jQuery.isFirst=true}jQuery.historyCallback(current_hash.replace(/^#/,''));setInterval(jQuery.historyCheck,100)},historyAddHistory:function(hash){jQuery.historyBackStack.push(hash);jQuery.historyForwardStack.length=0;this.isFirst=true},historyCheck:function(){if(jQuery.browser.msie){var ihistory=$("#jQuery_history")[0];var iframe=ihistory.contentDocument||ihistory.contentWindow.document;var current_hash=iframe.location.hash;if(current_hash!=jQuery.historyCurrentHash){location.hash=current_hash;jQuery.historyCurrentHash=current_hash;jQuery.historyCallback(current_hash.replace(/^#/,''))}}else if($.browser.safari){if(!jQuery.dontCheck){var historyDelta=history.length-jQuery.historyBackStack.length;if(historyDelta){jQuery.isFirst=false;if(historyDelta<0){for(var i=0;i<Math.abs(historyDelta);i++)jQuery.historyForwardStack.unshift(jQuery.historyBackStack.pop())}else{for(var i=0;i<historyDelta;i++)jQuery.historyBackStack.push(jQuery.historyForwardStack.shift())}var cachedHash=jQuery.historyBackStack[jQuery.historyBackStack.length-1];if(cachedHash!=undefined){jQuery.historyCurrentHash=location.hash;jQuery.historyCallback(cachedHash)}}else if(jQuery.historyBackStack[jQuery.historyBackStack.length-1]==undefined&&!jQuery.isFirst){if(document.URL.indexOf('#')>=0){jQuery.historyCallback(document.URL.split('#')[1])}else{var current_hash=location.hash;jQuery.historyCallback('')}jQuery.isFirst=true}}}else{var current_hash=location.hash;if(current_hash!=jQuery.historyCurrentHash){jQuery.historyCurrentHash=current_hash;jQuery.historyCallback(current_hash.replace(/^#/,''))}}},historyLoad:function(hash){var newhash;if(jQuery.browser.safari){newhash=hash}else{newhash='#'+hash;location.hash=newhash}jQuery.historyCurrentHash=newhash;if(jQuery.browser.msie){var ihistory=$("#jQuery_history")[0];var iframe=ihistory.contentWindow.document;iframe.open();iframe.close();iframe.location.hash=newhash;jQuery.historyCallback(hash)}else if(jQuery.browser.safari){jQuery.dontCheck=true;this.historyAddHistory(hash);var fn=function(){jQuery.dontCheck=false};window.setTimeout(fn,200);jQuery.historyCallback(hash);location.hash=newhash}else{jQuery.historyCallback(hash)}}});


// validate.php and meta.js

(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( {}, $.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); }, 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: "", 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).", 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 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");validator.settings["on" + event.type] && validator.settings["on" + event.type].call(validator, this[0] );}$(this.currentForm).delegate("focusin focusout keyup", ":text, :password, :file, select, textarea", delegate).delegate("click", ":radio, :checkbox", 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();} 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.formSubmitted = false;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");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 );if ( typeof message == "function" ) message = message.call(this, rule.parameters, element);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) {return this.errors().filter("[for='" + this.idOrName(element) + "']"); },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();} else if (!valid && this.pendingRequest == 0 && this.formSubmitted) {$(this.currentForm).triggerHandler("invalid-form", [this]);} },previousValue: function(element) {return $.data(element, "previousValue") || $.data(element, "previousValue", previous = {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 || $.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 options = $("option:selected", element);return options.length > 0 && ( element.type == "select-multiple" || ($.browser.msie && !(options[0].attributes['value'].specified) ? options[0].text : options[0].value).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] = {};this.settings.messages[element.name].remote = typeof previous.message == "function" ? previous.message(value) : 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) {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 = {};errors[element.name] = previous.message = response || validator.defaultMessage( element, "remote" );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); },dateDE: function(value, element) {return this.optional(element) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value); },number: function(value, element) {return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value); },numberDE: 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 (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) {return value == $(param).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($) {$.each({ focus: 'focusin', blur: 'focusout' }, function( original, fix ){ $.event.special[fix] = {setup:function() {if ( $.browser.msie ) return false;this.addEventListener( original, $.event.special[fix].handler, true );},teardown:function() {if ( $.browser.msie ) return false;this.removeEventListener( original,$.event.special[fix].handler, true );},handler: function(e) {arguments[0] = $.event.fix(e);arguments[0].type = fix;return $.event.handle.apply(this, arguments);} };});$.extend($.fn, { delegate: function(type, delegate, handler) {return this.bind(type, function(event) {var target = $(event.target);if (target.is(delegate)) {return handler.apply(target, arguments);}}); }, triggerEvent: function(type, target) {return this.triggerHandler(type, [$.event.fix({ type: type, target: target })]); }})})(jQuery);(function($) {$.extend({metadata : { defaults : {type: 'class',name: 'metadata',cre: /({.*})/,single: 'metadata' }, setType: function( type, name ){this.defaults.type = type;this.defaults.name = name; }, get: function( elem, opts ){var settings = $.extend({},this.defaults,opts);if ( !settings.single.length ) settings.single = 'metadata';var data = $.data(elem, settings.single);if ( data ) return data;data = "{}";if ( settings.type == "class" ) {var m = settings.cre.exec( elem.className );if ( m )data = m[1];} else if ( settings.type == "elem" ) {if( !elem.getElementsByTagName )return undefined;var e = elem.getElementsByTagName(settings.name);if ( e.length )data = $.trim(e[0].innerHTML);} else if ( elem.getAttribute != undefined ) {var attr = elem.getAttribute( settings.name );if ( attr )data = attr;}if ( data.indexOf( '{' ) <0 )data = "{" + data + "}";data = eval("(" + data + ")");$.data( elem, settings.single, data );return data; }}});$.fn.metadata = function( opts ){return $.metadata.get( this[0], opts );};})(jQuery);

