/** JQZoom **/
/*
 * JQZoom Evolution 1.0.1 - Javascript Image magnifier
 *
 * Copyright (c) Engineer Renzi Marco(www.mind-projects.it)
 *
 * $Date: 12-12-2008
 *
 *	ChangeLog:
 *  
 * $License : GPL,so any change to the code you should copy and paste this section,and would be nice to report this to me(renzi.mrc@gmail.com).
 */
(function($)
{
    $.fn.jqzoom = function(options)
    {
        var settings = {
            zoomType: 'reverse', //standard/reverse/innerzoom
            zoomWidth:200,		//zoomed width default width
            zoomHeight:200,		//zoomed div default width
            xOffset:57,		//zoomed div default offset
            yOffset: 0,
            position: "right" ,//zoomed div default position,offset position is to the right of the image
            lens:true, //zooming lens over the image,by default is 1;
			lensReset : false,
			imageOpacity: 0.2,
			title : true,
			alwaysOn: false,
			showEffect: 'show',
			hideEffect: 'fadeout',
			fadeinSpeed: 'fast',
			fadeoutSpeed: 'fast',
			preloadImages :true,
			showPreload: true,
			preloadText : 'Loading zoom',
			preloadPosition : 'center'   //bycss
        };

			//extending options
			options = options || {};
        	$.extend(settings, options);


		return this.each(function()
		{
			var a = $(this);
			var aTitle = a.attr('title'); //variabile per memorizzare il titolo href
			$(a).removeAttr('title');
			$(a).css('outline-style','none');


			var img = $("img", this);
			var imageTitle = img.attr('title');
			img.removeAttr('title');	//variabile per memorizzare il titolo immagine


			var smallimage = new Smallimage( img );
			var smallimagedata = {};
			//imageborder
			var btop = 0;
			var bleft = 0;

			var loader = null;     //variabile per memorizzare oggetto loader
			loader = new Loader();

			var ZoomTitle = (trim(aTitle).length > 0) ? aTitle :
			(trim(imageTitle).length > 0) ? imageTitle : null;  //setting zoomtitle
			var ZoomTitleObj = new zoomTitle();

			var largeimage = new Largeimage( a[0].href );

			var lens = new Lens();
			var lensdata = {};
			//lensborder



			var largeimageloaded = false;
			var scale = {}; //rapporto tra immagine grande e piccola scale.x/scale.y
			var stage = null; // quadrato che mostra l'immagine ingrandita
			var running = false; // running = true quando si verifica l'evento che mostra lo zoom(adesso mouseover).
			var mousepos = {};
			var firstime = 0;
			var preloadshow = false;
			var isMouseDown = false;
			var dragstatus = false;
			//loading smallimagedata
			smallimage.loadimage();

			//ritorna false al click dell href
			$(this).click(function(){return false;});

			//se settato alwaysOn attivo lo Zoom e lo mostro.

			//attivo al mouseover
			$(this).hover(function(e)
			{
				mousepos.x = e.pageX;
				mousepos.y	= e.pageY;
				activate();
			},function()
			{
				deactivate();
			});


			//ALWAYS ON
			if(settings.alwaysOn)
			{
				setTimeout(function(){activate();},150);
			}


			function activate()
			{

				if ( !running ) {

					//finding border
					smallimage.findborder();

					running = true;

					//rimuovo il titolo al mouseover
					imageTitle = img.attr('title');
					img.removeAttr('title');
					aTitle = a.attr('title');
					$(a).removeAttr('title');

					//se non cè creo l'oggetto largeimage
					if (!largeimage || $.browser.safari) {
						largeimage = new Largeimage( a[0].href );
					}

					//se l'immagine grande non è stata caricata la carico
					if(!largeimageloaded || $.browser.safari)
					{
						largeimage.loadimage();
					}else
					{
					//after preload
						if(settings.zoomType != 'innerzoom')
						{
							stage = new Stage();
							stage.activate();
						}
						lens = new Lens;
						lens.activate();
					}

					//hack per MAC
				/*	if($.browser.safari)
					{
						if(settings.zoomType != 'innerzoom') //se innerzoom non mostro la finestra dello zoom
						{
							stage = new Stage();
							stage.activate();
						}
						if($('div.jqZoomPup').length <= 0)
						{
						lens = new Lens();
						}
						//if(settings.zoomType == 'innerzoom'){lens = new Lens()};
						lens.activate();
						(settings.alwaysOn) ? lens.center() : lens.setposition(null);
					}
					*/
					a[0].blur();
					//alert($('div.jqZoomPup').length);
					return false;
				}




			}

			function deactivate()
			{
				if(settings.zoomType == 'reverse' &&  !settings.alwaysOn)
				{
					img.css({'opacity' : 1});
				}

				if(!settings.alwaysOn)
				{
					//resetting parameters
					running = false;
					largeimageloaded = false;
					$(lens.node).unbind('mousemove');
					lens.remove();
					if($('div.jqZoomWindow').length >0)
					{
						stage.remove();
					}
					if($('div.jqZoomTitle').length > 0)
					{
						ZoomTitleObj.remove();
					}
					//resetting title
					img.attr('title',imageTitle);
					a.attr('title',aTitle);
					$().unbind();

					a.unbind('mousemove');
					//resetto il parametro che mi dice che è la prima volta che mostor lo zoom
					firstime = 0;
					//remove ieiframe
					if(jQuery('.zoom_ieframe').length > 0)
					{
						jQuery('.zoom_ieframe').remove();
					}
				}else
				{
					if(settings.lensReset)
					{
						switch(settings.zoomType)
						{
							case 'innerzoom':
							largeimage.setcenter();
							break;
							default:
							lens.center();
							break;
						}
					}
				}

				//non so se serve da provare
				if(settings.alwaysOn)
				{
					activate();
				}
			};





		//smallimage
		function Smallimage( image )
		{
			this.node = image[0];

			this.loadimage = function() {
				this.node.src = image[0].src;
			};
			this.findborder = function()
			{
				var bordertop = '';
				bordertop = $(img).css('border-top-width');
				btop = '';
				var borderleft = '';
				borderleft = $(img).css('border-left-width');
				bleft = '';
				/*if($.browser.msie)
				{
					var temp = bordertop.split(' ');

					bordertop = temp[1];
					var temp = borderleft.split(' ');
					borderleft = temp[1];
				}*/

				if(bordertop)
				{
					for(i=0;i<3;i++)
					{
						var x = [];
						x = bordertop.substr(i,1);

						if(isNaN(x) == false)
						{
							btop = btop +''+ bordertop.substr(i,1);
						}else
						{
							break;
						}
					}
				}

				if(borderleft)
				{
					for(i=0;i<3;i++)
					{
						if(!isNaN(borderleft.substr(i,1)))
						{
							bleft = bleft + borderleft.substr(i,1);
						}else
						{
							break;
						}
					}
				}
				btop = (btop.length > 0) ? eval(btop) : 0;
				bleft = (bleft.length > 0) ? eval(bleft) : 0;
			}
			this.node.onload = function()
			{
				//setto il cursor e la posizione dell'href


				a.css({'cursor':'crosshair','display':'block'});

				if(a.css('position')!= 'absolute' && a.parent().css('position'))
				{
					a.css({'cursor':'crosshair','position':'relative','display':'block'});
				}
				if(a.parent().css('position') != 'absolute')
				{
					a.parent().css('position','relative');
					//a.css('position','relative');
				}
				else{
				//a.css('position','relative');
				}
				if($.browser.safari || $.browser.opera)
				{
					$(img).css({position:'absolute',top:'0px',left:'0px'});
				}
				/*if(a.css('position')!= 'absolute' && a.parent().css('position'))
				{
					a.css({'cursor':'crosshair','position':'relative','display':'block'});
				}
				if(a.parent().css('position') != 'absolute')
				{
					alert('in');
					a.parent().css('position','relative');
					//a.css('position','relative');
				}
				else{
				//a.css('position','relative');
				}*/



				/*
				if(a.parent().css('position') != 'relative' && a.css('position') != 'absolute')
				{
				a.css({'cursor':'crosshair','position':'relative','display':'block'});
				}*/

				//al docuemnt ready viene caricato l'src quindi viene azionato l'onload e carico tutti i dati
				smallimagedata.w = $( this ).width();
				smallimagedata.h = $( this ).height();


				//non viene fatta assegnazione alla variabile globale
				smallimagedata.h = $( this ).height();
				smallimagedata.pos = $( this ).offset();
				smallimagedata.pos.l = $( this ).offset().left;
				smallimagedata.pos.t = $( this ).offset().top;
				smallimagedata.pos.r = smallimagedata.w + smallimagedata.pos.l;
				smallimagedata.pos.b = smallimagedata.h + smallimagedata.pos.t;

				//per sicurezza setto l'altezza e la width dell'href
				a.height(smallimagedata.h);
				a.width(smallimagedata.w);


				//PRELOAD IMAGES
				if(settings.preloadImages)
				{
					largeimage.loadimage();
				}



			};



			return this;
		};



		//Lens
		function Lens()
		{


			//creating element and adding class
			this.node = document.createElement("div");
			$(this.node).addClass('jqZoomPup');

			this.node.onerror = function() {
				$( lens.node ).remove();
				lens = new Lens();
				lens.activate() ;
			};




			//funzione privata per il caricamento dello zoom
			this.loadlens = function()
			{


				switch(settings.zoomType)
				{
					case 'reverse':
						this.image = new Image();
						this.image.src = smallimage.node.src; // fires off async
						this.node.appendChild( this.image );
						$( this.node ).css({'opacity' : 1});
					break;
					case 'innerzoom':

						this.image = new Image();
						this.image.src = largeimage.node.src; // fires off async
						this.node.appendChild( this.image );
						$( this.node ).css({'opacity' : 1});
					break
					default:
					break;
				}



				switch(settings.zoomType)
				{
					case 'innerzoom':
						lensdata.w = smallimagedata.w;
						lensdata.h = smallimagedata.h;
					break;
					default:
						lensdata.w = (settings.zoomWidth)/scale.x;
						lensdata.h = (settings.zoomHeight)/scale.y;
					break;
				}

			$( this.node ).css({
					width: lensdata.w + 'px',
					height: lensdata.h + 'px',
					position: 'absolute',
					display: 'none',
					borderWidth: 1+'px'
				});
			a.append(this.node);
			}
			return this;
		};

		Lens.prototype.activate = function()
		{
			//carico la lente
			this.loadlens();

			switch(settings.zoomType)
			{
				case 'reverse':
					img.css({'opacity' : settings.imageOpacity});

					(settings.alwaysOn) ? lens.center() : lens.setposition(null);
					//lens.center();
					//bindo ad a il mousemove della lente
					a.bind( 'mousemove', function(e)
					{
						mousepos.x = e.pageX;
						mousepos.y = e.pageY;
						lens.setposition( e );
					});
				break;
				case 'innerzoom':

					//	lens = new Lens();
					//	lens.activate();

					$( this.node ).css({top : 0 ,left: 0});
				   	if(settings.title)
					{
						ZoomTitleObj.loadtitle();
					}

					largeimage.setcenter();

				   	a.bind( 'mousemove', function(e)
				   	{
						mousepos.x = e.pageX;
						mousepos.y = e.pageY;
						largeimage.setinner( e );

					/*if(settings.zoomType == 'innerzoom' && running)
					{
						$(a).mousemove(function(){
							if($('div.jqZoomPup').length <= 0)
							{
								lens = new Lens();
								lens.activate();
							}
						});
					}*/

						/*if($('div.jqZoomPup').length <= 0)
							{
								lens = new Lens();
								lens.activate();
							}*/

					});
				break;
				default:
					/*$(document).mousemove(function(e){
					if(isMouseDown && dragstatus != false){
					lens.setposition( e );
					}
					});
					lens.center()


					dragstatus = 'on'
					$(document).mouseup(function(e){
					if(isMouseDown && dragstatus != false){
						isMouseDown = false;
						dragstatus = false;

					}
					});

					$(this.node).mousedown(function(e){
					$('div.jqZoomPup').css("cursor", "move");
					$(this.node).css("position", "absolute");

				// set z-index
					$(this.node).css("z-index", parseInt( new Date().getTime()/1000 ));
					if($.browser.safari)
					{
						$(a).css("cursor", "move");
					}
					isMouseDown    = true;
					dragstatus = 'on';
					lens.setposition( e );
					});
					*/


					(settings.alwaysOn) ? lens.center() : lens.setposition(null);

					//bindo ad a il mousemove della lente
					$(a).bind( 'mousemove', function(e)
					{

						mousepos.x = e.pageX;
						mousepos.y = e.pageY;
						lens.setposition( e );
					});

				break;
			}


			return this;
		};

		Lens.prototype.setposition = function( e)
		{


			if(e)
			{
				mousepos.x = e.pageX;
				mousepos.y	= e.pageY;
			}

			if(firstime == 0)
			{
			 	var lensleft = (smallimagedata.w)/2 - (lensdata.w)/2 ;
			 	var lenstop = (smallimagedata.h)/2 - (lensdata.h)/2 ;
				//ADDED

				$('div.jqZoomPup').show()
				if(settings.lens)
				{
					this.node.style.visibility = 'visible';
				}
				else
				{
					this.node.style.visibility = 'hidden';
					$('div.jqZoomPup').hide();
				}
				//ADDED
				firstime = 1;

			}else
			{
				var lensleft = mousepos.x - smallimagedata.pos.l - (lensdata.w)/2 ;
				var lenstop = mousepos.y - smallimagedata.pos.t -(lensdata.h)/2 ;
			}


				//a sinistra
				if(overleft())
				{
					lensleft = 0  + bleft;
				}else
				//a destra
				if(overright())
				{
					if($.browser.msie)
					{
					lensleft = smallimagedata.w - lensdata.w  + bleft + 1  ;
					}else
					{
					lensleft = smallimagedata.w - lensdata.w  + bleft - 1  ;
					}


				}

				//in alto
				if(overtop())
				{
					lenstop = 0 + btop ;
				}else
				//sotto
				if(overbottom())
				{

					if($.browser.msie)
					{
					lenstop = smallimagedata.h - lensdata.h  + btop + 1 ;
					}else
					{
					lenstop = smallimagedata.h - lensdata.h - 1 + btop  ;
					}

				}
				lensleft = parseInt(lensleft);
				lenstop = parseInt(lenstop);

				//setto lo zoom ed un eventuale immagine al centro
				$('div.jqZoomPup',a).css({top: lenstop,left: lensleft });

				if(settings.zoomType == 'reverse')
				{
					$('div.jqZoomPup img',a).css({'position': 'absolute','top': -( lenstop - btop +1) ,'left': -(lensleft - bleft +1)  });
				}

				this.node.style.left = lensleft + 'px';
				this.node.style.top = lenstop + 'px';

				//setto l'immagine grande
				largeimage.setposition();

				function overleft() {
					return mousepos.x - (lensdata.w +2*1)/2  - bleft < smallimagedata.pos.l;
				}

				function overright() {

					return mousepos.x + (lensdata.w + 2* 1)/2  > smallimagedata.pos.r + bleft ;
				}

				function overtop() {
					return mousepos.y - (lensdata.h + 2* 1)/2  - btop < smallimagedata.pos.t;
				}

				function overbottom() {
					return mousepos.y + (lensdata.h + 2* 1)/2    > smallimagedata.pos.b + btop;
				}

			return this;
		};


		//mostra la lente al centro dell'immagine
		Lens.prototype.center = function()
		{
			$('div.jqZoomPup',a).css('display','none');
			var lensleft = (smallimagedata.w)/2 - (lensdata.w)/2 ;
			var lenstop = (smallimagedata.h)/2 - (lensdata.h)/2;
			this.node.style.left = lensleft + 'px';
			this.node.style.top = lenstop + 'px';
			$('div.jqZoomPup',a).css({top: lenstop,left: lensleft });

			if(settings.zoomType == 'reverse')
			{
				/*if($.browser.safari){
					alert('safari');
					alert(2*bleft);
					$('div.jqZoomPup img',a).css({'position': 'absolute','top': -( lenstop - btop +1) ,'left': -(lensleft - 2*bleft)  });
				}else
				{*/
					$('div.jqZoomPup img',a).css({'position': 'absolute','top': -(lenstop - btop + 1) ,'left': -( lensleft  - bleft +1)   });
				//}
			}

			largeimage.setposition();
			if($.browser.msie)
			{
				$('div.jqZoomPup',a).show();
			}else
			{
				setTimeout(function(){$('div.jqZoomPup').fadeIn('fast');},10);
			}
		};


		//ritorna l'offset
		Lens.prototype.getoffset = function() {
			var o = {};
			o.left = parseInt(this.node.style.left) ;
			o.top =  parseInt(this.node.style.top) ;
			return o;
		};

		//rimuove la lente
		Lens.prototype.remove = function()
		{

			if(settings.zoomType == 'innerzoom')
			{
				$('div.jqZoomPup',a).fadeOut('fast',function(){/*$('div.jqZoomPup img').remove();*/$(this).remove();});
			}else
			{
				//$('div.jqZoomPup img').remove();
				$('div.jqZoomPup',a).remove();
			}
		};

		Lens.prototype.findborder = function()
		{
			var bordertop = '';
			bordertop = $('div.jqZoomPup').css('borderTop');
			//alert(bordertop);
			lensbtop = '';
			var borderleft = '';
			borderleft = $('div.jqZoomPup').css('borderLeft');
			lensbleft = '';
			if($.browser.msie)
			{
				var temp = bordertop.split(' ');

				bordertop = temp[1];
				var temp = borderleft.split(' ');
				borderleft = temp[1];
			}

			if(bordertop)
			{
				for(i=0;i<3;i++)
				{
					var x = [];
					x = bordertop.substr(i,1);

					if(isNaN(x) == false)
					{
						lensbtop = lensbtop +''+ bordertop.substr(i,1);
					}else
					{
						break;
					}
				}
			}

			if(borderleft)
			{
				for(i=0;i<3;i++)
				{
					if(!isNaN(borderleft.substr(i,1)))
					{
						lensbleft = lensbleft + borderleft.substr(i,1)
					}else
					{
						break;
					}
				}
			}


			lensbtop = (lensbtop.length > 0) ? eval(lensbtop) : 0;
			lensbleft = (lensbleft.length > 0) ? eval(lensbleft) : 0;
		}

		//LARGEIMAGE
		function Largeimage( url )
		{
			this.url = url;
			this.node = new Image();

			/*if(settings.preloadImages)
			{
			 	preload.push(new Image());
				preload.slice(-1).src = url ;
			}*/

			this.loadimage = function()
			{


				if(!this.node)
				this.node = new Image();

				this.node.style.position = 'absolute';
				this.node.style.display = 'none';
				this.node.style.left = '-5000px';
				this.node.style.top = '10px';
				loader = new Loader();

				if(settings.showPreload && !preloadshow)
				{
					loader.show();
					preloadshow = true;
				}

				document.body.appendChild( this.node );
				this.node.src = this.url; // fires off async
			}

			this.node.onload = function()
			{
				this.style.display = 'block';
				var w = Math.round($(this).width());
				var	h = Math.round($(this).height());

				this.style.display = 'none';

				//setting scale
				scale.x = (w / smallimagedata.w);
				scale.y = (h / smallimagedata.h);





				if($('div.preload').length > 0)
				{
					$('div.preload').remove();
				}

				largeimageloaded = true;

				if(settings.zoomType != 'innerzoom' && running){
					stage = new Stage();
					stage.activate();
				}

				if(running)
				{
				//alert('in');
				lens = new Lens();

				lens.activate() ;

				}
				//la attivo

				if($('div.preload').length > 0)
				{
					$('div.preload').remove();
				}
			}
			return this;
		}


		Largeimage.prototype.setposition = function()
		{
          	this.node.style.left = Math.ceil( - scale.x * parseInt(lens.getoffset().left) + bleft) + 'px';
			this.node.style.top = Math.ceil( - scale.y * parseInt(lens.getoffset().top) +btop) + 'px';
		};

		//setto la posizione dell'immagine grande nel caso di innerzoom
		Largeimage.prototype.setinner = function(e) {
          	this.node.style.left = Math.ceil( - scale.x * Math.abs(e.pageX - smallimagedata.pos.l)) + 'px';
			this.node.style.top = Math.ceil( - scale.y * Math.abs(e.pageY - smallimagedata.pos.t)) + 'px';
			$('div.jqZoomPup img',a).css({'position': 'absolute','top': this.node.style.top,'left': this.node.style.left  });
		};


		Largeimage.prototype.setcenter = function() {
          	this.node.style.left = Math.ceil(- scale.x * Math.abs((smallimagedata.w)/2)) + 'px';
			this.node.style.top = Math.ceil( - scale.y * Math.abs((smallimagedata.h)/2)) + 'px';


			$('div.jqZoomPup img',a).css({'position': 'absolute','top': this.node.style.top,'left': this.node.style.left  });
		};


		//STAGE
		function Stage()
		{

			var leftpos = smallimagedata.pos.l;
			var toppos = smallimagedata.pos.t;
			//creating element and class
			this.node = document.createElement("div");
			$(this.node).addClass('jqZoomWindow');

			$( this.node )
				.css({
					position: 'absolute',
					width: Math.round(settings.zoomWidth) + 'px',
					height: Math.round(settings.zoomHeight) + 'px',
					display: 'none',
					zIndex: 10000,
					overflow: 'hidden'
				});

			//fa il positionamento
		    switch(settings.position)
		    {
		    	case "right":

				leftpos = (smallimagedata.pos.r + Math.abs(settings.xOffset) + settings.zoomWidth < screen.width)
				? (smallimagedata.pos.l + smallimagedata.w + Math.abs(settings.xOffset))
				: (smallimagedata.pos.l - settings.zoomWidth - Math.abs(settings.xOffset));

				topwindow = smallimagedata.pos.t + settings.yOffset + settings.zoomHeight;
				toppos = (topwindow < screen.height && topwindow > 0)
				?  smallimagedata.pos.t + settings.yOffset
				:  smallimagedata.pos.t;

		    	break;
		    	case "left":

				leftpos = (smallimagedata.pos.l - Math.abs(settings.xOffset) - settings.zoomWidth > 0)
				? (smallimagedata.pos.l - Math.abs(settings.xOffset) - settings.zoomWidth)
				: (smallimagedata.pos.l + smallimagedata.w + Math.abs(settings.xOffset));

				topwindow = smallimagedata.pos.t + settings.yOffset + settings.zoomHeight;
				toppos = (topwindow < screen.height && topwindow > 0)
				?  smallimagedata.pos.t + settings.yOffset
				:  smallimagedata.pos.t;

		    	break;
		    	case "top":

				toppos = (smallimagedata.pos.t - Math.abs(settings.yOffset) - settings.zoomHeight > 0)
				? (smallimagedata.pos.t - Math.abs(settings.yOffset) - settings.zoomHeight)
				: (smallimagedata.pos.t + smallimagedata.h + Math.abs(settings.yOffset));


				leftwindow = smallimagedata.pos.l + settings.xOffset + settings.zoomWidth;
				leftpos = (leftwindow < screen.width && leftwindow > 0)
				? smallimagedata.pos.l + settings.xOffset
				: smallimagedata.pos.l;

		    	break;
		    	case "bottom":


				toppos = (smallimagedata.pos.b + Math.abs(settings.yOffset) + settings.zoomHeight < $('body').height())
				? (smallimagedata.pos.b + Math.abs(settings.yOffset))
				: (smallimagedata.pos.t - settings.zoomHeight - Math.abs(settings.yOffset));


				leftwindow = smallimagedata.pos.l + settings.xOffset + settings.zoomWidth;
				leftpos = (leftwindow < screen.width && leftwindow > 0)
				? smallimagedata.pos.l + settings.xOffset
				: smallimagedata.pos.l;

		    	break;
		    	default:

				leftpos = (smallimagedata.pos.l + smallimagedata.w + settings.xOffset + settings.zoomWidth < screen.width)
				? (smallimagedata.pos.l + smallimagedata.w + Math.abs(settings.xOffset))
				: (smallimagedata.pos.l - settings.zoomWidth - Math.abs(settings.xOffset));

				toppos = (smallimagedata.pos.b + Math.abs(settings.yOffset) + settings.zoomHeight < screen.height)
				? (smallimagedata.pos.b + Math.abs(settings.yOffset))
				: (smallimagedata.pos.t - settings.zoomHeight - Math.abs(settings.yOffset));

		    	break;
		    }

			this.node.style.left = leftpos + 'px';
			this.node.style.top = toppos + 'px';
			return this;
		}


		Stage.prototype.activate = function()
		{

			if ( !this.node.firstChild )
					this.node.appendChild( largeimage.node );


			if(settings.title)
			{
				ZoomTitleObj.loadtitle();
			}



			document.body.appendChild( this.node );


			switch(settings.showEffect)
			{
				case 'show':
					$(this.node).show();
				break;
				case 'fadein':
					$(this.node).fadeIn(settings.fadeinSpeed);
				break;
				default:
					$(this.node).show();
				break;
			}

			$(this.node).show();

            if ($.browser.msie && $.browser.version < 7) {
	        this.ieframe = $('<iframe class="zoom_ieframe" frameborder="0" src="#"></iframe>')
	          .css({ position: "absolute", left:this.node.style.left,top:this.node.style.top,zIndex: 99,width:settings.zoomWidth,height:settings.zoomHeight })
	          .insertBefore(this.node);
	     	 };


			largeimage.node.style.display = 'block';
		}

		Stage.prototype.remove = function() {
			switch(settings.hideEffect)
			{
				case 'hide':
					$('.jqZoomWindow').remove();
				break;
				case 'fadeout':
					$('.jqZoomWindow').fadeOut(settings.fadeoutSpeed, function() {
						$(this).remove();
					});
				break;
				default:
					$('.jqZoomWindow').remove();
				break;
			}
		}

		function zoomTitle()
		{

			this.node =  jQuery('<div />')
				.addClass('jqZoomTitle')
				.html('' + ZoomTitle +'');

			this.loadtitle = function()
			{
				if(settings.zoomType == 'innerzoom')
				{
					$(this.node)
					.css({position: 'absolute',
						  top: smallimagedata.pos.b +3,
						  left: (smallimagedata.pos.l+1),
						  width:smallimagedata.w
						  })
					.appendTo('body');
				}else
				{
					$(this.node).appendTo(stage.node);
				}
			};
		}

		zoomTitle.prototype.remove = function() {
			$('.jqZoomTitle').remove();
		}


		function Loader()
		{

			this.node = document.createElement("div");
			$(this.node).addClass('preload');
			$(this.node).html(settings.preloadText);//appendo il testo

			$(this.node )
				.appendTo("body")
				.css('visibility','hidden');



			this.show = function()
			{
				switch(settings.preloadPosition)
				{
					case 'center':
						loadertop =  smallimagedata.pos.t + (smallimagedata.h - $(this.node ).height())/2;
						loaderleft = smallimagedata.pos.l + (smallimagedata.w - $(this.node ).width())/2;
					break;
					default:
					var loaderoffset = this.getoffset();
					loadertop = !isNaN(loaderoffset.top) ? smallimagedata.pos.t + loaderoffset.top : smallimagedata.pos.t + 0;
					loaderleft = !isNaN(loaderoffset.left) ? smallimagedata.pos.l + loaderoffset.left : smallimagedata.pos.l + 0;
					break;
				}

				//setting position
				$(this.node).css({
							top: loadertop  ,
							left: loaderleft ,
							position: 'absolute',
							visibility:'visible'
					    	});
			}
			return this;
		}

		Loader.prototype.getoffset = function()
		{
			var o = null;
			o = $('div.preload').offset();
			return o;
		}

		});
	}
})(jQuery);

	function trim(stringa)
	{
	    while (stringa.substring(0,1) == ' '){
	        stringa = stringa.substring(1, stringa.length);
	    }
	    while (stringa.substring(stringa.length-1, stringa.length) == ' '){
	        stringa = stringa.substring(0,stringa.length-1);
	    }
	    return stringa;
	}
	
