/*
  * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
  *
  * Uses the built in easing capabilities added In jQuery 1.1
  * to offer multiple easing options
  *
  * TERMS OF USE - jQuery Easing
  * 
  * Open source under the BSD License. 
  * 
  * Copyright Ã‚Â© 2008 George McGinley Smith
  * All rights reserved.
  * 
  * Redistribution and use in source and binary forms, with or without modification, 
  * are permitted provided that the following conditions are met:
  * 
  * Redistributions of source code must retain the above copyright notice, this list of 
  * conditions and the following disclaimer.
  * Redistributions in binary form must reproduce the above copyright notice, this list 
  * of conditions and the following disclaimer in the documentation and/or other materials 
  * provided with the distribution.
  * 
  * Neither the name of the author nor the names of contributors may be used to endorse 
  * or promote products derived from this software without specific prior written permission.
  * 
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
  *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
  * OF THE POSSIBILITY OF SUCH DAMAGE. 
  *
 */
 
 // t: current time, b: begInnIng value, c: change In value, d: duration
 jQuery.easing['jswing'] = jQuery.easing['swing'];
 
 jQuery.extend( jQuery.easing,
 {
 	def: 'easeOutQuad',
 	swing: function (x, t, b, c, d) {
 		//alert(jQuery.easing.default);
 		return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
 	},
 	easeInQuad: function (x, t, b, c, d) {
 		return c*(t/=d)*t + b;
 	},
 	easeOutQuad: function (x, t, b, c, d) {
 		return -c *(t/=d)*(t-2) + b;
 	},
 	easeInOutQuad: function (x, t, b, c, d) {
 		if ((t/=d/2) < 1) return c/2*t*t + b;
 		return -c/2 * ((--t)*(t-2) - 1) + b;
 	},
 	easeInCubic: function (x, t, b, c, d) {
 		return c*(t/=d)*t*t + b;
 	},
 	easeOutCubic: function (x, t, b, c, d) {
 		return c*((t=t/d-1)*t*t + 1) + b;
 	},
 	easeInOutCubic: function (x, t, b, c, d) {
 		if ((t/=d/2) < 1) return c/2*t*t*t + b;
 		return c/2*((t-=2)*t*t + 2) + b;
 	},
 	easeInQuart: function (x, t, b, c, d) {
 		return c*(t/=d)*t*t*t + b;
 	},
 	easeOutQuart: function (x, t, b, c, d) {
 		return -c * ((t=t/d-1)*t*t*t - 1) + b;
 	},
 	easeInOutQuart: function (x, t, b, c, d) {
 		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
 		return -c/2 * ((t-=2)*t*t*t - 2) + b;
 	},
 	easeInQuint: function (x, t, b, c, d) {
 		return c*(t/=d)*t*t*t*t + b;
 	},
 	easeOutQuint: function (x, t, b, c, d) {
 		return c*((t=t/d-1)*t*t*t*t + 1) + b;
 	},
 	easeInOutQuint: function (x, t, b, c, d) {
 		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
 		return c/2*((t-=2)*t*t*t*t + 2) + b;
 	},
 	easeInSine: function (x, t, b, c, d) {
 		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
 	},
 	easeOutSine: function (x, t, b, c, d) {
 		return c * Math.sin(t/d * (Math.PI/2)) + b;
 	},
 	easeInOutSine: function (x, t, b, c, d) {
 		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
 	},
 	easeInExpo: function (x, t, b, c, d) {
 		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
 	},
 	easeOutExpo: function (x, t, b, c, d) {
 		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
 	},
 	easeInOutExpo: function (x, t, b, c, d) {
 		if (t==0) return b;
 		if (t==d) return b+c;
 		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
 		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
 	},
 	easeInCirc: function (x, t, b, c, d) {
 		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
 	},
 	easeOutCirc: function (x, t, b, c, d) {
 		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
 	},
 	easeInOutCirc: function (x, t, b, c, d) {
 		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
 		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
 	},
 	easeInElastic: 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;
 	},
 	easeOutElastic: 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;
 	},
 	easeInOutElastic: 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;
 	},
 	easeInBack: function (x, t, b, c, d, s) {
 		if (s == undefined) s = 1.70158;
 		return c*(t/=d)*t*((s+1)*t - s) + b;
 	},
 	easeOutBack: function (x, t, b, c, d, s) {
 		if (s == undefined) s = 1.70158;
 		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
 	},
 	easeInOutBack: function (x, t, b, c, d, s) {
 		if (s == undefined) 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;
 	},
 	easeInBounce: function (x, t, b, c, d) {
 		return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
 	},
 	easeOutBounce: 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;
 		}
 	},
 	easeInOutBounce: function (x, t, b, c, d) {
 		if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
 		return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
 	}
 });
 
 /*
  *
  * TERMS OF USE - EASING EQUATIONS
  * 
  * Open source under the BSD License. 
  * 
  * Copyright Ã‚Â© 2001 Robert Penner
  * All rights reserved.
  * 
  * Redistribution and use in source and binary forms, with or without modification, 
  * are permitted provided that the following conditions are met:
  * 
  * Redistributions of source code must retain the above copyright notice, this list of 
  * conditions and the following disclaimer.
  * Redistributions in binary form must reproduce the above copyright notice, this list 
  * of conditions and the following disclaimer in the documentation and/or other materials 
  * provided with the distribution.
  * 
  * Neither the name of the author nor the names of contributors may be used to endorse 
  * or promote products derived from this software without specific prior written permission.
  * 
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
  *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
  * OF THE POSSIBILITY OF SUCH DAMAGE. 
  *
  */
  
  /*
   * jQuery Easing v1.1.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.extend(jQuery.easing, {
  	easein: function(x, t, b, c, d) {
  		return c*(t/=d)*t + b; // in
  	},
  	easeinout: function(x, t, b, c, d) {
  		if (t < d/2) return 2*c*t*t/(d*d) + b;
  		var ts = t - d/2;
  		return -2*c*ts*ts/(d*d) + 2*c*ts/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 flip = 1;
  		if (c < 0) {
  			flip *= -1;
  			c *= -1;
  		}
  		return flip * (Math.exp(Math.log(c)/d * t)) + b;		
  	},
  	expoout: function(x, t, b, c, d) {
  		var flip = 1;
  		if (c < 0) {
  			flip *= -1;
  			c *= -1;
  		}
  		return flip * (-Math.exp(-Math.log(c)/d * (t-d)) + c + 1) + b;
  	},
  	expoinout: function(x, t, b, c, d) {
  		var flip = 1;
  		if (c < 0) {
  			flip *= -1;
  			c *= -1;
  		}
  		if (t < d/2) return flip * (Math.exp(Math.log(c/2)/(d/2) * t)) + b;
  		return flip * (-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;
  	}
  });

 
 
 
 /*
  * 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);
 
 
 
 
 /*
  * FancyBox - jQuery Plugin
  * Simple and fancy lightbox alternative
  *
  * Copyright (c) 20010 Janis Skarnelis
  * Examples and documentation at: http://fancybox.net
  *
  * Version: 1.3.0 (02/02/2010)
  * Requires: jQuery v1.3+
  *
  * Dual licensed under the MIT and GPL licenses:
  *   http://www.opensource.org/licenses/mit-license.php
  *   http://www.gnu.org/licenses/gpl.html
  */
 
 ;(function($) {
 
 	var tmp, loading, overlay, wrap, outer, inner, content, close, nav_left, nav_right;
 
 	var selectedIndex = 0, selectedOpts = {}, selectedArray = [], currentIndex = 0, currentOpts = {}, currentArray = [];
 
 	var ajaxLoader = null, imgPreloader = new Image, imageRegExp = /\.(jpg|gif|png|bmp|jpeg)(.*)?$/i, swfRegExp = /[^\.]\.(swf)\s*$/i;
 
 	var loadingTimer, loadingFrame = 1;
 
 	var start_pos, final_pos, busy = false, shadow = 20, fx = $.extend($('<div/>')[0], { prop: 0 }), titleh = 0, isIE6 = !$.support.opacity && !window.XMLHttpRequest;
 
 	$.fn.fixPNG = function() {
 		return this.each(function () {
 			var image = $(this).css('backgroundImage');
 
 			if (image.match(/^url\(["']?(.*\.png)["']?\)$/i)) {
 				image = RegExp.$1;
 				$(this).css({
 					'backgroundImage': 'none',
 					'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=" + ($(this).css('backgroundRepeat') == 'no-repeat' ? 'crop' : 'scale') + ", src='" + image + "')"
 				}).each(function () {
 					var position = $(this).css('position');
 					if (position != 'absolute' && position != 'relative')
 						$(this).css('position', 'relative');
 				}).css('zoom', 1);
 			}
 		});
 	};
 
 	$.fn.fancybox = function(options) {
 		$(this).data('fancybox', $.extend({}, options));
 
 		$(this).unbind('click.fb').bind('click.fb', function(e) {
 			e.preventDefault();
 
 			if (busy) return;
 
 			busy = true;
 
 			$(this).blur();
 
 			selectedArray	= [];
 			selectedIndex	= 0;
 
 			var rel = $(this).attr('rel') || '';
 
 			if (!rel || rel == '' || rel === 'nofollow') {
 				selectedArray.push(this);
 
 			} else {
 				selectedArray	= $("a[rel=" + rel + "], area[rel=" + rel + "]");
 				selectedIndex	= selectedArray.index( this );
 			}
 
 			fancybox_start();
 
 			return false;
 		});
 
 		return this;
 	};
 
 	/*
 
 	Public Methods
 
 	*/
 
 	$.fancybox = function(obj, opts) {
 		if (busy) return;
 
 		busy = true;
 
 		selectedArray	= [];
 		selectedIndex	= 0;
 
 		if ($.isArray(obj)) {
 			for (var i = 0, j = obj.length; i < j; i++) {
 				if (typeof obj[i] == 'object') {
 					$(obj[i]).data('fancybox', $.extend({}, opts, obj[i]));
 				} else {
 					obj[i] = $({}).data('fancybox', $.extend({content : obj[i]}, opts));
 				}
 			}
 
 			selectedArray = jQuery.merge(selectedArray, obj);
 
 		} else {
 			if (typeof obj == 'object') {
 				$(obj).data('fancybox', $.extend({}, opts, obj));
 			} else {
 				obj = $({}).data('fancybox', $.extend({content : obj}, opts));
 			}
 
 			selectedArray.push(obj);
 		}
 
 		fancybox_start();
 	};
 
 	$.fancybox.showActivity = function() {
 		clearInterval(loadingTimer);
 
 		loading.show();
 		loadingTimer = setInterval(fancybox_animate_loading, 66);
 	};
 	
 	$.fancybox.hideActivity = function() {
 		loading.hide();
 	};
 
 	$.fancybox.next = function() {
 		return $.fancybox.pos( currentIndex + 1);
 	};
 	
 	$.fancybox.prev = function() {
 		return $.fancybox.pos( currentIndex - 1);
 	};
 
 	$.fancybox.pos = function(pos) {
 		if (busy) return;
 
 		pos = parseInt(pos);
 
 		if (pos > -1 && currentArray.length > pos) {
 			selectedIndex = pos;
 			fancybox_start();
 		}
 
 		if (currentOpts.cyclic && currentArray.length > 1 && pos < 0) {
 			selectedIndex = currentArray.length - 1;
 			fancybox_start();
 		}
 
 		if (currentOpts.cyclic && currentArray.length > 1 && pos >= currentArray.length) {
 			selectedIndex = 0;
 			fancybox_start();
 		}
 
 		return;
 	};
 
 	$.fancybox.cancel = function() {
 		if (busy) return;
 
 		busy = true;
 
 		$.event.trigger('fancybox-cancel');
 
 		fancybox_abort();
 
 		if (selectedOpts && $.isFunction(selectedOpts.onCancel)) {
 			selectedOpts.onCancel(selectedArray, selectedIndex, selectedOpts);
 		};
 
 		busy = false;
 	};
 
 	// Note: within an iframe use - parent.$.fancybox.close();
 	$.fancybox.close = function() {
 		if (busy || wrap.is(':hidden')) return;
 
 		busy = true;
 
 		if (currentOpts && $.isFunction(currentOpts.onCleanup)) {
 			if (currentOpts.onCleanup(currentArray, currentIndex, currentOpts) === false) {
 				busy = false;
 				return;
 			}
 		};
 
 		fancybox_abort();
 
 		$(close.add( nav_left ).add( nav_right )).hide();
 
 		$('#fancybox-title').remove();
 
 		wrap.add(inner).add(overlay).unbind();
 
 		$(window).unbind("resize.fb scroll.fb");
 		$(document).unbind('keydown.fb');
 
 		function _cleanup() {
 			overlay.fadeOut('fast');
 
 			wrap.hide();
 
 			$.event.trigger('fancybox-cleanup');
 
 			inner.empty();
 
 			if ($.isFunction(currentOpts.onClosed)) {
 				currentOpts.onClosed(currentArray, currentIndex, currentOpts);
 			}
 
 			currentArray	= selectedOpts	= [];
 			currentIndex	= selectedIndex	= 0;
 			currentOpts		= selectedOpts	= {};
 
 			busy = false;
 		}
 
 		inner.css('overflow', 'hidden');
 
 		if (currentOpts.transitionOut == 'elastic') {
 			start_pos = fancybox_get_zoom_from();
 
 			var pos = wrap.position();
 
 			final_pos = {
 				top		:	pos.top ,
 				left	:	pos.left,
 				width	:	wrap.width(),
 				height	:	wrap.height()
 			};
 
 			if (currentOpts.opacity) {
 				final_pos.opacity = 1;
 			}
 
 			fx.prop = 1;
 
 			$(fx).animate({ prop: 0 }, {
 				 duration	: currentOpts.speedOut,
 				 easing		: currentOpts.easingOut,
 				 step		: fancybox_draw,
 				 complete	: _cleanup
 			});
 
 		} else {
 			wrap.fadeOut( currentOpts.transitionOut == 'none' ? 0 : currentOpts.speedOut, _cleanup);
 		}
 	};
 
 	$.fancybox.resize = function() {
 		if (busy || wrap.is(':hidden')) return;
 
 		busy = true;
 
 		var c = inner.wrapInner("<div style='overflow:auto'></div>").children();
 		var h = c.height();
 
 		wrap.css({height:	h + (currentOpts.padding * 2) + titleh});
 		inner.css({height:	h});
 
 		c.replaceWith(c.children());
 
 		$.fancybox.center();
 	};
 
 	$.fancybox.center = function() {
 		busy = true;
 
 		var view	= fancybox_get_viewport();
 		var margin	= currentOpts.margin;
 		var to		= {};
 
 		to.top	= view[3] + ((view[1] - ((wrap.height() - titleh) + (shadow * 2 ))) * 0.5);
 		to.left	= view[2] + ((view[0] - (wrap.width() + (shadow * 2 ))) * 0.5);
 
 		to.top	= Math.max(view[3] + margin, to.top);
 		to.left	= Math.max(view[2] + margin, to.left);
 
 		wrap.css(to);
 
 		busy = false;
 	};
 
 	/*
 	
 	Inner Methods
 
 	*/
 
 	function fancybox_abort() {
 		loading.hide();
 
 		imgPreloader.onerror = imgPreloader.onload = null;
 		
 		if (ajaxLoader) ajaxLoader.abort();
 
 		tmp.empty();
 	};
 
 	function fancybox_error() {
 		$.fancybox('<p id="fancybox_error">The requested content cannot be loaded.<br />Please try again later.</p>', {
 			'scrolling'		: 'no',
 			'padding'		: 20,
 			'transitionIn'	: 'none',
 			'transitionOut'	: 'none'
 		});
 	};
 	
 	function fancybox_start() {
 		fancybox_abort();
 
 		var obj	= selectedArray[ selectedIndex ];
 
 		selectedOpts = $.extend({}, $.fn.fancybox.defaults, (typeof $(obj).data('fancybox') == 'undefined' ? selectedOpts : $(obj).data('fancybox')));
 
 		var href, type, title = obj.title || $(obj).title || selectedOpts.title || '';
 
 		if (obj.nodeName && !selectedOpts.orig) {
 			selectedOpts.orig = $(obj).children("img:first").length ? $(obj).children("img:first") : $(obj);
 		}
 
 		if (title == '' && selectedOpts.orig) title = selectedOpts.orig.attr('alt');
 
 		if (obj.nodeName && (/^(?:javascript|#)/i).test(obj.href)) {
 			href = selectedOpts.href || null;
 		} else {
 			href = selectedOpts.href || obj.href || null;
 		}
 
 		if (selectedOpts.type) {
 			type = selectedOpts.type;
 
 			if (!href) href = selectedOpts.content;
 			
 		} else if (selectedOpts.content) {
 			type	= 'html';
 
 		} else if (href) {
 			if (href.match(imageRegExp)) {
 				type = 'image';
 
 			} else if (href.match(swfRegExp)) {
 				type = 'swf';
 
 			} else if ($(obj).hasClass("iframe")) {
 				type = 'iframe';
 
 			} else if (href.match(/#/)) {
 				obj = href.substr(href.indexOf("#"));
 
 				type = $(obj).length > 0 ? 'inline' : 'ajax';
 			} else {
 				type = 'ajax';
 			}
 		} else {
 			type = 'inline';
 		}
 
 		selectedOpts.type	= type;
 		selectedOpts.href	= href;
 		selectedOpts.title	= title;
 
 		if (selectedOpts.autoDimensions && selectedOpts.type !== 'iframe' && selectedOpts.type !== 'swf') {
 			selectedOpts.width		= 'auto';
 			selectedOpts.height		= 'auto';
 		}
 
 		if (selectedOpts.modal) {
 			selectedOpts.overlayShow		= true;
 			selectedOpts.hideOnOverlayClick	= false;
 			selectedOpts.hideOnContentClick	= false;
 			selectedOpts.enableEscapeButton	= false;
 			selectedOpts.showCloseButton	= false;
 		}
 
 		if ($.isFunction(selectedOpts.onStart)) {
 			if (selectedOpts.onStart(selectedArray, selectedIndex, selectedOpts) === false) {
 				busy = false;
 				return;
 			}
 		};
 
 		tmp.css('padding', (shadow + selectedOpts.padding + selectedOpts.margin));
 
 		$('.fancybox-inline-tmp').unbind('fancybox-cancel').bind('fancybox-change', function() {
 			$(this).replaceWith(inner.children());
 		});
 
 		switch (type) {
 			case 'html' :
 				tmp.html( selectedOpts.content );
 
 				fancybox_process_inline();
 			break;
 
 			case 'inline' :
 				$('<div class="fancybox-inline-tmp" />').hide().insertBefore( $(obj) ).bind('fancybox-cleanup', function() {
 					$(this).replaceWith(inner.children());
 				}).bind('fancybox-cancel', function() {
 					$(this).replaceWith(tmp.children());
 				});
 
 				$(obj).appendTo(tmp);
 
 				fancybox_process_inline();
 			break;
 
 			case 'image':
 				busy = false;
 
 				$.fancybox.showActivity();
 
 				imgPreloader = new Image;
 
 				imgPreloader.onerror = function() {
 					fancybox_error();
 				}
 
 				imgPreloader.onload = function() {
 					imgPreloader.onerror = null;
 					imgPreloader.onload = null;
 					fancybox_process_image();
 				}
 
 				imgPreloader.src = href;
 	
 			break;
 
 			case 'swf':
 				var str = '';
 				var emb = '';
 
 				str += '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="' + selectedOpts.width + '" height="' + selectedOpts.height + '"><param name="movie" value="' + href + '"></param>';
 
 				$.each(selectedOpts.swf, function(name, val) {
 					str += '<param name="' + name + '" value="' + val + '"></param>';
 					emb += ' ' + name + '="' + val + '"';
 				});
 
 				str += '<embed src="' + href + '" type="application/x-shockwave-flash" width="' + selectedOpts.width + '" height="' + selectedOpts.height + '"' + emb + '></embed></object>';
 
 				tmp.html(str);
 
 				fancybox_process_inline();
 			break;
 
 			case 'ajax':
 				var selector	= href.split('#', 2);
 				var data		= selectedOpts.ajax.data || {};
 
 				if (selector.length > 1) {
 					href = selector[0];
 
 					typeof data == "string" ? data += '&selector=' + selector[1] : data['selector'] = selector[1];
 				}
 
 				busy = false;
 				$.fancybox.showActivity();
 
 				ajaxLoader = $.ajax($.extend(selectedOpts.ajax, {
 					url		: href,
 					data	: data,
 					error	: fancybox_error,
 					success : function(data, textStatus, XMLHttpRequest) {
 						if (ajaxLoader.status == 200) {
 							tmp.html( data );
 							fancybox_process_inline();
 						}
 					}
 				}));
 
 			break;
 
 			case 'iframe' :
 				$('<iframe id="fancybox-frame" name="fancybox-frame' + new Date().getTime() + '" frameborder="0" hspace="0" scrolling="' + selectedOpts.scrolling + '" src="' + selectedOpts.href + '"></iframe>').appendTo(tmp);
 
 				fancybox_show();
 			break;
 		}
 	};
 
 	function fancybox_process_image() {
 		busy = true;
 
 		selectedOpts.width	= imgPreloader.width;
 		selectedOpts.height	= imgPreloader.height;
 
 		$("<img />").attr({
 			'id'	: 'fancybox-img',
 			'src'	: imgPreloader.src,
 			'alt'	: selectedOpts.title
 		}).appendTo( tmp );
 
 		fancybox_show();
 	};
 
 	function fancybox_process_inline() {
 		tmp.width(	selectedOpts.width );
 		tmp.height(	selectedOpts.height );
 
 		if (selectedOpts.width	== 'auto') selectedOpts.width	= tmp.width();
 		if (selectedOpts.height	== 'auto') selectedOpts.height	= tmp.height();
 
 		fancybox_show();
 	};
 
 	function fancybox_show() {
 		loading.hide();
 
 		if (wrap.is(":visible") && $.isFunction(currentOpts.onCleanup)) {
 			if (currentOpts.onCleanup(currentArray, currentIndex, currentOpts) === false) {
 				$.event.trigger('fancybox-cancel');
 
 				busy = false;
 				return;
 			}
 		};
 
 		currentArray	= selectedArray;
 		currentIndex	= selectedIndex;
 		currentOpts		= selectedOpts;
 
 		inner.get(0).scrollTop	= 0;
 		inner.get(0).scrollLeft	= 0;
 
 		if (currentOpts.overlayShow) {
 			if (isIE6) {
 				$('select:not(#fancybox-tmp select)').filter(function() {
 					return this.style.visibility !== 'hidden';
 				}).css({'visibility':'hidden'}).one('fancybox-cleanup', function() {
 					this.style.visibility = 'inherit';
 				});
 			}
 
 			overlay.css({
 				'background-color'	: currentOpts.overlayColor,
 				'opacity'			: currentOpts.overlayOpacity
 			}).unbind().show();
 		}
 
 		final_pos = fancybox_get_zoom_to();
 
 		fancybox_process_title();
 
 		if (wrap.is(":visible")) {
 			$( close.add( nav_left ).add( nav_right ) ).hide();
 
 			var pos = wrap.position();
 
 			start_pos = {
 				top		:	pos.top ,
 				left	:	pos.left,
 				width	:	wrap.width(),
 				height	:	wrap.height()
 			};
 
 			var equal = (start_pos.width == final_pos.width && start_pos.height == final_pos.height);
 
 			inner.fadeOut(currentOpts.changeFade, function() {
 				$.event.trigger('fancybox-change');
 
 				inner.css({
 						top			: currentOpts.padding,
 						left		: currentOpts.padding,
 						width		: Math.max(start_pos.width	- (currentOpts.padding * 2), 1),
 						height		: Math.max(start_pos.height	- (currentOpts.padding * 2), 1)
 					})
 					.empty()
 					.css('overflow', 'hidden');
 
 				function finish_resizing() {
 					inner.html( tmp.contents() ).fadeIn(currentOpts.changeFade, _finish);
 				}
 
 				fx.prop = 0;
 
 				$(fx).animate({ prop: 1 }, {
 					 duration	: equal ? 0 : currentOpts.changeSpeed,
 					 easing		: currentOpts.easingChange,
 					 step		: fancybox_draw,
 					 complete	: finish_resizing
 				});
 			});
 
 			return;
 		}
 
 		wrap.css('opacity', 1);
 
 		if (currentOpts.transitionIn == 'elastic') {
 			start_pos = fancybox_get_zoom_from();
 
 			inner.css({
 					top			: currentOpts.padding,
 					left		: currentOpts.padding,
 					width		: Math.max(start_pos.width	- (currentOpts.padding * 2), 1),
 					height		: Math.max(start_pos.height	- (currentOpts.padding * 2), 1)
 				})
 				.html( tmp.contents() );
 
 			wrap.css(start_pos).show();
 
 			if (currentOpts.opacity) final_pos.opacity = 0;
 
 			fx.prop = 0;
 
 			$(fx).animate({ prop: 1 }, {
 				 duration	: currentOpts.speedIn,
 				 easing		: currentOpts.easingIn,
 				 step		: fancybox_draw,
 				 complete	: _finish
 			});
 
 		} else {
 			inner.css({
 					top			: currentOpts.padding,
 					left		: currentOpts.padding,
 					width		: Math.max(final_pos.width	- (currentOpts.padding * 2), 1),
 					height		: Math.max(final_pos.height	- (currentOpts.padding * 2) - titleh, 1)
 				})
 				.html( tmp.contents() );
 
 			wrap.css( final_pos ).fadeIn( currentOpts.transitionIn == 'none' ? 0 : currentOpts.speedIn, _finish );
 		}
 	};
 
 	function fancybox_draw(pos) {
 		var width	= Math.round(start_pos.width	+ (final_pos.width	- start_pos.width)	* pos);
 		var height	= Math.round(start_pos.height	+ (final_pos.height	- start_pos.height)	* pos);
 
 		var top		= Math.round(start_pos.top	+ (final_pos.top	- start_pos.top)	* pos);
 		var left	= Math.round(start_pos.left	+ (final_pos.left	- start_pos.left)	* pos);
 
 		wrap.css({
 			'width'		: width		+ 'px',
 			'height'	: height	+ 'px',
 			'top'		: top		+ 'px',
 			'left'		: left		+ 'px'
 		});
 
 		width	= Math.max(width - currentOpts.padding * 2, 0);
 		height	= Math.max(height - (currentOpts.padding * 2 + (titleh * pos)), 0);
 
 		inner.css({
 			'width'		: width		+ 'px',
 			'height'	: height	+ 'px'
 		});
 
 		if (typeof final_pos.opacity !== 'undefined') wrap.css('opacity', (pos < 0.5 ? 0.5 : pos));
 	};
 
 	function _finish() {
 		inner.css('overflow', overflow = (currentOpts.scrolling == 'auto' ? (currentOpts.type == 'image' || currentOpts.type == 'iframe' || currentOpts.type == 'swf' ? 'hidden' : 'auto') : (currentOpts.scrolling == 'yes' ? 'auto' : 'visible')));
 
 		if (!$.support.opacity) {
 			inner.get(0).style.removeAttribute('filter');
 			wrap.get(0).style.removeAttribute('filter');
 		}
 
 		$('#fancybox-title').show();
 
 		if (currentOpts.hideOnContentClick)	inner.one('click',		$.fancybox.close);
 		if (currentOpts.hideOnOverlayClick)	overlay.one('click',	$.fancybox.close);
 
 		if (currentOpts.showCloseButton) close.show();
 
 		fancybox_set_navigation();
 
 		$(window).bind("resize.fb", $.fancybox.center);
 
 		currentOpts.centerOnScroll ? $(window).bind("scroll.fb", $.fancybox.center) : $(window).unbind("scroll.fb");
 
 		if ($.isFunction(currentOpts.onComplete)) currentOpts.onComplete(currentArray, currentIndex, currentOpts);
 
 		busy = false;
 
 		fancybox_preload_images();
 	};
 
 	function fancybox_get_zoom_to() {
 		var view	= fancybox_get_viewport();
 		var to		= {};
 
 		var margin = currentOpts.margin;
 		var resize = currentOpts.autoScale;
 
 		var horizontal_space	= (shadow + margin) * 2 ;
 		var vertical_space		= (shadow + margin) * 2 ;
 		var double_padding		= (currentOpts.padding * 2);
 
 		if (currentOpts.width.toString().indexOf('%') > -1) {
 			to.width = ((view[0] * parseFloat(currentOpts.width)) / 100) - (shadow * 2) ;
 			resize = false;
 
 		} else {
 			to.width = currentOpts.width + double_padding;
 		}
 
 		if (currentOpts.height.toString().indexOf('%') > -1) {
 			to.height = ((view[1] * parseFloat(currentOpts.height)) / 100) - (shadow * 2);
 			resize = false;
 
 		} else {
 			to.height = currentOpts.height + double_padding;
 		}
 
 		if (resize && (to.width > (view[0] - horizontal_space) || to.height > (view[1] - vertical_space))) {
 			if (selectedOpts.type == 'image' || selectedOpts.type == 'swf') {
 				horizontal_space	+= double_padding;
 				vertical_space		+= double_padding;
 
 				var ratio = Math.min(Math.min( view[0] - horizontal_space, currentOpts.width) / currentOpts.width, Math.min( view[1] - vertical_space, currentOpts.height) / currentOpts.height);
 
 				to.width	= Math.round(ratio * (to.width	- double_padding)) + double_padding;
 				to.height	= Math.round(ratio * (to.height	- double_padding)) + double_padding;
 
 			} else {
 				to.width	= Math.min(to.width,	(view[0] - horizontal_space));
 				to.height	= Math.min(to.height,	(view[1] - vertical_space));
 			}
 		}
 
 		to.top	= view[3] + ((view[1] - (to.height	+ (shadow * 2 ))) * 0.5);
 		to.left	= view[2] + ((view[0] - (to.width	+ (shadow * 2 ))) * 0.5);
 
 		if (currentOpts.autoScale == false) {
 			to.top	= Math.max(view[3] + margin, to.top);
 			to.left	= Math.max(view[2] + margin, to.left);
 		}
 
 		return to;
 	};
 
 	function fancybox_get_zoom_from() {
 		var orig	= selectedOpts.orig ? $(selectedOpts.orig) : false;
 		var from 	= {};
 
 		if (orig && orig.length) {
 			var pos = fancybox_get_obj_pos(orig);
 
 			from = {
 				width	: (pos.width	+ (currentOpts.padding * 2)),
 				height	: (pos.height	+ (currentOpts.padding * 2)),
 				top		: (pos.top		- currentOpts.padding - shadow),
 				left	: (pos.left		- currentOpts.padding - shadow)
 			};
 			
 		} else {
 			var view = fancybox_get_viewport();
 
 			from = {
 				width	: 1,
 				height	: 1,
 				top		: view[3] + view[1] * 0.5,
 				left	: view[2] + view[0] * 0.5
 			};
 		}
 
 		return from;
 	};
 
 	function fancybox_set_navigation() {
 		$(document).unbind('keydown.fb').bind('keydown.fb', function(e) {
 			if (e.keyCode == 27 && currentOpts.enableEscapeButton) {
 				e.preventDefault();
 				$.fancybox.close();
 
 			} else if (e.keyCode == 37) {
 				e.preventDefault();
 				$.fancybox.prev();
 
 			} else if (e.keyCode == 39) {
 				e.preventDefault();
 				$.fancybox.next();
 			}
 		});
 
 		if ($.fn.mousewheel) {
 			wrap.unbind('mousewheel.fb');
 
 			if (currentArray.length > 1) {
 				wrap.bind('mousewheel.fb', function(e, delta) {
 					e.preventDefault();
 
 					if (busy || delta == 0) return;
 
 					delta > 0 ? $.fancybox.prev() : $.fancybox.next();
 				});
 			}
 		}
 
 		if (!currentOpts.showNavArrows) return;
 
 		if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex != 0) {
 			nav_left.show();
 		}
 
 		if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex != (currentArray.length -1)) {
 			nav_right.show();
 		}
 	};
 
 	function fancybox_preload_images() {
 		if ((currentArray.length -1) > currentIndex) {
 			var href = currentArray[ currentIndex + 1 ].href;
 
 			if (typeof href !== 'undefined' && href.match(imageRegExp)) {
 				var objNext = new Image();
 				objNext.src = href;
 			}
 		}
 
 		if (currentIndex > 0) {
 			var href = currentArray[ currentIndex - 1 ].href;
 
 			if (typeof href !== 'undefined' && href.match(imageRegExp)) {
 				var objNext = new Image();
 				objNext.src = href;
 			}
 		}
 	};
 
 	function fancybox_animate_loading() {
 		if (!loading.is(':visible')){
 			clearInterval(loadingTimer);
 			return;
 		}
 
 		$('div', loading).css('top', (loadingFrame * -40) + 'px');
 
 		loadingFrame = (loadingFrame + 1) % 12;
 	};
 
 	function fancybox_get_viewport() {
 		return [ $(window).width(), $(window).height(), $(document).scrollLeft(), $(document).scrollTop() ];
 	};
 
 	function fancybox_get_obj_pos(obj) {
 		var pos		= obj.offset();
 
 		pos.top		+= parseFloat( obj.css('paddingTop') )	|| 0;
 		pos.left	+= parseFloat( obj.css('paddingLeft') )	|| 0;
 
 		pos.top		+= parseFloat( obj.css('border-top-width') )	|| 0;
 		pos.left	+= parseFloat( obj.css('border-left-width') )	|| 0;
 
 		pos.width	= obj.width();
 		pos.height	= obj.height();
 
 		return pos;
 	};
 
 	function fancybox_process_title() {
 		$('#fancybox-title').remove();
 
 		titleh = 0;
 
 		if (currentOpts.titleShow == false) return;
 
 		var obj		= currentArray[ currentIndex ];
 		var title	= currentOpts.title;
 
 		title = $.isFunction(currentOpts.titleFormat) ? currentOpts.titleFormat(title, currentArray, currentIndex, currentOpts) : fancybox_format_title(title);
 
 		if (!title || title == '') return;
 
 		var width	= final_pos.width - (currentOpts.padding * 2);
 		var titlec	= 'fancybox-title-' + currentOpts.titlePosition;
 
 		$('<div id="fancybox-title" class="' + titlec + '" />').css({
 			'width'			: width,
 			'paddingLeft'	: currentOpts.padding,
 			'paddingRight'	: currentOpts.padding
 		}).html(title).appendTo('body');
 
 		switch (currentOpts.titlePosition) {
 			case 'inside':
 				titleh = $("#fancybox-title").outerHeight(true) - currentOpts.padding;
 				final_pos.height += titleh;
 			break;
 
 			case 'over':
 				$('#fancybox-title').css('bottom', currentOpts.padding);
 			break;
 
 			default:
 				$('#fancybox-title').css('bottom', $("#fancybox-title").outerHeight(true) * -1);
 			break;
 		}
 
 		$('#fancybox-title').appendTo( outer ).hide();
 
 		if (isIE6) {
 			$('#fancybox-title span').fixPNG();
 		}
 	};
 
 	function fancybox_format_title(title) {
 		if (title && title.length) {
 			switch (currentOpts.titlePosition) {
 				case 'inside':
 					return title;
 				break;
 
 				case 'over':
 					return '<span id="fancybox-title-over">' + title + '</span>';
 				break;
 
 				default:
 					return '<span id="fancybox-title-wrap"><span id="fancybox-title-left"></span><span id="fancybox-title-main">' + title + '</span><span id="fancybox-title-right"></span></span>';
 				break;
 			}
 		}
 
 		return false;
 	};
 
 	function fancybox_init() {
 		if ($("#fancybox-wrap").length) return;
 
 		$('body').append(
 			tmp			= $('<div id="fancybox-tmp"></div>'),
 			loading		= $('<div id="fancybox-loading"><div></div></div>'),
 			overlay		= $('<div id="fancybox-overlay"></div>'),
 			wrap		= $('<div id="fancybox-wrap"></div>')
 		);
 
 		outer = $('<div id="fancybox-outer"></div>')
 			.append('<div class="fancy-bg" id="fancy-bg-n"></div><div class="fancy-bg" id="fancy-bg-ne"></div><div class="fancy-bg" id="fancy-bg-e"></div><div class="fancy-bg" id="fancy-bg-se"></div><div class="fancy-bg" id="fancy-bg-s"></div><div class="fancy-bg" id="fancy-bg-sw"></div><div class="fancy-bg" id="fancy-bg-w"></div><div class="fancy-bg" id="fancy-bg-nw"></div>')
 			.appendTo( wrap );
 
 		outer.append(
 			inner		= $('<div id="fancybox-inner"></div>'),
 			close		= $('<a id="fancybox-close"></a>'),
 
 			nav_left	= $('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'),
 			nav_right	= $('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>')
 		);
 		
 		close.click($.fancybox.close);
 		loading.click($.fancybox.cancel);
 
 		nav_left.click(function(e) {
 			e.preventDefault();
 			$.fancybox.prev();
 		});
 
 		nav_right.click(function(e) {
 			e.preventDefault();
 			$.fancybox.next();
 		});
 
 		if (!$.support.opacity) {
 			outer.find('.fancy-bg').fixPNG();
 		}
 
 		if (isIE6) {
 			$(close.add('.fancy-ico').add('div', loading)).fixPNG();
 
 			overlay.get(0).style.setExpression('height',	"document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px'");
 			loading.get(0).style.setExpression('top',		"(-20 + (document.documentElement.clientHeight ? document.documentElement.clientHeight/2 : document.body.clientHeight/2 ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop )) + 'px'");
 
 			outer.prepend('<iframe id="fancybox-hide-sel-frame" src="javascript:\'\';" scrolling="no" frameborder="0" ></iframe>');
 		}
 	};
 
 	$.fn.fancybox.defaults = {
 		padding				:	10,
 		margin				:	20,
 		opacity				:	false,
 		modal				:	false,
 		cyclic				:	false,
 		scrolling			:	'auto',	// 'auto', 'yes' or 'no'
 
 		width				:	560,
 		height				:	340,
 
 		autoScale			:	true,
 		autoDimensions		:	true,
 		centerOnScroll		:	false,
 
 		ajax				:	{},
 		swf					:	{ wmode: 'transparent' },
 
 		hideOnOverlayClick	:	true,
 		hideOnContentClick	:	false,
 
 		overlayShow			:	true,
 		overlayOpacity		:	0.6,
 		overlayColor		:	'#000',
 
 		titleShow			:	true,
 		titlePosition		:	'outside',	// 'outside', 'inside' or 'over'
 		titleFormat			:	null,
 
 		transitionIn		:	'fade',	// 'elastic', 'fade' or 'none'
 		transitionOut		:	'fade',	// 'elastic', 'fade' or 'none'
 
 		speedIn				:	300,
 		speedOut			:	300,
 
 		changeSpeed			:	300,
 		changeFade			:	'fast',
 
 		easingIn			:	'swing',
 		easingOut			:	'swing',
 
 		showCloseButton		:	true,
 		showNavArrows		:	true,
 		enableEscapeButton	:	true,
 
 		onStart				:	null,
 		onCancel			:	null,
 		onComplete			:	null,
 		onCleanup			:	null,
 		onClosed			:	null
 	};
 
 	$(document).ready(function() {
 		fancybox_init();
 	});
 
 })(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);
 
 (function($) {
   var cache = [];
   // Arguments are image paths relative to the current page.
   $.preLoadImages = function() {
     var args_len = arguments.length;
     for (var i = args_len; i--;) {
       var cacheImage = document.createElement('img');
       cacheImage.src = arguments[i];
       cache.push(cacheImage);
     }
   }
 })(jQuery)
 
 /*
  * jQuery UI Accordion 1.6
  * 
  * Copyright (c) 2007 Jörn Zaefferer
  *
  * http://docs.jquery.com/UI/Accordion
  *
  * Dual licensed under the MIT and GPL licenses:
  *   http://www.opensource.org/licenses/mit-license.php
  *   http://www.gnu.org/licenses/gpl.html
  *
  * Revision: $Id: jquery.accordion.js 4876 2008-03-08 11:49:04Z joern.zaefferer $
  *
  */
 
 ;(function($) {
 	
 // If the UI scope is not available, add it
 $.ui = $.ui || {};
 
 $.fn.extend({
 	accordion: function(options, data) {
 		var args = Array.prototype.slice.call(arguments, 1);
 
 		return this.each(function() {
 			if (typeof options == "string") {
 				var accordion = $.data(this, "ui-accordion");
 				accordion[options].apply(accordion, args);
 			// INIT with optional options
 			} else if (!$(this).is(".ui-accordion"))
 				$.data(this, "ui-accordion", new $.ui.accordion(this, options));
 		});
 	},
 	// deprecated, use accordion("activate", index) instead
 	activate: function(index) {
 		return this.accordion("activate", index);
 	}
 });
 
 $.ui.accordion = function(container, options) {
 	
 	// setup configuration
 	this.options = options = $.extend({}, $.ui.accordion.defaults, options);
 	this.element = container;
 	
 	$(container).addClass("ui-accordion");
 	
 	if ( options.navigation ) {
 		var current = $(container).find("a").filter(options.navigationFilter);
 		if ( current.length ) {
 			if ( current.filter(options.header).length ) {
 				options.active = current;
 			} else {
 				options.active = current.parent().parent().prev();
 				current.addClass("current");
 			}
 		}
 	}
 	
 	// calculate active if not specified, using the first header
 	options.headers = $(container).find(options.header);
 	options.active = findActive(options.headers, options.active);
 
 	if ( options.fillSpace ) {
 		var maxHeight = $(container).parent().height();
 		options.headers.each(function() {
 			maxHeight -= $(this).outerHeight();
 		});
 		var maxPadding = 0;
 		options.headers.next().each(function() {
 			maxPadding = Math.max(maxPadding, $(this).innerHeight() - $(this).height());
 		}).height(maxHeight - maxPadding);
 	} else if ( options.autoheight ) {
 		var maxHeight = 0;
 		options.headers.next().each(function() {
 			maxHeight = Math.max(maxHeight, $(this).outerHeight());
 		}).height(maxHeight);
 	}
 
 	options.headers
 		.not(options.active || "")
 		.next()
 		.hide();
 	options.active.parent().andSelf().addClass(options.selectedClass);
 	
 	if (options.event)
 		$(container).bind((options.event) + ".ui-accordion", clickHandler);
 };
 
 $.ui.accordion.prototype = {
 	activate: function(index) {
 		// call clickHandler with custom event
 		clickHandler.call(this.element, {
 			target: findActive( this.options.headers, index )[0]
 		});
 	},
 	
 	enable: function() {
 		this.options.disabled = false;
 	},
 	disable: function() {
 		this.options.disabled = true;
 	},
 	destroy: function() {
 		this.options.headers.next().css("display", "");
 		if ( this.options.fillSpace || this.options.autoheight ) {
 			this.options.headers.next().css("height", "");
 		}
 		$.removeData(this.element, "ui-accordion");
 		$(this.element).removeClass("ui-accordion").unbind(".ui-accordion");
 	}
 }
 
 function scopeCallback(callback, scope) {
 	return function() {
 		return callback.apply(scope, arguments);
 	};
 }
 
 function completed(cancel) {
 	// if removed while animated data can be empty
 	if (!$.data(this, "ui-accordion"))
 		return;
 	var instance = $.data(this, "ui-accordion");
 	var options = instance.options;
 	options.running = cancel ? 0 : --options.running;
 	if ( options.running )
 		return;
 	if ( options.clearStyle ) {
 		options.toShow.add(options.toHide).css({
 			height: "",
 			overflow: ""
 		});
 	}
 	$(this).triggerHandler("change.ui-accordion", [options.data], options.change);
 }
 
 function toggle(toShow, toHide, data, clickedActive, down) {
 	var options = $.data(this, "ui-accordion").options;
 	options.toShow = toShow;
 	options.toHide = toHide;
 	options.data = data;
 	var complete = scopeCallback(completed, this);
 	
 	// count elements to animate
 	options.running = toHide.size() == 0 ? toShow.size() : toHide.size();
 	
 	if ( options.animated ) {
 		if ( !options.alwaysOpen && clickedActive ) {
 			$.ui.accordion.animations[options.animated]({
 				toShow: jQuery([]),
 				toHide: toHide,
 				complete: complete,
 				down: down,
 				autoheight: options.autoheight
 			});
 		} else {
 			$.ui.accordion.animations[options.animated]({
 				toShow: toShow,
 				toHide: toHide,
 				complete: complete,
 				down: down,
 				autoheight: options.autoheight
 			});
 		}
 	} else {
 		if ( !options.alwaysOpen && clickedActive ) {
 			toShow.toggle();
 		} else {
 			toHide.hide();
 			toShow.show();
 		}
 		complete(true);
 	}
 }
 
 function clickHandler(event) {
 	var options = $.data(this, "ui-accordion").options;
 	if (options.disabled)
 		return false;
 	
 	// called only when using activate(false) to close all parts programmatically
 	if ( !event.target && !options.alwaysOpen ) {
 		options.active.parent().andSelf().toggleClass(options.selectedClass);
 		var toHide = options.active.next(),
 			data = {
 				instance: this,
 				options: options,
 				newHeader: jQuery([]),
 				oldHeader: options.active,
 				newContent: jQuery([]),
 				oldContent: toHide
 			},
 			toShow = options.active = $([]);
 		toggle.call(this, toShow, toHide, data );
 		return false;
 	}
 	// get the click target
 	var clicked = $(event.target);
 	
 	// due to the event delegation model, we have to check if one
 	// of the parent elements is our actual header, and find that
 	if ( clicked.parents(options.header).length )
 		while ( !clicked.is(options.header) )
 			clicked = clicked.parent();
 	
 	var clickedActive = clicked[0] == options.active[0];
 	
 	// if animations are still active, or the active header is the target, ignore click
 	if (options.running || (options.alwaysOpen && clickedActive))
 		return false;
 	if (!clicked.is(options.header))
 		return;
 
 	// switch classes
 	options.active.parent().andSelf().toggleClass(options.selectedClass);
 	if ( !clickedActive ) {
 		clicked.parent().andSelf().addClass(options.selectedClass);
 	}
 
 	// find elements to show and hide
 	var toShow = clicked.next(),
 		toHide = options.active.next(),
 		//data = [clicked, options.active, toShow, toHide],
 		data = {
 			instance: this,
 			options: options,
 			newHeader: clicked,
 			oldHeader: options.active,
 			newContent: toShow,
 			oldContent: toHide
 		},
 		down = options.headers.index( options.active[0] ) > options.headers.index( clicked[0] );
 	
 	options.active = clickedActive ? $([]) : clicked;
 	toggle.call(this, toShow, toHide, data, clickedActive, down );
 
 	return false;
 };
 
 function findActive(headers, selector) {
 	return selector != undefined
 		? typeof selector == "number"
 			? headers.filter(":eq(" + selector + ")")
 			: headers.not(headers.not(selector))
 		: selector === false
 			? $([])
 			: headers.filter(":eq(0)");
 }
 
 $.extend($.ui.accordion, {
 	defaults: {
 		selectedClass: "selected",
 		alwaysOpen: true,
 		animated: 'slide',
 		event: "click",
 		header: "a",
 		autoheight: true,
 		running: 0,
 		navigationFilter: function() {
 			return this.href.toLowerCase() == location.href.toLowerCase();
 		}
 	},
 	animations: {
 		slide: function(options, additions) {
 			options = $.extend({
 				easing: "swing",
 				duration: 300
 			}, options, additions);
 			if ( !options.toHide.size() ) {
 				options.toShow.animate({height: "show"}, options);
 				return;
 			}
 			var hideHeight = options.toHide.height(),
 				showHeight = options.toShow.height(),
 				difference = showHeight / hideHeight;
 			options.toShow.css({ height: 0, overflow: 'hidden' }).show();
 			options.toHide.filter(":hidden").each(options.complete).end().filter(":visible").animate({height:"hide"},{
 				step: function(now) {
 					var current = (hideHeight - now) * difference;
 					if ($.browser.msie || $.browser.opera) {
 						current = Math.ceil(current);
 					}
 					options.toShow.height( current );
 				},
 				duration: options.duration,
 				easing: options.easing,
 				complete: function() {
 					if ( !options.autoheight ) {
 						options.toShow.css("height", "auto");
 					}
 					options.complete();
 				}
 			});
 		},
 		bounceslide: function(options) {
 			this.slide(options, {
 				easing: options.down ? "bounceout" : "swing",
 				duration: options.down ? 1000 : 200
 			});
 		},
 		easeslide: function(options) {
 			this.slide(options, {
 				easing: "easeinout",
 				duration: 700
 			})
 		}
 	}
 });
 
 })(jQuery);
 
 
 /*!
  * jquery.qtip. The jQuery tooltip plugin
  *
  * Copyright (c) 2009 Craig Thompson
  * http://craigsworks.com
  *
  * Licensed under MIT
  * http://www.opensource.org/licenses/mit-license.php
  *
  * Launch  : February 2009
  * Version : 1.0.0-rc3
  * Released: Tuesday 12th May, 2009 - 00:00
  * Debug: jquery.qtip.debug.js
  */
 (function($)
 {
    // Implementation
    $.fn.qtip = function(options, blanket)
    {
       var i, id, interfaces, opts, obj, command, config, api;
 
       // Return API / Interfaces if requested
       if(typeof options == 'string')
       {
          // Make sure API data exists if requested
          if(typeof $(this).data('qtip') !== 'object')
             $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.NO_TOOLTIP_PRESENT, false);
 
          // Return requested object
          if(options == 'api')
             return $(this).data('qtip').interfaces[ $(this).data('qtip').current ];
          else if(options == 'interfaces')
             return $(this).data('qtip').interfaces;
       }
 
       // Validate provided options
       else
       {
          // Set null options object if no options are provided
          if(!options) options = {};
 
          // Sanitize option data
          if(typeof options.content !== 'object' || (options.content.jquery && options.content.length > 0)) options.content = { text: options.content };
          if(typeof options.content.title !== 'object') options.content.title = { text: options.content.title };
          if(typeof options.position !== 'object') options.position = { corner: options.position };
          if(typeof options.position.corner !== 'object') options.position.corner = { target: options.position.corner, tooltip: options.position.corner };
          if(typeof options.show !== 'object') options.show = { when: options.show };
          if(typeof options.show.when !== 'object') options.show.when = { event: options.show.when };
          if(typeof options.show.effect !== 'object') options.show.effect = { type: options.show.effect };
          if(typeof options.hide !== 'object') options.hide = { when: options.hide };
          if(typeof options.hide.when !== 'object') options.hide.when = { event: options.hide.when };
          if(typeof options.hide.effect !== 'object') options.hide.effect = { type: options.hide.effect };
          if(typeof options.style !== 'object') options.style = { name: options.style };
          options.style = sanitizeStyle(options.style);
 
          // Build main options object
          opts = $.extend(true, {}, $.fn.qtip.defaults, options);
 
          // Inherit all style properties into one syle object and include original options
          opts.style = buildStyle.call({ options: opts }, opts.style);
          opts.user = $.extend(true, {}, options);
       };
 
       // Iterate each matched element
       return $(this).each(function() // Return original elements as per jQuery guidelines
       {
          // Check for API commands
          if(typeof options == 'string')
          {
             command = options.toLowerCase();
             interfaces = $(this).qtip('interfaces');
 
             // Make sure API data exists$('.qtip').qtip('destroy')
             if(typeof interfaces == 'object')
             {
                // Check if API call is a BLANKET DESTROY command
                if(blanket === true && command == 'destroy')
                   while(interfaces.length > 0) interfaces[interfaces.length-1].destroy();
 
                // API call is not a BLANKET DESTROY command
                else
                {
                   // Check if supplied command effects this tooltip only (NOT BLANKET)
                   if(blanket !== true) interfaces = [ $(this).qtip('api') ];
 
                   // Execute command on chosen qTips
                   for(i = 0; i < interfaces.length; i++)
                   {
                      // Destroy command doesn't require tooltip to be rendered
                      if(command == 'destroy') interfaces[i].destroy();
 
                      // Only call API if tooltip is rendered and it wasn't a destroy call
                      else if(interfaces[i].status.rendered === true)
                      {
                         if(command == 'show') interfaces[i].show();
                         else if(command == 'hide') interfaces[i].hide();
                         else if(command == 'focus') interfaces[i].focus();
                         else if(command == 'disable') interfaces[i].disable(true);
                         else if(command == 'enable') interfaces[i].disable(false);
                      };
                   };
                };
             };
          }
 
          // No API commands, continue with qTip creation
          else
          {
             // Create unique configuration object
             config = $.extend(true, {}, opts);
             config.hide.effect.length = opts.hide.effect.length;
             config.show.effect.length = opts.show.effect.length;
 
             // Sanitize target options
             if(config.position.container === false) config.position.container = $(document.body);
             if(config.position.target === false) config.position.target = $(this);
             if(config.show.when.target === false) config.show.when.target = $(this);
             if(config.hide.when.target === false) config.hide.when.target = $(this);
 
             // Determine tooltip ID (Reuse array slots if possible)
             id = $.fn.qtip.interfaces.length;
             for(i = 0; i < id; i++)
             {
                if(typeof $.fn.qtip.interfaces[i] == 'undefined'){ id = i; break; };
             };
 
             // Instantiate the tooltip
             obj = new qTip($(this), config, id);
 
             // Add API references
             $.fn.qtip.interfaces[id] = obj;
 
             // Check if element already has qTip data assigned
             if(typeof $(this).data('qtip') == 'object')
             {
                // Set new current interface id
                if(typeof $(this).attr('qtip') === 'undefined')
                   $(this).data('qtip').current = $(this).data('qtip').interfaces.length;
 
                // Push new API interface onto interfaces array
                $(this).data('qtip').interfaces.push(obj);
             }
 
             // No qTip data is present, create now
             else $(this).data('qtip', { current: 0, interfaces: [obj] });
 
             // If prerendering is disabled, create tooltip on showEvent
             if(config.content.prerender === false && config.show.when.event !== false && config.show.ready !== true)
             {
                config.show.when.target.bind(config.show.when.event+'.qtip-'+id+'-create', { qtip: id }, function(event)
                {
                   // Retrieve API interface via passed qTip Id
                   api = $.fn.qtip.interfaces[ event.data.qtip ];
 
                   // Unbind show event and cache mouse coords
                   api.options.show.when.target.unbind(api.options.show.when.event+'.qtip-'+event.data.qtip+'-create');
                   api.cache.mouse = { x: event.pageX, y: event.pageY };
 
                   // Render tooltip and start the event sequence
                   construct.call( api );
                   api.options.show.when.target.trigger(api.options.show.when.event);
                });
             }
 
             // Prerendering is enabled, create tooltip now
             else
             {
                // Set mouse position cache to top left of the element
                obj.cache.mouse = {
                   x: config.show.when.target.offset().left,
                   y: config.show.when.target.offset().top
                };
 
                // Construct the tooltip
                construct.call(obj);
             }
          };
       });
    };
 
    // Instantiator
    function qTip(target, options, id)
    {
       // Declare this reference
       var self = this;
 
       // Setup class attributes
       self.id = id;
       self.options = options;
       self.status = {
          animated: false,
          rendered: false,
          disabled: false,
          focused: false
       };
       self.elements = {
          target: target.addClass(self.options.style.classes.target),
          tooltip: null,
          wrapper: null,
          content: null,
          contentWrapper: null,
          title: null,
          button: null,
          tip: null,
          bgiframe: null
       };
       self.cache = {
          mouse: {},
          position: {},
          toggle: 0
       };
       self.timers = {};
 
       // Define exposed API methods
       $.extend(self, self.options.api,
       {
          show: function(event)
          {
             var returned, solo;
 
             // Make sure tooltip is rendered and if not, return
             if(!self.status.rendered)
                return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'show');
 
             // Only continue if element is visible
             if(self.elements.tooltip.css('display') !== 'none') return self;
 
             // Clear animation queue
             self.elements.tooltip.stop(true, false);
 
             // Call API method and if return value is false, halt
             returned = self.beforeShow.call(self, event);
             if(returned === false) return self;
 
             // Define afterShow callback method
             function afterShow()
             {
                // Call API method and focus if it isn't static
                if(self.options.position.type !== 'static') self.focus();
                self.onShow.call(self, event);
 
                // Prevent antialias from disappearing in IE7 by removing filter attribute
                if($.browser.msie) self.elements.tooltip.get(0).style.removeAttribute('filter');
             };
 
             // Maintain toggle functionality if enabled
             self.cache.toggle = 1;
 
             // Update tooltip position if it isn't static
             if(self.options.position.type !== 'static')
                self.updatePosition(event, (self.options.show.effect.length > 0));
 
             // Hide other tooltips if tooltip is solo
             if(typeof self.options.show.solo == 'object') solo = $(self.options.show.solo);
             else if(self.options.show.solo === true) solo = $('div.qtip').not(self.elements.tooltip);
             if(solo) solo.each(function(){ if($(this).qtip('api').status.rendered === true) $(this).qtip('api').hide(); });
 
             // Show tooltip
             if(typeof self.options.show.effect.type == 'function')
             {
                self.options.show.effect.type.call(self.elements.tooltip, self.options.show.effect.length);
                self.elements.tooltip.queue(function(){ afterShow(); $(this).dequeue(); });
             }
             else
             {
                switch(self.options.show.effect.type.toLowerCase())
                {
                   case 'fade':
                      self.elements.tooltip.fadeIn(self.options.show.effect.length, afterShow);
                      break;
                   case 'slide':
                      self.elements.tooltip.slideDown(self.options.show.effect.length, function()
                      {
                         afterShow();
                         if(self.options.position.type !== 'static') self.updatePosition(event, true);
                      });
                      break;
                   case 'grow':
                      self.elements.tooltip.show(self.options.show.effect.length, afterShow);
                      break;
                   default:
                      self.elements.tooltip.show(null, afterShow);
                      break;
                };
 
                // Add active class to tooltip
                self.elements.tooltip.addClass(self.options.style.classes.active);
             };
 
             // Log event and return
             return $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_SHOWN, 'show');
          },
 
          hide: function(event)
          {
             var returned;
 
             // Make sure tooltip is rendered and if not, return
             if(!self.status.rendered)
                return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'hide');
 
             // Only continue if element is visible
             else if(self.elements.tooltip.css('display') === 'none') return self;
 
             // Stop show timer and animation queue
             clearTimeout(self.timers.show);
             self.elements.tooltip.stop(true, false);
 
             // Call API method and if return value is false, halt
             returned = self.beforeHide.call(self, event);
             if(returned === false) return self;
 
             // Define afterHide callback method
             function afterHide(){ self.onHide.call(self, event); };
 
             // Maintain toggle functionality if enabled
             self.cache.toggle = 0;
 
             // Hide tooltip
             if(typeof self.options.hide.effect.type == 'function')
             {
                self.options.hide.effect.type.call(self.elements.tooltip, self.options.hide.effect.length);
                self.elements.tooltip.queue(function(){ afterHide(); $(this).dequeue(); });
             }
             else
             {
                switch(self.options.hide.effect.type.toLowerCase())
                {
                   case 'fade':
                      self.elements.tooltip.fadeOut(self.options.hide.effect.length, afterHide);
                      break;
                   case 'slide':
                      self.elements.tooltip.slideUp(self.options.hide.effect.length, afterHide);
                      break;
                   case 'grow':
                      self.elements.tooltip.hide(self.options.hide.effect.length, afterHide);
                      break;
                   default:
                      self.elements.tooltip.hide(null, afterHide);
                      break;
                };
 
                // Remove active class to tooltip
                self.elements.tooltip.removeClass(self.options.style.classes.active);
             };
 
             // Log event and return
             return $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_HIDDEN, 'hide');
          },
 
          updatePosition: function(event, animate)
          {
             var i, target, tooltip, coords, mapName, imagePos, newPosition, ieAdjust, ie6Adjust, borderAdjust, mouseAdjust, offset, curPosition, returned
 
             // Make sure tooltip is rendered and if not, return
             if(!self.status.rendered)
                return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'updatePosition');
 
             // If tooltip is static, return
             else if(self.options.position.type == 'static')
                return $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.CANNOT_POSITION_STATIC, 'updatePosition');
 
             // Define property objects
             target = {
                position: { left: 0, top: 0 },
                dimensions: { height: 0, width: 0 },
                corner: self.options.position.corner.target
             };
             tooltip = {
                position: self.getPosition(),
                dimensions: self.getDimensions(),
                corner: self.options.position.corner.tooltip
             };
 
             // Target is an HTML element
             if(self.options.position.target !== 'mouse')
             {
                // If the HTML element is AREA, calculate position manually
                if(self.options.position.target.get(0).nodeName.toLowerCase() == 'area')
                {
                   // Retrieve coordinates from coords attribute and parse into integers
                   coords = self.options.position.target.attr('coords').split(',');
                   for(i = 0; i < coords.length; i++) coords[i] = parseInt(coords[i]);
 
                   // Setup target position object
                   mapName = self.options.position.target.parent('map').attr('name');
                   imagePos = $('img[usemap="#'+mapName+'"]:first').offset();
                   target.position = {
                      left: Math.floor(imagePos.left + coords[0]),
                      top: Math.floor(imagePos.top + coords[1])
                   };
 
                   // Determine width and height of the area
                   switch(self.options.position.target.attr('shape').toLowerCase())
                   {
                      case 'rect':
                         target.dimensions = {
                            width: Math.ceil(Math.abs(coords[2] - coords[0])),
                            height: Math.ceil(Math.abs(coords[3] - coords[1]))
                         };
                         break;
 
                      case 'circle':
                         target.dimensions = {
                            width: coords[2] + 1,
                            height: coords[2] + 1
                         };
                         break;
 
                      case 'poly':
                         target.dimensions = {
                            width: coords[0],
                            height: coords[1]
                         };
 
                         for(i = 0; i < coords.length; i++)
                         {
                            if(i % 2 == 0)
                            {
                               if(coords[i] > target.dimensions.width)
                                  target.dimensions.width = coords[i];
                               if(coords[i] < coords[0])
                                  target.position.left = Math.floor(imagePos.left + coords[i]);
                            }
                            else
                            {
                               if(coords[i] > target.dimensions.height)
                                  target.dimensions.height = coords[i];
                               if(coords[i] < coords[1])
                                  target.position.top = Math.floor(imagePos.top + coords[i]);
                            };
                         };
 
                         target.dimensions.width = target.dimensions.width - (target.position.left - imagePos.left);
                         target.dimensions.height = target.dimensions.height - (target.position.top - imagePos.top);
                         break;
 
                      default:
                         return $.fn.qtip.log.error.call(self, 4, $.fn.qtip.constants.INVALID_AREA_SHAPE, 'updatePosition');
                         break;
                   };
 
                   // Adjust position by 2 pixels (Positioning bug?)
                   target.dimensions.width -= 2; target.dimensions.height -= 2;
                }
 
                // Target is the document
                else if(self.options.position.target.add(document.body).length === 1)
                {
                   target.position = { left: $(document).scrollLeft(), top: $(document).scrollTop() };
                   target.dimensions = { height: $(window).height(), width: $(window).width() };
                }
 
                // Target is a regular HTML element, find position normally
                else
                {
                   // Check if the target is another tooltip. If its animated, retrieve position from newPosition data
                   if(typeof self.options.position.target.attr('qtip') !== 'undefined')
                      target.position = self.options.position.target.qtip('api').cache.position;
                   else
                      target.position = self.options.position.target.offset();
 
                   // Setup dimensions objects
                   target.dimensions = {
                      height: self.options.position.target.outerHeight(),
                      width: self.options.position.target.outerWidth()
                   };
                };
 
                // Calculate correct target corner position
                newPosition = $.extend({}, target.position);
                if(target.corner.search(/right/i) !== -1)
                   newPosition.left += target.dimensions.width;
 
                if(target.corner.search(/bottom/i) !== -1)
                   newPosition.top += target.dimensions.height;
 
                if(target.corner.search(/((top|bottom)Middle)|center/) !== -1)
                   newPosition.left += (target.dimensions.width / 2);
 
                if(target.corner.search(/((left|right)Middle)|center/) !== -1)
                   newPosition.top += (target.dimensions.height / 2);
             }
 
             // Mouse is the target, set position to current mouse coordinates
             else
             {
                // Setup target position and dimensions objects
                target.position = newPosition = { left: self.cache.mouse.x, top: self.cache.mouse.y };
                target.dimensions = { height: 1, width: 1 };
             };
 
             // Calculate correct target corner position
             if(tooltip.corner.search(/right/i) !== -1)
                newPosition.left -= tooltip.dimensions.width;
 
             if(tooltip.corner.search(/bottom/i) !== -1)
                newPosition.top -= tooltip.dimensions.height;
 
             if(tooltip.corner.search(/((top|bottom)Middle)|center/) !== -1)
                newPosition.left -= (tooltip.dimensions.width / 2);
 
             if(tooltip.corner.search(/((left|right)Middle)|center/) !== -1)
                newPosition.top -= (tooltip.dimensions.height / 2);
 
             // Setup IE adjustment variables (Pixel gap bugs)
             ieAdjust = ($.browser.msie) ? 1 : 0; // And this is why I hate IE...
             ie6Adjust = ($.browser.msie && parseInt($.browser.version.charAt(0)) === 6) ? 1 : 0; // ...and even more so IE6!
 
             // Adjust for border radius
             if(self.options.style.border.radius > 0)
             {
                if(tooltip.corner.search(/Left/) !== -1)
                   newPosition.left -= self.options.style.border.radius;
                else if(tooltip.corner.search(/Right/) !== -1)
                   newPosition.left += self.options.style.border.radius;
 
                if(tooltip.corner.search(/Top/) !== -1)
                   newPosition.top -= self.options.style.border.radius;
                else if(tooltip.corner.search(/Bottom/) !== -1)
                   newPosition.top += self.options.style.border.radius;
             };
 
             // IE only adjustments (Pixel perfect!)
             if(ieAdjust)
             {
                if(tooltip.corner.search(/top/) !== -1)
                   newPosition.top -= ieAdjust
                else if(tooltip.corner.search(/bottom/) !== -1)
                   newPosition.top += ieAdjust
 
                if(tooltip.corner.search(/left/) !== -1)
                   newPosition.left -= ieAdjust
                else if(tooltip.corner.search(/right/) !== -1)
                   newPosition.left += ieAdjust
 
                if(tooltip.corner.search(/leftMiddle|rightMiddle/) !== -1)
                   newPosition.top -= 1
             };
 
             // If screen adjustment is enabled, apply adjustments
             if(self.options.position.adjust.screen === true)
                newPosition = screenAdjust.call(self, newPosition, target, tooltip);
 
             // If mouse is the target, prevent tooltip appearing directly under the mouse
             if(self.options.position.target === 'mouse' && self.options.position.adjust.mouse === true)
             {
                if(self.options.position.adjust.screen === true && self.elements.tip)
                   mouseAdjust = self.elements.tip.attr('rel');
                else
                   mouseAdjust = self.options.position.corner.tooltip;
 
                newPosition.left += (mouseAdjust.search(/right/i) !== -1) ? -6 : 6;
                newPosition.top += (mouseAdjust.search(/bottom/i) !== -1) ? -6 : 6;
             }
 
             // Initiate bgiframe plugin in IE6 if tooltip overlaps a select box or object element
             if(!self.elements.bgiframe && $.browser.msie && parseInt($.browser.version.charAt(0)) == 6)
             {
                $('select, object').each(function()
                {
                   offset = $(this).offset();
                   offset.bottom = offset.top + $(this).height();
                   offset.right = offset.left + $(this).width();
 
                   if(newPosition.top + tooltip.dimensions.height >= offset.top
                   && newPosition.left + tooltip.dimensions.width >= offset.left)
                      bgiframe.call(self);
                });
             };
 
             // Add user xy adjustments
             newPosition.left += self.options.position.adjust.x;
             newPosition.top += self.options.position.adjust.y;
 
             // Set new tooltip position if its moved, animate if enabled
             curPosition = self.getPosition();
             if(newPosition.left != curPosition.left || newPosition.top != curPosition.top)
             {
                // Call API method and if return value is false, halt
                returned = self.beforePositionUpdate.call(self, event);
                if(returned === false) return self;
 
                // Cache new position
                self.cache.position = newPosition;
 
                // Check if animation is enabled
                if(animate === true)
                {
                   // Set animated status
                   self.status.animated = true;
 
                   // Animate and reset animated status on animation end
                   self.elements.tooltip.animate(newPosition, 200, 'swing', function(){ self.status.animated = false });
                }
 
                // Set new position via CSS
                else self.elements.tooltip.css(newPosition);
 
                // Call API method and log event if its not a mouse move
                self.onPositionUpdate.call(self, event);
                if(typeof event !== 'undefined' && event.type && event.type !== 'mousemove')
                   $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_POSITION_UPDATED, 'updatePosition');
             };
 
             return self;
          },
 
          updateWidth: function(newWidth)
          {
             var hidden;
 
             // Make sure tooltip is rendered and if not, return
             if(!self.status.rendered)
                return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'updateWidth');
 
             // Make sure supplied width is a number and if not, return
             else if(newWidth && typeof newWidth !== 'number')
                return $.fn.qtip.log.error.call(self, 2, 'newWidth must be of type number', 'updateWidth');
 
             // Setup elements which must be hidden during width update
             hidden = self.elements.contentWrapper.siblings().add(self.elements.tip).add(self.elements.button);
 
             // Calculate the new width if one is not supplied
             if(!newWidth)
             {
                // Explicit width is set
                if(typeof self.options.style.width.value == 'number')
                   newWidth = self.options.style.width.value;
 
                // No width is set, proceed with auto detection
                else
                {
                   // Set width to auto initally to determine new width and hide other elements
                   self.elements.tooltip.css({ width: 'auto' });
                   hidden.hide();
 
                   // Set position and zoom to defaults to prevent IE hasLayout bug
                   if($.browser.msie)
                      self.elements.wrapper.add(self.elements.contentWrapper.children()).css({ zoom: 'normal' });
 
                   // Set the new width
                   newWidth = self.getDimensions().width + 1;
 
                   // Make sure its within the maximum and minimum width boundries
                   if(!self.options.style.width.value)
                   {
                      if(newWidth > self.options.style.width.max) newWidth = self.options.style.width.max
                      if(newWidth < self.options.style.width.min) newWidth = self.options.style.width.min
                   };
                };
             };
 
             // Adjust newWidth by 1px if width is odd (IE6 rounding bug fix)
             if(newWidth % 2 !== 0) newWidth -= 1;
 
             // Set the new calculated width and unhide other elements
             self.elements.tooltip.width(newWidth);
             hidden.show();
 
             // Set the border width, if enabled
             if(self.options.style.border.radius)
             {
                self.elements.tooltip.find('.qtip-betweenCorners').each(function(i)
                {
                   $(this).width(newWidth - (self.options.style.border.radius * 2));
                })
             };
 
             // IE only adjustments
             if($.browser.msie)
             {
                // Reset position and zoom to give the wrapper layout (IE hasLayout bug)
                self.elements.wrapper.add(self.elements.contentWrapper.children()).css({ zoom: '1' });
 
                // Set the new width
                self.elements.wrapper.width(newWidth);
 
                // Adjust BGIframe height and width if enabled
                if(self.elements.bgiframe) self.elements.bgiframe.width(newWidth).height(self.getDimensions.height);
             };
 
             // Log event and return
             return $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_WIDTH_UPDATED, 'updateWidth');
          },
 
          updateStyle: function(name)
          {
             var tip, borders, context, corner, coordinates;
 
             // Make sure tooltip is rendered and if not, return
             if(!self.status.rendered)
                return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'updateStyle');
 
             // Return if style is not defined or name is not a string
             else if(typeof name !== 'string' || !$.fn.qtip.styles[name])
                return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.STYLE_NOT_DEFINED, 'updateStyle');
 
             // Set the new style object
             self.options.style = buildStyle.call(self, $.fn.qtip.styles[name], self.options.user.style);
 
             // Update initial styles of content and title elements
             self.elements.content.css( jQueryStyle(self.options.style) );
             if(self.options.content.title.text !== false)
                self.elements.title.css( jQueryStyle(self.options.style.title, true) );
 
             // Update CSS border colour
             self.elements.contentWrapper.css({ borderColor: self.options.style.border.color });
 
             // Update tip color if enabled
             if(self.options.style.tip.corner !== false)
             {
                if($('<canvas>').get(0).getContext)
                {
                   // Retrieve canvas context and clear
                   tip = self.elements.tooltip.find('.qtip-tip canvas:first');
                   context = tip.get(0).getContext('2d');
                   context.clearRect(0,0,300,300);
 
                   // Draw new tip
                   corner = tip.parent('div[rel]:first').attr('rel');
                   coordinates = calculateTip(corner, self.options.style.tip.size.width, self.options.style.tip.size.height);
                   drawTip.call(self, tip, coordinates, self.options.style.tip.color || self.options.style.border.color);
                }
                else if($.browser.msie)
                {
                   // Set new fillcolor attribute
                   tip = self.elements.tooltip.find('.qtip-tip [nodeName="shape"]');
                   tip.attr('fillcolor', self.options.style.tip.color || self.options.style.border.color);
                };
             };
 
             // Update border colors if enabled
             if(self.options.style.border.radius > 0)
             {
                self.elements.tooltip.find('.qtip-betweenCorners').css({ backgroundColor: self.options.style.border.color });
 
                if($('<canvas>').get(0).getContext)
                {
                   borders = calculateBorders(self.options.style.border.radius)
                   self.elements.tooltip.find('.qtip-wrapper canvas').each(function()
                   {
                      // Retrieve canvas context and clear
                      context = $(this).get(0).getContext('2d');
                      context.clearRect(0,0,300,300);
 
                      // Draw new border
                      corner = $(this).parent('div[rel]:first').attr('rel')
                      drawBorder.call(self, $(this), borders[corner],
                         self.options.style.border.radius, self.options.style.border.color);
                   });
                }
                else if($.browser.msie)
                {
                   // Set new fillcolor attribute on each border corner
                   self.elements.tooltip.find('.qtip-wrapper [nodeName="arc"]').each(function()
                   {
                      $(this).attr('fillcolor', self.options.style.border.color)
                   });
                };
             };
 
             // Log event and return
             return $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_STYLE_UPDATED, 'updateStyle');
          },
 
          updateContent: function(content, reposition)
          {
             var parsedContent, images, loadedImages;
 
             // Make sure tooltip is rendered and if not, return
             if(!self.status.rendered)
                return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'updateContent');
 
             // Make sure content is defined before update
             else if(!content)
                return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.NO_CONTENT_PROVIDED, 'updateContent');
 
             // Call API method and set new content if a string is returned
             parsedContent = self.beforeContentUpdate.call(self, content);
             if(typeof parsedContent == 'string') content = parsedContent;
             else if(parsedContent === false) return;
 
             // Set position and zoom to defaults to prevent IE hasLayout bug
             if($.browser.msie) self.elements.contentWrapper.children().css({ zoom: 'normal' });
 
             // Append new content if its a DOM array and show it if hidden
             if(content.jquery && content.length > 0)
                content.clone(true).appendTo(self.elements.content).show();
 
             // Content is a regular string, insert the new content
             else self.elements.content.html(content);
 
             // Check if images need to be loaded before position is updated to prevent mis-positioning
             images = self.elements.content.find('img[complete=false]');
             if(images.length > 0)
             {
                loadedImages = 0;
                images.each(function(i)
                {
                   $('<img src="'+ $(this).attr('src') +'" />')
                      .load(function(){ if(++loadedImages == images.length) afterLoad(); });
                });
             }
             else afterLoad();
 
             function afterLoad()
             {
                // Update the tooltip width
                self.updateWidth();
 
                // If repositioning is enabled, update positions
                if(reposition !== false)
                {
                   // Update position if tooltip isn't static
                   if(self.options.position.type !== 'static')
                      self.updatePosition(self.elements.tooltip.is(':visible'), true);
 
                   // Reposition the tip if enabled
                   if(self.options.style.tip.corner !== false)
                      positionTip.call(self);
                };
             };
 
             // Call API method and log event
             self.onContentUpdate.call(self);
             return $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_CONTENT_UPDATED, 'loadContent');
          },
 
          loadContent: function(url, data, method)
          {
             var returned;
 
             // Make sure tooltip is rendered and if not, return
             if(!self.status.rendered)
                return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'loadContent');
 
             // Call API method and if return value is false, halt
             returned = self.beforeContentLoad.call(self);
             if(returned === false) return self;
 
             // Load content using specified request type
             if(method == 'post')
                $.post(url, data, setupContent);
             else
                $.get(url, data, setupContent);
 
             function setupContent(content)
             {
                // Call API method and log event
                self.onContentLoad.call(self);
                $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_CONTENT_LOADED, 'loadContent');
 
                // Update the content
                self.updateContent(content);
             };
 
             return self;
          },
 
          updateTitle: function(content)
          {
             // Make sure tooltip is rendered and if not, return
             if(!self.status.rendered)
                return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'updateTitle');
 
             // Make sure content is defined before update
             else if(!content)
                return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.NO_CONTENT_PROVIDED, 'updateTitle');
 
             // Call API method and if return value is false, halt
             returned = self.beforeTitleUpdate.call(self);
             if(returned === false) return self;
 
             // Set the new content and reappend the button if enabled
             if(self.elements.button) self.elements.button = self.elements.button.clone(true);
             self.elements.title.html(content)
             if(self.elements.button) self.elements.title.prepend(self.elements.button);
 
             // Call API method and log event
             self.onTitleUpdate.call(self);
             return $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_TITLE_UPDATED, 'updateTitle');
          },
 
          focus: function(event)
          {
             var curIndex, newIndex, elemIndex, returned;
 
             // Make sure tooltip is rendered and if not, return
             if(!self.status.rendered)
                return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'focus');
 
             else if(self.options.position.type == 'static')
                return $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.CANNOT_FOCUS_STATIC, 'focus');
 
             // Set z-index variables
             curIndex = parseInt( self.elements.tooltip.css('z-index') );
             newIndex = 6000 + $('div.qtip[qtip]').length - 1;
 
             // Only update the z-index if it has changed and tooltip is not already focused
             if(!self.status.focused && curIndex !== newIndex)
             {
                // Call API method and if return value is false, halt
                returned = self.beforeFocus.call(self, event);
                if(returned === false) return self;
 
                // Loop through all other tooltips
                $('div.qtip[qtip]').not(self.elements.tooltip).each(function()
                {
                   if($(this).qtip('api').status.rendered === true)
                   {
                      elemIndex = parseInt($(this).css('z-index'));
 
                      // Reduce all other tooltip z-index by 1
                      if(typeof elemIndex == 'number' && elemIndex > -1)
                         $(this).css({ zIndex: parseInt( $(this).css('z-index') ) - 1 });
 
                      // Set focused status to false
                      $(this).qtip('api').status.focused = false;
                   }
                })
 
                // Set the new z-index and set focus status to true
                self.elements.tooltip.css({ zIndex: newIndex });
                self.status.focused = true;
 
                // Call API method and log event
                self.onFocus.call(self, event);
                $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_FOCUSED, 'focus');
             };
 
             return self;
          },
 
          disable: function(state)
          {
             // Make sure tooltip is rendered and if not, return
             if(!self.status.rendered)
                return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'disable');
 
             if(state)
             {
                // Tooltip is not already disabled, proceed
                if(!self.status.disabled)
                {
                   // Set the disabled flag and log event
                   self.status.disabled = true;
                   $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_DISABLED, 'disable');
                }
 
                // Tooltip is already disabled, inform user via log
                else  $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.TOOLTIP_ALREADY_DISABLED, 'disable');
             }
             else
             {
                // Tooltip is not already enabled, proceed
                if(self.status.disabled)
                {
                   // Reassign events, set disable status and log
                   self.status.disabled = false;
                   $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_ENABLED, 'disable');
                }
 
                // Tooltip is already enabled, inform the user via log
                else $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.TOOLTIP_ALREADY_ENABLED, 'disable');
             };
 
             return self;
          },
 
          destroy: function()
          {
             var i, returned, interfaces;
 
             // Call API method and if return value is false, halt
             returned = self.beforeDestroy.call(self);
             if(returned === false) return self;
 
             // Check if tooltip is rendered
             if(self.status.rendered)
             {
                // Remove event handlers and remove element
                self.options.show.when.target.unbind('mousemove.qtip', self.updatePosition);
                self.options.show.when.target.unbind('mouseout.qtip', self.hide);
                self.options.show.when.target.unbind(self.options.show.when.event + '.qtip');
                self.options.hide.when.target.unbind(self.options.hide.when.event + '.qtip');
                self.elements.tooltip.unbind(self.options.hide.when.event + '.qtip');
                self.elements.tooltip.unbind('mouseover.qtip', self.focus);
                self.elements.tooltip.remove();
             }
 
             // Tooltip isn't yet rendered, remove render event
             else self.options.show.when.target.unbind(self.options.show.when.event+'.qtip-create');
 
             // Check to make sure qTip data is present on target element
             if(typeof self.elements.target.data('qtip') == 'object')
             {
                // Remove API references from interfaces object
                interfaces = self.elements.target.data('qtip').interfaces;
                if(typeof interfaces == 'object' && interfaces.length > 0)
                {
                   // Remove API from interfaces array
                   for(i = 0; i < interfaces.length - 1; i++)
                      if(interfaces[i].id == self.id) interfaces.splice(i, 1)
                }
             }
             delete $.fn.qtip.interfaces[self.id];
 
             // Set qTip current id to previous tooltips API if available
             if(typeof interfaces == 'object' && interfaces.length > 0)
                self.elements.target.data('qtip').current = interfaces.length -1;
             else
                self.elements.target.removeData('qtip');
 
             // Call API method and log destroy
             self.onDestroy.call(self);
             $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_DESTROYED, 'destroy');
 
             return self.elements.target
          },
 
          getPosition: function()
          {
             var show, offset;
 
             // Make sure tooltip is rendered and if not, return
             if(!self.status.rendered)
                return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'getPosition');
 
             show = (self.elements.tooltip.css('display') !== 'none') ? false : true;
 
             // Show and hide tooltip to make sure coordinates are returned
             if(show) self.elements.tooltip.css({ visiblity: 'hidden' }).show();
             offset = self.elements.tooltip.offset();
             if(show) self.elements.tooltip.css({ visiblity: 'visible' }).hide();
 
             return offset;
          },
 
          getDimensions: function()
          {
             var show, dimensions;
 
             // Make sure tooltip is rendered and if not, return
             if(!self.status.rendered)
                return $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.TOOLTIP_NOT_RENDERED, 'getDimensions');
 
             show = (!self.elements.tooltip.is(':visible')) ? true : false;
 
             // Show and hide tooltip to make sure dimensions are returned
             if(show) self.elements.tooltip.css({ visiblity: 'hidden' }).show();
             dimensions = {
                height: self.elements.tooltip.outerHeight(),
                width: self.elements.tooltip.outerWidth()
             };
             if(show) self.elements.tooltip.css({ visiblity: 'visible' }).hide();
 
             return dimensions;
          }
       });
    };
 
    // Define priamry construct function
    function construct()
    {
       var self, adjust, content, url, data, method, tempLength;
       self = this;
 
       // Call API method
       self.beforeRender.call(self);
 
       // Set rendered status to true
       self.status.rendered = true;
 
       // Create initial tooltip elements
       self.elements.tooltip =  '<div qtip="'+self.id+'" ' +
          'class="qtip '+(self.options.style.classes.tooltip || self.options.style)+'"' +
          'style="display:none; -moz-border-radius:0; -webkit-border-radius:0; border-radius:0;' +
          'position:'+self.options.position.type+';">' +
          '  <div class="qtip-wrapper" style="position:relative; overflow:hidden; text-align:left;">' +
          '    <div class="qtip-contentWrapper" style="overflow:hidden;">' +
          '       <div class="qtip-content '+self.options.style.classes.content+'"></div>' +
          '</div></div></div>';
 
       // Append to container element
       self.elements.tooltip = $(self.elements.tooltip);
       self.elements.tooltip.appendTo(self.options.position.container)
 
       // Setup tooltip qTip data
       self.elements.tooltip.data('qtip', { current: 0, interfaces: [self] });
 
       // Setup element references
       self.elements.wrapper = self.elements.tooltip.children('div:first');
       self.elements.contentWrapper = self.elements.wrapper.children('div:first').css({ background: self.options.style.background });
       self.elements.content = self.elements.contentWrapper.children('div:first').css( jQueryStyle(self.options.style) );
 
       // Apply IE hasLayout fix to wrapper and content elements
       if($.browser.msie) self.elements.wrapper.add(self.elements.content).css({ zoom: 1 });
 
       // Setup tooltip attributes
       if(self.options.hide.when.event == 'unfocus') self.elements.tooltip.attr('unfocus', true);
 
       // If an explicit width is set, updateWidth prior to setting content to prevent dirty rendering
       if(typeof self.options.style.width.value == 'number') self.updateWidth();
 
       // Create borders and tips if supported by the browser
       if($('<canvas>').get(0).getContext || $.browser.msie)
       {
          // Create border
          if(self.options.style.border.radius > 0)
             createBorder.call(self);
          else
             self.elements.contentWrapper.css({ border: self.options.style.border.width+'px solid '+self.options.style.border.color  });
 
          // Create tip if enabled
          if(self.options.style.tip.corner !== false)
             createTip.call(self);
       }
 
       // Neither canvas or VML is supported, tips and borders cannot be drawn!
       else
       {
          // Set defined border width
          self.elements.contentWrapper.css({ border: self.options.style.border.width+'px solid '+self.options.style.border.color  });
 
          // Reset border radius and tip
          self.options.style.border.radius = 0;
          self.options.style.tip.corner = false;
 
          // Inform via log
          $.fn.qtip.log.error.call(self, 2, $.fn.qtip.constants.CANVAS_VML_NOT_SUPPORTED, 'render');
       };
 
       // Use the provided content string or DOM array
       if((typeof self.options.content.text == 'string' && self.options.content.text.length > 0)
       || (self.options.content.text.jquery && self.options.content.text.length > 0))
          content = self.options.content.text;
 
       // Use title string for content if present
       else if(typeof self.elements.target.attr('title') == 'string' && self.elements.target.attr('title').length > 0)
       {
          content = self.elements.target.attr('title').replace("\\n", '<br />');
          self.elements.target.attr('title', ''); // Remove title attribute to prevent default tooltip showing
       }
 
       // No title is present, use alt attribute instead
       else if(typeof self.elements.target.attr('alt') == 'string' && self.elements.target.attr('alt').length > 0)
       {
          content = self.elements.target.attr('alt').replace("\\n", '<br />');
          self.elements.target.attr('alt', ''); // Remove alt attribute to prevent default tooltip showing
       }
 
       // No valid content was provided, inform via log
       else
       {
          content = ' ';
          $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.NO_VALID_CONTENT, 'render');
       };
 
       // Set the tooltips content and create title if enabled
       if(self.options.content.title.text !== false) createTitle.call(self);
       self.updateContent(content);
 
       // Assign events and toggle tooltip with focus
       assignEvents.call(self);
       if(self.options.show.ready === true) self.show();
 
       // Retrieve ajax content if provided
       if(self.options.content.url !== false)
       {
          url = self.options.content.url;
          data = self.options.content.data;
          method = self.options.content.method || 'get';
          self.loadContent(url, data, method);
       };
 
       // Call API method and log event
       self.onRender.call(self);
       $.fn.qtip.log.error.call(self, 1, $.fn.qtip.constants.EVENT_RENDERED, 'render');
    };
 
    // Create borders using canvas and VML
    function createBorder()
    {
       var self, i, width, radius, color, coordinates, containers, size, betweenWidth, betweenCorners, borderTop, borderBottom, borderCoord, sideWidth, vertWidth;
       self = this;
 
       // Destroy previous border elements, if present
       self.elements.wrapper.find('.qtip-borderBottom, .qtip-borderTop').remove();
 
       // Setup local variables
       width = self.options.style.border.width;
       radius = self.options.style.border.radius;
       color = self.options.style.border.color || self.options.style.tip.color;
 
       // Calculate border coordinates
       coordinates = calculateBorders(radius);
 
       // Create containers for the border shapes
       containers = {};
       for(i in coordinates)
       {
          // Create shape container
          containers[i] = '<div rel="'+i+'" style="'+((i.search(/Left/) !== -1) ? 'left' : 'right') + ':0; ' +
             'position:absolute; height:'+radius+'px; width:'+radius+'px; overflow:hidden; line-height:0.1px; font-size:1px">';
 
          // Canvas is supported
          if($('<canvas>').get(0).getContext)
             containers[i] += '<canvas height="'+radius+'" width="'+radius+'" style="vertical-align: top"></canvas>';
 
          // No canvas, but if it's IE use VML
          else if($.browser.msie)
          {
             size = radius * 2 + 3;
             containers[i] += '<v:arc stroked="false" fillcolor="'+color+'" startangle="'+coordinates[i][0]+'" endangle="'+coordinates[i][1]+'" ' +
                'style="width:'+size+'px; height:'+size+'px; margin-top:'+((i.search(/bottom/) !== -1) ? -2 : -1)+'px; ' +
                'margin-left:'+((i.search(/Right/) !== -1) ? coordinates[i][2] - 3.5 : -1)+'px; ' +
                'vertical-align:top; display:inline-block; behavior:url(#default#VML)"></v:arc>';
 
          };
 
          containers[i] += '</div>';
       };
 
       // Create between corners elements
       betweenWidth = self.getDimensions().width - (Math.max(width, radius) * 2);
       betweenCorners = '<div class="qtip-betweenCorners" style="height:'+radius+'px; width:'+betweenWidth+'px; ' +
          'overflow:hidden; background-color:'+color+'; line-height:0.1px; font-size:1px;">';
 
       // Create top border container
       borderTop = '<div class="qtip-borderTop" dir="ltr" style="height:'+radius+'px; ' +
          'margin-left:'+radius+'px; line-height:0.1px; font-size:1px; padding:0;">' +
          containers['topLeft'] + containers['topRight'] + betweenCorners;
       self.elements.wrapper.prepend(borderTop);
 
       // Create bottom border container
       borderBottom = '<div class="qtip-borderBottom" dir="ltr" style="height:'+radius+'px; ' +
          'margin-left:'+radius+'px; line-height:0.1px; font-size:1px; padding:0;">' +
          containers['bottomLeft'] + containers['bottomRight'] + betweenCorners;
       self.elements.wrapper.append(borderBottom);
 
       // Draw the borders if canvas were used (Delayed til after DOM creation)
       if($('<canvas>').get(0).getContext)
       {
          self.elements.wrapper.find('canvas').each(function()
          {
             borderCoord = coordinates[ $(this).parent('[rel]:first').attr('rel') ];
             drawBorder.call(self, $(this), borderCoord, radius, color);
          })
       }
 
       // Create a phantom VML element (IE won't show the last created VML element otherwise)
       else if($.browser.msie) self.elements.tooltip.append('<v:image style="behavior:url(#default#VML);"></v:image>');
 
       // Setup contentWrapper border
       sideWidth = Math.max(radius, (radius + (width - radius)) )
       vertWidth = Math.max(width - radius, 0);
       self.elements.contentWrapper.css({
          border: '0px solid ' + color,
          borderWidth: vertWidth + 'px ' + sideWidth + 'px'
       })
    };
 
    // Border canvas draw method
    function drawBorder(canvas, coordinates, radius, color)
    {
       // Create corner
       var context = canvas.get(0).getContext('2d');
       context.fillStyle = color;
       context.beginPath();
       context.arc(coordinates[0], coordinates[1], radius, 0, Math.PI * 2, false);
       context.fill();
    };
 
    // Create tip using canvas and VML
    function createTip(corner)
    {
       var self, color, coordinates, coordsize, path;
       self = this;
 
       // Destroy previous tip, if there is one
       if(self.elements.tip !== null) self.elements.tip.remove();
 
       // Setup color and corner values
       color = self.options.style.tip.color || self.options.style.border.color;
       if(self.options.style.tip.corner === false) return;
       else if(!corner) corner = self.options.style.tip.corner;
 
       // Calculate tip coordinates
       coordinates = calculateTip(corner, self.options.style.tip.size.width, self.options.style.tip.size.height);
 
       // Create tip element
       self.elements.tip =  '<div class="'+self.options.style.classes.tip+'" dir="ltr" rel="'+corner+'" style="position:absolute; ' +
          'height:'+self.options.style.tip.size.height+'px; width:'+self.options.style.tip.size.width+'px; ' +
          'margin:0 auto; line-height:0.1px; font-size:1px;">';
 
       // Use canvas element if supported
       if($('<canvas>').get(0).getContext)
           self.elements.tip += '<canvas height="'+self.options.style.tip.size.height+'" width="'+self.options.style.tip.size.width+'"></canvas>';
 
       // Canvas not supported - Use VML (IE)
       else if($.browser.msie)
       {
          // Create coordize and tip path using tip coordinates
          coordsize = self.options.style.tip.size.width + ',' + self.options.style.tip.size.height;
          path = 'm' + coordinates[0][0] + ',' + coordinates[0][1];
          path += ' l' + coordinates[1][0] + ',' + coordinates[1][1];
          path += ' ' + coordinates[2][0] + ',' + coordinates[2][1];
          path += ' xe';
 
          // Create VML element
          self.elements.tip += '<v:shape fillcolor="'+color+'" stroked="false" filled="true" path="'+path+'" coordsize="'+coordsize+'" ' +
             'style="width:'+self.options.style.tip.size.width+'px; height:'+self.options.style.tip.size.height+'px; ' +
             'line-height:0.1px; display:inline-block; behavior:url(#default#VML); ' +
             'vertical-align:'+((corner.search(/top/) !== -1) ? 'bottom' : 'top')+'"></v:shape>';
 
          // Create a phantom VML element (IE won't show the last created VML element otherwise)
          self.elements.tip += '<v:image style="behavior:url(#default#VML);"></v:image>';
 
          // Prevent tooltip appearing above the content (IE z-index bug)
          self.elements.contentWrapper.css('position', 'relative');
       };
 
       // Attach new tip to tooltip element
       self.elements.tooltip.prepend(self.elements.tip + '</div>');
 
       // Create element reference and draw the canvas tip (Delayed til after DOM creation)
       self.elements.tip = self.elements.tooltip.find('.'+self.options.style.classes.tip).eq(0);
       if($('<canvas>').get(0).getContext)
          drawTip.call(self, self.elements.tip.find('canvas:first'), coordinates, color);
 
       // Fix IE small tip bug
       if(corner.search(/top/) !== -1 && $.browser.msie && parseInt($.browser.version.charAt(0)) === 6)
          self.elements.tip.css({ marginTop: -4 });
 
       // Set the tip position
       positionTip.call(self, corner);
    };
 
    // Canvas tip drawing method
    function drawTip(canvas, coordinates, color)
    {
       // Setup properties
       var context = canvas.get(0).getContext('2d');
       context.fillStyle = color;
 
       // Create tip
       context.beginPath();
       context.moveTo(coordinates[0][0], coordinates[0][1]);
       context.lineTo(coordinates[1][0], coordinates[1][1]);
       context.lineTo(coordinates[2][0], coordinates[2][1]);
       context.fill();
    };
 
    function positionTip(corner)
    {
       var self, ieAdjust, paddingCorner, paddingSize, newMargin;
       self = this;
 
       // Return if tips are disabled or tip is not yet rendered
       if(self.options.style.tip.corner === false || !self.elements.tip) return;
       if(!corner) corner = self.elements.tip.attr('rel');
 
       // Setup adjustment variables
       ieAdjust = positionAdjust = ($.browser.msie) ? 1 : 0;
 
       // Set initial position
       self.elements.tip.css(corner.match(/left|right|top|bottom/)[0], 0);
 
       // Set position of tip to correct side
       if(corner.search(/top|bottom/) !== -1)
       {
          // Adjustments for IE6 - 0.5px border gap bug
          if($.browser.msie)
          {
             if(parseInt($.browser.version.charAt(0)) === 6)
                positionAdjust = (corner.search(/top/) !== -1) ? -3 : 1;
             else
                positionAdjust = (corner.search(/top/) !== -1) ? 1 : 2;
          };
 
          if(corner.search(/Middle/) !== -1)
             self.elements.tip.css({ left: '50%', marginLeft: -(self.options.style.tip.size.width / 2) });
 
          else if(corner.search(/Left/) !== -1)
             self.elements.tip.css({ left: self.options.style.border.radius - ieAdjust });
 
          else if(corner.search(/Right/) !== -1)
             self.elements.tip.css({ right: self.options.style.border.radius + ieAdjust });
 
          if(corner.search(/top/) !== -1)
             self.elements.tip.css({ top: -positionAdjust });
          else
             self.elements.tip.css({ bottom: positionAdjust });
 
       }
       else if(corner.search(/left|right/) !== -1)
       {
          // Adjustments for IE6 - 0.5px border gap bug
          if($.browser.msie)
             positionAdjust = (parseInt($.browser.version.charAt(0)) === 6) ? 1 : ((corner.search(/left/) !== -1) ? 1 : 2);
 
          if(corner.search(/Middle/) !== -1)
             self.elements.tip.css({ top: '50%', marginTop: -(self.options.style.tip.size.height / 2) });
 
          else if(corner.search(/Top/) !== -1)
             self.elements.tip.css({ top: self.options.style.border.radius - ieAdjust });
 
          else if(corner.search(/Bottom/) !== -1)
             self.elements.tip.css({ bottom: self.options.style.border.radius + ieAdjust });
 
          if(corner.search(/left/) !== -1)
             self.elements.tip.css({ left: -positionAdjust });
          else
             self.elements.tip.css({ right: positionAdjust });
       };
 
       // Adjust tooltip padding to compensate for tip
       paddingCorner = 'padding-' + corner.match(/left|right|top|bottom/)[0];
       paddingSize = self.options.style.tip.size[ (paddingCorner.search(/left|right/) !== -1) ? 'width' : 'height' ];
       self.elements.tooltip.css('padding', 0);
       self.elements.tooltip.css(paddingCorner, paddingSize);
 
       // Match content margin to prevent gap bug in IE6 ONLY
       if($.browser.msie && parseInt($.browser.version.charAt(0)) == 6)
       {
          newMargin = parseInt(self.elements.tip.css('margin-top')) || 0;
          newMargin += parseInt(self.elements.content.css('margin-top')) || 0;
 
          self.elements.tip.css({ marginTop: newMargin });
       };
    };
 
    // Create title bar for content
    function createTitle()
    {
       var self = this;
 
       // Destroy previous title element, if present
       if(self.elements.title !== null) self.elements.title.remove();
 
       // Create title element
       self.elements.title = $('<div class="'+self.options.style.classes.title+'">')
          .css( jQueryStyle(self.options.style.title, true) )
          .css({ zoom: ($.browser.msie) ? 1 : 0 })
          .prependTo(self.elements.contentWrapper);
 
       // Update title with contents if enabled
       if(self.options.content.title.text) self.updateTitle.call(self, self.options.content.title.text);
 
       // Create title close buttons if enabled
       if(self.options.content.title.button !== false
       && typeof self.options.content.title.button == 'string')
       {
          self.elements.button = $('<a class="'+self.options.style.classes.button+'" style="float:right; position: relative"></a>')
             .css( jQueryStyle(self.options.style.button, true) )
             .html(self.options.content.title.button)
             .prependTo(self.elements.title)
             .click(function(event){ if(!self.status.disabled) self.hide(event) });
       };
    };
 
    // Assign hide and show events
    function assignEvents()
    {
       var self, showTarget, hideTarget, inactiveEvents;
       self = this;
 
       // Setup event target variables
       showTarget = self.options.show.when.target;
       hideTarget = self.options.hide.when.target;
 
       // Add tooltip as a hideTarget is its fixed
       if(self.options.hide.fixed) hideTarget = hideTarget.add(self.elements.tooltip);
 
       // Check if the hide event is special 'inactive' type
       if(self.options.hide.when.event == 'inactive')
       {
          // Define events which reset the 'inactive' event handler
          inactiveEvents = ['click', 'dblclick', 'mousedown', 'mouseup', 'mousemove',
          'mouseout', 'mouseenter', 'mouseleave', 'mouseover' ];
 
          // Define 'inactive' event timer method
          function inactiveMethod(event)
          {
             if(self.status.disabled === true) return;
 
             //Clear and reset the timer
             clearTimeout(self.timers.inactive);
             self.timers.inactive = setTimeout(function()
             {
                // Unassign 'inactive' events
                $(inactiveEvents).each(function()
                {
                   hideTarget.unbind(this+'.qtip-inactive');
                   self.elements.content.unbind(this+'.qtip-inactive');
                });
 
                // Hide the tooltip
                self.hide(event);
             }
             , self.options.hide.delay);
          };
       }
 
       // Check if the tooltip is 'fixed'
       else if(self.options.hide.fixed === true)
       {
          self.elements.tooltip.bind('mouseover.qtip', function()
          {
             if(self.status.disabled === true) return;
 
             // Reset the hide timer
             clearTimeout(self.timers.hide);
          });
       };
 
       // Define show event method
       function showMethod(event)
       {
          if(self.status.disabled === true) return;
 
          // If set, hide tooltip when inactive for delay period
          if(self.options.hide.when.event == 'inactive')
          {
             // Assign each reset event
             $(inactiveEvents).each(function()
             {
                hideTarget.bind(this+'.qtip-inactive', inactiveMethod);
                self.elements.content.bind(this+'.qtip-inactive', inactiveMethod);
             });
 
             // Start the inactive timer
             inactiveMethod();
          };
 
          // Clear hide timers
          clearTimeout(self.timers.show);
          clearTimeout(self.timers.hide);
 
          // Start show timer
          self.timers.show = setTimeout(function(){ self.show(event); }, self.options.show.delay);
       };
 
       // Define hide event method
       function hideMethod(event)
       {
          if(self.status.disabled === true) return;
 
          // Prevent hiding if tooltip is fixed and event target is the tooltip
          if(self.options.hide.fixed === true
          && self.options.hide.when.event.search(/mouse(out|leave)/i) !== -1
          && $(event.relatedTarget).parents('div.qtip[qtip]').length > 0)
          {
             // Prevent default and popagation
             event.stopPropagation();
             event.preventDefault();
 
             // Reset the hide timer
             clearTimeout(self.timers.hide);
             return false;
          };
 
          // Clear timers and stop animation queue
          clearTimeout(self.timers.show);
          clearTimeout(self.timers.hide);
          self.elements.tooltip.stop(true, true);
 
          // If tooltip has displayed, start hide timer
          self.timers.hide = setTimeout(function(){ self.hide(event); }, self.options.hide.delay);
       };
 
       // Both events and targets are identical, apply events using a toggle
       if((self.options.show.when.target.add(self.options.hide.when.target).length === 1
       && self.options.show.when.event == self.options.hide.when.event
       && self.options.hide.when.event !== 'inactive')
       || self.options.hide.when.event == 'unfocus')
       {
          self.cache.toggle = 0;
          // Use a toggle to prevent hide/show conflicts
          showTarget.bind(self.options.show.when.event + '.qtip', function(event)
          {
             if(self.cache.toggle == 0) showMethod(event);
             else hideMethod(event);
          });
       }
 
       // Events are not identical, bind normally
       else
       {
          showTarget.bind(self.options.show.when.event + '.qtip', showMethod);
 
          // If the hide event is not 'inactive', bind the hide method
          if(self.options.hide.when.event !== 'inactive')
             hideTarget.bind(self.options.hide.when.event + '.qtip', hideMethod);
       };
 
       // Focus the tooltip on mouseover
       if(self.options.position.type.search(/(fixed|absolute)/) !== -1)
          self.elements.tooltip.bind('mouseover.qtip', self.focus);
 
       // If mouse is the target, update tooltip position on mousemove
       if(self.options.position.target === 'mouse' && self.options.position.type !== 'static')
       {
          showTarget.bind('mousemove.qtip', function(event)
          {
             // Set the new mouse positions if adjustment is enabled
             self.cache.mouse = { x: event.pageX, y: event.pageY };
 
             // Update the tooltip position only if the tooltip is visible and adjustment is enabled
             if(self.status.disabled === false
             && self.options.position.adjust.mouse === true
             && self.options.position.type !== 'static'
             && self.elements.tooltip.css('display') !== 'none')
                self.updatePosition(event);
          });
       };
    };
 
    // Screen position adjustment
    function screenAdjust(position, target, tooltip)
    {
       var self, adjustedPosition, adjust, newCorner, overflow, corner;
       self = this;
 
       // Setup corner and adjustment variable
       if(tooltip.corner == 'center') return target.position // TODO: 'center' corner adjustment
       adjustedPosition = $.extend({}, position);
       newCorner = { x: false, y: false };
 
       // Define overflow properties
       overflow = {
          left: (adjustedPosition.left < $.fn.qtip.cache.screen.scroll.left),
          right: (adjustedPosition.left + tooltip.dimensions.width + 2 >= $.fn.qtip.cache.screen.width + $.fn.qtip.cache.screen.scroll.left),
          top: (adjustedPosition.top < $.fn.qtip.cache.screen.scroll.top),
          bottom: (adjustedPosition.top + tooltip.dimensions.height + 2 >= $.fn.qtip.cache.screen.height + $.fn.qtip.cache.screen.scroll.top)
       };
 
       // Determine new positioning properties
       adjust = {
          left: (overflow.left && (tooltip.corner.search(/right/i) != -1 || (tooltip.corner.search(/right/i) == -1 && !overflow.right))),
          right: (overflow.right && (tooltip.corner.search(/left/i) != -1 || (tooltip.corner.search(/left/i) == -1 && !overflow.left))),
          top: (overflow.top && tooltip.corner.search(/top/i) == -1),
          bottom: (overflow.bottom && tooltip.corner.search(/bottom/i) == -1)
       };
 
       // Tooltip overflows off the left side of the screen
       if(adjust.left)
       {
          if(self.options.position.target !== 'mouse')
             adjustedPosition.left = target.position.left + target.dimensions.width;
          else
             adjustedPosition.left = self.cache.mouse.x
 
          newCorner.x = 'Left';
       }
 
       // Tooltip overflows off the right side of the screen
       else if(adjust.right)
       {
          if(self.options.position.target !== 'mouse')
             adjustedPosition.left = target.position.left - tooltip.dimensions.width;
          else
             adjustedPosition.left = self.cache.mouse.x - tooltip.dimensions.width;
 
          newCorner.x = 'Right';
       };
 
       // Tooltip overflows off the top of the screen
       if(adjust.top)
       {
          if(self.options.position.target !== 'mouse')
             adjustedPosition.top = target.position.top + target.dimensions.height;
          else
             adjustedPosition.top = self.cache.mouse.y
 
          newCorner.y = 'top';
       }
 
       // Tooltip overflows off the bottom of the screen
       else if(adjust.bottom)
       {
          if(self.options.position.target !== 'mouse')
             adjustedPosition.top = target.position.top - tooltip.dimensions.height;
          else
             adjustedPosition.top = self.cache.mouse.y - tooltip.dimensions.height;
 
          newCorner.y = 'bottom';
       };
 
       // Don't adjust if resulting position is negative
       if(adjustedPosition.left < 0)
       {
          adjustedPosition.left = position.left;
          newCorner.x = false;
       };
       if(adjustedPosition.top < 0)
       {
          adjustedPosition.top = position.top;
          newCorner.y = false;
       };
 
       // Change tip corner if positioning has changed and tips are enabled
       if(self.options.style.tip.corner !== false)
       {
          // Determine new corner properties
          adjustedPosition.corner = new String(tooltip.corner);
          if(newCorner.x !== false) adjustedPosition.corner = adjustedPosition.corner.replace(/Left|Right|Middle/, newCorner.x);
          if(newCorner.y !== false) adjustedPosition.corner = adjustedPosition.corner.replace(/top|bottom/, newCorner.y);
 
          // Adjust tip if position has changed and tips are enabled
          if(adjustedPosition.corner !== self.elements.tip.attr('rel'))
             createTip.call(self, adjustedPosition.corner);
       };
 
       return adjustedPosition;
    };
 
    // Build a jQuery style object from supplied style object
    function jQueryStyle(style, sub)
    {
       var styleObj, i;
 
       styleObj = $.extend(true, {}, style);
       for(i in styleObj)
       {
          if(sub === true && i.search(/(tip|classes)/i) !== -1)
             delete styleObj[i];
          else if(!sub && i.search(/(width|border|tip|title|classes|user)/i) !== -1)
             delete styleObj[i];
       };
 
       return styleObj;
    };
 
    // Sanitize styles
    function sanitizeStyle(style)
    {
       if(typeof style.tip !== 'object') style.tip = { corner: style.tip };
       if(typeof style.tip.size !== 'object') style.tip.size = { width: style.tip.size, height: style.tip.size };
       if(typeof style.border !== 'object') style.border = { width: style.border };
       if(typeof style.width !== 'object') style.width = { value: style.width };
       if(typeof style.width.max == 'string') style.width.max = parseInt(style.width.max.replace(/([0-9]+)/i, "$1"));
       if(typeof style.width.min == 'string') style.width.min = parseInt(style.width.min.replace(/([0-9]+)/i, "$1"));
 
       // Convert deprecated x and y tip values to width/height
       if(typeof style.tip.size.x == 'number')
       {
          style.tip.size.width = style.tip.size.x;
          delete style.tip.size.x;
       };
       if(typeof style.tip.size.y == 'number')
       {
          style.tip.size.height = style.tip.size.y;
          delete style.tip.size.y;
       };
 
       return style;
    };
 
    // Build styles recursively with inheritance
    function buildStyle()
    {
       var self, i, styleArray, styleExtend, finalStyle, ieAdjust;
       self = this;
 
       // Build style options from supplied arguments
       styleArray = [true, {}];
       for(i = 0; i < arguments.length; i++)
          styleArray.push(arguments[i]);
       styleExtend = [ $.extend.apply($, styleArray) ];
 
       // Loop through each named style inheritance
       while(typeof styleExtend[0].name == 'string')
       {
          // Sanitize style data and append to extend array
          styleExtend.unshift( sanitizeStyle($.fn.qtip.styles[ styleExtend[0].name ]) );
       };
 
       // Make sure resulting tooltip className represents final style
       styleExtend.unshift(true, {classes:{ tooltip: 'qtip-' + (arguments[0].name || 'defaults') }}, $.fn.qtip.styles.defaults);
 
       // Extend into a single style object
       finalStyle = $.extend.apply($, styleExtend);
 
       // Adjust tip size if needed (IE 1px adjustment bug fix)
       ieAdjust = ($.browser.msie) ? 1 : 0;
       finalStyle.tip.size.width += ieAdjust;
       finalStyle.tip.size.height += ieAdjust;
 
       // Force even numbers for pixel precision
       if(finalStyle.tip.size.width % 2 > 0) finalStyle.tip.size.width += 1;
       if(finalStyle.tip.size.height % 2 > 0) finalStyle.tip.size.height += 1;
 
       // Sanitize final styles tip corner value
       if(finalStyle.tip.corner === true)
          finalStyle.tip.corner = (self.options.position.corner.tooltip === 'center') ? false : self.options.position.corner.tooltip;
 
       return finalStyle;
    };
 
    // Tip coordinates calculator
    function calculateTip(corner, width, height)
    {
       // Define tip coordinates in terms of height and width values
       var tips = {
          bottomRight:   [[0,0],              [width,height],      [width,0]],
          bottomLeft:    [[0,0],              [width,0],           [0,height]],
          topRight:      [[0,height],         [width,0],           [width,height]],
          topLeft:       [[0,0],              [0,height],          [width,height]],
          topMiddle:     [[0,height],         [width / 2,0],       [width,height]],
          bottomMiddle:  [[0,0],              [width,0],           [width / 2,height]],
          rightMiddle:   [[0,0],              [width,height / 2],  [0,height]],
          leftMiddle:    [[width,0],          [width,height],      [0,height / 2]]
       };
       tips.leftTop = tips.bottomRight;
       tips.rightTop = tips.bottomLeft;
       tips.leftBottom = tips.topRight;
       tips.rightBottom = tips.topLeft;
 
       return tips[corner];
    };
 
    // Border coordinates calculator
    function calculateBorders(radius)
    {
       var borders;
 
       // Use canvas element if supported
       if($('<canvas>').get(0).getContext)
       {
          borders = {
             topLeft: [radius,radius], topRight: [0,radius],
             bottomLeft: [radius,0], bottomRight: [0,0]
          };
       }
 
       // Canvas not supported - Use VML (IE)
       else if($.browser.msie)
       {
          borders = {
             topLeft: [-90,90,0], topRight: [-90,90,-radius],
             bottomLeft: [90,270,0], bottomRight: [90, 270,-radius]
          };
       };
 
       return borders;
    };
 
    // BGIFRAME JQUERY PLUGIN ADAPTION
    //   Special thanks to Brandon Aaron for this plugin
    //   http://plugins.jquery.com/project/bgiframe
    function bgiframe()
    {
       var self, html, dimensions;
       self = this;
       dimensions = self.getDimensions();
 
       // Setup iframe HTML string
       html = '<iframe class="qtip-bgiframe" frameborder="0" tabindex="-1" src="javascript:false" '+
          'style="display:block; position:absolute; z-index:-1; filter:alpha(opacity=\'0\'); border: 1px solid red; ' +
          'height:'+dimensions.height+'px; width:'+dimensions.width+'px" />';
 
       // Append the new HTML and setup element reference
       self.elements.bgiframe = self.elements.wrapper.prepend(html).children('.qtip-bgiframe:first');
    };
 
    // Assign cache and event initialisation on document load
    $(document).ready(function()
    {
       // Setup library cache with window scroll and dimensions of document
       $.fn.qtip.cache = {
          screen: {
             scroll: { left: $(window).scrollLeft(), top: $(window).scrollTop() },
             width: $(window).width(),
             height: $(window).height()
          }
       };
 
       // Adjust positions of the tooltips on window resize or scroll if enabled
       var adjustTimer;
       $(window).bind('resize scroll', function(event)
       {
          clearTimeout(adjustTimer);
          adjustTimer = setTimeout(function()
          {
             // Readjust cached screen values
             if(event.type === 'scroll')
                $.fn.qtip.cache.screen.scroll = { left: $(window).scrollLeft(), top: $(window).scrollTop() };
             else
             {
                $.fn.qtip.cache.screen.width = $(window).width();
                $.fn.qtip.cache.screen.height = $(window).height();
             };
 
             for(i = 0; i < $.fn.qtip.interfaces.length; i++)
             {
                // Access current elements API
                var api = $.fn.qtip.interfaces[i];
 
                // Update position if resize or scroll adjustments are enabled
                if(api.status.rendered === true
                && (api.options.position.type !== 'static'
                || api.options.position.adjust.scroll && event.type === 'scroll'
                || api.options.position.adjust.resize && event.type === 'resize'))
                {
                   // Queue the animation so positions are updated correctly
                   api.updatePosition(event, true);
                }
             };
          }
          , 100);
       })
 
       // Hide unfocus toolipts on document mousedown
       $(document).bind('mousedown.qtip', function(event)
       {
          if($(event.target).parents('div.qtip').length === 0)
          {
             $('.qtip[unfocus]').each(function()
             {
                var api = $(this).qtip("api");
 
                // Only hide if its visible and not the tooltips target
                if($(this).is(':visible') && !api.status.disabled
                && $(event.target).add(api.elements.target).length > 1)
                   api.hide(event);
             })
          };
       })
    });
 
    // Define qTip API interfaces array
    $.fn.qtip.interfaces = []
 
    // Define log and constant place holders
    $.fn.qtip.log = { error: function(){ return this; } };
    $.fn.qtip.constants = {};
 
    // Define configuration defaults
    $.fn.qtip.defaults = {
       // Content
       content: {
          prerender: false,
          text: false,
          url: false,
          data: null,
          title: {
             text: false,
             button: false
          }
       },
       // Position
       position: {
          target: false,
          corner: {
             target: 'bottomRight',
             tooltip: 'topLeft'
          },
          adjust: {
             x: 0, y: 0,
             mouse: true,
             screen: false,
             scroll: true,
             resize: true
          },
          type: 'absolute',
          container: false
       },
       // Effects
       show: {
          when: {
             target: false,
             event: 'mouseover'
          },
          effect: {
             type: 'fade',
             length: 100
          },
          delay: 140,
          solo: false,
          ready: false
       },
       hide: {
          when: {
             target: false,
             event: 'mouseout'
          },
          effect: {
             type: 'fade',
             length: 100
          },
          delay: 0,
          fixed: false
       },
       // Callbacks
       api: {
          beforeRender: function(){},
          onRender: function(){},
          beforePositionUpdate: function(){},
          onPositionUpdate: function(){},
          beforeShow: function(){},
          onShow: function(){},
          beforeHide: function(){},
          onHide: function(){},
          beforeContentUpdate: function(){},
          onContentUpdate: function(){},
          beforeContentLoad: function(){},
          onContentLoad: function(){},
          beforeTitleUpdate: function(){},
          onTitleUpdate: function(){},
          beforeDestroy: function(){},
          onDestroy: function(){},
          beforeFocus: function(){},
          onFocus: function(){}
       }
    };
 
    $.fn.qtip.styles = {
       defaults: {
          background: 'white',
          color: '#111',
          overflow: 'hidden',
          textAlign: 'left',
          width: {
             min: 0,
             max: 250
          },
          padding: '5px 9px',
          border: {
             width: 1,
             radius: 0,
             color: '#d3d3d3'
          },
          tip: {
             corner: false,
             color: false,
             size: { width: 13, height: 13 },
             opacity: 1
          },
          title: {
             background: '#e1e1e1',
             fontWeight: 'bold',
             padding: '7px 12px'
          },
          button: {
             cursor: 'pointer'
          },
          classes: {
             target: '',
             tip: 'qtip-tip',
             title: 'qtip-title',
             button: 'qtip-button',
             content: 'qtip-content',
             active: 'qtip-active'
          }
       },
       cream: {
          border: {
             width: 3,
             radius: 0,
             color: '#F9E98E'
          },
          title: {
             background: '#F0DE7D',
             color: '#A27D35'
          },
          background: '#FBF7AA',
          color: '#A27D35',
 
          classes: { tooltip: 'qtip-cream' }
       },
       light: {
          border: {
             width: 3,
             radius: 0,
             color: '#E2E2E2'
          },
          title: {
             background: '#f1f1f1',
             color: '#454545'
          },
          background: 'white',
          color: '#454545',
 
          classes: { tooltip: 'qtip-light' }
       },
       dark: {
          border: {
             width: 3,
             radius: 0,
             color: '#303030'
          },
          title: {
             background: '#404040',
             color: '#f3f3f3'
          },
          background: '#505050',
          color: '#f3f3f3',
 
          classes: { tooltip: 'qtip-dark' }
       },
       red: {
          border: {
             width: 3,
             radius: 0,
             color: '#CE6F6F'
          },
          title: {
             background: '#f28279',
             color: '#9C2F2F'
          },
          background: '#F79992',
          color: '#9C2F2F',
 
          classes: { tooltip: 'qtip-red' }
       },
       green: {
          border: {
             width: 3,
             radius: 0,
             color: '#A9DB66'
          },
          title: {
             background: '#b9db8c',
             color: '#58792E'
          },
          background: '#CDE6AC',
          color: '#58792E',
 
          classes: { tooltip: 'qtip-green' }
       },
       blue: {
          border: {
             width: 3,
             radius: 0,
             color: '#ADD9ED'
          },
          title: {
             background: '#D0E9F5',
             color: '#5E99BD'
          },
          background: '#E5F6FE',
          color: '#4D9FBF',
 
          classes: { tooltip: 'qtip-blue' }
       }
    };
 })(jQuery);
 
 
 
 $(window).load(function() {
	 if ($('.back-img-container').length > 0){
	 	if ($('#contentpage').length > 0){
	 		$('#footer-left').append('<ul class="footer-img-nav"></ul>');
	 		
	 		var original_width = '';  
	 		var original_height = '';
	 		var thumb = '';
	 		$('#contentpage .back-img-container img').each(function() {
	 			 $.preLoadImages($(this).attr('src'), $(this).attr('src'));
	 			 
	 			 original_width = $(this).attr('width');  
	 			 original_height = $(this).attr('height');
	 			 
	 			 resizeImg($(this), original_width, original_height);
	 		});
	 		
	 		$('#contentpage .back-img-container').cycle({
	 			fx: 'fade',
	 			random: 1, 
	 			delay:  8000
	 		});
	 		
	 	}
	 }	
 });
 
 
 $(document).ready(function() { 
 	/* BACKGROUND RESIZE */
 	if ($('.back-img-container').length > 0){
 		/*
 		if ($('#contentpage').length <= 0){ 
		 	$.preLoadImages("/img/back-infra.jpg", "/img/back-infra.jpg");
		 	$.preLoadImages("/img/back-bouwgrondstoffen.jpg", "/img/back-bouwgrondstoffen.jpg");
		 	$.preLoadImages("/img/back-transport-logistiek.jpg", "/img/back-transport-logistiek.jpg");
		 	$.preLoadImages("/img/back-projectontwikkeling.jpg", "/img/back-projectontwikkeling.jpg");
		 */	
		 	var original_width = $('.back-img-container img').attr('width');  
		 	var original_height = $('.back-img-container img').attr('height');
		
		 	resizeImg('.back-img-container img', original_width, original_height);
		 /*
		}
		*/
	 	
	 	$(window).bind("resize", function() {
	 		resizeImg('.back-img-container img', original_width, original_height);
	 	});
	}
 	/* VERVANG ACHTERGROND ALS ER OP DE HOMEPAGE OVER EEN DIENST WORDT GEGAAN */
 	if($("#column-right-home").length > 0){
 		$('.back-img-container img').first().css('display', 'block');
 		$('#column-right-home h3 a').hover(function () {
 			var hoveredItem = $(this).attr('title');
 			if (hoveredItem == 'Infra') {
 				$('.back-img-container img').css('display', 'none');
 				$('.back-img-container img:nth-child(2)').css('display', 'block');
 		    }
 		    else if (hoveredItem == 'Bouwgrondstoffen') {
 		    	$('.back-img-container img').css('display', 'none');
 		    	$('.back-img-container img:nth-child(3)').css('display', 'block');	   
 		    }
 		    else if (hoveredItem == 'Transport-logistiek') {
 		    	$('.back-img-container img').css('display', 'none');
 		    	$('.back-img-container img:nth-child(4)').css('display', 'block');
 		    }
 		    else if (hoveredItem == 'Projectontwikkeling') {
 		    	$('.back-img-container img').css('display', 'none');
 		    	$('.back-img-container img:nth-child(5)').css('display', 'block');
 		    }
 		    
 		    var original_width = $('.back-img-container img').attr('width');  
 		    var original_height = $('.back-img-container img').attr('height'); 		
 		    resizeImg('.back-img-container img', original_width, original_height);
 		});
 	}

 	/* WEER / VERKEER */
 	//get_weather();
 	var p = $("#code").val();
	if(p != 'GMXX3180') {
		var to_load = '/codeblue/getWeather.php?p=' + p;
	}
	else {
		var to_load = '/codeblue/getWeather.php';
	}
 	$("#weather-specific").load(to_load);
 	
 	/* HOMEPAGE EQUAL HEIGHT DIVS */
 	if($("#column-right-home").length > 0){
 		$("#column-right-home").height($("#column-left-home").outerHeight());
 	}
 	
 	/* HEADNAV ITEMS SCHALEN */
 	var navItems = $('#headnav a.head').length - 1;
 	$('#headnav a').width ((710 / navItems ) - 20);
 	$('#headnav a.Home').width (230);
 	
 	/* FOOTER POSITIONERING */
 	$('#footer-right').css('left', $('#footer-right').width() + 35 + 'px');
 	$(window).bind("resize", function() {
 		$('#footer-right').css('left', $('#footer-right').width() + 35 + 'px');
 	});

 	/* FANCYBOX */
 	if($(".fancybox").length > 0){
 		$(".fancybox").fancybox();
 	}
 	
 	/* JUBILEA SORT */
	if($("ul.anniversary").length > 0){
		var listitems = $('ul.anniversary li');
		
		listitems.sort(function(a, b) {
		   var compA1 = $(a).attr('data-date').split('-');
		   var compB1 = $(b).attr('data-date').split('-');
		
		    var compA = new Date(compA1[2], compA1[1]-1, compA1[0]);
		    var compB = new Date(compB1[2], compB1[1]-1, compB1[0]);
		    
		   return compA > compB;
		})
		    
		$.each(listitems, function(idx, itm) {$('ul.anniversary').append(itm); });
	}
	
	/* SMOELENBOEK */
	if ($('.user-moreinfo').length > 0) {		 
		$('.user-moreinfo').each(function(){
			$(this).qtip({ 
				content: $('#userinfo' + $(this).attr('id').replace('userlink', '')),
				position: {
				    corner: {
				        target: 'bottomMiddle',
				    	tooltip: 'topMiddle'
					}
				},
				style: {
					width: 275,
					padding: 10,
				    background: '#ffffff',
				    color: 'black',
				    border: {
				    	width: 7,
				        radius: 5,
				        color: '#ccc'
				    },
				    tip: 'topMiddle'
				},
				hide: { fixed: true, delay: 200 }
			});
		});
	}
	
	$('.projects .read-more').click(function() {
		$('.projects .gallery').css('height', 'auto');
	});
	$('#loginbox').width(($(window).width() / 2) - 555);
	
	/* DOWNLOADS */
	if ($('#downloads').length > 0) {
		$('#downloads').css('min-height', ($('#groups').height() - 10) + 'px');
	}
	
	/* MAILFORM FOCUS */
	if($("form#commentform").length > 0){
		var default_values = new Array();
		$('form#commentform input').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];
				}
			});
		});
		$('form#commentform textarea').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];
				}
			});
		});
	}
	if($("form#searchform").length > 0){
		var default_values = new Array();
		$('form#searchform input').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];
				}
			});
		});
	}
	
	/* VALIDATIE VAN DEFAULT WAARDES */
	jQuery.validator.addMethod("defaultInvalid", function(value, element) {
		if(element.value in oc(['Naam*:', 'Adres*:','Postcode*:','Woonplaats*:','Vraag / opmerking*:','Onderwerp*:','Omschrijving*:']) ) {
			return false;
		}
		else {
			return true;
		}
	});
	
	/* VALIDATIE CONTACTFORMULIER */
	if($("#mailform").length > 0){
		$("#mailform").validate({
	 		rules: {
	 			formcontrolecode: {
	 				required: true,
	 				remote: '/codeblue/verifycode.php'
	 			},
	 			Telefoon: {
	 				required: true,
	 				minlength: 10
	 			}
	 		},
	 		messages: {
	 			Naam: "Vul hier a.u.b. uw naam in.",
	 			Adres: "Vul hier a.u.b. uw adres in.",
	 			Postcode: "Vul hier a.u.b. uw postcode in.",
	 			Woonplaats: "Vul hier a.u.b. uw woonplaats in.",
	 			Vraag: "Vul hier a.u.b. uw vraag / opmerking in.",
	 			Onderwerp: "Vul hier a.u.b. het onderwerp in.",
	 			Omschrijving: "Vul hier a.u.b. de omschrijving in."
	 		}
	 	});
	}
		
	/* VALIDATIE REACTIEFORMULIER */
	if($("#commentform").length > 0){
	 	$("#commentform").validate({
	 		rules: {
	 			formcontrolecode: {
	 				required: true,
	 				remote: '/codeblue/verifycode.php'
	 			}
	 		}
	 	});
	}
	
	/* IE 6 hack */
	if($.browser.msie && $.browser.version < 7){
		$('#footer-right').css('left', $('#footer-left').width() + 'px');
		$(window).bind("resize", function() {
			$('#footer-right').css('left', $('#footer-left').width() + 'px');
		});
	} 
 });
 
 function oc(a){
   var o = {};
   for(var i=0;i<a.length;i++)
   {
     o[a[i]]='';
   }
   return o;
 }
 
 function checkLogin(fm){
 	var username = fm.username.value;
 	var password = fm.password.value;
 	$('div.status').load('/codeblue/checkLogin.php', {user: username, pass : password});
 	return false;
 }
 
 function checkPassphrase(fm){
 	var passphrase = fm.passphrase.value;
 	var cid = fm.cid.value;
 	var aid = fm.aid.value;
 	$('#status_' + cid).load('/codeblue/checkCFT.php', {passphrase: passphrase, cid : cid, aid : aid});
 	return false;
 }
 
 function changePassword(fm){
 	var username = fm.username.value;
 	var currentpass = fm.currentpass.value;
 	var newpass = fm.newpass.value;
 	var newpassrep = fm.newpassrep.value;
 	$('div.status').load('/codeblue/changePassword.php', {user: username, currentpass: currentpass, newpass: newpass, newpassrep: newpassrep});
 	return false;
 }
 
 function resetPassword(fm){
 	var username = fm.username.value;
 	var mail = fm.email.value;
 	$('div.status').load('/codeblue/resetPassword.php', {user: username, email: mail});
 	return false;
 }
 
 function logOut(){
 	$('body').load('/codeblue/checkLogin.php', {logout: 'true'});
 }
 
 function setGroup(groupid, templateid){
 	var url = '/codeblue/inc_downloadmodule.php';
 	$('#groups').load(url, {action: 'setGroup', id : groupid, template: templateid});
 	$('#categories').load(url, {action: 'setProduct', id : '0', template: templateid});
 	$('#downloads').load(url, {action: 'setCat', id : '0', cattype: '0', template: templateid});
 	$('#products').load(url, {action: 'setActive', id : '0', group: groupid, template: templateid});
 }
 
 function setProduct(productid, templateid, groupid){
 	var url = '/codeblue/inc_downloadmodule.php';
 	$('#categories').load(url, {action: 'setProduct', id : productid, template: templateid});
 	$('#downloads').load(url, {action: 'setCat', id : '0', cattype: '0', template: templateid});
 	$('#products').load(url, {action: 'setActive', id : productid, group: groupid, template: templateid});
 }
 
 function setCat(productid, templateid, cattypeid){
 	var url = '/codeblue/inc_downloadmodule.php';
 	$('#categories').load(url, {action: 'setActiveCat', id : productid, cattype: cattypeid, template: templateid});
 	$('#downloads').load(url, {action: 'setCat', id : productid, cattype: cattypeid, template: templateid});
 }
 
 function listTopCategories(groupid, templateid){
 	var url = '/codeblue/inc_downloadmodule.php';
 	$('#groups').load(url, {action: 'listTopCategories', id : groupid, template: templateid});
 	$('#downloads').load(url, {action: 'setTopCategory', id : groupid, template: templateid});
 	$('#downloads').load(url, {action: 'setTopCategory', id : groupid, template: templateid});
 }
 
 
 function resizeImg(image, original_width, original_height) {
 	var imgWidth = $(image).attr('width');  
  	var imgHeight = $(image).attr('height');
  	var ratio = imgHeight/imgWidth;
  	var winWidth = $(window).width();
  	var winHeight = $(window).height();
  	var winRatio = winHeight/winWidth;
  	if (winRatio > ratio) {
  	    $(image).height(winHeight);
  	    $(image).width(winHeight / ratio);
  	    $(image).children().height(winHeight);
  	    $(image).children().width(winHeight / ratio);
  	} else {
  	    $(image).width(winWidth);
  	    $(image).height(winWidth * ratio);
  	    $(image).children().width(winWidth);
  		$(image).children().height(winWidth * ratio);
  	}
  	//$image).show();
 }
 
 function get_weather(){
 	var p = $("#code").val();
 	if(p != 'GMXX3180') {
 		var to_load = '/codeblue/getWeather.php?p=' + p;
 	}
 	else {
 		var to_load = '/codeblue/getWeather.php';
 	}
 	$("#weather-specific").load(to_load);
 }
 
 // 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();
 }
