/*
 * jQuery Easing v1.1 - http://gsgd.co.uk/sandbox/jquery.easing.php
 *
 * Uses the built in easing capabilities added in jQuery 1.1
 * to offer multiple easing options
 *
 * Copyright (c) 2007 George Smith
 * Licensed under the MIT License:
 *   http://www.opensource.org/licenses/mit-license.php
 */
jQuery.easing={easein:function(x,t,b,c,d){return c*(t/=d)*t+b},easeinout:function(x,t,b,c,d){if(t<d/2)return 2*c*t*t/(d*d)+b;var a=t-d/2;return-2*c*a*a/(d*d)+2*c*a/d+c/2+b},easeout:function(x,t,b,c,d){return-c*t*t/(d*d)+2*c*t/d+b},expoin:function(x,t,b,c,d){var a=1;if(c<0){a*=-1;c*=-1}return a*(Math.exp(Math.log(c)/d*t))+b},expoout:function(x,t,b,c,d){var a=1;if(c<0){a*=-1;c*=-1}return a*(-Math.exp(-Math.log(c)/d*(t-d))+c+1)+b},expoinout:function(x,t,b,c,d){var a=1;if(c<0){a*=-1;c*=-1}if(t<d/2)return a*(Math.exp(Math.log(c/2)/(d/2)*t))+b;return a*(-Math.exp(-2*Math.log(c/2)/d*(t-d))+c+1)+b},bouncein:function(x,t,b,c,d){return c-jQuery.easing['bounceout'](x,d-t,0,c,d)+b},bounceout:function(x,t,b,c,d){if((t/=d)<(1/2.75)){return c*(7.5625*t*t)+b}else if(t<(2/2.75)){return c*(7.5625*(t-=(1.5/2.75))*t+.75)+b}else if(t<(2.5/2.75)){return c*(7.5625*(t-=(2.25/2.75))*t+.9375)+b}else{return c*(7.5625*(t-=(2.625/2.75))*t+.984375)+b}},bounceinout:function(x,t,b,c,d){if(t<d/2)return jQuery.easing['bouncein'](x,t*2,0,c,d)*.5+b;return jQuery.easing['bounceout'](x,t*2-d,0,c,d)*.5+c*.5+b},elasin:function(x,t,b,c,d){var s=1.70158;var p=0;var a=c;if(t==0)return b;if((t/=d)==1)return b+c;if(!p)p=d*.3;if(a<Math.abs(c)){a=c;var s=p/4}else var s=p/(2*Math.PI)*Math.asin(c/a);return-(a*Math.pow(2,10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p))+b},elasout:function(x,t,b,c,d){var s=1.70158;var p=0;var a=c;if(t==0)return b;if((t/=d)==1)return b+c;if(!p)p=d*.3;if(a<Math.abs(c)){a=c;var s=p/4}else var s=p/(2*Math.PI)*Math.asin(c/a);return a*Math.pow(2,-10*t)*Math.sin((t*d-s)*(2*Math.PI)/p)+c+b},elasinout:function(x,t,b,c,d){var s=1.70158;var p=0;var a=c;if(t==0)return b;if((t/=d/2)==2)return b+c;if(!p)p=d*(.3*1.5);if(a<Math.abs(c)){a=c;var s=p/4}else var s=p/(2*Math.PI)*Math.asin(c/a);if(t<1)return-.5*(a*Math.pow(2,10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p))+b;return a*Math.pow(2,-10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p)*.5+c+b},backin:function(x,t,b,c,d){var s=1.70158;return c*(t/=d)*t*((s+1)*t-s)+b},backout:function(x,t,b,c,d){var s=1.70158;return c*((t=t/d-1)*t*((s+1)*t+s)+1)+b},backinout:function(x,t,b,c,d){var s=1.70158;if((t/=d/2)<1)return c/2*(t*t*(((s*=(1.525))+1)*t-s))+b;return c/2*((t-=2)*t*(((s*=(1.525))+1)*t+s)+2)+b},linear:function(x,t,b,c,d){return c*t/d+b}};
 

 
 
 
 /*
  * Superfish v1.4.8 - jQuery menu widget
  * Copyright (c) 2008 Joel Birch
  *
  * Dual licensed under the MIT and GPL licenses:
  * 	http://www.opensource.org/licenses/mit-license.php
  * 	http://www.gnu.org/licenses/gpl.html
  *
  * CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt
  */
 
 ;(function($){
 	$.fn.superfish = function(op){
 
 		var sf = $.fn.superfish,
 			c = sf.c,
 			$arrow = $(['<span class="',c.arrowClass,'"></span>'].join('')),
 			over = function(){
 				var $$ = $(this), menu = getMenu($$);
 				clearTimeout(menu.sfTimer);
 				$$.showSuperfishUl().siblings().hideSuperfishUl();
 			},
 			out = function(){
 				var $$ = $(this), menu = getMenu($$), o = sf.op;
 				clearTimeout(menu.sfTimer);
 				menu.sfTimer=setTimeout(function(){
 					o.retainPath=($.inArray($$[0],o.$path)>-1);
 					$$.hideSuperfishUl();
 					if (o.$path.length && $$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);}
 				},o.delay);	
 			},
 			getMenu = function($menu){
 				var menu = $menu.parents(['ul.',c.menuClass,':first'].join(''))[0];
 				sf.op = sf.o[menu.serial];
 				return menu;
 			},
 			addArrow = function($a){ $a.addClass(c.anchorClass).append($arrow.clone()); };
 			
 		return this.each(function() {
 			var s = this.serial = sf.o.length;
 			var o = $.extend({},sf.defaults,op);
 			o.$path = $('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){
 				$(this).addClass([o.hoverClass,c.bcClass].join(' '))
 					.filter('li:has(ul)').removeClass(o.pathClass);
 			});
 			sf.o[s] = sf.op = o;
 			
 			$('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](over,out).each(function() {
 				if (o.autoArrows) addArrow( $('>a:first-child',this) );
 			})
 			.not('.'+c.bcClass)
 				.hideSuperfishUl();
 			
 			var $a = $('a',this);
 			$a.each(function(i){
 				var $li = $a.eq(i).parents('li');
 				$a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);});
 			});
 			o.onInit.call(this);
 			
 		}).each(function() {
 			var menuClasses = [c.menuClass];
 			if (sf.op.dropShadows  && !($.browser.msie && $.browser.version < 7)) menuClasses.push(c.shadowClass);
 			$(this).addClass(menuClasses.join(' '));
 		});
 	};
 
 	var sf = $.fn.superfish;
 	sf.o = [];
 	sf.op = {};
 	sf.IE7fix = function(){
 		var o = sf.op;
 		if ($.browser.msie && $.browser.version > 6 && o.dropShadows && o.animation.opacity!=undefined)
 			this.toggleClass(sf.c.shadowClass+'-off');
 		};
 	sf.c = {
 		bcClass     : 'sf-breadcrumb',
 		menuClass   : 'sf-js-enabled',
 		anchorClass : 'sf-with-ul',
 		arrowClass  : 'sf-sub-indicator',
 		shadowClass : 'sf-shadow'
 	};
 	sf.defaults = {
 		hoverClass	: 'sfHover',
 		pathClass	: 'overideThisToUse',
 		pathLevels	: 1,
 		delay		: 100,
 		animation	: {opacity:'show'},
 		speed		: 'normal',
 		autoArrows	: true,
 		dropShadows : true,
 		disableHI	: false,		// true disables hoverIntent detection
 		onInit		: function(){}, // callback functions
 		onBeforeShow: function(){},
 		onShow		: function(){},
 		onHide		: function(){}
 	};
 	$.fn.extend({
 		hideSuperfishUl : function(){
 			var o = sf.op,
 				not = (o.retainPath===true) ? o.$path : '';
 			o.retainPath = false;
 			var $ul = $(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass)
 					.find('>ul').hide().css('visibility','hidden');
 			o.onHide.call($ul);
 			return this;
 		},
 		showSuperfishUl : function(){
 			var o = sf.op,
 				sh = sf.c.shadowClass+'-off',
 				$ul = this.addClass(o.hoverClass)
 					.find('>ul:hidden').css('visibility','visible');
 			sf.IE7fix.call($ul);
 			o.onBeforeShow.call($ul);
 			$ul.animate(o.animation,o.speed,function(){ sf.IE7fix.call($ul); o.onShow.call($ul); });
 			return this;
 		}
 	});
 
 })(jQuery);
 
 
 
 
 
 /*
  * jQuery validation plug-in 1.5.5
  *
  * 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, {
 	// http://docs.jquery.com/Plugins/Validation/validate
 	validate: function( options ) {
 
 		// if nothing is selected, return nothing; can't chain anyway
 		if (!this.length) {
 			options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" );
 			return;
 		}
 
 		// check if a validator for this form was already created
 		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 ) {
 		
 			// allow suppresing validation by adding a cancel class to the submit button
 			this.find("input, button").filter(".cancel").click(function() {
 				validator.cancelSubmit = true;
 			});
 			
 			// when a submitHandler is used, capture the submitting button
 			if (validator.settings.submitHandler) {
 				this.find("input, button").filter(":submit").click(function() {
 					validator.submitButton = this;
 				});
 			}
 		
 			// validate the form on submit
 			this.submit( function( event ) {
 				if ( validator.settings.debug )
 					// prevent form submit to be able to see console output
 					event.preventDefault();
 					
 				function handle() {
 					if ( validator.settings.submitHandler ) {
 						if (validator.submitButton) {
 							// insert a hidden input as a replacement for the missing submit button
 							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) {
 							// and clean up afterwards; thanks to no-block-scope, hidden can be referenced
 							hidden.remove();
 						}
 						return false;
 					}
 					return true;
 				}
 					
 				// prevent submit for invalid forms or custom submit handlers
 				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;
 	},
 	// http://docs.jquery.com/Plugins/Validation/valid
 	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;
         }
     },
 	// attributes: space seperated list of attributes to retrieve and remove
 	removeAttrs: function(attributes) {
 		var result = {},
 			$element = this;
 		$.each(attributes.split(/\s/), function(index, value) {
 			result[value] = $element.attr(value);
 			$element.removeAttr(value);
 		});
 		return result;
 	},
 	// http://docs.jquery.com/Plugins/Validation/rules
 	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);
 		
 		// make sure required is at front
 		if (data.required) {
 			var param = data.required;
 			delete data.required;
 			data = $.extend({required: param}, data);
 		}
 		
 		return data;
 	}
 });
 
 // Custom selectors
 $.extend($.expr[":"], {
 	// http://docs.jquery.com/Plugins/Validation/blank
 	blank: function(a) {return !$.trim(a.value);},
 	// http://docs.jquery.com/Plugins/Validation/filled
 	filled: function(a) {return !!$.trim(a.value);},
 	// http://docs.jquery.com/Plugins/Validation/unchecked
 	unchecked: function(a) {return !a.checked;}
 });
 
 // constructor for validator
 $.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: "span",
 		focusInvalid: true,
 		errorContainer: $( [] ),
 		errorLabelContainer: $( [] ),
 		onsubmit: true,
 		ignore: [],
 		ignoreTitle: false,
 		onfocusin: function(element) {
 			this.lastActive = element;
 				
 			// hide error label and remove error class on focus if enabled
 			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);
 		}
 	},
 
 	// http://docs.jquery.com/Plugins/Validation/Validator/setDefaults
 	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");
 				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);
 		},
 
 		// http://docs.jquery.com/Plugins/Validation/Validator/form
 		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(); 
 		},
 		
 		// http://docs.jquery.com/Plugins/Validation/Validator/element
 		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() ) {
 				// Hide error containers on last error
 				this.toHide = this.toHide.add( this.containers );
 			}
 			this.showErrors();
 			return result;
 		},
 
 		// http://docs.jquery.com/Plugins/Validation/Validator/showErrors
 		showErrors: function(errors) {
 			if(errors) {
 				// add items to error list and map
 				$.extend( this.errorMap, errors );
 				this.errorList = [];
 				for ( var name in errors ) {
 					this.errorList.push({
 						message: errors[name],
 						element: this.findByName(name)[0]
 					});
 				}
 				// remove items from success list
 				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();
 		},
 		
 		// http://docs.jquery.com/Plugins/Validation/Validator/resetForm
 		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) {
 					// ignore IE throwing errors when focusing hidden elements
 				}
 			}
 		},
 		
 		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 = {};
 			
 			// select all valid inputs inside the form (no submit or reset buttons)
 			// workaround $Query([]).add until http://dev.jquery.com/ticket/2114 is solved
 			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);
 			
 				// select only the first element for each name, and only those with rules specified
 				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 radio/checkbox, validate first element in group instead
 			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 a method indicates that the field is optional and therefore valid,
 					// don't mark it as valid when there are no other rules
 					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;
 		},
 		
 		// return the custom message for the given element and validation method
 		// specified in the element's "messages" metadata
 		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];
 		},
 		
 		// return the custom message for the given element name and validation method
 		customMessage: function( name, method ) {
 			var m = this.settings.messages[name];
 			return m && (m.constructor == String
 				? m
 				: m[method]);
 		},
 		
 		// return the first defined argument, allowing empty strings
 		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 ),
 				// title is never undefined, so handle empty string as undefined
 				!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 ) {
 				// refresh error/success class
 				label.removeClass().addClass( this.settings.errorClass );
 			
 				// check if we have a generated label, replace the message then
 				label.attr("generated") && label.html(message);
 			} else {
 				// create label
 				label = $("<" + this.settings.errorElement + "/>")
 					.attr({"for":  this.idOrName(element), generated: true})
 					.addClass(this.settings.errorClass)
 					.html(message || "");
 				if ( this.settings.wrapper ) {
 					// make sure the element is visible, even in IE
 					// actually showing the wrapped element is handled elsewhere
 					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 ) {
 			// select by name and filter by form for performance over form.find("[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--;
 			// sometimes synchronization fails, make sure pendingRequest is never < 0
 			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;
 			}
 		}
 		
 		// maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs
 		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) {
 		// handle dependency check
 		$.each(rules, function(prop, val) {
 			// ignore rule when param is explicitly false, eg. required:false
 			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];
 				}
 			}
 		});
 		
 		// evaluate parameters
 		$.each(rules, function(rule, parameter) {
 			rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter;
 		});
 		
 		// clean number parameters
 		$.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) {
 			// auto-create ranges
 			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;
 			}
 		}
 		
 		// To support custom messages in metadata ignore rule methods titled "messages"
 		if (rules.messages) {
 			delete rules.messages
 		}
 		
 		return rules;
 	},
 	
 	// Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
 	normalizeRule: function(data) {
 		if( typeof data == "string" ) {
 			var transformed = {};
 			$.each(data.split(/\s/), function() {
 				transformed[this] = true;
 			});
 			data = transformed;
 		}
 		return data;
 	},
 	
 	// http://docs.jquery.com/Plugins/Validation/Validator/addMethod
 	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: {
 
 		// http://docs.jquery.com/Plugins/Validation/Methods/required
 		required: function(value, element, param) {
 			// check if dependency is met
 			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;
 			}
 		},
 		
 		// http://docs.jquery.com/Plugins/Validation/Methods/remote
 		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;
 		},
 
 		// http://docs.jquery.com/Plugins/Validation/Methods/minlength
 		minlength: function(value, element, param) {
 			return this.optional(element) || this.getLength($.trim(value), element) >= param;
 		},
 		
 		// http://docs.jquery.com/Plugins/Validation/Methods/maxlength
 		maxlength: function(value, element, param) {
 			return this.optional(element) || this.getLength($.trim(value), element) <= param;
 		},
 		
 		// http://docs.jquery.com/Plugins/Validation/Methods/rangelength
 		rangelength: function(value, element, param) {
 			var length = this.getLength($.trim(value), element);
 			return this.optional(element) || ( length >= param[0] && length <= param[1] );
 		},
 		
 		// http://docs.jquery.com/Plugins/Validation/Methods/min
 		min: function( value, element, param ) {
 			return this.optional(element) || value >= param;
 		},
 		
 		// http://docs.jquery.com/Plugins/Validation/Methods/max
 		max: function( value, element, param ) {
 			return this.optional(element) || value <= param;
 		},
 		
 		// http://docs.jquery.com/Plugins/Validation/Methods/range
 		range: function( value, element, param ) {
 			return this.optional(element) || ( value >= param[0] && value <= param[1] );
 		},
 		
 		// http://docs.jquery.com/Plugins/Validation/Methods/email
 		email: function(value, element) {
 			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
 			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);
 		},
 	
 		// http://docs.jquery.com/Plugins/Validation/Methods/url
 		url: function(value, element) {
 			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
 			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);
 		},
         
 		// http://docs.jquery.com/Plugins/Validation/Methods/date
 		date: function(value, element) {
 			return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
 		},
 	
 		// http://docs.jquery.com/Plugins/Validation/Methods/dateISO
 		dateISO: function(value, element) {
 			return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value);
 		},
 	
 		// http://docs.jquery.com/Plugins/Validation/Methods/dateDE
 		dateDE: function(value, element) {
 			return this.optional(element) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value);
 		},
 	
 		// http://docs.jquery.com/Plugins/Validation/Methods/number
 		number: function(value, element) {
 			return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value);
 		},
 	
 		// http://docs.jquery.com/Plugins/Validation/Methods/numberDE
 		numberDE: function(value, element) {
 			return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);
 		},
 		
 		// http://docs.jquery.com/Plugins/Validation/Methods/digits
 		digits: function(value, element) {
 			return this.optional(element) || /^\d+$/.test(value);
 		},
 		
 		// http://docs.jquery.com/Plugins/Validation/Methods/creditcard
 		// based on http://en.wikipedia.org/wiki/Luhn
 		creditcard: function(value, element) {
 			if ( this.optional(element) )
 				return "dependency-mismatch";
 			// accept only digits and dashes
 			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;
 		},
 		
 		// http://docs.jquery.com/Plugins/Validation/Methods/accept
 		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")); 
 		},
 		
 		// http://docs.jquery.com/Plugins/Validation/Methods/equalTo
 		equalTo: function(value, element, param) {
 			return value == $(param).val();
 		}
 		
 	}
 	
 });
 
 // deprecated, use $.validator.format instead
 $.format = $.validator.format;
 
 })(jQuery);
 
 // ajax mode: abort
 // usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
 // if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() 
 ;(function($) {
 	var ajax = $.ajax;
 	var pendingRequests = {};
 	$.ajax = function(settings) {
 		// create settings for compatibility with ajaxSetup
 		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);
 
 // provides cross-browser focusin and focusout events
 // IE has native support, in other browsers, use event caputuring (neither bubbles)
 
 // provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation
 // handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target 
 
 // provides triggerEvent(type: String, target: Element) to trigger delegated events
 ;(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);
 
 /*
  * Translated default messages for the jQuery validation plugin.
  * Language: NL
  */
 jQuery.extend(jQuery.validator.messages, {
         required: "Dit is een verplicht veld.",
         remote: "Controleer dit veld.",
         email: "Vul hier een geldig email adres in.",
         url: "Vul hier een geldige URL in.",
         date: "Vul hier een geldige datum in.",
         dateISO: "Vul hier een geldige datum in (ISO).",
         number: "Vul hier een geldig nummer in.",
         digits: "Vul hier alleen cijfers in.",
         creditcard: "Vul hier een geldig credit card nummer in.",
         equalTo: "Vul hier dezelfde waarde in.",
         accept: "Vul hier een waarde in met een geldige extensie.",
         maxlength: jQuery.format("Vul hier maximaal {0} tekens in."),
         minlength: jQuery.format("Vul hier minimaal {0} tekens in."),
         rangelength: jQuery.format("Vul hier een waarde in van minimaal {0} en maximaal {1} tekens."),
         range: jQuery.format("Vul hier een waarde in van minimaal {0} en maximaal {1}."),
         max: jQuery.format("Vul hier een waarde in kleiner dan of gelijk aan {0}."),
         min: jQuery.format("Vul hier een waarde in groter dan of gelijk aan {0}.")
 });
 
 
 
 
 
 /*!
  * jQuery Cycle Plugin (with Transition Definitions)
  * Examples and documentation at: http://jquery.malsup.com/cycle/
  * Copyright (c) 2007-2009 M. Alsup
  * Version: 2.72 (09-SEP-2009)
  * Dual licensed under the MIT and GPL licenses:
  * http://www.opensource.org/licenses/mit-license.php
  * http://www.gnu.org/licenses/gpl.html
  * Requires: jQuery v1.2.6 or later
  *
  * Originally based on the work of:
  *	1) Matt Oakes
  *	2) Torsten Baldes (http://medienfreunde.com/lab/innerfade/)
  *	3) Benjamin Sterling (http://www.benjaminsterling.com/experiments/jqShuffle/)
  */
 ;(function($) {
 
 var ver = '2.72';
 
 // if $.support is not defined (pre jQuery 1.3) add what I need
 if ($.support == undefined) {
 	$.support = {
 		opacity: !($.browser.msie)
 	};
 }
 
 function debug(s) {
 	if ($.fn.cycle.debug)
 		log(s);
 }		
 function log() {
 	if (window.console && window.console.log)
 		window.console.log('[cycle] ' + Array.prototype.join.call(arguments,' '));
 	//$('body').append('<div>'+Array.prototype.join.call(arguments,' ')+'</div>');
 };
 
 // the options arg can be...
 //   a number  - indicates an immediate transition should occur to the given slide index
 //   a string  - 'stop', 'pause', 'resume', or the name of a transition effect (ie, 'fade', 'zoom', etc)
 //   an object - properties to control the slideshow
 //
 // the arg2 arg can be...
 //   the name of an fx (only used in conjunction with a numeric value for 'options')
 //   the value true (only used in conjunction with a options == 'resume') and indicates
 //	 that the resume should occur immediately (not wait for next timeout)
 
 $.fn.cycle = function(options, arg2) {
 	var o = { s: this.selector, c: this.context };
 
 	// in 1.3+ we can fix mistakes with the ready state
 	if (this.length === 0 && options != 'stop') {
 		if (!$.isReady && o.s) {
 			log('DOM not ready, queuing slideshow');
 			$(function() {
 				$(o.s,o.c).cycle(options,arg2);
 			});
 			return this;
 		}
 		// is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
 		log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
 		return this;
 	}
 
 	// iterate the matched nodeset
 	return this.each(function() {
 		var opts = handleArguments(this, options, arg2);
 		if (opts === false)
 			return;
 
 		// stop existing slideshow for this container (if there is one)
 		if (this.cycleTimeout)
 			clearTimeout(this.cycleTimeout);
 		this.cycleTimeout = this.cyclePause = 0;
 
 		var $cont = $(this);
 		var $slides = opts.slideExpr ? $(opts.slideExpr, this) : $cont.children();
 		var els = $slides.get();
 		if (els.length < 2) {
 			log('terminating; too few slides: ' + els.length);
 			return;
 		}
 
 		var opts2 = buildOptions($cont, $slides, els, opts, o);
 		if (opts2 === false)
 			return;
 
 		var startTime = opts2.continuous ? 10 : getTimeout(opts2.currSlide, opts2.nextSlide, opts2, !opts2.rev);
 
 		// if it's an auto slideshow, kick it off
 		if (startTime) {
 			startTime += (opts2.delay || 0);
 			if (startTime < 10)
 				startTime = 10;
 			debug('first timeout: ' + startTime);
 			this.cycleTimeout = setTimeout(function(){go(els,opts2,0,!opts2.rev)}, startTime);
 		}
 	});
 };
 
 // process the args that were passed to the plugin fn
 function handleArguments(cont, options, arg2) {
 	if (cont.cycleStop == undefined)
 		cont.cycleStop = 0;
 	if (options === undefined || options === null)
 		options = {};
 	if (options.constructor == String) {
 		switch(options) {
 		case 'stop':
 			cont.cycleStop++; // callbacks look for change
 			if (cont.cycleTimeout)
 				clearTimeout(cont.cycleTimeout);
 			cont.cycleTimeout = 0;
 			$(cont).removeData('cycle.opts');
 			return false;
 		case 'pause':
 			cont.cyclePause = 1;
 			return false;
 		case 'resume':
 			cont.cyclePause = 0;
 			if (arg2 === true) { // resume now!
 				options = $(cont).data('cycle.opts');
 				if (!options) {
 					log('options not found, can not resume');
 					return false;
 				}
 				if (cont.cycleTimeout) {
 					clearTimeout(cont.cycleTimeout);
 					cont.cycleTimeout = 0;
 				}
 				go(options.elements, options, 1, 1);
 			}
 			return false;
 		case 'prev':
 		case 'next':
 			var opts = $(cont).data('cycle.opts');
 			if (!opts) {
 				log('options not found, "prev/next" ignored');
 				return false;
 			}
 			$.fn.cycle[options](opts);
 			return false;
 		default:
 			options = { fx: options };
 		};
 		return options;
 	}
 	else if (options.constructor == Number) {
 		// go to the requested slide
 		var num = options;
 		options = $(cont).data('cycle.opts');
 		if (!options) {
 			log('options not found, can not advance slide');
 			return false;
 		}
 		if (num < 0 || num >= options.elements.length) {
 			log('invalid slide index: ' + num);
 			return false;
 		}
 		options.nextSlide = num;
 		if (cont.cycleTimeout) {
 			clearTimeout(cont.cycleTimeout);
 			cont.cycleTimeout = 0;
 		}
 		if (typeof arg2 == 'string')
 			options.oneTimeFx = arg2;
 		go(options.elements, options, 1, num >= options.currSlide);
 		return false;
 	}
 	return options;
 };
 
 function removeFilter(el, opts) {
 	if (!$.support.opacity && opts.cleartype && el.style.filter) {
 		try { el.style.removeAttribute('filter'); }
 		catch(smother) {} // handle old opera versions
 	}
 };
 
 // one-time initialization
 function buildOptions($cont, $slides, els, options, o) {
 	// support metadata plugin (v1.0 and v2.0)
 	var opts = $.extend({}, $.fn.cycle.defaults, options || {}, $.metadata ? $cont.metadata() : $.meta ? $cont.data() : {});
 	if (opts.autostop)
 		opts.countdown = opts.autostopCount || els.length;
 
 	var cont = $cont[0];
 	$cont.data('cycle.opts', opts);
 	opts.$cont = $cont;
 	opts.stopCount = cont.cycleStop;
 	opts.elements = els;
 	opts.before = opts.before ? [opts.before] : [];
 	opts.after = opts.after ? [opts.after] : [];
 	opts.after.unshift(function(){ opts.busy=0; });
 
 	// push some after callbacks
 	if (!$.support.opacity && opts.cleartype)
 		opts.after.push(function() { removeFilter(this, opts); });
 	if (opts.continuous)
 		opts.after.push(function() { go(els,opts,0,!opts.rev); });
 
 	saveOriginalOpts(opts);
 
 	// clearType corrections
 	if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
 		clearTypeFix($slides);
 
 	// container requires non-static position so that slides can be position within
 	if ($cont.css('position') == 'static')
 		$cont.css('position', 'relative');
 	if (opts.width)
 		$cont.width(opts.width);
 	if (opts.height && opts.height != 'auto')
 		$cont.height(opts.height);
 
 	if (opts.startingSlide)
 		opts.startingSlide = parseInt(opts.startingSlide);
 
 	// if random, mix up the slide array
 	if (opts.random) {
 		opts.randomMap = [];
 		for (var i = 0; i < els.length; i++)
 			opts.randomMap.push(i);
 
 		opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
 		opts.randomIndex = 0;
 		opts.startingSlide = opts.randomMap[0];
 	}
 	else if (opts.startingSlide >= els.length)
 		opts.startingSlide = 0; // catch bogus input
 	opts.currSlide = opts.startingSlide = opts.startingSlide || 0;
 	var first = opts.startingSlide;
 
 	// set position and zIndex on all the slides
 	$slides.css({position: 'absolute', top:0, left:0}).hide().each(function(i) {
 		var z = first ? i >= first ? els.length - (i-first) : first-i : els.length-i;
 		$(this).css('z-index', z)
 	});
 
 	// make sure first slide is visible
 	$(els[first]).css('opacity',1).show(); // opacity bit needed to handle restart use case
 	removeFilter(els[first], opts);
 
 	// stretch slides
 	if (opts.fit && opts.width)
 		$slides.width(opts.width);
 	if (opts.fit && opts.height && opts.height != 'auto')
 		$slides.height(opts.height);
 
 	// stretch container
 	var reshape = opts.containerResize && !$cont.innerHeight();
 	if (reshape) { // do this only if container has no size http://tinyurl.com/da2oa9
 		var maxw = 0, maxh = 0;
 		for(var j=0; j < els.length; j++) {
 			var $e = $(els[j]), e = $e[0], w = $e.outerWidth(), h = $e.outerHeight();
 			if (!w) w = e.offsetWidth;
 			if (!h) h = e.offsetHeight;
 			maxw = w > maxw ? w : maxw;
 			maxh = h > maxh ? h : maxh;
 		}
 		if (maxw > 0 && maxh > 0)
 			$cont.css({width:maxw+'px',height:maxh+'px'});
 	}
 
 	if (opts.pause)
 		$cont.hover(function(){this.cyclePause++;},function(){this.cyclePause--;});
 
 	if (supportMultiTransitions(opts) === false)
 		return false;
 
 	// apparently a lot of people use image slideshows without height/width attributes on the images.
 	// Cycle 2.50+ requires the sizing info for every slide; this block tries to deal with that.
 	var requeue = false;
 	options.requeueAttempts = options.requeueAttempts || 0;
 	$slides.each(function() {
 		// try to get height/width of each slide
 		var $el = $(this);
 		this.cycleH = (opts.fit && opts.height) ? opts.height : $el.height();
 		this.cycleW = (opts.fit && opts.width) ? opts.width : $el.width();
 
 		if ( $el.is('img') ) {
 			// sigh..  sniffing, hacking, shrugging...  this crappy hack tries to account for what browsers do when
 			// an image is being downloaded and the markup did not include sizing info (height/width attributes);
 			// there seems to be some "default" sizes used in this situation
 			var loadingIE	= ($.browser.msie  && this.cycleW == 28 && this.cycleH == 30 && !this.complete);
 			var loadingFF	= ($.browser.mozilla && this.cycleW == 34 && this.cycleH == 19 && !this.complete);
 			var loadingOp	= ($.browser.opera && ((this.cycleW == 42 && this.cycleH == 19) || (this.cycleW == 37 && this.cycleH == 17)) && !this.complete);
 			var loadingOther = (this.cycleH == 0 && this.cycleW == 0 && !this.complete);
 			// don't requeue for images that are still loading but have a valid size
 			if (loadingIE || loadingFF || loadingOp || loadingOther) {
 				if (o.s && opts.requeueOnImageNotLoaded && ++options.requeueAttempts < 100) { // track retry count so we don't loop forever
 					log(options.requeueAttempts,' - img slide not loaded, requeuing slideshow: ', this.src, this.cycleW, this.cycleH);
 					setTimeout(function() {$(o.s,o.c).cycle(options)}, opts.requeueTimeout);
 					requeue = true;
 					return false; // break each loop
 				}
 				else {
 					log('could not determine size of image: '+this.src, this.cycleW, this.cycleH);
 				}
 			}
 		}
 		return true;
 	});
 
 	if (requeue)
 		return false;
 
 	opts.cssBefore = opts.cssBefore || {};
 	opts.animIn = opts.animIn || {};
 	opts.animOut = opts.animOut || {};
 
 	$slides.not(':eq('+first+')').css(opts.cssBefore);
 	if (opts.cssFirst)
 		$($slides[first]).css(opts.cssFirst);
 
 	if (opts.timeout) {
 		opts.timeout = parseInt(opts.timeout);
 		// ensure that timeout and speed settings are sane
 		if (opts.speed.constructor == String)
 			opts.speed = $.fx.speeds[opts.speed] || parseInt(opts.speed);
 		if (!opts.sync)
 			opts.speed = opts.speed / 2;
 		while((opts.timeout - opts.speed) < 250) // sanitize timeout
 			opts.timeout += opts.speed;
 	}
 	if (opts.easing)
 		opts.easeIn = opts.easeOut = opts.easing;
 	if (!opts.speedIn)
 		opts.speedIn = opts.speed;
 	if (!opts.speedOut)
 		opts.speedOut = opts.speed;
 
 	opts.slideCount = els.length;
 	opts.currSlide = opts.lastSlide = first;
 	if (opts.random) {
 		opts.nextSlide = opts.currSlide;
 		if (++opts.randomIndex == els.length)
 			opts.randomIndex = 0;
 		opts.nextSlide = opts.randomMap[opts.randomIndex];
 	}
 	else
 		opts.nextSlide = opts.startingSlide >= (els.length-1) ? 0 : opts.startingSlide+1;
 
 	// run transition init fn
 	if (!opts.multiFx) {
 		var init = $.fn.cycle.transitions[opts.fx];
 		if ($.isFunction(init))
 			init($cont, $slides, opts);
 		else if (opts.fx != 'custom' && !opts.multiFx) {
 			log('unknown transition: ' + opts.fx,'; slideshow terminating');
 			return false;
 		}
 	}
 
 	// fire artificial events
 	var e0 = $slides[first];
 	if (opts.before.length)
 		opts.before[0].apply(e0, [e0, e0, opts, true]);
 	if (opts.after.length > 1)
 		opts.after[1].apply(e0, [e0, e0, opts, true]);
 
 	if (opts.next)
 		$(opts.next).bind(opts.prevNextEvent,function(){return advance(opts,opts.rev?-1:1)});
 	if (opts.prev)
 		$(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,opts.rev?1:-1)});
 	if (opts.pager)
 		buildPager(els,opts);
 
 	exposeAddSlide(opts, els);
 
 	return opts;
 };
 
 // save off original opts so we can restore after clearing state
 function saveOriginalOpts(opts) {
 	opts.original = { before: [], after: [] };
 	opts.original.cssBefore = $.extend({}, opts.cssBefore);
 	opts.original.cssAfter  = $.extend({}, opts.cssAfter);
 	opts.original.animIn	= $.extend({}, opts.animIn);
 	opts.original.animOut   = $.extend({}, opts.animOut);
 	$.each(opts.before, function() { opts.original.before.push(this); });
 	$.each(opts.after,  function() { opts.original.after.push(this); });
 };
 
 function supportMultiTransitions(opts) {
 	var i, tx, txs = $.fn.cycle.transitions;
 	// look for multiple effects
 	if (opts.fx.indexOf(',') > 0) {
 		opts.multiFx = true;
 		opts.fxs = opts.fx.replace(/\s*/g,'').split(',');
 		// discard any bogus effect names
 		for (i=0; i < opts.fxs.length; i++) {
 			var fx = opts.fxs[i];
 			tx = txs[fx];
 			if (!tx || !txs.hasOwnProperty(fx) || !$.isFunction(tx)) {
 				log('discarding unknown transition: ',fx);
 				opts.fxs.splice(i,1);
 				i--;
 			}
 		}
 		// if we have an empty list then we threw everything away!
 		if (!opts.fxs.length) {
 			log('No valid transitions named; slideshow terminating.');
 			return false;
 		}
 	}
 	else if (opts.fx == 'all') {  // auto-gen the list of transitions
 		opts.multiFx = true;
 		opts.fxs = [];
 		for (p in txs) {
 			tx = txs[p];
 			if (txs.hasOwnProperty(p) && $.isFunction(tx))
 				opts.fxs.push(p);
 		}
 	}
 	if (opts.multiFx && opts.randomizeEffects) {
 		// munge the fxs array to make effect selection random
 		var r1 = Math.floor(Math.random() * 20) + 30;
 		for (i = 0; i < r1; i++) {
 			var r2 = Math.floor(Math.random() * opts.fxs.length);
 			opts.fxs.push(opts.fxs.splice(r2,1)[0]);
 		}
 		debug('randomized fx sequence: ',opts.fxs);
 	}
 	return true;
 };
 
 // provide a mechanism for adding slides after the slideshow has started
 function exposeAddSlide(opts, els) {
 	opts.addSlide = function(newSlide, prepend) {
 		var $s = $(newSlide), s = $s[0];
 		if (!opts.autostopCount)
 			opts.countdown++;
 		els[prepend?'unshift':'push'](s);
 		if (opts.els)
 			opts.els[prepend?'unshift':'push'](s); // shuffle needs this
 		opts.slideCount = els.length;
 
 		$s.css('position','absolute');
 		$s[prepend?'prependTo':'appendTo'](opts.$cont);
 
 		if (prepend) {
 			opts.currSlide++;
 			opts.nextSlide++;
 		}
 
 		if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
 			clearTypeFix($s);
 
 		if (opts.fit && opts.width)
 			$s.width(opts.width);
 		if (opts.fit && opts.height && opts.height != 'auto')
 			$slides.height(opts.height);
 		s.cycleH = (opts.fit && opts.height) ? opts.height : $s.height();
 		s.cycleW = (opts.fit && opts.width) ? opts.width : $s.width();
 
 		$s.css(opts.cssBefore);
 
 		if (opts.pager)
 			$.fn.cycle.createPagerAnchor(els.length-1, s, $(opts.pager), els, opts);
 
 		if ($.isFunction(opts.onAddSlide))
 			opts.onAddSlide($s);
 		else
 			$s.hide(); // default behavior
 	};
 }
 
 // reset internal state; we do this on every pass in order to support multiple effects
 $.fn.cycle.resetState = function(opts, fx) {
 	fx = fx || opts.fx;
 	opts.before = []; opts.after = [];
 	opts.cssBefore = $.extend({}, opts.original.cssBefore);
 	opts.cssAfter  = $.extend({}, opts.original.cssAfter);
 	opts.animIn	= $.extend({}, opts.original.animIn);
 	opts.animOut   = $.extend({}, opts.original.animOut);
 	opts.fxFn = null;
 	$.each(opts.original.before, function() { opts.before.push(this); });
 	$.each(opts.original.after,  function() { opts.after.push(this); });
 
 	// re-init
 	var init = $.fn.cycle.transitions[fx];
 	if ($.isFunction(init))
 		init(opts.$cont, $(opts.elements), opts);
 };
 
 // this is the main engine fn, it handles the timeouts, callbacks and slide index mgmt
 function go(els, opts, manual, fwd) {
 	// opts.busy is true if we're in the middle of an animation
 	if (manual && opts.busy && opts.manualTrump) {
 		// let manual transitions requests trump active ones
 		$(els).stop(true,true);
 		opts.busy = false;
 	}
 	// don't begin another timeout-based transition if there is one active
 	if (opts.busy)
 		return;
 
 	var p = opts.$cont[0], curr = els[opts.currSlide], next = els[opts.nextSlide];
 
 	// stop cycling if we have an outstanding stop request
 	if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0 && !manual)
 		return;
 
 	// check to see if we should stop cycling based on autostop options
 	if (!manual && !p.cyclePause &&
 		((opts.autostop && (--opts.countdown <= 0)) ||
 		(opts.nowrap && !opts.random && opts.nextSlide < opts.currSlide))) {
 		if (opts.end)
 			opts.end(opts);
 		return;
 	}
 
 	// if slideshow is paused, only transition on a manual trigger
 	if (manual || !p.cyclePause) {
 		var fx = opts.fx;
 		// keep trying to get the slide size if we don't have it yet
 		curr.cycleH = curr.cycleH || $(curr).height();
 		curr.cycleW = curr.cycleW || $(curr).width();
 		next.cycleH = next.cycleH || $(next).height();
 		next.cycleW = next.cycleW || $(next).width();
 
 		// support multiple transition types
 		if (opts.multiFx) {
 			if (opts.lastFx == undefined || ++opts.lastFx >= opts.fxs.length)
 				opts.lastFx = 0;
 			fx = opts.fxs[opts.lastFx];
 			opts.currFx = fx;
 		}
 
 		// one-time fx overrides apply to:  $('div').cycle(3,'zoom');
 		if (opts.oneTimeFx) {
 			fx = opts.oneTimeFx;
 			opts.oneTimeFx = null;
 		}
 
 		$.fn.cycle.resetState(opts, fx);
 
 		// run the before callbacks
 		if (opts.before.length)
 			$.each(opts.before, function(i,o) {
 				if (p.cycleStop != opts.stopCount) return;
 				o.apply(next, [curr, next, opts, fwd]);
 			});
 
 		// stage the after callacks
 		var after = function() {
 			$.each(opts.after, function(i,o) {
 				if (p.cycleStop != opts.stopCount) return;
 				o.apply(next, [curr, next, opts, fwd]);
 			});
 		};
 
 		if (opts.nextSlide != opts.currSlide) {
 			// get ready to perform the transition
 			opts.busy = 1;
 			if (opts.fxFn) // fx function provided?
 				opts.fxFn(curr, next, opts, after, fwd);
 			else if ($.isFunction($.fn.cycle[opts.fx])) // fx plugin ?
 				$.fn.cycle[opts.fx](curr, next, opts, after);
 			else
 				$.fn.cycle.custom(curr, next, opts, after, manual && opts.fastOnEvent);
 		}
 
 		// calculate the next slide
 		opts.lastSlide = opts.currSlide;
 		if (opts.random) {
 			opts.currSlide = opts.nextSlide;
 			if (++opts.randomIndex == els.length)
 				opts.randomIndex = 0;
 			opts.nextSlide = opts.randomMap[opts.randomIndex];
 		}
 		else { // sequence
 			var roll = (opts.nextSlide + 1) == els.length;
 			opts.nextSlide = roll ? 0 : opts.nextSlide+1;
 			opts.currSlide = roll ? els.length-1 : opts.nextSlide-1;
 		}
 
 		if (opts.pager)
 			$.fn.cycle.updateActivePagerLink(opts.pager, opts.currSlide);
 	}
 
 	// stage the next transtion
 	var ms = 0;
 	if (opts.timeout && !opts.continuous)
 		ms = getTimeout(curr, next, opts, fwd);
 	else if (opts.continuous && p.cyclePause) // continuous shows work off an after callback, not this timer logic
 		ms = 10;
 	if (ms > 0)
 		p.cycleTimeout = setTimeout(function(){ go(els, opts, 0, !opts.rev) }, ms);
 };
 
 // invoked after transition
 $.fn.cycle.updateActivePagerLink = function(pager, currSlide) {
 	$(pager).find('a').removeClass('activeSlide').filter('a:eq('+currSlide+')').addClass('activeSlide');
 };
 
 // calculate timeout value for current transition
 function getTimeout(curr, next, opts, fwd) {
 	if (opts.timeoutFn) {
 		// call user provided calc fn
 		var t = opts.timeoutFn(curr,next,opts,fwd);
 		while ((t - opts.speed) < 250) // sanitize timeout
 			t += opts.speed;
 		debug('calculated timeout: ' + t + '; speed: ' + opts.speed);
 		if (t !== false)
 			return t;
 	}
 	return opts.timeout;
 };
 
 // expose next/prev function, caller must pass in state
 $.fn.cycle.next = function(opts) { advance(opts, opts.rev?-1:1); };
 $.fn.cycle.prev = function(opts) { advance(opts, opts.rev?1:-1);};
 
 // advance slide forward or back
 function advance(opts, val) {
 	var els = opts.elements;
 	var p = opts.$cont[0], timeout = p.cycleTimeout;
 	if (timeout) {
 		clearTimeout(timeout);
 		p.cycleTimeout = 0;
 	}
 	if (opts.random && val < 0) {
 		// move back to the previously display slide
 		opts.randomIndex--;
 		if (--opts.randomIndex == -2)
 			opts.randomIndex = els.length-2;
 		else if (opts.randomIndex == -1)
 			opts.randomIndex = els.length-1;
 		opts.nextSlide = opts.randomMap[opts.randomIndex];
 	}
 	else if (opts.random) {
 		if (++opts.randomIndex == els.length)
 			opts.randomIndex = 0;
 		opts.nextSlide = opts.randomMap[opts.randomIndex];
 	}
 	else {
 		opts.nextSlide = opts.currSlide + val;
 		if (opts.nextSlide < 0) {
 			if (opts.nowrap) return false;
 			opts.nextSlide = els.length - 1;
 		}
 		else if (opts.nextSlide >= els.length) {
 			if (opts.nowrap) return false;
 			opts.nextSlide = 0;
 		}
 	}
 
 	if ($.isFunction(opts.prevNextClick))
 		opts.prevNextClick(val > 0, opts.nextSlide, els[opts.nextSlide]);
 	go(els, opts, 1, val>=0);
 	return false;
 };
 
 function buildPager(els, opts) {
 	var $p = $(opts.pager);
 	$.each(els, function(i,o) {
 		$.fn.cycle.createPagerAnchor(i,o,$p,els,opts);
 	});
    $.fn.cycle.updateActivePagerLink(opts.pager, opts.startingSlide);
 };
 
 $.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) {
 	var a;
 	if ($.isFunction(opts.pagerAnchorBuilder))
 		a = opts.pagerAnchorBuilder(i,el);
 	else
 		a = '<a href="#">'+(i+1)+'</a>';
 		
 	if (!a)
 		return;
 	var $a = $(a);
 	// don't reparent if anchor is in the dom
 	if ($a.parents('body').length === 0) {
 		var arr = [];
 		if ($p.length > 1) {
 			$p.each(function() {
 				var $clone = $a.clone(true);
 				$(this).append($clone);
 				arr.push($clone);
 			});
 			$a = $(arr);
 		}
 		else {
 			$a.appendTo($p);
 		}
 	}
 
 	$a.bind(opts.pagerEvent, function(e) {
 		e.preventDefault();
 		opts.nextSlide = i;
 		var p = opts.$cont[0], timeout = p.cycleTimeout;
 		if (timeout) {
 			clearTimeout(timeout);
 			p.cycleTimeout = 0;
 		}
 		if ($.isFunction(opts.pagerClick))
 			opts.pagerClick(opts.nextSlide, els[opts.nextSlide]);
 		go(els,opts,1,opts.currSlide < i); // trigger the trans
 		return false;
 	});
 	
 	if (opts.pagerEvent != 'click')
 		$a.click(function(){return false;}); // supress click
 	
 	if (opts.pauseOnPagerHover)
 		$a.hover(function() { opts.$cont[0].cyclePause++; }, function() { opts.$cont[0].cyclePause--; } );
 };
 
 // helper fn to calculate the number of slides between the current and the next
 $.fn.cycle.hopsFromLast = function(opts, fwd) {
 	var hops, l = opts.lastSlide, c = opts.currSlide;
 	if (fwd)
 		hops = c > l ? c - l : opts.slideCount - l;
 	else
 		hops = c < l ? l - c : l + opts.slideCount - c;
 	return hops;
 };
 
 // fix clearType problems in ie6 by setting an explicit bg color
 // (otherwise text slides look horrible during a fade transition)
 function clearTypeFix($slides) {
 	function hex(s) {
 		s = parseInt(s).toString(16);
 		return s.length < 2 ? '0'+s : s;
 	};
 	function getBg(e) {
 		for ( ; e && e.nodeName.toLowerCase() != 'html'; e = e.parentNode) {
 			var v = $.css(e,'background-color');
 			if (v.indexOf('rgb') >= 0 ) {
 				var rgb = v.match(/\d+/g);
 				return '#'+ hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]);
 			}
 			if (v && v != 'transparent')
 				return v;
 		}
 		return '#ffffff';
 	};
 	$slides.each(function() { $(this).css('background-color', getBg(this)); });
 };
 
 // reset common props before the next transition
 $.fn.cycle.commonReset = function(curr,next,opts,w,h,rev) {
 	$(opts.elements).not(curr).hide();
 	opts.cssBefore.opacity = 1;
 	opts.cssBefore.display = 'block';
 	if (w !== false && next.cycleW > 0)
 		opts.cssBefore.width = next.cycleW;
 	if (h !== false && next.cycleH > 0)
 		opts.cssBefore.height = next.cycleH;
 	opts.cssAfter = opts.cssAfter || {};
 	opts.cssAfter.display = 'none';
 	$(curr).css('zIndex',opts.slideCount + (rev === true ? 1 : 0));
 	$(next).css('zIndex',opts.slideCount + (rev === true ? 0 : 1));
 };
 
 // the actual fn for effecting a transition
 $.fn.cycle.custom = function(curr, next, opts, cb, speedOverride) {
 	var $l = $(curr), $n = $(next);
 	var speedIn = opts.speedIn, speedOut = opts.speedOut, easeIn = opts.easeIn, easeOut = opts.easeOut;
 	$n.css(opts.cssBefore);
 	if (speedOverride) {
 		if (typeof speedOverride == 'number')
 			speedIn = speedOut = speedOverride;
 		else
 			speedIn = speedOut = 1;
 		easeIn = easeOut = null;
 	}
 	var fn = function() {$n.animate(opts.animIn, speedIn, easeIn, cb)};
 	$l.animate(opts.animOut, speedOut, easeOut, function() {
 		if (opts.cssAfter) $l.css(opts.cssAfter);
 		if (!opts.sync) fn();
 	});
 	if (opts.sync) fn();
 };
 
 // transition definitions - only fade is defined here, transition pack defines the rest
 $.fn.cycle.transitions = {
 	fade: function($cont, $slides, opts) {
 		$slides.not(':eq('+opts.currSlide+')').css('opacity',0);
 		opts.before.push(function(curr,next,opts) {
 			$.fn.cycle.commonReset(curr,next,opts);
 			opts.cssBefore.opacity = 0;
 		});
 		opts.animIn	   = { opacity: 1 };
 		opts.animOut   = { opacity: 0 };
 		opts.cssBefore = { top: 0, left: 0 };
 	}
 };
 
 $.fn.cycle.ver = function() { return ver; };
 
 // override these globally if you like (they are all optional)
 $.fn.cycle.defaults = {
 	fx:			  'fade', // name of transition effect (or comma separated names, ex: fade,scrollUp,shuffle)
 	timeout:	   4000,  // milliseconds between slide transitions (0 to disable auto advance)
 	timeoutFn:	 null,  // callback for determining per-slide timeout value:  function(currSlideElement, nextSlideElement, options, forwardFlag)
 	continuous:	   0,	  // true to start next transition immediately after current one completes
 	speed:		   1000,  // speed of the transition (any valid fx speed value)
 	speedIn:	   null,  // speed of the 'in' transition
 	speedOut:	   null,  // speed of the 'out' transition
 	next:		   null,  // selector for element to use as click trigger for next slide
 	prev:		   null,  // selector for element to use as click trigger for previous slide
 	prevNextClick: null,  // callback fn for prev/next clicks:	function(isNext, zeroBasedSlideIndex, slideElement)
 	prevNextEvent:'click',// event which drives the manual transition to the previous or next slide
 	pager:		   null,  // selector for element to use as pager container
 	pagerClick:	   null,  // callback fn for pager clicks:	function(zeroBasedSlideIndex, slideElement)
 	pagerEvent:	  'click', // name of event which drives the pager navigation
 	pagerAnchorBuilder: null, // callback fn for building anchor links:  function(index, DOMelement)
 	before:		   null,  // transition callback (scope set to element to be shown):	 function(currSlideElement, nextSlideElement, options, forwardFlag)
 	after:		   null,  // transition callback (scope set to element that was shown):  function(currSlideElement, nextSlideElement, options, forwardFlag)
 	end:		   null,  // callback invoked when the slideshow terminates (use with autostop or nowrap options): function(options)
 	easing:		   null,  // easing method for both in and out transitions
 	easeIn:		   null,  // easing for "in" transition
 	easeOut:	   null,  // easing for "out" transition
 	shuffle:	   null,  // coords for shuffle animation, ex: { top:15, left: 200 }
 	animIn:		   null,  // properties that define how the slide animates in
 	animOut:	   null,  // properties that define how the slide animates out
 	cssBefore:	   null,  // properties that define the initial state of the slide before transitioning in
 	cssAfter:	   null,  // properties that defined the state of the slide after transitioning out
 	fxFn:		   null,  // function used to control the transition: function(currSlideElement, nextSlideElement, options, afterCalback, forwardFlag)
 	height:		  'auto', // container height
 	startingSlide: 0,	  // zero-based index of the first slide to be displayed
 	sync:		   1,	  // true if in/out transitions should occur simultaneously
 	random:		   0,	  // true for random, false for sequence (not applicable to shuffle fx)
 	fit:		   0,	  // force slides to fit container
 	containerResize: 1,	  // resize container to fit largest slide
 	pause:		   0,	  // true to enable "pause on hover"
 	pauseOnPagerHover: 0, // true to pause when hovering over pager link
 	autostop:	   0,	  // true to end slideshow after X transitions (where X == slide count)
 	autostopCount: 0,	  // number of transitions (optionally used with autostop to define X)
 	delay:		   0,	  // additional delay (in ms) for first transition (hint: can be negative)
 	slideExpr:	   null,  // expression for selecting slides (if something other than all children is required)
 	cleartype:	   !$.support.opacity,  // true if clearType corrections should be applied (for IE)
 	cleartypeNoBg: false, // set to true to disable extra cleartype fixing (leave false to force background color setting on slides)
 	nowrap:		   0,	  // true to prevent slideshow from wrapping
 	fastOnEvent:   0,	  // force fast transitions when triggered manually (via pager or prev/next); value == time in ms
 	randomizeEffects: 1,  // valid when multiple effects are used; true to make the effect sequence random
 	rev:		   0,	 // causes animations to transition in reverse
 	manualTrump:   true,  // causes manual transition to stop an active transition instead of being ignored
 	requeueOnImageNotLoaded: true, // requeue the slideshow if any image slides are not yet loaded
 	requeueTimeout: 250   // ms delay for requeue
 };
 
 })(jQuery);
  
 /*!
  * jQuery Cycle Plugin Transition Definitions
  * This script is a plugin for the jQuery Cycle Plugin
  * Examples and documentation at: http://malsup.com/jquery/cycle/
  * Copyright (c) 2007-2008 M. Alsup
  * Version:	 2.72
  * Dual licensed under the MIT and GPL licenses:
  * http://www.opensource.org/licenses/mit-license.php
  * http://www.gnu.org/licenses/gpl.html
  */
 (function($) {
 
 //
 // These functions define one-time slide initialization for the named
 // transitions. To save file size feel free to remove any of these that you
 // don't need.
 //
 $.fn.cycle.transitions.none = function($cont, $slides, opts) {
 	opts.fxFn = function(curr,next,opts,after){
 		$(next).show();
 		$(curr).hide();
 		after();
 	};
 }
 
 // scrollUp/Down/Left/Right
 $.fn.cycle.transitions.scrollUp = function($cont, $slides, opts) {
 	$cont.css('overflow','hidden');
 	opts.before.push($.fn.cycle.commonReset);
 	var h = $cont.height();
 	opts.cssBefore ={ top: h, left: 0 };
 	opts.cssFirst = { top: 0 };
 	opts.animIn	  = { top: 0 };
 	opts.animOut  = { top: -h };
 };
 $.fn.cycle.transitions.scrollDown = function($cont, $slides, opts) {
 	$cont.css('overflow','hidden');
 	opts.before.push($.fn.cycle.commonReset);
 	var h = $cont.height();
 	opts.cssFirst = { top: 0 };
 	opts.cssBefore= { top: -h, left: 0 };
 	opts.animIn	  = { top: 0 };
 	opts.animOut  = { top: h };
 };
 $.fn.cycle.transitions.scrollLeft = function($cont, $slides, opts) {
 	$cont.css('overflow','hidden');
 	opts.before.push($.fn.cycle.commonReset);
 	var w = $cont.width();
 	opts.cssFirst = { left: 0 };
 	opts.cssBefore= { left: w, top: 0 };
 	opts.animIn	  = { left: 0 };
 	opts.animOut  = { left: 0-w };
 };
 $.fn.cycle.transitions.scrollRight = function($cont, $slides, opts) {
 	$cont.css('overflow','hidden');
 	opts.before.push($.fn.cycle.commonReset);
 	var w = $cont.width();
 	opts.cssFirst = { left: 0 };
 	opts.cssBefore= { left: -w, top: 0 };
 	opts.animIn	  = { left: 0 };
 	opts.animOut  = { left: w };
 };
 $.fn.cycle.transitions.scrollHorz = function($cont, $slides, opts) {
 	$cont.css('overflow','hidden').width();
 	opts.before.push(function(curr, next, opts, fwd) {
 		$.fn.cycle.commonReset(curr,next,opts);
 		opts.cssBefore.left = fwd ? (next.cycleW-1) : (1-next.cycleW);
 		opts.animOut.left = fwd ? -curr.cycleW : curr.cycleW;
 	});
 	opts.cssFirst = { left: 0 };
 	opts.cssBefore= { top: 0 };
 	opts.animIn   = { left: 0 };
 	opts.animOut  = { top: 0 };
 };
 $.fn.cycle.transitions.scrollVert = function($cont, $slides, opts) {
 	$cont.css('overflow','hidden');
 	opts.before.push(function(curr, next, opts, fwd) {
 		$.fn.cycle.commonReset(curr,next,opts);
 		opts.cssBefore.top = fwd ? (1-next.cycleH) : (next.cycleH-1);
 		opts.animOut.top = fwd ? curr.cycleH : -curr.cycleH;
 	});
 	opts.cssFirst = { top: 0 };
 	opts.cssBefore= { left: 0 };
 	opts.animIn   = { top: 0 };
 	opts.animOut  = { left: 0 };
 };
 
 // slideX/slideY
 $.fn.cycle.transitions.slideX = function($cont, $slides, opts) {
 	opts.before.push(function(curr, next, opts) {
 		$(opts.elements).not(curr).hide();
 		$.fn.cycle.commonReset(curr,next,opts,false,true);
 		opts.animIn.width = next.cycleW;
 	});
 	opts.cssBefore = { left: 0, top: 0, width: 0 };
 	opts.animIn	 = { width: 'show' };
 	opts.animOut = { width: 0 };
 };
 $.fn.cycle.transitions.slideY = function($cont, $slides, opts) {
 	opts.before.push(function(curr, next, opts) {
 		$(opts.elements).not(curr).hide();
 		$.fn.cycle.commonReset(curr,next,opts,true,false);
 		opts.animIn.height = next.cycleH;
 	});
 	opts.cssBefore = { left: 0, top: 0, height: 0 };
 	opts.animIn	 = { height: 'show' };
 	opts.animOut = { height: 0 };
 };
 
 // shuffle
 $.fn.cycle.transitions.shuffle = function($cont, $slides, opts) {
 	var i, w = $cont.css('overflow', 'visible').width();
 	$slides.css({left: 0, top: 0});
 	opts.before.push(function(curr,next,opts) {
 		$.fn.cycle.commonReset(curr,next,opts,true,true,true);
 	});
 	// only adjust speed once!
 	if (!opts.speedAdjusted) {
 		opts.speed = opts.speed / 2; // shuffle has 2 transitions
 		opts.speedAdjusted = true;
 	}
 	opts.random = 0;
 	opts.shuffle = opts.shuffle || {left:-w, top:15};
 	opts.els = [];
 	for (i=0; i < $slides.length; i++)
 		opts.els.push($slides[i]);
 
 	for (i=0; i < opts.currSlide; i++)
 		opts.els.push(opts.els.shift());
 
 	// custom transition fn (hat tip to Benjamin Sterling for this bit of sweetness!)
 	opts.fxFn = function(curr, next, opts, cb, fwd) {
 		var $el = fwd ? $(curr) : $(next);
 		$(next).css(opts.cssBefore);
 		var count = opts.slideCount;
 		$el.animate(opts.shuffle, opts.speedIn, opts.easeIn, function() {
 			var hops = $.fn.cycle.hopsFromLast(opts, fwd);
 			for (var k=0; k < hops; k++)
 				fwd ? opts.els.push(opts.els.shift()) : opts.els.unshift(opts.els.pop());
 			if (fwd) {
 				for (var i=0, len=opts.els.length; i < len; i++)
 					$(opts.els[i]).css('z-index', len-i+count);
 			}
 			else {
 				var z = $(curr).css('z-index');
 				$el.css('z-index', parseInt(z)+1+count);
 			}
 			$el.animate({left:0, top:0}, opts.speedOut, opts.easeOut, function() {
 				$(fwd ? this : curr).hide();
 				if (cb) cb();
 			});
 		});
 	};
 	opts.cssBefore = { display: 'block', opacity: 1, top: 0, left: 0 };
 };
 
 // turnUp/Down/Left/Right
 $.fn.cycle.transitions.turnUp = function($cont, $slides, opts) {
 	opts.before.push(function(curr, next, opts) {
 		$.fn.cycle.commonReset(curr,next,opts,true,false);
 		opts.cssBefore.top = next.cycleH;
 		opts.animIn.height = next.cycleH;
 	});
 	opts.cssFirst  = { top: 0 };
 	opts.cssBefore = { left: 0, height: 0 };
 	opts.animIn	   = { top: 0 };
 	opts.animOut   = { height: 0 };
 };
 $.fn.cycle.transitions.turnDown = function($cont, $slides, opts) {
 	opts.before.push(function(curr, next, opts) {
 		$.fn.cycle.commonReset(curr,next,opts,true,false);
 		opts.animIn.height = next.cycleH;
 		opts.animOut.top   = curr.cycleH;
 	});
 	opts.cssFirst  = { top: 0 };
 	opts.cssBefore = { left: 0, top: 0, height: 0 };
 	opts.animOut   = { height: 0 };
 };
 $.fn.cycle.transitions.turnLeft = function($cont, $slides, opts) {
 	opts.before.push(function(curr, next, opts) {
 		$.fn.cycle.commonReset(curr,next,opts,false,true);
 		opts.cssBefore.left = next.cycleW;
 		opts.animIn.width = next.cycleW;
 	});
 	opts.cssBefore = { top: 0, width: 0  };
 	opts.animIn	   = { left: 0 };
 	opts.animOut   = { width: 0 };
 };
 $.fn.cycle.transitions.turnRight = function($cont, $slides, opts) {
 	opts.before.push(function(curr, next, opts) {
 		$.fn.cycle.commonReset(curr,next,opts,false,true);
 		opts.animIn.width = next.cycleW;
 		opts.animOut.left = curr.cycleW;
 	});
 	opts.cssBefore = { top: 0, left: 0, width: 0 };
 	opts.animIn	   = { left: 0 };
 	opts.animOut   = { width: 0 };
 };
 
 // zoom
 $.fn.cycle.transitions.zoom = function($cont, $slides, opts) {
 	opts.before.push(function(curr, next, opts) {
 		$.fn.cycle.commonReset(curr,next,opts,false,false,true);
 		opts.cssBefore.top = next.cycleH/2;
 		opts.cssBefore.left = next.cycleW/2;
 		opts.animIn	   = { top: 0, left: 0, width: next.cycleW, height: next.cycleH };
 		opts.animOut   = { width: 0, height: 0, top: curr.cycleH/2, left: curr.cycleW/2 };
 	});
 	opts.cssFirst = { top:0, left: 0 };
 	opts.cssBefore = { width: 0, height: 0 };
 };
 
 // fadeZoom
 $.fn.cycle.transitions.fadeZoom = function($cont, $slides, opts) {
 	opts.before.push(function(curr, next, opts) {
 		$.fn.cycle.commonReset(curr,next,opts,false,false);
 		opts.cssBefore.left = next.cycleW/2;
 		opts.cssBefore.top = next.cycleH/2;
 		opts.animIn	= { top: 0, left: 0, width: next.cycleW, height: next.cycleH };
 	});
 	opts.cssBefore = { width: 0, height: 0 };
 	opts.animOut  = { opacity: 0 };
 };
 
 // blindX
 $.fn.cycle.transitions.blindX = function($cont, $slides, opts) {
 	var w = $cont.css('overflow','hidden').width();
 	opts.before.push(function(curr, next, opts) {
 		$.fn.cycle.commonReset(curr,next,opts);
 		opts.animIn.width = next.cycleW;
 		opts.animOut.left   = curr.cycleW;
 	});
 	opts.cssBefore = { left: w, top: 0 };
 	opts.animIn = { left: 0 };
 	opts.animOut  = { left: w };
 };
 // blindY
 $.fn.cycle.transitions.blindY = function($cont, $slides, opts) {
 	var h = $cont.css('overflow','hidden').height();
 	opts.before.push(function(curr, next, opts) {
 		$.fn.cycle.commonReset(curr,next,opts);
 		opts.animIn.height = next.cycleH;
 		opts.animOut.top   = curr.cycleH;
 	});
 	opts.cssBefore = { top: h, left: 0 };
 	opts.animIn = { top: 0 };
 	opts.animOut  = { top: h };
 };
 // blindZ
 $.fn.cycle.transitions.blindZ = function($cont, $slides, opts) {
 	var h = $cont.css('overflow','hidden').height();
 	var w = $cont.width();
 	opts.before.push(function(curr, next, opts) {
 		$.fn.cycle.commonReset(curr,next,opts);
 		opts.animIn.height = next.cycleH;
 		opts.animOut.top   = curr.cycleH;
 	});
 	opts.cssBefore = { top: h, left: w };
 	opts.animIn = { top: 0, left: 0 };
 	opts.animOut  = { top: h, left: w };
 };
 
 // growX - grow horizontally from centered 0 width
 $.fn.cycle.transitions.growX = function($cont, $slides, opts) {
 	opts.before.push(function(curr, next, opts) {
 		$.fn.cycle.commonReset(curr,next,opts,false,true);
 		opts.cssBefore.left = this.cycleW/2;
 		opts.animIn = { left: 0, width: this.cycleW };
 		opts.animOut = { left: 0 };
 	});
 	opts.cssBefore = { width: 0, top: 0 };
 };
 // growY - grow vertically from centered 0 height
 $.fn.cycle.transitions.growY = function($cont, $slides, opts) {
 	opts.before.push(function(curr, next, opts) {
 		$.fn.cycle.commonReset(curr,next,opts,true,false);
 		opts.cssBefore.top = this.cycleH/2;
 		opts.animIn = { top: 0, height: this.cycleH };
 		opts.animOut = { top: 0 };
 	});
 	opts.cssBefore = { height: 0, left: 0 };
 };
 
 // curtainX - squeeze in both edges horizontally
 $.fn.cycle.transitions.curtainX = function($cont, $slides, opts) {
 	opts.before.push(function(curr, next, opts) {
 		$.fn.cycle.commonReset(curr,next,opts,false,true,true);
 		opts.cssBefore.left = next.cycleW/2;
 		opts.animIn = { left: 0, width: this.cycleW };
 		opts.animOut = { left: curr.cycleW/2, width: 0 };
 	});
 	opts.cssBefore = { top: 0, width: 0 };
 };
 // curtainY - squeeze in both edges vertically
 $.fn.cycle.transitions.curtainY = function($cont, $slides, opts) {
 	opts.before.push(function(curr, next, opts) {
 		$.fn.cycle.commonReset(curr,next,opts,true,false,true);
 		opts.cssBefore.top = next.cycleH/2;
 		opts.animIn = { top: 0, height: next.cycleH };
 		opts.animOut = { top: curr.cycleH/2, height: 0 };
 	});
 	opts.cssBefore = { left: 0, height: 0 };
 };
 
 // cover - curr slide covered by next slide
 $.fn.cycle.transitions.cover = function($cont, $slides, opts) {
 	var d = opts.direction || 'left';
 	var w = $cont.css('overflow','hidden').width();
 	var h = $cont.height();
 	opts.before.push(function(curr, next, opts) {
 		$.fn.cycle.commonReset(curr,next,opts);
 		if (d == 'right')
 			opts.cssBefore.left = -w;
 		else if (d == 'up')
 			opts.cssBefore.top = h;
 		else if (d == 'down')
 			opts.cssBefore.top = -h;
 		else
 			opts.cssBefore.left = w;
 	});
 	opts.animIn = { left: 0, top: 0};
 	opts.animOut = { opacity: 1 };
 	opts.cssBefore = { top: 0, left: 0 };
 };
 
 // uncover - curr slide moves off next slide
 $.fn.cycle.transitions.uncover = function($cont, $slides, opts) {
 	var d = opts.direction || 'left';
 	var w = $cont.css('overflow','hidden').width();
 	var h = $cont.height();
 	opts.before.push(function(curr, next, opts) {
 		$.fn.cycle.commonReset(curr,next,opts,true,true,true);
 		if (d == 'right')
 			opts.animOut.left = w;
 		else if (d == 'up')
 			opts.animOut.top = -h;
 		else if (d == 'down')
 			opts.animOut.top = h;
 		else
 			opts.animOut.left = -w;
 	});
 	opts.animIn = { left: 0, top: 0 };
 	opts.animOut = { opacity: 1 };
 	opts.cssBefore = { top: 0, left: 0 };
 };
 
 // toss - move top slide and fade away
 $.fn.cycle.transitions.toss = function($cont, $slides, opts) {
 	var w = $cont.css('overflow','visible').width();
 	var h = $cont.height();
 	opts.before.push(function(curr, next, opts) {
 		$.fn.cycle.commonReset(curr,next,opts,true,true,true);
 		// provide default toss settings if animOut not provided
 		if (!opts.animOut.left && !opts.animOut.top)
 			opts.animOut = { left: w*2, top: -h/2, opacity: 0 };
 		else
 			opts.animOut.opacity = 0;
 	});
 	opts.cssBefore = { left: 0, top: 0 };
 	opts.animIn = { left: 0 };
 };
 
 // wipe - clip animation
 $.fn.cycle.transitions.wipe = function($cont, $slides, opts) {
 	var w = $cont.css('overflow','hidden').width();
 	var h = $cont.height();
 	opts.cssBefore = opts.cssBefore || {};
 	var clip;
 	if (opts.clip) {
 		if (/l2r/.test(opts.clip))
 			clip = 'rect(0px 0px '+h+'px 0px)';
 		else if (/r2l/.test(opts.clip))
 			clip = 'rect(0px '+w+'px '+h+'px '+w+'px)';
 		else if (/t2b/.test(opts.clip))
 			clip = 'rect(0px '+w+'px 0px 0px)';
 		else if (/b2t/.test(opts.clip))
 			clip = 'rect('+h+'px '+w+'px '+h+'px 0px)';
 		else if (/zoom/.test(opts.clip)) {
 			var top = parseInt(h/2);
 			var left = parseInt(w/2);
 			clip = 'rect('+top+'px '+left+'px '+top+'px '+left+'px)';
 		}
 	}
 
 	opts.cssBefore.clip = opts.cssBefore.clip || clip || 'rect(0px 0px 0px 0px)';
 
 	var d = opts.cssBefore.clip.match(/(\d+)/g);
 	var t = parseInt(d[0]), r = parseInt(d[1]), b = parseInt(d[2]), l = parseInt(d[3]);
 
 	opts.before.push(function(curr, next, opts) {
 		if (curr == next) return;
 		var $curr = $(curr), $next = $(next);
 		$.fn.cycle.commonReset(curr,next,opts,true,true,false);
 		opts.cssAfter.display = 'block';
 
 		var step = 1, count = parseInt((opts.speedIn / 13)) - 1;
 		(function f() {
 			var tt = t ? t - parseInt(step * (t/count)) : 0;
 			var ll = l ? l - parseInt(step * (l/count)) : 0;
 			var bb = b < h ? b + parseInt(step * ((h-b)/count || 1)) : h;
 			var rr = r < w ? r + parseInt(step * ((w-r)/count || 1)) : w;
 			$next.css({ clip: 'rect('+tt+'px '+rr+'px '+bb+'px '+ll+'px)' });
 			(step++ <= count) ? setTimeout(f, 13) : $curr.css('display', 'none');
 		})();
 	});
 	opts.cssBefore = { display: 'block', opacity: 1, top: 0, left: 0 };
 	opts.animIn	   = { left: 0 };
 	opts.animOut   = { left: 0 };
 };
 
 })(jQuery);
 

 /*
  * 	Easy Slider 1.7 - jQuery plugin
  *	written by Alen Grakalic	
  *	http://cssglobe.com/post/4004/easy-slider-15-the-easiest-jquery-plugin-for-sliding
  *
  *	Copyright (c) 2009 Alen Grakalic (http://cssglobe.com)
  *	Dual licensed under the MIT (MIT-LICENSE.txt)
  *	and GPL (GPL-LICENSE.txt) licenses.
  *
  *	Built for jQuery library
  *	http://jquery.com
  *
  */
  
 /*
  *	markup example for $("#slider").easySlider();
  *	
  * 	<div id="slider">
  *		<ul>
  *			<li><img src="images/01.jpg" alt="" /></li>
  *			<li><img src="images/02.jpg" alt="" /></li>
  *			<li><img src="images/03.jpg" alt="" /></li>
  *			<li><img src="images/04.jpg" alt="" /></li>
  *			<li><img src="images/05.jpg" alt="" /></li>
  *		</ul>
  *	</div>
  *
  */
 
 (function($) {
 
 	$.fn.easySlider = function(options){
 	  
 		// default configuration properties
 		var defaults = {			
 			prevId: 		'prevBtn',
 			prevText: 		'Previous',
 			nextId: 		'nextBtn',	
 			nextText: 		'Next',
 			controlsShow:	true,
 			controlsBefore:	'',
 			controlsAfter:	'',	
 			controlsFade:	true,
 			firstId: 		'firstBtn',
 			firstText: 		'First',
 			firstShow:		false,
 			lastId: 		'lastBtn',	
 			lastText: 		'Last',
 			lastShow:		false,				
 			vertical:		false,
 			speed: 			800,
 			auto:			false,
 			pause:			8000,
 			continuous:		false, 
 			numeric: 		false,
 			numericId: 		'controls'
 		}; 
 		
 		var options = $.extend(defaults, options);  
 				
 		this.each(function() {  
 			var obj = $(this); 				
 			var s = $("li", obj).length;
 			var w = $("li", obj).width(); 
 			var h = $("li", obj).height(); 
 			var clickable = true;
 			obj.width(w); 
 			obj.height(h); 
 			obj.css("overflow","hidden");
 			var ts = s-1;
 			var t = 0;
 			$("ul", obj).css('width',s*w);			
 			
 			if(options.continuous){
 				$("ul", obj).prepend($("ul li:last-child", obj).clone().css("margin-left","-"+ w +"px"));
 				$("ul", obj).append($("ul li:nth-child(2)", obj).clone());
 				$("ul", obj).css('width',(s+1)*w);
 			};				
 			
 			if(!options.vertical) $("li", obj).css('float','left');
 								
 			if(options.controlsShow){
 				var html = options.controlsBefore;				
 				if(options.numeric){
 					html += '<ol id="'+ options.numericId +'"></ol>';
 				} else {
 					if(options.firstShow) html += '<span id="'+ options.firstId +'"><a href=\"javascript:void(0);\">'+ options.firstText +'</a></span>';
 					html += ' <span id="'+ options.prevId +'"><a href=\"javascript:void(0);\">'+ options.prevText +'</a></span>';
 					html += ' <span id="'+ options.nextId +'"><a href=\"javascript:void(0);\">'+ options.nextText +'</a></span>';
 					if(options.lastShow) html += ' <span id="'+ options.lastId +'"><a href=\"javascript:void(0);\">'+ options.lastText +'</a></span>';				
 				};
 				
 				html += options.controlsAfter;						
 				$(obj).after(html);										
 			};
 			
 			if(options.numeric){									
 				for(var i=0;i<s;i++){						
 					$(document.createElement("li"))
 						.attr('id',options.numericId + (i+1))
 						.html('<a rel='+ i +' href=\"javascript:void(0);\">'+ (i+1) +'</a>')
 						.appendTo($("#"+ options.numericId))
 						.click(function(){							
 							animate($("a",$(this)).attr('rel'),true);
 						}); 												
 				};							
 			} else {
 				$("a","#"+options.nextId).click(function(){		
 					animate("next",true);
 				});
 				$("a","#"+options.prevId).click(function(){		
 					animate("prev",true);				
 				});	
 				$("#slider_r").click(function(){		
 					animate("next",true);
 				});
 				$("#slider_l").click(function(){		
 					animate("prev",true);				
 				});	
 				$("a","#"+options.firstId).click(function(){		
 					animate("first",true);
 				});				
 				$("a","#"+options.lastId).click(function(){		
 					animate("last",true);				
 				});				
 			};
 			
 			function setCurrent(i){
 				i = parseInt(i)+1;
 				$("li", "#" + options.numericId).removeClass("current");
 				$("li#" + options.numericId + i).addClass("current");
 			};
 			
 			function adjust(){
 				if(t>ts) t=0;		
 				if(t<0) t=ts;	
 				if(!options.vertical) {
 					$("ul",obj).css("margin-left",(t*w*-1));
 				} else {
 					$("ul",obj).css("margin-left",(t*h*-1));
 				}
 				clickable = true;
 				if(options.numeric) setCurrent(t);
 			};
 			
 			function animate(dir,clicked){
 				if (clickable){
 					clickable = false;
 					var ot = t;				
 					switch(dir){
 						case "next":
 							t = (ot>=ts) ? (options.continuous ? t+1 : ts) : t+1;						
 							break; 
 						case "prev":
 							t = (t<=0) ? (options.continuous ? t-1 : 0) : t-1;
 							break; 
 						case "first":
 							t = 0;
 							break; 
 						case "last":
 							t = ts;
 							break; 
 						default:
 							t = dir;
 							break; 
 					};	
 					var diff = Math.abs(ot-t);
 					var speed = diff*options.speed;						
 					if(!options.vertical) {
 						p = (t*w*-1);
 						$("ul",obj).animate(
 							{ marginLeft: p }, 
 							{ queue:false, duration:speed, complete:adjust }
 						);				
 					} else {
 						p = (t*h*-1);
 						$("ul",obj).animate(
 							{ marginTop: p }, 
 							{ queue:false, duration:speed, complete:adjust }
 						);					
 					};
 					
 					if(!options.continuous && options.controlsFade){					
 						if(t==ts){
 							$("a","#"+options.nextId).hide();
 							$("a","#"+options.lastId).hide();
 						} else {
 							$("a","#"+options.nextId).show();
 							$("a","#"+options.lastId).show();					
 						};
 						if(t==0){
 							$("a","#"+options.prevId).hide();
 							$("a","#"+options.firstId).hide();
 						} else {
 							$("a","#"+options.prevId).show();
 							$("a","#"+options.firstId).show();
 						};					
 					};				
 					
 					if(clicked) clearTimeout(timeout);
 					if(options.auto && dir=="next" && !clicked){;
 						timeout = setTimeout(function(){
 							animate("next",false);
 						},diff*options.speed+options.pause);
 					};
 			
 				};
 				
 			};
 			// init
 			var timeout;
  			if(options.auto){;
 				timeout = setTimeout(function(){
 					animate("next",false);
 				},options.pause);
 			};		
 			
 			if(options.numeric) setCurrent(0);
 		
 			if(!options.continuous && options.controlsFade){					
 				$("a","#"+options.prevId).hide();
 				$("a","#"+options.firstId).hide();				
 			};				
 			
 		});
 	  
 	};
 
 })(jQuery);
 
 
 
 
 
 
 /**
  * --------------------------------------------------------------------
  * jQuery-Plugin "pngFix"
  * Version: 1.2, 09.03.2009
  * by Andreas Eberhard, andreas.eberhard@gmail.com
  *                      http://jquery.andreaseberhard.de/
  *
  * Copyright (c) 2007 Andreas Eberhard
  * Licensed under GPL (http://www.opensource.org/licenses/gpl-license.php)
  *
  * Changelog:
  *    09.03.2009 Version 1.2
  *    - Update for jQuery 1.3.x, removed @ from selectors
  *    11.09.2007 Version 1.1
  *    - removed noConflict
  *    - added png-support for input type=image
  *    - 01.08.2007 CSS background-image support extension added by Scott Jehl, scott@filamentgroup.com, http://www.filamentgroup.com
  *    31.05.2007 initial Version 1.0
  * --------------------------------------------------------------------
  * @example $(function(){$(document).pngFix();});
  * @desc Fixes all PNG's in the document on document.ready
  *
  * jQuery(function(){jQuery(document).pngFix();});
  * @desc Fixes all PNG's in the document on document.ready when using noConflict
  *
  * @example $(function(){$('div.examples').pngFix();});
  * @desc Fixes all PNG's within div with class examples
  *
  * @example $(function(){$('div.examples').pngFix( { blankgif:'ext.gif' } );});
  * @desc Fixes all PNG's within div with class examples, provides blank gif for input with png
  * --------------------------------------------------------------------
  */
 
 (function($) {
 
 jQuery.fn.pngFix = function(settings) {
 
 	// Settings
 	settings = jQuery.extend({
 		blankgif: 'blank.gif'
 	}, settings);
 
 	var ie55 = (navigator.appName == "Microsoft Internet Explorer" && parseInt(navigator.appVersion) == 4 && navigator.appVersion.indexOf("MSIE 5.5") != -1);
 	var ie6 = (navigator.appName == "Microsoft Internet Explorer" && parseInt(navigator.appVersion) == 4 && navigator.appVersion.indexOf("MSIE 6.0") != -1);
 
 	if (jQuery.browser.msie && (ie55 || ie6)) {
 
 		//fix images with png-source
 		jQuery(this).find("img[src$=.png]").each(function() {
 
 			jQuery(this).attr('width',jQuery(this).width());
 			jQuery(this).attr('height',jQuery(this).height());
 
 			var prevStyle = '';
 			var strNewHTML = '';
 			var imgId = (jQuery(this).attr('id')) ? 'id="' + jQuery(this).attr('id') + '" ' : '';
 			var imgClass = (jQuery(this).attr('class')) ? 'class="' + jQuery(this).attr('class') + '" ' : '';
 			var imgTitle = (jQuery(this).attr('title')) ? 'title="' + jQuery(this).attr('title') + '" ' : '';
 			var imgAlt = (jQuery(this).attr('alt')) ? 'alt="' + jQuery(this).attr('alt') + '" ' : '';
 			var imgAlign = (jQuery(this).attr('align')) ? 'float:' + jQuery(this).attr('align') + ';' : '';
 			var imgHand = (jQuery(this).parent().attr('href')) ? 'cursor:hand;' : '';
 			if (this.style.border) {
 				prevStyle += 'border:'+this.style.border+';';
 				this.style.border = '';
 			}
 			if (this.style.padding) {
 				prevStyle += 'padding:'+this.style.padding+';';
 				this.style.padding = '';
 			}
 			if (this.style.margin) {
 				prevStyle += 'margin:'+this.style.margin+';';
 				this.style.margin = '';
 			}
 			var imgStyle = (this.style.cssText);
 
 			strNewHTML += '<span '+imgId+imgClass+imgTitle+imgAlt;
 			strNewHTML += 'style="position:relative;white-space:pre-line;display:inline-block;background:transparent;'+imgAlign+imgHand;
 			strNewHTML += 'width:' + jQuery(this).width() + 'px;' + 'height:' + jQuery(this).height() + 'px;';
 			strNewHTML += 'filter:progid:DXImageTransform.Microsoft.AlphaImageLoader' + '(src=\'' + jQuery(this).attr('src') + '\', sizingMethod=\'scale\');';
 			strNewHTML += imgStyle+'"></span>';
 			if (prevStyle != ''){
 				strNewHTML = '<span style="position:relative;display:inline-block;'+prevStyle+imgHand+'width:' + jQuery(this).width() + 'px;' + 'height:' + jQuery(this).height() + 'px;'+'">' + strNewHTML + '</span>';
 			}
 
 			jQuery(this).hide();
 			jQuery(this).after(strNewHTML);
 
 		});
 
 		// fix css background pngs
 		jQuery(this).find("*").each(function(){
 			var bgIMG = jQuery(this).css('background-image');
 			if(bgIMG.indexOf(".png")!=-1){
 				var iebg = bgIMG.split('url("')[1].split('")')[0];
 				jQuery(this).css('background-image', 'none');
 				jQuery(this).get(0).runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + iebg + "',sizingMethod='scale')";
 			}
 		});
 		
 		//fix input with png-source
 		jQuery(this).find("input[src$=.png]").each(function() {
 			var bgIMG = jQuery(this).attr('src');
 			jQuery(this).get(0).runtimeStyle.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader' + '(src=\'' + bgIMG + '\', sizingMethod=\'scale\');';
    		jQuery(this).attr('src', settings.blankgif)
 		});
 	
 	}
 	
 	return jQuery;
 
 };
 
 })(jQuery);

 // Open External Links as Blank Targets via Unobtrusive JavaScript
 // http://perishablepress.com/press/2007/11/20/open-external-links-as-blank-targets-via-unobtrusive-javascript/
 
 function externalLinks() {
 	if (!document.getElementsByTagName) return;
 	var anchors = document.getElementsByTagName("a");
 	for (var i=0; i<anchors.length; i++) {
 		var anchor = anchors[i];
 		if (
 			anchor.getAttribute("href") && ( 
 			anchor.getAttribute("rel") == "external" || 
 			anchor.getAttribute("rel") == "external nofollow" || 
 			anchor.getAttribute("rel") == "nofollow external" )
 			)
 		anchor.target = "_blank";
 	}
 }
 window.onload = function() {
 	externalLinks();
 };
 
 jQuery(window).resize(function() {
   if (jQuery(window).width() >= 1024){
   	jQuery("#main").css("margin-right","50px");
   } else {
   	jQuery("#main").css("margin-right","0px");
   }
 });
 
jQuery(document).ready(function() { 	
	//jQuery('#s')attr.("value", "zoeken..");
	var default_values = new Array();
	jQuery('#s').focus(function() {
		if (!default_values[this.id]) {
			default_values[this.id] = this.value;
		}
		if (this.value == default_values[this.id]) {
			this.value = '';
		}
		$(this).blur(function() {
			if (this.value == '') {
				this.value = default_values[this.id];
			}
		});
	});

	jQuery("#bfqbigpic").animate({
		position: "absolute",
		top: (jQuery(document).height() - 972 )+"px",
	}, 2000)
	if (jQuery(window).width() >= 1024){
		jQuery("#main").css("margin-right","50px");
	} else {
		jQuery("#main").css("margin-right","0px");
	}
	/* DIVERSEN */
	jQuery('.headnav a').append('<span></span>');
	jQuery('.text').append('<div class="text-top"></div><div class="text-bottom"></div>');
	
	/* PNG FIX */
	jQuery(document).pngFix();
	
	/* FANCYBOX */
	if(jQuery(".fancybox").length > 0){
		jQuery(".fancybox").fancybox();
	}
		
	/* SUPERFISH */
	if(jQuery("ul.headnav").length > 0){
		jQuery('ul.headnav').superfish();
	}
		
	/* CYCLE */
	if(jQuery("#slider").length > 0){
		jQuery('#pictures').cycle({
			fx: 'fade', 
		    timeout: 5000,
		    random: true,
			next:   '#next', 
    		prev:   '#prev' 
		});
	}
	
	/* Projecten Cycle */

		var aantal_proj = jQuery(".proj").length;
		
		for (var i=0; i<aantal_proj; i++) {
			var slider_id = jQuery(".projsc").eq(i).attr("class");
			slider_id = slider_id.substring(slider_id.length -2, slider_id.length);
			jQuery("."+slider_id+'').cycle({
				fx: 'uncover', 
			    timeout: 5000,
			    random: true,
			});
		}
	 
	
	/* FANCYBOX */
	if(jQuery(".fancybox").length > 0){
		jQuery(".fancybox").fancybox();
	}
		
	/* VALIDATIE CONTACTFORMULIER */
	if(jQuery("#mailform").length > 0){
	 	jQuery("#mailform").validate({
	 		rules: {
	 			formcontrolecode: {
					required: true,
	 				remote: '/codeblue/verifycode.php'
	 			},
	 			Telefoon: {
	 				required: true,
	 				minlength: 10
	 			}
	 		}
	 	});
	}	
});
 