/** HoverIntent **/

/**
* hoverIntent is similar to jQuery's built-in "hover" function except that
* instead of firing the onMouseOver event immediately, hoverIntent checks
* to see if the user's mouse has slowed down (beneath the sensitivity
* threshold) before firing the onMouseOver event.
* 
* hoverIntent r5 // 2007.03.27 // jQuery 1.1.2+
* <http://cherne.net/brian/resources/jquery.hoverIntent.html>
* 
* hoverIntent is currently available for use in all personal or commercial 
* projects under both MIT and GPL licenses. This means that you can choose 
* the license that best suits your project, and use it accordingly.
* 
* // basic usage (just like .hover) receives onMouseOver and onMouseOut functions
* $("ul li").hoverIntent( showNav , hideNav );
* 
* // advanced usage receives configuration object only
* $("ul li").hoverIntent({
*	sensitivity: 7, // number = sensitivity threshold (must be 1 or higher)
*	interval: 100,   // number = milliseconds of polling interval
*	over: showNav,  // function = onMouseOver callback (required)
*	timeout: 0,   // number = milliseconds delay before onMouseOut function call
*	out: hideNav    // function = onMouseOut callback (required)
* });
* 
* @param  f  onMouseOver function || An object with configuration options
* @param  g  onMouseOut function  || Nothing (use configuration options object)
* @author    Brian Cherne <brian@cherne.net>
*/
(function($) {
	$.fn.hoverIntent = function(f,g) {
		// default configuration options
		var cfg = {
			sensitivity: 8,
			interval: 100,
			timeout: 0
		};
		// override configuration options with user supplied object
		cfg = $.extend(cfg, g ? { over: f, out: g } : f );

		// instantiate variables
		// cX, cY = current X and Y position of mouse, updated by mousemove event
		// pX, pY = previous X and Y position of mouse, set by mouseover and polling interval
		var cX, cY, pX, pY;

		// A private function for getting mouse position
		var track = function(ev) {
			cX = ev.pageX;
			cY = ev.pageY;
		};

		// A private function for comparing current and previous mouse position
		var compare = function(ev,ob) {
			ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
			// compare mouse positions to see if they've crossed the threshold
			if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) {
				$(ob).unbind("mousemove",track);
				// set hoverIntent state to true (so mouseOut can be called)
				ob.hoverIntent_s = 1;
				return cfg.over.apply(ob,[ev]);
			} else {
				// set previous coordinates for next time
				pX = cX; pY = cY;
				// use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
				ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval );
			}
		};

		// A private function for delaying the mouseOut function
		var delay = function(ev,ob) {
			ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
			ob.hoverIntent_s = 0;
			return cfg.out.apply(ob,[ev]);
		};

		// A private function for handling mouse 'hovering'
		var handleHover = function(e) {
			// next three lines copied from jQuery.hover, ignore children onMouseOver/onMouseOut
			var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
			while ( p && p != this ) { try { p = p.parentNode; } catch(e) { p = this; } }
			if ( p == this ) { return false; }

			// copy objects to be passed into t (required for event object to be passed in IE)
			var ev = jQuery.extend({},e);
			var ob = this;

			// cancel hoverIntent timer if it exists
			if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); }

			// else e.type == "onmouseover"
			if (e.type == "mouseover") {
				// set "previous" X and Y position based on initial entry point
				pX = ev.pageX; pY = ev.pageY;
				// update "current" X and Y position based on mousemove
				$(ob).bind("mousemove",track);
				// start polling interval (self-calling timeout) to compare mouse coordinates over time
				if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );}

			// else e.type == "onmouseout"
			} else {
				// unbind expensive mousemove event
				$(ob).unbind("mousemove",track);
				// if hoverIntent state is true, then call the mouseOut function after the specified delay
				if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );}
			}
		};

		// bind the function to the two event listeners
		return this.mouseover(handleHover).mouseout(handleHover);
	};
})(jQuery);

/** Labelize **/

/*
 * jQuery Labelize Plugin (jQuery >= 1.2.2)
 *
 * This work is distributed under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 * Copyright 2008, Ben Vinegar [ ben ! benlog dot org ]
 *
 * Usage:
 *
 * $('.myLabel').labelize()
 *
 */

jQuery.fn.labelize = function(hoverClass) {

  var containers = $(this).filter(':has(input)');
  
  // Apply cursor attribute to containers
  $(containers).css('cursor', 'pointer');
  
  // Apply click event to container
  containers.click(jQuery.fn.labelize.labelClickEvent);
  
  // Apply optional hoverClass
  if (hoverClass) {
    containers
      .mouseover(function() { $(this).addClass(hoverClass) })
      .mouseout (function() { $(this).removeClass(hoverClass) });
  }
  
  // Remove encompassing label event when hovering over the
  // input element; this makes sure click() events don't fire twice
  $('input', this)
    .mouseover(function() {
      $(containers).unbind('click', jQuery.fn.labelize.labelClickEvent);
    })
    .mouseout(function() {
      $(containers).click(jQuery.fn.labelize.labelClickEvent);
  });
    
  return this;
}

jQuery.fn.labelize.labelClickEvent = function() {
  $('input', this).click();
}

/** Password **/

var shortPass = '<span class="passwordInfo">Your password must be 8 or more characters</span>'
var noNumbers = '<span class="passwordWarning">Your password must contain at least one number</span>'
var warningPass = '<span class="passwordWarning">Weak password</span>'
var goodPass = '<span class="passwordAccepted">Good password</span>'
var strongPass = '<span class="passwordAccepted">Strong password</span>'

function passwordStrength(password)
{
    score = 0 
    
    //password < 4
    if (password.length < 8 ) { return shortPass }
    if (password.match(/^[^0-9]*$/)) return noNumbers
    
    //password length
    score += password.length * 4
    score += ( checkRepetition(1,password).length - password.length ) * 1
    score += ( checkRepetition(2,password).length - password.length ) * 1
    score += ( checkRepetition(3,password).length - password.length ) * 1
    score += ( checkRepetition(4,password).length - password.length ) * 1
    
    //password has 3 numbers
    if (password.match(/(.*[0-9].*[0-9].*[0-9])/))  score += 5 
    
    //password has 2 sybols
    if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) score += 5 
    
    //password has Upper and Lower chars
    if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/))  score += 10 
    
    //password has number and chars
    if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/))  score += 15 
    //
    //password has number and symbol
    if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/))  score += 15 
    
    //password has char and symbol
    if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/))  score += 15 
    
    //password is just a nubers or chars
    if (password.match(/^\w+$/) || password.match(/^\d+$/) )  score -= 10 
    
    //verifing 0 < score < 100
    if ( score < 0 )  score = 0 
    if ( score > 100 )  score = 100 
    
    if (score < 30 )  return warningPass
    if (score < 68 )  return goodPass
    return strongPass
}

function checkRepetition(pLen,str) {
    res = ""
    for ( i=0; i<str.length ; i++ ) {
        repeated=true
        for (j=0;j < pLen && (j+i+pLen) < str.length;j++)
            repeated=repeated && (str.charAt(j+i)==str.charAt(j+i+pLen))
        if (j<pLen) repeated=false
        if (repeated) {
            i+=pLen-1
            repeated=false
        }
        else {
            res+=str.charAt(i)
        }
    }
    return res
}

$(document).ready(function() {
    $('#confirmPassword').keyup(function() {
        var pw1 = $('#password').val();
        var pw2 = $('#confirmPassword').val();
        if (pw1 != pw2) {
           $('.confirmPasswordResult').find('.passwordWarning, .passwordInfo, .passwordAccepted').remove();
           $('.confirmPasswordResult').append('<span class="passwordInfo">Please confirm your password.</span>');
        } else {
           $('.confirmPasswordResult').find('.passwordWarning, .passwordInfo, .passwordAccepted').remove();
            $('.confirmPasswordResult').append('<span class="passwordAccepted">Password matches</span>');
        }
    });
});

/**
 * jCarousel - Riding carousels with jQuery
 *   http://sorgalla.com/jcarousel/
 *
 * Copyright (c) 2006 Jan Sorgalla (http://sorgalla.com)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * Built on top of the jQuery library
 *   http://jquery.com
 *
 * Inspired by the "Carousel Component" by Bill Scott
 *   http://billwscott.com/carousel/
 */

(function($) {
    /**
     * Creates a carousel for all matched elements.
     *
     * @example $("#mycarousel").jcarousel();
     * @before <ul id="mycarousel" class="jcarousel-skin-name"><li>First item</li><li>Second item</li></ul>
     * @result
     *
     * <div class="jcarousel-skin-name">
     *   <div class="jcarousel-container">
     *     <div disabled="disabled" class="jcarousel-prev jcarousel-prev-disabled"></div>
     *     <div class="jcarousel-next"></div>
     *     <div class="jcarousel-clip">
     *       <ul class="jcarousel-list">
     *         <li class="jcarousel-item-1">First item</li>
     *         <li class="jcarousel-item-2">Second item</li>
     *       </ul>
     *     </div>
     *   </div>
     * </div>
     *
     * @name jcarousel
     * @type jQuery
     * @param Hash o A set of key/value pairs to set as configuration properties.
     * @cat Plugins/jCarousel
     */
    $.fn.jcarousel = function(o) {
        return this.each(function() {
            new $jc(this, o);
        });
    };

    // Default configuration properties.
    var defaults = {
        vertical: false,
        start: 1,
        offset: 1,
        size: null,
        scroll: 3,
        visible: null,
        animation: 'normal',
        easing: 'swing',
        auto: 0,
        wrap: null,
        initCallback: null,
        reloadCallback: null,
        itemLoadCallback: null,
        itemFirstInCallback: null,
        itemFirstOutCallback: null,
        itemLastInCallback: null,
        itemLastOutCallback: null,
        itemVisibleInCallback: null,
        itemVisibleOutCallback: null,
        buttonNextHTML: '<div></div>',
        buttonPrevHTML: '<div></div>',
        buttonNextEvent: 'click',
        buttonPrevEvent: 'click',
        buttonNextCallback: null,
        buttonPrevCallback: null
    };

    /**
     * The jCarousel object.
     *
     * @constructor
     * @name $.jcarousel
     * @param Object e The element to create the carousel for.
     * @param Hash o A set of key/value pairs to set as configuration properties.
     * @cat Plugins/jCarousel
     */
    $.jcarousel = function(e, o) {
        this.options    = $.extend({}, defaults, o || {});

        this.locked     = false;

        this.container  = null;
        this.clip       = null;
        this.list       = null;
        this.buttonNext = null;
        this.buttonPrev = null;

        this.wh = !this.options.vertical ? 'width' : 'height';
        this.lt = !this.options.vertical ? 'left' : 'top';

        // Extract skin class
        var skin = '', split = e.className.split(' ');

        for (var i = 0; i < split.length; i++) {
            if (split[i].indexOf('jcarousel-skin') != -1) {
                $(e).removeClass(split[i]);
                var skin = split[i];
                break;
            }
        }

        if (e.nodeName == 'UL' || e.nodeName == 'OL') {
            this.list = $(e);
            this.container = this.list.parent();

            if (this.container.hasClass('jcarousel-clip')) {
                if (!this.container.parent().hasClass('jcarousel-container'))
                    this.container = this.container.wrap('<div></div>');

                this.container = this.container.parent();
            } else if (!this.container.hasClass('jcarousel-container'))
                this.container = this.list.wrap('<div></div>').parent();
        } else {
            this.container = $(e);
            this.list = $(e).find('>ul,>ol,div>ul,div>ol');
        }

        if (skin != '' && this.container.parent()[0].className.indexOf('jcarousel-skin') == -1)
        	this.container.wrap('<div class=" '+ skin + '"></div>');

        this.clip = this.list.parent();

        if (!this.clip.length || !this.clip.hasClass('jcarousel-clip'))
            this.clip = this.list.wrap('<div></div>').parent();

        this.buttonPrev = $('.jcarousel-prev', this.container);

        if (this.buttonPrev.size() == 0 && this.options.buttonPrevHTML != null)
            this.buttonPrev = this.clip.before(this.options.buttonPrevHTML).prev();

        this.buttonPrev.addClass(this.className('jcarousel-prev'));

        this.buttonNext = $('.jcarousel-next', this.container);

        if (this.buttonNext.size() == 0 && this.options.buttonNextHTML != null)
            this.buttonNext = this.clip.before(this.options.buttonNextHTML).prev();

        this.buttonNext.addClass(this.className('jcarousel-next'));

        this.clip.addClass(this.className('jcarousel-clip'));
        this.list.addClass(this.className('jcarousel-list'));
        this.container.addClass(this.className('jcarousel-container'));

        var di = this.options.visible != null ? Math.ceil(this.clipping() / this.options.visible) : null;
        var li = this.list.children('li');

        var self = this;

        if (li.size() > 0) {
            var wh = 0, i = this.options.offset;
            li.each(function() {
                self.format(this, i++);
                wh += self.dimension(this, di);
            });

            this.list.css(this.wh, wh + 'px');

            // Only set if not explicitly passed as option
            if (!o || o.size === undefined)
                this.options.size = li.size();
        }

        // For whatever reason, .show() does not work in Safari...
        this.container.css('display', 'block');
        this.buttonNext.css('display', 'block');
        this.buttonPrev.css('display', 'block');

        this.funcNext   = function() { self.next(); };
        this.funcPrev   = function() { self.prev(); };
        this.funcResize = function() { self.reload(); };

        if (this.options.initCallback != null)
            this.options.initCallback(this, 'init');

        if ($.browser.safari) {
            this.buttons(false, false);
            $(window).bind('load', function() { self.setup(); });
        } else
            this.setup();
    };

    // Create shortcut for internal use
    var $jc = $.jcarousel;

    $jc.fn = $jc.prototype = {
        jcarousel: '0.2.3'
    };

    $jc.fn.extend = $jc.extend = $.extend;

    $jc.fn.extend({
        /**
         * Setups the carousel.
         *
         * @name setup
         * @type undefined
         * @cat Plugins/jCarousel
         */
        setup: function() {
            this.first     = null;
            this.last      = null;
            this.prevFirst = null;
            this.prevLast  = null;
            this.animating = false;
            this.timer     = null;
            this.tail      = null;
            this.inTail    = false;

            if (this.locked)
                return;

            this.list.css(this.lt, this.pos(this.options.offset) + 'px');
            var p = this.pos(this.options.start);
            this.prevFirst = this.prevLast = null;
            this.animate(p, false);

            $(window).unbind('resize', this.funcResize).bind('resize', this.funcResize);
        },

        /**
         * Clears the list and resets the carousel.
         *
         * @name reset
         * @type undefined
         * @cat Plugins/jCarousel
         */
        reset: function() {
            this.list.empty();

            this.list.css(this.lt, '0px');
            this.list.css(this.wh, '10px');

            if (this.options.initCallback != null)
                this.options.initCallback(this, 'reset');

            this.setup();
        },

        /**
         * Reloads the carousel and adjusts positions.
         *
         * @name reload
         * @type undefined
         * @cat Plugins/jCarousel
         */
        reload: function() {
            if (this.tail != null && this.inTail)
                this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) + this.tail);

            this.tail   = null;
            this.inTail = false;

            if (this.options.reloadCallback != null)
                this.options.reloadCallback(this);

            if (this.options.visible != null) {
                var self = this;
                var di = Math.ceil(this.clipping() / this.options.visible), wh = 0, lt = 0;
                $('li', this.list).each(function(i) {
                    wh += self.dimension(this, di);
                    if (i + 1 < self.first)
                        lt = wh;
                });

                this.list.css(this.wh, wh + 'px');
                this.list.css(this.lt, -lt + 'px');
            }

            this.scroll(this.first, false);
        },

        /**
         * Locks the carousel.
         *
         * @name lock
         * @type undefined
         * @cat Plugins/jCarousel
         */
        lock: function() {
            this.locked = true;
            this.buttons();
        },

        /**
         * Unlocks the carousel.
         *
         * @name unlock
         * @type undefined
         * @cat Plugins/jCarousel
         */
        unlock: function() {
            this.locked = false;
            this.buttons();
        },

        /**
         * Sets the size of the carousel.
         *
         * @name size
         * @type undefined
         * @param Number s The size of the carousel.
         * @cat Plugins/jCarousel
         */
        size: function(s) {
            if (s != undefined) {
                this.options.size = s;
                if (!this.locked)
                    this.buttons();
            }

            return this.options.size;
        },

        /**
         * Checks whether a list element exists for the given index (or index range).
         *
         * @name get
         * @type bool
         * @param Number i The index of the (first) element.
         * @param Number i2 The index of the last element.
         * @cat Plugins/jCarousel
         */
        has: function(i, i2) {
            if (i2 == undefined || !i2)
                i2 = i;

            if (this.options.size !== null && i2 > this.options.size)
            	i2 = this.options.size;

            for (var j = i; j <= i2; j++) {
                var e = this.get(j);
                if (!e.length || e.hasClass('jcarousel-item-placeholder'))
                    return false;
            }

            return true;
        },

        /**
         * Returns a jQuery object with list element for the given index.
         *
         * @name get
         * @type jQuery
         * @param Number i The index of the element.
         * @cat Plugins/jCarousel
         */
        get: function(i) {
            return $('.jcarousel-item-' + i, this.list);
        },

        /**
         * Adds an element for the given index to the list.
         * If the element already exists, it updates the inner html.
         * Returns the created element as jQuery object.
         *
         * @name add
         * @type jQuery
         * @param Number i The index of the element.
         * @param String s The innerHTML of the element.
         * @cat Plugins/jCarousel
         */
        add: function(i, s) {
            var e = this.get(i), old = 0, add = 0;

            if (e.length == 0) {
                var c, e = this.create(i), j = $jc.intval(i);
                while (c = this.get(--j)) {
                    if (j <= 0 || c.length) {
                        j <= 0 ? this.list.prepend(e) : c.after(e);
                        break;
                    }
                }
            } else
                old = this.dimension(e);

            e.removeClass(this.className('jcarousel-item-placeholder'));
            typeof s == 'string' ? e.html(s) : e.empty().append(s);

            var di = this.options.visible != null ? Math.ceil(this.clipping() / this.options.visible) : null;
            var wh = this.dimension(e, di) - old;

            if (i > 0 && i < this.first)
                this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) - wh + 'px');

            this.list.css(this.wh, $jc.intval(this.list.css(this.wh)) + wh + 'px');

            return e;
        },

        /**
         * Removes an element for the given index from the list.
         *
         * @name remove
         * @type undefined
         * @param Number i The index of the element.
         * @cat Plugins/jCarousel
         */
        remove: function(i) {
            var e = this.get(i);

            // Check if item exists and is not currently visible
            if (!e.length || (i >= this.first && i <= this.last))
                return;

            var d = this.dimension(e);

            if (i < this.first)
                this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) + d + 'px');

            e.remove();

            this.list.css(this.wh, $jc.intval(this.list.css(this.wh)) - d + 'px');
        },

        /**
         * Moves the carousel forwards.
         *
         * @name next
         * @type undefined
         * @cat Plugins/jCarousel
         */
        next: function() {
            this.stopAuto();

            if (this.tail != null && !this.inTail)
                this.scrollTail(false);
            else
                this.scroll(((this.options.wrap == 'both' || this.options.wrap == 'last') && this.options.size != null && this.last == this.options.size) ? 1 : this.first + this.options.scroll);
        },

        /**
         * Moves the carousel backwards.
         *
         * @name prev
         * @type undefined
         * @cat Plugins/jCarousel
         */
        prev: function() {
            this.stopAuto();

            if (this.tail != null && this.inTail)
                this.scrollTail(true);
            else
                this.scroll(((this.options.wrap == 'both' || this.options.wrap == 'first') && this.options.size != null && this.first == 1) ? this.options.size : this.first - this.options.scroll);
        },

        /**
         * Scrolls the tail of the carousel.
         *
         * @name scrollTail
         * @type undefined
         * @param Bool b Whether scroll the tail back or forward.
         * @cat Plugins/jCarousel
         */
        scrollTail: function(b) {
            if (this.locked || this.animating || !this.tail)
                return;

            var pos  = $jc.intval(this.list.css(this.lt));

            !b ? pos -= this.tail : pos += this.tail;
            this.inTail = !b;

            // Save for callbacks
            this.prevFirst = this.first;
            this.prevLast  = this.last;

            this.animate(pos);
        },

        /**
         * Scrolls the carousel to a certain position.
         *
         * @name scroll
         * @type undefined
         * @param Number i The index of the element to scoll to.
         * @param Bool a Flag indicating whether to perform animation.
         * @cat Plugins/jCarousel
         */
        scroll: function(i, a) {
            if (this.locked || this.animating)
                return;

            this.animate(this.pos(i), a);
        },

        /**
         * Prepares the carousel and return the position for a certian index.
         *
         * @name pos
         * @type Number
         * @param Number i The index of the element to scoll to.
         * @cat Plugins/jCarousel
         */
        pos: function(i) {
            if (this.locked || this.animating)
                return;

            if (this.options.wrap != 'circular')
                i = i < 1 ? 1 : (this.options.size && i > this.options.size ? this.options.size : i);

            var back = this.first > i;
            var pos  = $jc.intval(this.list.css(this.lt));

            // Create placeholders, new list width/height
            // and new list position
            var f = this.options.wrap != 'circular' && this.first <= 1 ? 1 : this.first;
            var c = back ? this.get(f) : this.get(this.last);
            var j = back ? f : f - 1;
            var e = null, l = 0, p = false, d = 0;

            while (back ? --j >= i : ++j < i) {
                e = this.get(j);
                p = !e.length;
                if (e.length == 0) {
                    e = this.create(j).addClass(this.className('jcarousel-item-placeholder'));
                    c[back ? 'before' : 'after' ](e);
                }

                c = e;
                d = this.dimension(e);

                if (p)
                    l += d;

                if (this.first != null && (this.options.wrap == 'circular' || (j >= 1 && (this.options.size == null || j <= this.options.size))))
                    pos = back ? pos + d : pos - d;
            }

            // Calculate visible items
            var clipping = this.clipping();
            var cache = [];
            var visible = 0, j = i, v = 0;
            var c = this.get(i - 1);

            while (++visible) {
                e = this.get(j);
                p = !e.length;
                if (e.length == 0) {
                    e = this.create(j).addClass(this.className('jcarousel-item-placeholder'));
                    // This should only happen on a next scroll
                    c.length == 0 ? this.list.prepend(e) : c[back ? 'before' : 'after' ](e);
                }

                c = e;
                var d = this.dimension(e);
                if (d == 0) {
                    alert('jCarousel: No width/height set for items. This will cause an infinite loop. Aborting...');
                    return 0;
                }

                if (this.options.wrap != 'circular' && this.options.size !== null && j > this.options.size)
                    cache.push(e);
                else if (p)
                    l += d;

                v += d;

                if (v >= clipping)
                    break;

                j++;
            }

             // Remove out-of-range placeholders
            for (var x = 0; x < cache.length; x++)
                cache[x].remove();

            // Resize list
            if (l > 0) {
                this.list.css(this.wh, this.dimension(this.list) + l + 'px');

                if (back) {
                    pos -= l;
                    this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) - l + 'px');
                }
            }

            // Calculate first and last item
            var last = i + visible - 1;
            if (this.options.wrap != 'circular' && this.options.size && last > this.options.size)
                last = this.options.size;

            if (j > last) {
                visible = 0, j = last, v = 0;
                while (++visible) {
                    var e = this.get(j--);
                    if (!e.length)
                        break;
                    v += this.dimension(e);
                    if (v >= clipping)
                        break;
                }
            }

            var first = last - visible + 1;
            if (this.options.wrap != 'circular' && first < 1)
                first = 1;

            if (this.inTail && back) {
                pos += this.tail;
                this.inTail = false;
            }

            this.tail = null;
            if (this.options.wrap != 'circular' && last == this.options.size && (last - visible + 1) >= 1) {
                var m = $jc.margin(this.get(last), !this.options.vertical ? 'marginRight' : 'marginBottom');
                if ((v - m) > clipping)
                    this.tail = v - clipping - m;
            }

            // Adjust position
            while (i-- > first)
                pos += this.dimension(this.get(i));

            // Save visible item range
            this.prevFirst = this.first;
            this.prevLast  = this.last;
            this.first     = first;
            this.last      = last;

            return pos;
        },

        /**
         * Animates the carousel to a certain position.
         *
         * @name animate
         * @type undefined
         * @param mixed p Position to scroll to.
         * @param Bool a Flag indicating whether to perform animation.
         * @cat Plugins/jCarousel
         */
        animate: function(p, a) {
            if (this.locked || this.animating)
                return;

            this.animating = true;

            var self = this;
            var scrolled = function() {
                self.animating = false;

                if (p == 0)
                    self.list.css(self.lt,  0);

                if (self.options.wrap == 'both' || self.options.wrap == 'last' || self.options.size == null || self.last < self.options.size)
                    self.startAuto();

                self.buttons();
                self.notify('onAfterAnimation');
            };

            this.notify('onBeforeAnimation');

            // Animate
            if (!this.options.animation || a == false) {
                this.list.css(this.lt, p + 'px');
                scrolled();
            } else {
                var o = !this.options.vertical ? {'left': p} : {'top': p};
                this.list.animate(o, this.options.animation, this.options.easing, scrolled);
            }
        },

        /**
         * Starts autoscrolling.
         *
         * @name auto
         * @type undefined
         * @param Number s Seconds to periodically autoscroll the content.
         * @cat Plugins/jCarousel
         */
        startAuto: function(s) {
            if (s != undefined)
                this.options.auto = s;

            if (this.options.auto == 0)
                return this.stopAuto();

            if (this.timer != null)
                return;

            var self = this;
            this.timer = setTimeout(function() { self.next(); }, this.options.auto * 1000);
        },

        /**
         * Stops autoscrolling.
         *
         * @name stopAuto
         * @type undefined
         * @cat Plugins/jCarousel
         */
        stopAuto: function() {
            if (this.timer == null)
                return;

            clearTimeout(this.timer);
            this.timer = null;
        },

        /**
         * Sets the states of the prev/next buttons.
         *
         * @name buttons
         * @type undefined
         * @cat Plugins/jCarousel
         */
        buttons: function(n, p) {
            if (n == undefined || n == null) {
                var n = !this.locked && this.options.size !== 0 && ((this.options.wrap && this.options.wrap != 'first') || this.options.size == null || this.last < this.options.size);
                if (!this.locked && (!this.options.wrap || this.options.wrap == 'first') && this.options.size != null && this.last >= this.options.size)
                    n = this.tail != null && !this.inTail;
            }

            if (p == undefined || p == null) {
                var p = !this.locked && this.options.size !== 0 && ((this.options.wrap && this.options.wrap != 'last') || this.first > 1);
                if (!this.locked && (!this.options.wrap || this.options.wrap == 'last') && this.options.size != null && this.first == 1)
                    p = this.tail != null && this.inTail;
            }

            var self = this;

            this.buttonNext[n ? 'bind' : 'unbind'](this.options.buttonNextEvent, this.funcNext)[n ? 'removeClass' : 'addClass'](this.className('jcarousel-next-disabled')).attr('disabled', n ? false : true);
            this.buttonPrev[p ? 'bind' : 'unbind'](this.options.buttonPrevEvent, this.funcPrev)[p ? 'removeClass' : 'addClass'](this.className('jcarousel-prev-disabled')).attr('disabled', p ? false : true);

            if (this.buttonNext.length > 0 && (this.buttonNext[0].jcarouselstate == undefined || this.buttonNext[0].jcarouselstate != n) && this.options.buttonNextCallback != null) {
                this.buttonNext.each(function() { self.options.buttonNextCallback(self, this, n); });
                this.buttonNext[0].jcarouselstate = n;
            }

            if (this.buttonPrev.length > 0 && (this.buttonPrev[0].jcarouselstate == undefined || this.buttonPrev[0].jcarouselstate != p) && this.options.buttonPrevCallback != null) {
                this.buttonPrev.each(function() { self.options.buttonPrevCallback(self, this, p); });
                this.buttonPrev[0].jcarouselstate = p;
            }
        },

        notify: function(evt) {
            var state = this.prevFirst == null ? 'init' : (this.prevFirst < this.first ? 'next' : 'prev');

            // Load items
            this.callback('itemLoadCallback', evt, state);

            if (this.prevFirst !== this.first) {
                this.callback('itemFirstInCallback', evt, state, this.first);
                this.callback('itemFirstOutCallback', evt, state, this.prevFirst);
            }

            if (this.prevLast !== this.last) {
                this.callback('itemLastInCallback', evt, state, this.last);
                this.callback('itemLastOutCallback', evt, state, this.prevLast);
            }

            this.callback('itemVisibleInCallback', evt, state, this.first, this.last, this.prevFirst, this.prevLast);
            this.callback('itemVisibleOutCallback', evt, state, this.prevFirst, this.prevLast, this.first, this.last);
        },

        callback: function(cb, evt, state, i1, i2, i3, i4) {
            if (this.options[cb] == undefined || (typeof this.options[cb] != 'object' && evt != 'onAfterAnimation'))
                return;

            var callback = typeof this.options[cb] == 'object' ? this.options[cb][evt] : this.options[cb];

            if (!$.isFunction(callback))
                return;

            var self = this;

            if (i1 === undefined)
                callback(self, state, evt);
            else if (i2 === undefined)
                this.get(i1).each(function() { callback(self, this, i1, state, evt); });
            else {
                for (var i = i1; i <= i2; i++)
                    if (i !== null && !(i >= i3 && i <= i4))
                        this.get(i).each(function() { callback(self, this, i, state, evt); });
            }
        },

        create: function(i) {
            return this.format('<li></li>', i);
        },

        format: function(e, i) {
            var $e = $(e).addClass(this.className('jcarousel-item')).addClass(this.className('jcarousel-item-' + i));
            $e.attr('jcarouselindex', i);
            return $e;
        },

        className: function(c) {
            return c + ' ' + c + (!this.options.vertical ? '-horizontal' : '-vertical');
        },

        dimension: function(e, d) {
            var el = e.jquery != undefined ? e[0] : e;

            var old = !this.options.vertical ?
                el.offsetWidth + $jc.margin(el, 'marginLeft') + $jc.margin(el, 'marginRight') :
                el.offsetHeight + $jc.margin(el, 'marginTop') + $jc.margin(el, 'marginBottom');

            if (d == undefined || old == d)
                return old;

            var w = !this.options.vertical ?
                d - $jc.margin(el, 'marginLeft') - $jc.margin(el, 'marginRight') :
                d - $jc.margin(el, 'marginTop') - $jc.margin(el, 'marginBottom');

            $(el).css(this.wh, w + 'px');

            return this.dimension(el);
        },

        clipping: function() {
            return !this.options.vertical ?
                this.clip[0].offsetWidth - $jc.intval(this.clip.css('borderLeftWidth')) - $jc.intval(this.clip.css('borderRightWidth')) :
                this.clip[0].offsetHeight - $jc.intval(this.clip.css('borderTopWidth')) - $jc.intval(this.clip.css('borderBottomWidth'));
        },

        index: function(i, s) {
            if (s == undefined)
                s = this.options.size;

            return Math.round((((i-1) / s) - Math.floor((i-1) / s)) * s) + 1;
        }
    });

    $jc.extend({
        /**
         * Gets/Sets the global default configuration properties.
         *
         * @name defaults
         * @descr Gets/Sets the global default configuration properties.
         * @type Hash
         * @param Hash d A set of key/value pairs to set as configuration properties.
         * @cat Plugins/jCarousel
         */
        defaults: function(d) {
            return $.extend(defaults, d || {});
        },

        margin: function(e, p) {
            if (!e)
                return 0;

            var el = e.jquery != undefined ? e[0] : e;

            if (p == 'marginRight' && $.browser.safari) {
                var old = {'display': 'block', 'float': 'none', 'width': 'auto'}, oWidth, oWidth2;

                $.swap(el, old, function() { oWidth = el.offsetWidth; });

                old['marginRight'] = 0;
                $.swap(el, old, function() { oWidth2 = el.offsetWidth; });

                return oWidth2 - oWidth;
            }

            return $jc.intval($.css(el, p));
        },

        intval: function(v) {
            v = parseInt(v);
            return isNaN(v) ? 0 : v;
        }
    });
})(jQuery);

/*
 * jQuery BBQ: Back Button & Query Library - v1.2.1 - 2/17/2010
 * http://benalman.com/projects/jquery-bbq-plugin/
 * 
 * Copyright (c) 2010 "Cowboy" Ben Alman
 * Dual licensed under the MIT and GPL licenses.
 * http://benalman.com/about/license/
 */
(function($,p){var i,m=Array.prototype.slice,r=decodeURIComponent,a=$.param,c,l,v,b=$.bbq=$.bbq||{},q,u,j,e=$.event.special,d="hashchange",A="querystring",D="fragment",y="elemUrlAttr",g="location",k="href",t="src",x=/^.*\?|#.*$/g,w=/^.*\#/,h,C={};function E(F){return typeof F==="string"}function B(G){var F=m.call(arguments,1);return function(){return G.apply(this,F.concat(m.call(arguments)))}}function n(F){return F.replace(/^[^#]*#?(.*)$/,"$1")}function o(F){return F.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function f(H,M,F,I,G){var O,L,K,N,J;if(I!==i){K=F.match(H?/^([^#]*)\#?(.*)$/:/^([^#?]*)\??([^#]*)(#?.*)/);J=K[3]||"";if(G===2&&E(I)){L=I.replace(H?w:x,"")}else{N=l(K[2]);I=E(I)?l[H?D:A](I):I;L=G===2?I:G===1?$.extend({},I,N):$.extend({},N,I);L=a(L);if(H){L=L.replace(h,r)}}O=K[1]+(H?"#":L||!K[1]?"?":"")+L+J}else{O=M(F!==i?F:p[g][k])}return O}a[A]=B(f,0,o);a[D]=c=B(f,1,n);c.noEscape=function(G){G=G||"";var F=$.map(G.split(""),encodeURIComponent);h=new RegExp(F.join("|"),"g")};c.noEscape(",/");$.deparam=l=function(I,F){var H={},G={"true":!0,"false":!1,"null":null};$.each(I.replace(/\+/g," ").split("&"),function(L,Q){var K=Q.split("="),P=r(K[0]),J,O=H,M=0,R=P.split("]["),N=R.length-1;if(/\[/.test(R[0])&&/\]$/.test(R[N])){R[N]=R[N].replace(/\]$/,"");R=R.shift().split("[").concat(R);N=R.length-1}else{N=0}if(K.length===2){J=r(K[1]);if(F){J=J&&!isNaN(J)?+J:J==="undefined"?i:G[J]!==i?G[J]:J}if(N){for(;M<=N;M++){P=R[M]===""?O.length:R[M];O=O[P]=M<N?O[P]||(R[M+1]&&isNaN(R[M+1])?{}:[]):J}}else{if($.isArray(H[P])){H[P].push(J)}else{if(H[P]!==i){H[P]=[H[P],J]}else{H[P]=J}}}}else{if(P){H[P]=F?i:""}}});return H};function z(H,F,G){if(F===i||typeof F==="boolean"){G=F;F=a[H?D:A]()}else{F=E(F)?F.replace(H?w:x,""):F}return l(F,G)}l[A]=B(z,0);l[D]=v=B(z,1);$[y]||($[y]=function(F){return $.extend(C,F)})({a:k,base:k,iframe:t,img:t,input:t,form:"action",link:k,script:t});j=$[y];function s(I,G,H,F){if(!E(H)&&typeof H!=="object"){F=H;H=G;G=i}return this.each(function(){var L=$(this),J=G||j()[(this.nodeName||"").toLowerCase()]||"",K=J&&L.attr(J)||"";L.attr(J,a[I](K,H,F))})}$.fn[A]=B(s,A);$.fn[D]=B(s,D);b.pushState=q=function(I,F){if(E(I)&&/^#/.test(I)&&F===i){F=2}var H=I!==i,G=c(p[g][k],H?I:{},H?F:2);p[g][k]=G+(/#/.test(G)?"":"#")};b.getState=u=function(F,G){return F===i||typeof F==="boolean"?v(F):v(G)[F]};b.removeState=function(F){var G={};if(F!==i){G=u();$.each($.isArray(F)?F:arguments,function(I,H){delete G[H]})}q(G,2)};e[d]=$.extend(e[d],{add:function(F){var H;function G(J){var I=J[D]=c();J.getState=function(K,L){return K===i||typeof K==="boolean"?l(I,K):l(I,L)[K]};H.apply(this,arguments)}if($.isFunction(F)){H=F;return G}else{H=F.handler;F.handler=G}}})})(jQuery,this);
/*
 * jQuery hashchange event - v1.2 - 2/11/2010
 * http://benalman.com/projects/jquery-hashchange-plugin/
 * 
 * Copyright (c) 2010 "Cowboy" Ben Alman
 * Dual licensed under the MIT and GPL licenses.
 * http://benalman.com/about/license/
 */
(function($,i,b){var j,k=$.event.special,c="location",d="hashchange",l="href",f=$.browser,g=document.documentMode,h=f.msie&&(g===b||g<8),e="on"+d in i&&!h;function a(m){m=m||i[c][l];return m.replace(/^[^#]*#?(.*)$/,"$1")}$[d+"Delay"]=100;k[d]=$.extend(k[d],{setup:function(){if(e){return false}$(j.start)},teardown:function(){if(e){return false}$(j.stop)}});j=(function(){var m={},r,n,o,q;function p(){o=q=function(s){return s};if(h){n=$('<iframe src="javascript:0"/>').hide().insertAfter("body")[0].contentWindow;q=function(){return a(n.document[c][l])};o=function(u,s){if(u!==s){var t=n.document;t.open().close();t[c].hash="#"+u}};o(a())}}m.start=function(){if(r){return}var t=a();o||p();(function s(){var v=a(),u=q(t);if(v!==t){o(t=v,u);$(i).trigger(d)}else{if(u!==t){i[c][l]=i[c][l].replace(/#.*/,"")+"#"+u}}r=setTimeout(s,$[d+"Delay"])})()};m.stop=function(){if(!n){r&&clearTimeout(r);r=0}};return m})()})(jQuery,this);



/*
 * jQuery validation plug-in 1.7
 *
 * http://bassistance.de/jquery-plugins/jquery-plugin-validation/
 * http://docs.jquery.com/Plugins/Validation
 *
 * Copyright (c) 2006 - 2008 Jörn Zaefferer
 *
 * $Id: jquery.validate.js 6403 2009-06-17 14:27:16Z joern.zaefferer $
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */
(function($){$.extend($.fn,{validate:function(options){if(!this.length){options&&options.debug&&window.console&&console.warn("nothing selected, can't validate, returning nothing");return;}var validator=$.data(this[0],'validator');if(validator){return validator;}validator=new $.validator(options,this[0]);$.data(this[0],'validator',validator);if(validator.settings.onsubmit){this.find("input, button").filter(".cancel").click(function(){validator.cancelSubmit=true;});if(validator.settings.submitHandler){this.find("input, button").filter(":submit").click(function(){validator.submitButton=this;});}this.submit(function(event){if(validator.settings.debug)event.preventDefault();function handle(){if(validator.settings.submitHandler){if(validator.submitButton){var hidden=$("<input type='hidden'/>").attr("name",validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm);}validator.settings.submitHandler.call(validator,validator.currentForm);if(validator.submitButton){hidden.remove();}return false;}return true;}if(validator.cancelSubmit){validator.cancelSubmit=false;return handle();}if(validator.form()){if(validator.pendingRequest){validator.formSubmitted=true;return false;}return handle();}else{validator.focusInvalid();return false;}});}return validator;},valid:function(){if($(this[0]).is('form')){return this.validate().form();}else{var valid=true;var validator=$(this[0].form).validate();this.each(function(){valid&=validator.element(this);});return valid;}},removeAttrs:function(attributes){var result={},$element=this;$.each(attributes.split(/\s/),function(index,value){result[value]=$element.attr(value);$element.removeAttr(value);});return result;},rules:function(command,argument){var element=this[0];if(command){var settings=$.data(element.form,'validator').settings;var staticRules=settings.rules;var existingRules=$.validator.staticRules(element);switch(command){case"add":$.extend(existingRules,$.validator.normalizeRule(argument));staticRules[element.name]=existingRules;if(argument.messages)settings.messages[element.name]=$.extend(settings.messages[element.name],argument.messages);break;case"remove":if(!argument){delete staticRules[element.name];return existingRules;}var filtered={};$.each(argument.split(/\s/),function(index,method){filtered[method]=existingRules[method];delete existingRules[method];});return filtered;}}var data=$.validator.normalizeRules($.extend({},$.validator.metadataRules(element),$.validator.classRules(element),$.validator.attributeRules(element),$.validator.staticRules(element)),element);if(data.required){var param=data.required;delete data.required;data=$.extend({required:param},data);}return data;}});$.extend($.expr[":"],{blank:function(a){return!$.trim(""+a.value);},filled:function(a){return!!$.trim(""+a.value);},unchecked:function(a){return!a.checked;}});$.validator=function(options,form){this.settings=$.extend(true,{},$.validator.defaults,options);this.currentForm=form;this.init();};$.validator.format=function(source,params){if(arguments.length==1)return function(){var args=$.makeArray(arguments);args.unshift(source);return $.validator.format.apply(this,args);};if(arguments.length>2&&params.constructor!=Array){params=$.makeArray(arguments).slice(1);}if(params.constructor!=Array){params=[params];}$.each(params,function(i,n){source=source.replace(new RegExp("\\{"+i+"\\}","g"),n);});return source;};$.extend($.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",validClass:"valid",errorElement:"label",focusInvalid:true,errorContainer:$([]),errorLabelContainer:$([]),onsubmit:true,ignore:[],ignoreTitle:false,onfocusin:function(element){this.lastActive=element;if(this.settings.focusCleanup&&!this.blockFocusCleanup){this.settings.unhighlight&&this.settings.unhighlight.call(this,element,this.settings.errorClass,this.settings.validClass);this.errorsFor(element).hide();}},onfocusout:function(element){if(!this.checkable(element)&&(element.name in this.submitted||!this.optional(element))){this.element(element);}},onkeyup:function(element){if(element.name in this.submitted||element==this.lastElement){this.element(element);}},onclick:function(element){if(element.name in this.submitted)this.element(element);else if(element.parentNode.name in this.submitted)this.element(element.parentNode);},highlight:function(element,errorClass,validClass){$(element).addClass(errorClass).removeClass(validClass);},unhighlight:function(element,errorClass,validClass){$(element).removeClass(errorClass).addClass(validClass);}},setDefaults:function(settings){$.extend($.validator.defaults,settings);},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",creditcard:"Please enter a valid credit card number.",equalTo:"Please enter the same value again.",accept:"Please enter a value with a valid extension.",maxlength:$.validator.format("Please enter no more than {0} characters."),minlength:$.validator.format("Please enter at least {0} characters."),rangelength:$.validator.format("Please enter a value between {0} and {1} characters long."),range:$.validator.format("Please enter a value between {0} and {1}."),max:$.validator.format("Please enter a value less than or equal to {0}."),min:$.validator.format("Please enter a value greater than or equal to {0}.")},autoCreateRanges:false,prototype:{init:function(){this.labelContainer=$(this.settings.errorLabelContainer);this.errorContext=this.labelContainer.length&&this.labelContainer||$(this.currentForm);this.containers=$(this.settings.errorContainer).add(this.settings.errorLabelContainer);this.submitted={};this.valueCache={};this.pendingRequest=0;this.pending={};this.invalid={};this.reset();var groups=(this.groups={});$.each(this.settings.groups,function(key,value){$.each(value.split(/\s/),function(index,name){groups[name]=key;});});var rules=this.settings.rules;$.each(rules,function(key,value){rules[key]=$.validator.normalizeRule(value);});function delegate(event){var validator=$.data(this[0].form,"validator"),eventType="on"+event.type.replace(/^validate/,"");validator.settings[eventType]&&validator.settings[eventType].call(validator,this[0]);}$(this.currentForm).validateDelegate(":text, :password, :file, select, textarea","focusin focusout keyup",delegate).validateDelegate(":radio, :checkbox, select, option","click",delegate);if(this.settings.invalidHandler)$(this.currentForm).bind("invalid-form.validate",this.settings.invalidHandler);},form:function(){this.checkForm();$.extend(this.submitted,this.errorMap);this.invalid=$.extend({},this.errorMap);if(!this.valid())$(this.currentForm).triggerHandler("invalid-form",[this]);this.showErrors();return this.valid();},checkForm:function(){this.prepareForm();for(var i=0,elements=(this.currentElements=this.elements());elements[i];i++){this.check(elements[i]);}return this.valid();},element:function(element){element=this.clean(element);this.lastElement=element;this.prepareElement(element);this.currentElements=$(element);var result=this.check(element);if(result){delete this.invalid[element.name];}else{this.invalid[element.name]=true;}if(!this.numberOfInvalids()){this.toHide=this.toHide.add(this.containers);}this.showErrors();return result;},showErrors:function(errors){if(errors){$.extend(this.errorMap,errors);this.errorList=[];for(var name in errors){this.errorList.push({message:errors[name],element:this.findByName(name)[0]});}this.successList=$.grep(this.successList,function(element){return!(element.name in errors);});}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors();},resetForm:function(){if($.fn.resetForm)$(this.currentForm).resetForm();this.submitted={};this.prepareForm();this.hideErrors();this.elements().removeClass(this.settings.errorClass);},numberOfInvalids:function(){return this.objectLength(this.invalid);},objectLength:function(obj){var count=0;for(var i in obj)count++;return count;},hideErrors:function(){this.addWrapper(this.toHide).hide();},valid:function(){return this.size()==0;},size:function(){return this.errorList.length;},focusInvalid:function(){if(this.settings.focusInvalid){try{$(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin");}catch(e){}}},findLastActive:function(){var lastActive=this.lastActive;return lastActive&&$.grep(this.errorList,function(n){return n.element.name==lastActive.name;}).length==1&&lastActive;},elements:function(){var validator=this,rulesCache={};return $([]).add(this.currentForm.elements).filter(":input").not(":submit, :reset, :image, [disabled]").not(this.settings.ignore).filter(function(){!this.name&&validator.settings.debug&&window.console&&console.error("%o has no name assigned",this);if(this.name in rulesCache||!validator.objectLength($(this).rules()))return false;rulesCache[this.name]=true;return true;});},clean:function(selector){return $(selector)[0];},errors:function(){return $(this.settings.errorElement+"."+this.settings.errorClass,this.errorContext);},reset:function(){this.successList=[];this.errorList=[];this.errorMap={};this.toShow=$([]);this.toHide=$([]);this.currentElements=$([]);},prepareForm:function(){this.reset();this.toHide=this.errors().add(this.containers);},prepareElement:function(element){this.reset();this.toHide=this.errorsFor(element);},check:function(element){element=this.clean(element);if(this.checkable(element)){element=this.findByName(element.name)[0];}var rules=$(element).rules();var dependencyMismatch=false;for(method in rules){var rule={method:method,parameters:rules[method]};try{var result=$.validator.methods[method].call(this,element.value.replace(/\r/g,""),element,rule.parameters);if(result=="dependency-mismatch"){dependencyMismatch=true;continue;}dependencyMismatch=false;if(result=="pending"){this.toHide=this.toHide.not(this.errorsFor(element));return;}if(!result){this.formatAndAdd(element,rule);return false;}}catch(e){this.settings.debug&&window.console&&console.log("exception occured when checking element "+element.id
+", check the '"+rule.method+"' method",e);throw e;}}if(dependencyMismatch)return;if(this.objectLength(rules))this.successList.push(element);return true;},customMetaMessage:function(element,method){if(!$.metadata)return;var meta=this.settings.meta?$(element).metadata()[this.settings.meta]:$(element).metadata();return meta&&meta.messages&&meta.messages[method];},customMessage:function(name,method){var m=this.settings.messages[name];return m&&(m.constructor==String?m:m[method]);},findDefined:function(){for(var i=0;i<arguments.length;i++){if(arguments[i]!==undefined)return arguments[i];}return undefined;},defaultMessage:function(element,method){return this.findDefined(this.customMessage(element.name,method),this.customMetaMessage(element,method),!this.settings.ignoreTitle&&element.title||undefined,$.validator.messages[method],"<strong>Warning: No message defined for "+element.name+"</strong>");},formatAndAdd:function(element,rule){var message=this.defaultMessage(element,rule.method),theregex=/\$?\{(\d+)\}/g;if(typeof message=="function"){message=message.call(this,rule.parameters,element);}else if(theregex.test(message)){message=jQuery.format(message.replace(theregex,'{$1}'),rule.parameters);}this.errorList.push({message:message,element:element});this.errorMap[element.name]=message;this.submitted[element.name]=message;},addWrapper:function(toToggle){if(this.settings.wrapper)toToggle=toToggle.add(toToggle.parent(this.settings.wrapper));return toToggle;},defaultShowErrors:function(){for(var i=0;this.errorList[i];i++){var error=this.errorList[i];this.settings.highlight&&this.settings.highlight.call(this,error.element,this.settings.errorClass,this.settings.validClass);this.showLabel(error.element,error.message);}if(this.errorList.length){this.toShow=this.toShow.add(this.containers);}if(this.settings.success){for(var i=0;this.successList[i];i++){this.showLabel(this.successList[i]);}}if(this.settings.unhighlight){for(var i=0,elements=this.validElements();elements[i];i++){this.settings.unhighlight.call(this,elements[i],this.settings.errorClass,this.settings.validClass);}}this.toHide=this.toHide.not(this.toShow);this.hideErrors();this.addWrapper(this.toShow).show();},validElements:function(){return this.currentElements.not(this.invalidElements());},invalidElements:function(){return $(this.errorList).map(function(){return this.element;});},showLabel:function(element,message){var label=this.errorsFor(element);if(label.length){label.removeClass().addClass(this.settings.errorClass);label.attr("generated")&&label.html(message);}else{label=$("<"+this.settings.errorElement+"/>").attr({"for":this.idOrName(element),generated:true}).addClass(this.settings.errorClass).html(message||"");if(this.settings.wrapper){label=label.hide().show().wrap("<"+this.settings.wrapper+"/>").parent();}if(!this.labelContainer.append(label).length)this.settings.errorPlacement?this.settings.errorPlacement(label,$(element)):label.insertAfter(element);}if(!message&&this.settings.success){label.text("");typeof this.settings.success=="string"?label.addClass(this.settings.success):this.settings.success(label);}this.toShow=this.toShow.add(label);},errorsFor:function(element){var name=this.idOrName(element);return this.errors().filter(function(){return $(this).attr('for')==name;});},idOrName:function(element){return this.groups[element.name]||(this.checkable(element)?element.name:element.id||element.name);},checkable:function(element){return/radio|checkbox/i.test(element.type);},findByName:function(name){var form=this.currentForm;return $(document.getElementsByName(name)).map(function(index,element){return element.form==form&&element.name==name&&element||null;});},getLength:function(value,element){switch(element.nodeName.toLowerCase()){case'select':return $("option:selected",element).length;case'input':if(this.checkable(element))return this.findByName(element.name).filter(':checked').length;}return value.length;},depend:function(param,element){return this.dependTypes[typeof param]?this.dependTypes[typeof param](param,element):true;},dependTypes:{"boolean":function(param,element){return param;},"string":function(param,element){return!!$(param,element.form).length;},"function":function(param,element){return param(element);}},optional:function(element){return!$.validator.methods.required.call(this,$.trim(element.value),element)&&"dependency-mismatch";},startRequest:function(element){if(!this.pending[element.name]){this.pendingRequest++;this.pending[element.name]=true;}},stopRequest:function(element,valid){this.pendingRequest--;if(this.pendingRequest<0)this.pendingRequest=0;delete this.pending[element.name];if(valid&&this.pendingRequest==0&&this.formSubmitted&&this.form()){$(this.currentForm).submit();this.formSubmitted=false;}else if(!valid&&this.pendingRequest==0&&this.formSubmitted){$(this.currentForm).triggerHandler("invalid-form",[this]);this.formSubmitted=false;}},previousValue:function(element){return $.data(element,"previousValue")||$.data(element,"previousValue",{old:null,valid:true,message:this.defaultMessage(element,"remote")});}},classRuleSettings:{required:{required:true},email:{email:true},url:{url:true},date:{date:true},dateISO:{dateISO:true},dateDE:{dateDE:true},number:{number:true},numberDE:{numberDE:true},digits:{digits:true},creditcard:{creditcard:true}},addClassRules:function(className,rules){className.constructor==String?this.classRuleSettings[className]=rules:$.extend(this.classRuleSettings,className);},classRules:function(element){var rules={};var classes=$(element).attr('class');classes&&$.each(classes.split(' '),function(){if(this in $.validator.classRuleSettings){$.extend(rules,$.validator.classRuleSettings[this]);}});return rules;},attributeRules:function(element){var rules={};var $element=$(element);for(method in $.validator.methods){var value=$element.attr(method);if(value){rules[method]=value;}}if(rules.maxlength&&/-1|2147483647|524288/.test(rules.maxlength)){delete rules.maxlength;}return rules;},metadataRules:function(element){if(!$.metadata)return{};var meta=$.data(element.form,'validator').settings.meta;return meta?$(element).metadata()[meta]:$(element).metadata();},staticRules:function(element){var rules={};var validator=$.data(element.form,'validator');if(validator.settings.rules){rules=$.validator.normalizeRule(validator.settings.rules[element.name])||{};}return rules;},normalizeRules:function(rules,element){$.each(rules,function(prop,val){if(val===false){delete rules[prop];return;}if(val.param||val.depends){var keepRule=true;switch(typeof val.depends){case"string":keepRule=!!$(val.depends,element.form).length;break;case"function":keepRule=val.depends.call(element,element);break;}if(keepRule){rules[prop]=val.param!==undefined?val.param:true;}else{delete rules[prop];}}});$.each(rules,function(rule,parameter){rules[rule]=$.isFunction(parameter)?parameter(element):parameter;});$.each(['minlength','maxlength','min','max'],function(){if(rules[this]){rules[this]=Number(rules[this]);}});$.each(['rangelength','range'],function(){if(rules[this]){rules[this]=[Number(rules[this][0]),Number(rules[this][1])];}});if($.validator.autoCreateRanges){if(rules.min&&rules.max){rules.range=[rules.min,rules.max];delete rules.min;delete rules.max;}if(rules.minlength&&rules.maxlength){rules.rangelength=[rules.minlength,rules.maxlength];delete rules.minlength;delete rules.maxlength;}}if(rules.messages){delete rules.messages;}return rules;},normalizeRule:function(data){if(typeof data=="string"){var transformed={};$.each(data.split(/\s/),function(){transformed[this]=true;});data=transformed;}return data;},addMethod:function(name,method,message){$.validator.methods[name]=method;$.validator.messages[name]=message!=undefined?message:$.validator.messages[name];if(method.length<3){$.validator.addClassRules(name,$.validator.normalizeRule(name));}},methods:{required:function(value,element,param){if(!this.depend(param,element))return"dependency-mismatch";switch(element.nodeName.toLowerCase()){case'select':var val=$(element).val();return val&&val.length>0;case'input':if(this.checkable(element))return this.getLength(value,element)>0;default:return $.trim(value).length>0;}},remote:function(value,element,param){if(this.optional(element))return"dependency-mismatch";var previous=this.previousValue(element);if(!this.settings.messages[element.name])this.settings.messages[element.name]={};previous.originalMessage=this.settings.messages[element.name].remote;this.settings.messages[element.name].remote=previous.message;param=typeof param=="string"&&{url:param}||param;if(previous.old!==value){previous.old=value;var validator=this;this.startRequest(element);var data={};data[element.name]=value;$.ajax($.extend(true,{url:param,mode:"abort",port:"validate"+element.name,dataType:"json",data:data,success:function(response){validator.settings.messages[element.name].remote=previous.originalMessage;var valid=response===true;if(valid){var submitted=validator.formSubmitted;validator.prepareElement(element);validator.formSubmitted=submitted;validator.successList.push(element);validator.showErrors();}else{var errors={};var message=(previous.message=response||validator.defaultMessage(element,"remote"));errors[element.name]=$.isFunction(message)?message(value):message;validator.showErrors(errors);}previous.valid=valid;validator.stopRequest(element,valid);}},param));return"pending";}else if(this.pending[element.name]){return"pending";}return previous.valid;},minlength:function(value,element,param){return this.optional(element)||this.getLength($.trim(value),element)>=param;},maxlength:function(value,element,param){return this.optional(element)||this.getLength($.trim(value),element)<=param;},rangelength:function(value,element,param){var length=this.getLength($.trim(value),element);return this.optional(element)||(length>=param[0]&&length<=param[1]);},min:function(value,element,param){return this.optional(element)||value>=param;},max:function(value,element,param){return this.optional(element)||value<=param;},range:function(value,element,param){return this.optional(element)||(value>=param[0]&&value<=param[1]);},email:function(value,element){return this.optional(element)||/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);},url:function(value,element){return this.optional(element)||/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);},date:function(value,element){return this.optional(element)||!/Invalid|NaN/.test(new Date(value));},dateISO:function(value,element){return this.optional(element)||/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value);},number:function(value,element){return this.optional(element)||/^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value);},digits:function(value,element){return this.optional(element)||/^\d+$/.test(value);},creditcard:function(value,element){if(this.optional(element))return"dependency-mismatch";if(/[^0-9-]+/.test(value))return false;var nCheck=0,nDigit=0,bEven=false;value=value.replace(/\D/g,"");for(var n=value.length-1;n>=0;n--){var cDigit=value.charAt(n);var nDigit=parseInt(cDigit,10);if(bEven){if((nDigit*=2)>9)nDigit-=9;}nCheck+=nDigit;bEven=!bEven;}return(nCheck%10)==0;},accept:function(value,element,param){param=typeof param=="string"?param.replace(/,/g,'|'):"png|jpe?g|gif";return this.optional(element)||value.match(new RegExp(".("+param+")$","i"));},equalTo:function(value,element,param){var target=$(param).unbind(".validate-equalTo").bind("blur.validate-equalTo",function(){$(element).valid();});return value==target.val();}}});$.format=$.validator.format;})(jQuery);;(function($){var ajax=$.ajax;var pendingRequests={};$.ajax=function(settings){settings=$.extend(settings,$.extend({},$.ajaxSettings,settings));var port=settings.port;if(settings.mode=="abort"){if(pendingRequests[port]){pendingRequests[port].abort();}return(pendingRequests[port]=ajax.apply(this,arguments));}return ajax.apply(this,arguments);};})(jQuery);;(function($){if(!jQuery.event.special.focusin&&!jQuery.event.special.focusout&&document.addEventListener){$.each({focus:'focusin',blur:'focusout'},function(original,fix){$.event.special[fix]={setup:function(){this.addEventListener(original,handler,true);},teardown:function(){this.removeEventListener(original,handler,true);},handler:function(e){arguments[0]=$.event.fix(e);arguments[0].type=fix;return $.event.handle.apply(this,arguments);}};function handler(e){e=$.event.fix(e);e.type=fix;return $.event.handle.call(this,e);}});};$.extend($.fn,{validateDelegate:function(delegate,type,handler){return this.bind(type,function(event){var target=$(event.target);if(target.is(delegate)){return handler.apply(target,arguments);}});}});})(jQuery);


/*
 * 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
 */
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('"6t 6u";(j($){$(31).3x(j(){R i;$(2e).1J(\'3L 3E\',j(r){1V(i=0;i<$.18.g.O.Q;i++){R T=$.18.g.O[i];c(T&&T.V&&T.V.1b&&T.8.k.17!==\'29\'&&T.d.h.2r(\':28\')&&(T.8.k.1e.3E&&r.17===\'3E\'||T.8.k.1e.3L&&r.17===\'3L\')){T.2h(r,H)}}});$(31).1J(\'5j.g\',j(r){c($(r.s).5g(\'12.g\').Q===0){R h=$(\'.6w\'),T=h.g(\'T\');c(h.2r(\':28\')&&T&&T.V&&!T.V.23&&$(r.s).2m(T.d.s).Q>1){T.D(r)}}})});j 2D(w){c(!w){B p}A.x=5a(w).3l(/5x/i,\'1j\').5y(/M|25|1j/i)[0].2F();A.y=5a(w).3l(/5x/i,\'1j\').5y(/K|26|1j/i)[0].2F();A.1k={M:0,K:0};A.2y=(w.2H(0).6L(/^(t|b)/)>-1)?\'y\':\'x\';A.1w=j(){B(A.2y===\'y\')?A.y+A.x:A.x+A.y}}j 4t(w,o,G){R 1N={5B:[[0,0],[o,G],[o,0]],6a:[[0,0],[o,0],[0,G]],5K:[[0,G],[o,0],[o,G]],5N:[[0,0],[0,G],[o,G]],6y:[[0,G],[o/2,0],[o,G]],6v:[[0,0],[o,0],[o/2,G]],6i:[[0,0],[o,G/2],[0,G]],6J:[[o,0],[o,G],[0,G/2]]};1N.6M=1N.5B;1N.6z=1N.6a;1N.6x=1N.5K;1N.6C=1N.5N;B 1N[w]}j 4e(E){R 2j;c($(\'<1f />\').1q(0).1E){2j={3K:[E,E],40:[0,E],4I:[E,0],3P:[0,0]}}C c($.16.1d){2j={3K:[-2z,2z,0],40:[-2z,2z,-E],4I:[2z,5D,0],3P:[2z,5D,-E]}}B 2j}j 2G(e,4b){R 2U,i;2U=$.2p(H,{},e);1V(i 5R 2U){c(4b===H&&(/(f|1g)/i).1Y(i)){3z 2U[i]}C c(!4b&&(/(o|I|f|U|1g|4v)/i).1Y(i)){3z 2U[i]}}B 2U}j 4i(e){c(P e.f!==\'19\'){e.f={w:e.f}}c(P e.f.N!==\'19\'){e.f.N={o:e.f.N,G:e.f.N}}c(P e.I!==\'19\'){e.I={o:e.I}}c(P e.o!==\'19\'){e.o={2Z:e.o}}c(P e.o.1H===\'1w\'){e.o.1H=1A(e.o.1H.3l(/([0-9]+)/i,"$1"),10)}c(P e.o.2b===\'1w\'){e.o.2b=1A(e.o.2b.3l(/([0-9]+)/i,"$1"),10)}c(P e.f.N.x===\'2s\'){e.f.N.o=e.f.N.x;3z e.f.N.x}c(P e.f.N.y===\'2s\'){e.f.N.G=e.f.N.y;3z e.f.N.y}B e}j 4l(){R 7,i,3A,2v,1D,1P;7=A;3A=[H,{}];1V(i=0;i<3b.Q;i++){3A.5h(3b[i])}2v=[$.2p.4s($,3A)];6F(P 2v[0].21===\'1w\'){2v.5O(4i($.18.g.3c[2v[0].21]))}2v.5O(H,{1g:{h:\'g-\'+(3b[0].21||\'39\')}},$.18.g.3c.39);1D=$.2p.4s($,2v);1P=($.16.1d)?1:0;1D.f.N.o+=1P;1D.f.N.G+=1P;c(1D.f.N.o%2>0){1D.f.N.o+=1}c(1D.f.N.G%2>0){1D.f.N.G+=1}c(1D.f.w===H){c(7.8.k.w.h===\'1j\'&&7.8.k.w.s===\'1j\'){1D.f.w=p}C{1D.f.w=7.8.k.w.h}}B 1D}j 46(1f,X,E,J){R 1n=1f.1q(0).1E(\'2d\');1n.5G=J;1n.5U();1n.3p(X[0],X[1],E,0,1u.6N*2,p);1n.5Y()}j 59(){R 7,i,o,E,J,X,1Q,N,4O,2k,3e,3i,4g,4q,4G;7=A;7.d.1t.1M(\'.g-3i, .g-3e\').3W();o=7.8.e.I.o;E=7.8.e.I.E;J=7.8.e.I.J||7.8.e.f.J;X=4e(E);1Q={};1V(i 5R X){1Q[i]=\'<12 1S="\'+i+\'" e="\'+((/6n/).1Y(i)?\'M\':\'25\')+\':0; \'+\'k:34; G:\'+E+\'1a; o:\'+E+\'1a; 2u:1F; 2S-G:0.1B; 2Y-N:1B">\';c($(\'<1f />\').1q(0).1E){1Q[i]+=\'<1f G="\'+E+\'" o="\'+E+\'" e="4Q-3o: K"></1f>\'}C c($.16.1d){N=E*2+3;1Q[i]+=\'<v:3p 6f="p" 3t="\'+J+\'" 6s="\'+X[i][0]+\'" 6r="\'+X[i][1]+\'" \'+\'e="o:\'+N+\'1a; G:\'+N+\'1a; 2q-K:\'+((/26/).1Y(i)?-2:-1)+\'1a; \'+\'2q-M:\'+((/6m/).1Y(i)?X[i][2]-3.5:-1)+\'1a; \'+\'4Q-3o:K; 2a:53-4E; 3I:1x(#2L#3R)"></v:3p>\'}1Q[i]+=\'</12>\'}4O=7.3d().o-(1u.1H(o,E)*2);2k=\'<12 1I="g-2k" e="G:\'+E+\'1a; o:\'+4O+\'1a; \'+\'2u:1F; 1s-J:\'+J+\'; 2S-G:0.1B; 2Y-N:1B;">\';3e=\'<12 1I="g-3e" 4k="4f" e="G:\'+E+\'1a; \'+\'2q-M:\'+E+\'1a; 2S-G:0.1B; 2Y-N:1B; 2x:0;">\'+1Q.3K+1Q.40+2k;7.d.1t.3B(3e);3i=\'<12 1I="g-3i" 4k="4f" e="G:\'+E+\'1a; \'+\'2q-M:\'+E+\'1a; 2S-G:0.1B; 2Y-N:1B; 2x:0;">\'+1Q.4I+1Q.3P+2k;7.d.1t.5s(3i);c($(\'<1f />\').1q(0).1E){7.d.1t.1M(\'1f\').1L(j(){4g=X[$(A).3O(\'[1S]:1R\').W(\'1S\')];46.S(7,$(A),4g,E,J)})}C c($.16.1d){7.d.h.5s(\'<v:3C e="3I:1x(#2L#3R);"></v:3C>\')}4q=1u.1H(E,(E+(o-E)));4G=1u.1H(o-E,0);7.d.1y.F({I:\'6D 3q \'+J,6H:4G+\'1a \'+4q+\'1a\'})}j 4u(1f,X,J){R 1n=1f.1q(0).1E(\'2d\');1n.5G=J;1n.5U();1n.6o(X[0][0],X[0][1]);1n.5Q(X[1][0],X[1][1]);1n.5Q(X[2][0],X[2][1]);1n.5Y()}j 42(w){R 7,1P,24,4n,4h,3Q;7=A;c(7.8.e.f.w===p||!7.d.f){B}c(!w){w=2T 2D(7.d.f.W(\'1S\'))}1P=24=($.16.1d)?1:0;7.d.f.F(w[w.2y],0);c(w.2y===\'y\'){c($.16.1d){c(1A($.16.2X.2H(0),10)===6){24=w.y===\'K\'?-3:1}C{24=w.y===\'K\'?1:2}}c(w.x===\'1j\'){7.d.f.F({M:\'50%\',6K:-(7.8.e.f.N.o/2)})}C c(w.x===\'M\'){7.d.f.F({M:7.8.e.I.E-1P})}C{7.d.f.F({25:7.8.e.I.E+1P})}c(w.y===\'K\'){7.d.f.F({K:-24})}C{7.d.f.F({26:24})}}C{c($.16.1d){24=(1A($.16.2X.2H(0),10)===6)?1:(w.x===\'M\'?1:2)}c(w.y===\'1j\'){7.d.f.F({K:\'50%\',49:-(7.8.e.f.N.G/2)})}C c(w.y===\'K\'){7.d.f.F({K:7.8.e.I.E-1P})}C{7.d.f.F({26:7.8.e.I.E+1P})}c(w.x===\'M\'){7.d.f.F({M:-24})}C{7.d.f.F({25:24})}}4n=\'2x-\'+w[w.2y];4h=7.8.e.f.N[w.2y===\'x\'?\'o\':\'G\'];7.d.h.F(\'2x\',0).F(4n,4h);c($.16.1d&&1A($.16.2X.2H(0),6)===6){3Q=1A(7.d.f.F(\'2q-K\'),10)||0;3Q+=1A(7.d.u.F(\'2q-K\'),10)||0;7.d.f.F({49:3Q})}}j 44(w){R 7,J,X,3J,2o,f;7=A;c(7.d.f!==1z){7.d.f.3W()}J=7.8.e.f.J||7.8.e.I.J;c(7.8.e.f.w===p){B}C c(!w){w=2T 2D(7.8.e.f.w)}X=4t(w.1w(),7.8.e.f.N.o,7.8.e.f.N.G);7.d.f=\'<12 1I="\'+7.8.e.1g.f+\'" 4k="4f" 1S="\'+w.1w()+\'" e="k:34; \'+\'G:\'+7.8.e.f.N.G+\'1a; o:\'+7.8.e.f.N.o+\'1a; \'+\'2q:0 6e; 2S-G:0.1B; 2Y-N:1B;"></12>\';7.d.h.3B(7.d.f);c($(\'<1f />\').1q(0).1E){f=\'<1f G="\'+7.8.e.f.N.G+\'" o="\'+7.8.e.f.N.o+\'"></1f>\'}C c($.16.1d){3J=7.8.e.f.N.o+\',\'+7.8.e.f.N.G;2o=\'m\'+X[0][0]+\',\'+X[0][1];2o+=\' l\'+X[1][0]+\',\'+X[1][1];2o+=\' \'+X[2][0]+\',\'+X[2][1];2o+=\' 6I\';f=\'<v:3M 3t="\'+J+\'" 6f="p" 6p="H" 2o="\'+2o+\'" 3J="\'+3J+\'" \'+\'e="o:\'+7.8.e.f.N.o+\'1a; G:\'+7.8.e.f.N.G+\'1a; \'+\'2S-G:0.1B; 2a:53-4E; 3I:1x(#2L#3R); \'+\'4Q-3o:\'+(w.y===\'K\'?\'26\':\'K\')+\'"></v:3M>\';f+=\'<v:3C e="3I:1x(#2L#3R);"></v:3C>\';7.d.1y.F(\'k\',\'4y\')}7.d.f=7.d.h.1M(\'.\'+7.8.e.1g.f).6B(0);7.d.f.2l(f);c($(\'<1f  />\').1q(0).1E){4u.S(7,7.d.f.1M(\'1f:1R\'),X,J)}c(w.y===\'K\'&&$.16.1d&&1A($.16.2X.2H(0),10)===6){7.d.f.F({49:-4})}42.S(7,w)}j 5b(){R 7=A;c(7.d.U!==1z){7.d.U.3W()}7.d.h.W(\'3r-6E\',\'g-\'+7.11+\'-U\');7.d.U=$(\'<12 11="g-\'+7.11+\'-U" 1I="\'+7.8.e.1g.U+\'"></12>\').F(2G(7.8.e.U,H)).F({2f:($.16.1d)?1:0}).58(7.d.1y);c(7.8.u.U.1m){7.5W.S(7,7.8.u.U.1m)}c(7.8.u.U.1i!==p&&P 7.8.u.U.1i===\'1w\'){7.d.1i=$(\'<a 1I="\'+7.8.e.1g.1i+\'" 5e="1i" e="6G:25; k: 4y"></a>\').F(2G(7.8.e.1i,H)).2l(7.8.u.U.1i).58(7.d.U).5d(j(r){c(!7.V.23){7.D(r)}})}}j 5l(){R 7,3h,2i,3u;7=A;3h=7.8.q.L.s;2i=7.8.D.L.s;c(7.8.D.3g){2i=2i.2m(7.d.h)}3u=[\'5d\',\'6h\',\'6k\',\'6j\',\'4C\',\'4x\',\'5j\',\'6l\',\'35\'];j 3v(r){c(7.V.23===H){B}2g(7.1G.1W);7.1G.1W=4M(j(){$(3u).1L(j(){2i.1O(A+\'.g-1W\');7.d.u.1O(A+\'.g-1W\')});7.D(r)},7.8.D.2V)}c(7.8.D.3g===H){7.d.h.1J(\'35.g\',j(){c(7.V.23===H){B}2g(7.1G.D)})}j 4S(r){c(7.V.23===H){B}c(7.8.D.L.r===\'1W\'){$(3u).1L(j(){2i.1J(A+\'.g-1W\',3v);7.d.u.1J(A+\'.g-1W\',3v)});3v()}2g(7.1G.q);2g(7.1G.D);c(7.8.q.2V>0){7.1G.q=4M(j(){7.q(r)},7.8.q.2V)}C{7.q(r)}}j 4P(r){c(7.V.23===H){B}c(7.8.D.3g===H&&(/1K(6q|6A)/i).1Y(7.8.D.L.r)&&$(r.70).5g(\'12.g[11^="g"]\').Q>0){r.7L();r.7K();2g(7.1G.D);B p}2g(7.1G.q);2g(7.1G.D);7.d.h.3S(H,H);7.1G.D=4M(j(){7.D(r)},7.8.D.2V)}c(7.8.k.s===\'1K\'&&7.8.k.17!==\'29\'){3h.1J(\'4C.g\',j(r){7.1v.1K={M:r.3Y,K:r.4c};c(7.V.23===p&&7.8.k.1e.1K===H&&7.8.k.17!==\'29\'&&7.d.h.F(\'2a\')!==\'3a\'){7.2h(r)}})}c((7.8.q.L.s.2m(7.8.D.L.s).Q===1&&7.8.q.L.r===7.8.D.L.r&&7.8.D.L.r!==\'1W\')||7.8.D.L.r===\'4R\'){7.1v.2I=0;3h.1J(7.8.q.L.r+\'.g\',j(r){c(7.1v.2I===0){4S(r)}C{4P(r)}})}C{3h.1J(7.8.q.L.r+\'.g\',4S);c(7.8.D.L.r!==\'1W\'){2i.1J(7.8.D.L.r+\'.g\',4P)}}c((/(3g|34)/).1Y(7.8.k.17)){7.d.h.1J(\'35.g\',7.2E)}}j 22(){R 7,2l,2t;7=A;2t=7.3d();2l=\'<7J 1I="g-22" 7I="0" 7M="-1" 4T="7N:p" \'+\'e="2a:4E; k:34; z-3s:-1; 5m:7R(2B=\\\'0\\\'); I: 1B 3q 4H; \'+\'G:\'+2t.G+\'1a; o:\'+2t.o+\'1a" />\';7.d.22=7.d.1t.3B(2l).2w(\'.g-22:1R\')}j 4w(){R 7,u,1x,Y,2A;7=A;7.5J.S(7);7.V.1b=2;7.d.h=\'<12 g="\'+7.11+\'" 11="g-\'+7.11+\'" 5e="h" \'+\'3r-7Q="g-\'+7.11+\'-u" 1I="g \'+(7.8.e.1g.h||7.8.e)+\'" \'+\'e="2a:3a; -7P-I-E:0; -7O-I-E:0; I-E:0; k:\'+7.8.k.17+\';"> \'+\'  <12 1I="g-1t" e="k:4y; 2u:1F; 1m-3o:M;"> \'+\'    <12 1I="g-1y" e="2u:1F;"> \'+\'       <12 11="g-\'+7.11+\'-u" 1I="g-u \'+7.8.e.1g.u+\'"></12> \'+\'</12></12></12>\';7.d.h=$(7.d.h);7.d.h.5P(7.8.k.3U);7.d.h.Y(\'g\',{3k:0,O:[7]});7.d.1t=7.d.h.2w(\'12:1R\');7.d.1y=7.d.1t.2w(\'12:1R\');7.d.u=7.d.1y.2w(\'12:1R\').F(2G(7.8.e));c($.16.1d){7.d.1t.2m(7.d.u).F({2f:1})}c(7.8.D.L.r===\'4R\'){7.d.h.W(\'4R\',H)}c(P 7.8.e.o.2Z===\'2s\'){7.4d()}c($(\'<1f />\').1q(0).1E||$.16.1d){c(7.8.e.I.E>0){59.S(7)}C{7.d.1y.F({I:7.8.e.I.o+\'1a 3q \'+7.8.e.I.J})}c(7.8.e.f.w!==p){44.S(7)}}C{7.d.1y.F({I:7.8.e.I.o+\'1a 3q \'+7.8.e.I.J});7.8.e.I.E=0;7.8.e.f.w=p}c((P 7.8.u.1m===\'1w\'&&7.8.u.1m.Q>0)||(7.8.u.1m.4r&&7.8.u.1m.Q>0)){u=7.8.u.1m}C{u=\' \'}c(7.8.u.U.1m!==p){5b.S(7)}7.4A(u,p);5l.S(7);c(7.8.q.3x===H){7.q()}c(7.8.u.1x!==p){1x=7.8.u.1x;Y=7.8.u.Y;2A=7.8.u.2A||\'1q\';7.5Z(1x,Y,2A)}7.V.1b=H;7.5f.S(7)}j 56(s,8,11){R 7=A;7.11=11;7.8=8;7.V={4j:p,1b:p,23:p,3Z:p};7.d={s:s.5v(7.8.e.1g.s),h:1z,1t:1z,u:1z,1y:1z,U:1z,1i:1z,f:1z,22:1z};7.1v={W:p,1K:{},2I:0,2u:{M:p,K:p}};7.1G={};$.2p(7,7.8.T,{q:j(r){R 1c,1X;c(!7.V.1b){B p}c(7.d.h.F(\'2a\')!==\'3a\'){B 7}7.d.h.3S(H,p);1c=7.5n.S(7,r);c(1c===p){B 7}j 2M(){7.d.h.W(\'3r-1F\',H);c(7.8.k.17!==\'29\'){7.2E()}7.5q.S(7,r);c($.16.1d){R 4a=7.d.h.1q(0).e;4a.43(\'5m\');4a.43(\'2B\')}C{7.d.h.F({2B:\'\'})}}7.1v.2I=1;c(7.8.k.17!==\'29\'){7.2h(r,(7.8.q.Z.Q>0&&7.1b!==2))}c(P 7.8.q.1X===\'19\'){1X=$(7.8.q.1X)}C c(7.8.q.1X===H){1X=$(\'12.g\').5S(7.d.h)}c(1X){1X.1L(j(){c($(A).g(\'T\').V.1b===H){$(A).g(\'T\').D()}})}c(P 7.8.q.Z.17===\'j\'){7.8.q.Z.17.S(7.d.h,7.8.q.Z.Q);7.d.h.5u(j(){2M();$(A).5t()})}C{4N(7.8.q.Z.17.2F()){1Z\'3w\':7.d.h.7H(7.8.q.Z.Q,2M);1C;1Z\'5o\':7.d.h.7G(7.8.q.Z.Q,j(){2M();c(7.8.k.17!==\'29\'){7.2h(r,H)}});1C;1Z\'5p\':7.d.h.q(7.8.q.Z.Q,2M);1C;2L:7.d.h.q(1z,2M);1C}7.d.h.5v(7.8.e.1g.3T)}B 7},D:j(r){R 1c;c(!7.V.1b){B p}C c(7.d.h.F(\'2a\')===\'3a\'){B 7}2g(7.1G.q);7.d.h.3S(H,p);1c=7.5A.S(7,r);c(1c===p){B 7}j 2K(){7.d.h.W(\'3r-1F\',H);c($.16.1d){7.d.h.1q(0).e.43(\'2B\')}C{7.d.h.F({2B:\'\'})}7.4Z.S(7,r)}7.1v.2I=0;c(P 7.8.D.Z.17===\'j\'){7.8.D.Z.17.S(7.d.h,7.8.D.Z.Q);7.d.h.5u(j(){2K();$(A).5t()})}C{4N(7.8.D.Z.17.2F()){1Z\'3w\':7.d.h.7z(7.8.D.Z.Q,2K);1C;1Z\'5o\':7.d.h.7y(7.8.D.Z.Q,2K);1C;1Z\'5p\':7.d.h.D(7.8.D.Z.Q,2K);1C;2L:7.d.h.D(1z,2K);1C}7.d.h.7x(7.8.e.1g.3T)}B 7},2I:j(r,38){R 5r=/7w|2s/.1Y(P 38)?38:!7.d.h.2r(\':28\');7[5r?\'q\':\'D\'](r);B 7},2h:j(r,4o){c(!7.V.1b){B p}R 1U=8.k,s=$(1U.s),2Q=7.d.h.47(),2P=7.d.h.48(),1p,1l,k,1o=1U.w.h,2R=1U.w.s,1c,14,i,4L,27,45={M:j(){R 3j=$(2e).3D(),3n=$(2e).o()+$(2e).3D(),2J=1o.x===\'1j\'?2Q/2:2Q,2N=1o.x===\'1j\'?1p/2:1p,2O=(1o.x===\'1j\'?1:2)*7.8.e.I.E,1k=-2*1U.1e.x,3m=k.M+2Q,1h;c(3m>3n){1h=1k-2J-2N+2O;c(k.M+1h>3j||3j-(k.M+1h)<3m-3n){B{1e:1h,f:\'25\'}}}c(k.M<3j){1h=1k+2J+2N-2O;c(3m+1h<3n||3m+1h-3n<3j-k.M){B{1e:1h,f:\'M\'}}}B{1e:0,f:1o.x}},K:j(){R 30=$(2e).3G(),33=$(2e).G()+$(2e).3G(),2J=1o.y===\'1j\'?2P/2:2P,2N=1o.y===\'1j\'?1l/2:1l,2O=(1o.y===\'1j\'?1:2)*7.8.e.I.E,1k=-2*1U.1e.y,32=k.K+2P,1h;c(32>33){1h=1k-2J-2N+2O;c(k.K+1h>30||30-(k.K+1h)<32-33){B{1e:1h,f:\'26\'}}}c(k.K<30){1h=1k+2J+2N-2O;c(32+1h<33||32+1h-33<30-k.K){B{1e:1h,f:\'K\'}}}B{1e:0,f:1o.y}}};c(r&&8.k.s===\'1K\'){2R={x:\'M\',y:\'K\'};1p=1l=0;c(!r.3Y){k=7.1v.1K}C{k={K:r.4c,M:r.3Y}}}C{c(s[0]===31){1p=s.o();1l=s.G();k={K:0,M:0}}C c(s[0]===2e){1p=s.o();1l=s.G();k={K:s.3G(),M:s.3D()}}C c(s.2r(\'7A\')){14=7.8.k.s.W(\'14\').7B(\',\');1V(i=0;i<14.Q;i++){14[i]=1A(14[i],10)}4L=7.8.k.s.3O(\'7F\').W(\'21\');27=$(\'4U[7E="#\'+4L+\'"]:1R\').1k();k={M:1u.3H(27.M+14[0]),K:1u.3H(27.K+14[1])};4N(7.8.k.s.W(\'3M\').2F()){1Z\'7T\':1p=1u.4V(1u.5z(14[2]-14[0]));1l=1u.4V(1u.5z(14[3]-14[1]));1C;1Z\'7C\':1p=14[2]+1;1l=14[2]+1;1C;1Z\'7S\':1p=14[0];1l=14[1];1V(i=0;i<14.Q;i++){c(i%2===0){c(14[i]>1p){1p=14[i]}c(14[i]<14[0]){k.M=1u.3H(27.M+14[i])}}C{c(14[i]>1l){1l=14[i]}c(14[i]<14[1]){k.K=1u.3H(27.K+14[i])}}}1p=1p-(k.M-27.M);1l=1l-(k.K-27.K);1C}1p-=2;1l-=2}C{1p=s.47();1l=s.48();c(!7.d.h.2r(\':28\')){7.d.h.F({M:\'-81\'}).q()}c(!1U.1e.1k||7.d.h.4F()[0]===31.4X){k=s.1k()}C{k=s.k();k.K+=s.4F().3G();k.M+=s.4F().3D()}}k.M+=2R.x===\'25\'?1p:2R.x===\'1j\'?1p/2:0;k.K+=2R.y===\'26\'?1l:2R.y===\'1j\'?1l/2:0}k.M+=1U.1e.x+(1o.x===\'25\'?-2Q:1o.x===\'1j\'?-2Q/2:0);k.K+=1U.1e.y+(1o.y===\'26\'?-2P:1o.y===\'1j\'?-2P/2:0);c(7.8.e.I.E>0){c(1o.x===\'M\'){k.M-=7.8.e.I.E}C c(1o.x===\'25\'){k.M+=7.8.e.I.E}c(1o.y===\'K\'){k.K-=7.8.e.I.E}C c(1o.y===\'26\'){k.K+=7.8.e.I.E}}c(1U.1e.55){(j(){R 2W={x:0,y:0},2n={x:45.M(),y:45.K()},f=2T 2D(8.e.f.w);c(7.d.f&&f){c(2n.y.1e!==0){k.K+=2n.y.1e;f.y=2W.y=2n.y.f}c(2n.x.1e!==0){k.M+=2n.x.1e;f.x=2W.x=2n.x.f}7.1v.2u={M:2W.x===p,K:2W.y===p};c(7.d.f.W(\'1S\')!==f.1w()){44.S(7,f)}}}())}c(!7.d.22&&$.16.1d&&1A($.16.2X.2H(0),10)===6){22.S(7)}1c=7.57.S(7,r);c(1c===p){B 7}c(8.k.s!==\'1K\'&&4o===H){7.V.4j=H;7.d.h.3S().4o(k,7V,\'80\',j(){7.V.4j=p})}C{7.d.h.F(k)}7.5c.S(7,r);B 7},4d:j(1r){c(!7.V.1b||(1r&&P 1r!==\'2s\')){B p}R 1F=7.d.1y.7W().2m(7.d.f).2m(7.d.1i),2f=7.d.1t.2m(7.d.1y.2w()),h=7.d.h,1H=7.8.e.o.1H,2b=7.8.e.o.2b;c(!1r){c(P 7.8.e.o.2Z===\'2s\'){1r=7.8.e.o.2Z}C{7.d.h.F({o:\'6e\'});1F.D();h.o(1r);c($.16.1d){2f.F({2f:\'\'})}1r=7.3d().o;c(!7.8.e.o.2Z){1r=1u.2b(1u.1H(1r,2b),1H)}}}c(1r%2){1r+=1}7.d.h.o(1r);1F.q();c(7.8.e.I.E){7.d.h.1M(\'.g-2k\').1L(j(i){$(A).o(1r-(7.8.e.I.E*2))})}c($.16.1d){2f.F({2f:1});7.d.1t.o(1r);c(7.d.22){7.d.22.o(1r).G(7.3d.G)}}B 7},7Y:j(21){R f,2j,1n,w,X;c(!7.V.1b||P 21!==\'1w\'||!$.18.g.3c[21]){B p}7.8.e=4l.S(7,$.18.g.3c[21],7.8.4v.e);7.d.u.F(2G(7.8.e));c(7.8.u.U.1m!==p){7.d.U.F(2G(7.8.e.U,H))}7.d.1y.F({7U:7.8.e.I.J});c(7.8.e.f.w!==p){c($(\'<1f />\').1q(0).1E){f=7.d.h.1M(\'.g-f 1f:1R\');1n=f.1q(0).1E(\'2d\');1n.5I(0,0,3N,3N);w=f.3O(\'12[1S]:1R\').W(\'1S\');X=4t(w,7.8.e.f.N.o,7.8.e.f.N.G);4u.S(7,f,X,7.8.e.f.J||7.8.e.I.J)}C c($.16.1d){f=7.d.h.1M(\'.g-f [5E="3M"]\');f.W(\'3t\',7.8.e.f.J||7.8.e.I.J)}}c(7.8.e.I.E>0){7.d.h.1M(\'.g-2k\').F({7X:7.8.e.I.J});c($(\'<1f />\').1q(0).1E){2j=4e(7.8.e.I.E);7.d.h.1M(\'.g-1t 1f\').1L(j(){1n=$(A).1q(0).1E(\'2d\');1n.5I(0,0,3N,3N);w=$(A).3O(\'12[1S]:1R\').W(\'1S\');46.S(7,$(A),2j[w],7.8.e.I.E,7.8.e.I.J)})}C c($.16.1d){7.d.h.1M(\'.g-1t [5E="3p"]\').1L(j(){$(A).W(\'3t\',7.8.e.I.J)})}}B 7},4A:j(u,5F){R 36,37,4K;j 4J(){7.4d();c(5F!==p){c(7.8.k.17!==\'29\'){7.2h(7.d.h.2r(\':28\'),H)}c(7.8.e.f.w!==p){42.S(7)}}}c(!u){B p}36=7.54.S(7,u);c(P 36===\'1w\'){u=36}C c(36===p){B}c(7.V.1b){c($.16.1d){7.d.1y.2w().F({2f:\'7Z\'})}c(u.4r&&u.Q>0){u.5V(H).5P(7.d.u).q()}C{7.d.u.2l(u)}37=7.d.u.1M(\'4U[6O=p]\');c(37.Q>0){4K=0;37.1L(j(i){$(\'<4U 4T="\'+$(A).W(\'4T\')+\'" />\').7D(j(){c(++4K===37.Q){4J()}})})}C{4J()}}C{7.8.u.1m=u}7.4Y.S(7);B 7},5Z:j(1x,Y,2A){R 1c;j 4D(u){7.63.S(7);7.4A(u)}c(!7.V.1b){B p}1c=7.51.S(7);c(1c===p){B 7}c(2A===\'60\'){$.60(1x,Y,4D)}C{$.1q(1x,Y,4D)}B 7},5W:j(u){R 1c;c(!7.V.1b||!u){B p}1c=7.64.S(7);c(1c===p){B 7}c(7.d.1i){7.d.1i=7.d.1i.5V(H)}7.d.U.2l(u);c(7.d.1i){7.d.U.3B(7.d.1i)}7.65.S(7);B 7},2E:j(r){R 4B,3F,3y,1c;c(!7.V.1b||7.8.k.17===\'29\'){B p}4B=1A(7.d.h.F(\'z-3s\'),10);3F=7u+$(\'12.g[11^="g"]\').Q-1;c(!7.V.3Z&&4B!==3F){1c=7.5H.S(7,r);c(1c===p){B 7}$(\'12.g[11^="g"]\').5S(7.d.h).1L(j(){c($(A).g(\'T\').V.1b===H){3y=1A($(A).F(\'z-3s\'),10);c(P 3y===\'2s\'&&3y>-1){$(A).F({68:1A($(A).F(\'z-3s\'),10)-1})}$(A).g(\'T\').V.3Z=p}});7.d.h.F({68:3F});7.V.3Z=H;7.5C.S(7,r)}B 7},3X:j(38){7.V.23=38?H:p;B 7},3f:j(){R i,1c,O,4z=7.d.s.Y(\'4p\'+7.1v.W[0]);1c=7.61.S(7);c(1c===p){B 7}c(7.V.1b){7.8.q.L.s.1O(\'4C.g\',7.2h);7.8.q.L.s.1O(\'4x.g\',7.D);7.8.q.L.s.1O(7.8.q.L.r+\'.g\');7.8.D.L.s.1O(7.8.D.L.r+\'.g\');7.d.h.1O(7.8.D.L.r+\'.g\');7.d.h.1O(\'35.g\',7.2E);7.d.h.3W()}C{7.8.q.L.s.1O(7.8.q.L.r+\'.g-\'+7.11+\'-4m\')}c(P 7.d.s.Y(\'g\')===\'19\'){O=7.d.s.Y(\'g\').O;c(P O===\'19\'&&O.Q>0){1V(i=0;i<O.Q-1;i++){c(O[i].11===7.11){O.5X(i,1)}}}}$.18.g.O.5X(7.11,1);c(P O===\'19\'&&O.Q>0){7.d.s.Y(\'g\').3k=O.Q-1}C{7.d.s.73(\'g\')}c(4z){7.d.s.W(7.1v.W[0],4z)}7.62.S(7);B 7.d.s},72:j(){R q,1k;c(!7.V.1b){B p}q=(7.d.h.F(\'2a\')!==\'3a\')?p:H;c(q){7.d.h.F({3V:\'1F\'}).q()}1k=7.d.h.1k();c(q){7.d.h.F({3V:\'28\'}).D()}B 1k},3d:j(){R q,2t;c(!7.V.1b){B p}q=(!7.d.h.2r(\':28\'))?H:p;c(q){7.d.h.F({3V:\'1F\'}).q()}2t={G:7.d.h.48(),o:7.d.h.47()};c(q){7.d.h.F({3V:\'28\'}).D()}B 2t}})}$.18.g=j(8,41){R i,11,O,20,2c,1T,15,T;c(P 8===\'1w\'){c($(A).Y(\'g\')){c(8===\'T\'){B $(A).Y(\'g\').O[$(A).Y(\'g\').3k]}C c(8===\'O\'){B $(A).Y(\'g\').O}}C{B $(A)}}C{c(!8){8={}}c(P 8.u!==\'19\'||(8.u.4r&&8.u.Q>0)){8.u={1m:8.u}}c(P 8.u.U!==\'19\'){8.u.U={1m:8.u.U}}c(P 8.k!==\'19\'){8.k={w:8.k}}c(P 8.k.w!==\'19\'){8.k.w={s:8.k.w,h:8.k.w}}c(P 8.q!==\'19\'){8.q={L:8.q}}c(P 8.q.L!==\'19\'){8.q.L={r:8.q.L}}c(P 8.q.Z!==\'19\'){8.q.Z={17:8.q.Z}}c(P 8.D!==\'19\'){8.D={L:8.D}}c(P 8.D.L!==\'19\'){8.D.L={r:8.D.L}}c(P 8.D.Z!==\'19\'){8.D.Z={17:8.D.Z}}c(P 8.e!==\'19\'){8.e={21:8.e}}8.e=4i(8.e);20=$.2p(H,{},$.18.g.39,8);20.e=4l.S({8:20},20.e);20.4v=$.2p(H,{},8)}B $(A).1L(j(){R 7=$(A),u=p;c(P 8===\'1w\'){1T=8.2F();O=$(A).g(\'O\');c(P O===\'19\'){c(41===H&&1T===\'3f\'){1V(i=O.Q-1;i>-1;i--){c(\'19\'===P O[i]){O[i].3f()}}}C{c(41!==H){O=[$(A).g(\'T\')]}1V(i=0;i<O.Q;i++){c(1T===\'3f\'){O[i].3f()}C c(O[i].V.1b===H){c(1T===\'q\'){O[i].q()}C c(1T===\'D\'){O[i].D()}C c(1T===\'2E\'){O[i].2E()}C c(1T===\'3X\'){O[i].3X(H)}C c(1T===\'71\'){O[i].3X(p)}C c(1T===\'7v\'){O[i].2h()}}}}}}C{15=$.2p(H,{},20);15.D.Z.Q=20.D.Z.Q;15.q.Z.Q=20.q.Z.Q;c(15.k.3U===p){15.k.3U=$(31.4X)}c(15.k.s===p){15.k.s=$(A)}c(15.q.L.s===p){15.q.L.s=$(A)}c(15.D.L.s===p){15.D.L.s=$(A)}15.k.w.h=2T 2D(15.k.w.h);15.k.w.s=2T 2D(15.k.w.s);c(!15.u.1m.Q){$([\'U\',\'6b\']).1L(j(i,W){R 2C=7.W(W);c(2C&&2C.Q){u=[W,2C];7.Y(\'4p\'+W,2C).74(W);15.u.1m=2C.3l(/\\n/75,\'<78 />\');B p}})}11=$.18.g.O.Q;1V(i=0;i<11;i++){c(P $.18.g.O[i]===\'5i\'){11=i;1C}}2c=2T 56($(A),15,11);$.18.g.O[11]=2c;2c.1v.W=u;c(P $(A).Y(\'g\')===\'19\'&&$(A).Y(\'g\')){c(P $(A).W(\'g\')===\'5i\'){$(A).Y(\'g\').3k=$(A).Y(\'g\').O.Q}$(A).Y(\'g\').O.5h(2c)}C{$(A).Y(\'g\',{3k:0,O:[2c]})}c(15.u.5w===p&&15.q.L.r!==p&&15.q.3x!==H){15.q.L.s.1J(15.q.L.r+\'.g-\'+11+\'-4m\',{g:11},j(r){T=$.18.g.O[r.Y.g];T.8.q.L.s.1O(T.8.q.L.r+\'.g-\'+r.Y.g+\'-4m\');T.1v.1K={M:r.3Y,K:r.4c};4w.S(T);T.8.q.L.s.77(T.8.q.L.r)})}C{2c.1v.1K={M:15.q.L.s.1k().M,K:15.q.L.s.1k().K};4w.S(2c)}}})};$.18.g.O=[];$.18.g.18={W:$.18.W};$.18.W=j(W){R T=$(A).g(\'T\');B(3b.Q===1&&(/U|6b/i).1Y(W)&&T.V&&T.V.1b===H)?$(A).Y(\'4p\'+T.1v.W[0]):$.18.g.18.W.4s(A,3b)};$.18.g.39={u:{5w:p,1m:p,1x:p,Y:1z,U:{1m:p,1i:p}},k:{s:p,w:{s:\'3P\',h:\'3K\'},1e:{x:0,y:0,1K:H,55:p,3E:H,3L:H,1k:p},17:\'34\',3U:p},q:{L:{s:p,r:\'35\'},Z:{17:\'3w\',Q:5T},2V:76,1X:p,3x:p},D:{L:{s:p,r:\'4x\'},Z:{17:\'3w\',Q:5T},2V:0,3g:p},T:{5J:j(){},5f:j(){},57:j(){},5c:j(){},5n:j(){},5q:j(){},5A:j(){},4Z:j(){},54:j(){},4Y:j(){},51:j(){},63:j(){},64:j(){},65:j(){},61:j(){},62:j(){},5H:j(){},5C:j(){}}};$.18.g.3c={39:{1s:\'66\',J:\'#6Z\',2u:\'1F\',6Y:\'M\',o:{2b:0,1H:6S},2x:\'6R 6Q\',I:{o:1,E:0,J:\'#6P\'},f:{w:p,J:p,N:{o:13,G:13},2B:1},U:{1s:\'#6T\',6U:\'6X\',2x:\'6W 6V\'},1i:{79:\'7a\'},1g:{s:\'\',f:\'g-f\',U:\'g-U\',1i:\'g-1i\',u:\'g-u\',3T:\'g-3T\'}},5L:{I:{o:3,E:0,J:\'#7o\'},U:{1s:\'#7n\',J:\'#5M\'},1s:\'#7m\',J:\'#5M\',1g:{h:\'g-5L\'}},6d:{I:{o:3,E:0,J:\'#7p\'},U:{1s:\'#7q\',J:\'#6c\'},1s:\'66\',J:\'#6c\',1g:{h:\'g-6d\'}},69:{I:{o:3,E:0,J:\'#7t\'},U:{1s:\'#7s\',J:\'#67\'},1s:\'#7r\',J:\'#67\',1g:{h:\'g-69\'}},4H:{I:{o:3,E:0,J:\'#7l\'},U:{1s:\'#7k\',J:\'#6g\'},1s:\'#7e\',J:\'#6g\',1g:{h:\'g-4H\'}},52:{I:{o:3,E:0,J:\'#7d\'},U:{1s:\'#7c\',J:\'#4W\'},1s:\'#7b\',J:\'#4W\',1g:{h:\'g-52\'}},5k:{I:{o:3,E:0,J:\'#7f\'},U:{1s:\'#7g\',J:\'#7j\'},1s:\'#7i\',J:\'#7h\',1g:{h:\'g-5k\'}}}}(82));',62,499,'|||||||self|options||||if|elements|style|tip|qtip|tooltip||function|position||||width|false|show|event|target||content||corner||||this|return|else|hide|radius|css|height|true|border|color|top|when|left|size|interfaces|typeof|length|var|call|api|title|status|attr|coordinates|data|effect||id|div||coords|config|browser|type|fn|object|px|rendered|returned|msie|adjust|canvas|classes|adj|button|center|offset|targetHeight|text|context|my|targetWidth|get|newWidth|background|wrapper|Math|cache|string|url|contentWrapper|null|parseInt|1px|break|finalStyle|getContext|hidden|timers|max|class|bind|mouse|each|find|tips|unbind|ieAdjust|containers|first|rel|command|posOptions|for|inactive|solo|test|case|opts|name|bgiframe|disabled|positionAdjust|right|bottom|imagePos|visible|static|display|min|obj||window|zoom|clearTimeout|updatePosition|hideTarget|borders|betweenCorners|html|add|adapted|path|extend|margin|is|number|dimensions|overflow|styleExtend|children|padding|precedance|90|method|opacity|val|Corner|focus|toLowerCase|jQueryStyle|charAt|toggle|myOffset|afterHide|default|afterShow|atOffset|borderAdjust|elemHeight|elemWidth|at|line|new|styleObj|delay|adjusted|version|font|value|topEdge|document|pBottom|bottomEdge|absolute|mouseover|parsedContent|images|state|defaults|none|arguments|styles|getDimensions|borderTop|destroy|fixed|showTarget|borderBottom|leftEdge|current|replace|pRight|rightEdge|align|arc|solid|aria|index|fillcolor|inactiveEvents|inactiveMethod|fade|ready|elemIndex|delete|styleArray|prepend|image|scrollLeft|scroll|newIndex|scrollTop|floor|behavior|coordsize|topLeft|resize|shape|300|parent|bottomRight|newMargin|VML|stop|active|container|visiblity|remove|disable|pageX|focused|topRight|blanket|positionTip|removeAttribute|createTip|adapt|drawBorder|outerWidth|outerHeight|marginTop|ieStyle|sub|pageY|updateWidth|calculateBorders|ltr|borderCoord|paddingSize|sanitizeStyle|animated|dir|buildStyle|create|paddingCorner|animate|old|sideWidth|jquery|apply|calculateTip|drawTip|user|construct|mouseout|relative|oldattr|updateContent|curIndex|mousemove|setupContent|block|offsetParent|vertWidth|red|bottomLeft|afterLoad|loadedImages|mapName|setTimeout|switch|betweenWidth|hideMethod|vertical|unfocus|showMethod|src|img|ceil|58792E|body|onContentUpdate|onHide||beforeContentLoad|green|inline|beforeContentUpdate|screen|QTip|beforePositionUpdate|prependTo|createBorder|String|createTitle|onPositionUpdate|click|role|onRender|parents|push|undefined|mouseenter|blue|assignEvents|filter|beforeShow|slide|grow|onShow|condition|append|dequeue|queue|addClass|prerender|middle|match|abs|beforeHide|bottomright|onFocus|270|nodeName|reposition|fillStyle|beforeFocus|clearRect|beforeRender|topright|cream|A27D35|topleft|unshift|appendTo|lineTo|in|not|100|beginPath|clone|updateTitle|splice|fill|loadContent|post|beforeDestroy|onDestroy|onContentLoad|beforeTitleUpdate|onTitleUpdate|white|f3f3f3|zIndex|dark|bottomleft|alt|454545|light|auto|stroked|9C2F2F|dblclick|rightcenter|mouseup|mousedown|mouseleave|Right|Left|moveTo|filled|out|endangle|startangle|use|strict|bottomcenter|qtipSelector|leftbottom|topcenter|righttop|leave|eq|rightbottom|0px|labelledby|while|float|borderWidth|xe|leftcenter|marginLeft|search|lefttop|PI|complete|d3d3d3|9px|5px|250|e1e1e1|fontWeight|12px|7px|bold|textAlign|111|relatedTarget|enable|getPosition|removeData|removeAttr|gi|140|trigger|br|cursor|pointer|CDE6AC|b9db8c|A9DB66|F79992|ADD9ED|D0E9F5|4D9FBF|E5F6FE|5E99BD|f28279|CE6F6F|FBF7AA|F0DE7D|F9E98E|E2E2E2|f1f1f1|505050|404040|303030|15000|update|boolean|removeClass|slideUp|fadeOut|area|split|circle|load|usemap|map|slideDown|fadeIn|frameborder|iframe|preventDefault|stopPropagation|tabindex|javascript|webkit|moz|describedby|alpha|poly|rect|borderColor|200|siblings|backgroundColor|updateStyle|normal|swing|10000000em|jQuery'.split('|'),0,{}))

