/*
 * JQZoom Evolution 1.0.2 - Javascript Image magnifier
 *
 * Copyright (c) Engineer Renzi Marco(www.mind-projects.it) modification by woods.zhang (hoojar@163.com)
 *
 * $Date: 12-25-2009
 *
 * 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		: 'standard',	//standard/reverse/innerzoom
		zoomWidth		: 380,			//zoomed width default width
		zoomHeight		: 438,			//zoomed div default width
		xOffset			: 10,			//zoomed div default X offset
		yOffset			: 0,			//zoomed div default Y offset
		position		: 'right',		//zoomed div default position,Admitted values:right ,left ,top ,bottom
		lens			: true,			//if setted to false,the small lens,over the image, wont show.
		lensReset		: false,		//lens Reset options: true,false
		imageOpacity	: 0.2,			//Set the image opacity when the zoomType option is setted to reverse.
		title			: true,			//jqzoom show window title
		alwaysOn		: false,		//always On options: true,false
		showEffect		: 'show',		//Options available: show ,fadein.
		hideEffect		: 'hide',		//Options available: hide ,fadeout.
		fadeinSpeed		: 'fast',		//options: fast,slow,medium
		fadeoutSpeed	: 'slow',		//options: fast,slow,medium
		preloadImages	: false,		//preload large images loading indicator.(options: true,false)
		showPreload		: false,		//show preload large images loading indicator.(options: true,false)
		preloadText		: 'loading',	//Option to customize the preload indicator text.
		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 sImage(img);
		var smallImageData = {};
		var btop = 0;
		var bleft = 0;
		var loader = null; //variabile per memorizzare oggetto loader

		loader = new loaderDiv();
		var ZoomTitle = (trim(aTitle).length > 0) ? aTitle :
		(trim(imageTitle).length > 0) ? imageTitle : null; //setting zoomtitle
		var zoomTitle = new zoomTitleDiv();
		var largeImage = new lImage(a[0].href);
		var lens = new lensDiv();
		var lensData = {};

		var largeImageLoaded = false;
		var scale = {};		//rapporto tra immagine grande e piccola scale x scaley
		var stage = null;	//quadrato che mostra l immagine ingrandita
		var running = false;//running = true quando si verifica evento che mostra lo zoom(adesso mouseover).
		var mousePos = {};
		var firsTime = 0;

		var preloadShow = false;
		var isMouseDown = false;
		var dragStatus = false

		smallImage.loadImage();//loading smallImageData
		$(this).click(function(){return false;});//ritorna false al click dell href

		//attivo al mouseover
		$(this).hover(function(e)
		{
			mousePos.x = e.pageX;
			mousePos.y	= e.pageY;
			largeImageLoaded = false;
			activate();
		},function(){deactivate();});

		//se settato alwaysOn attivo lo Zoom e lo mostro.
		if (settings.alwaysOn){setTimeout(function(){activate();},150);}

		function activate()
		{
			if (running){return true;}
			//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 (!largeImageLoaded || !largeImage || $.browser.safari)
			{
				largeImage = new lImage(a[0].href);
			}
			//se limmagine grande non  stata caricata la carico
			if (!largeImageLoaded || $.browser.safari)
			{
				largeImage.loadImage();
			}
			else
			{
				if (settings.zoomType != 'innerzoom')//after preload
				{
					stage = new stageDiv();
					stage.activate();
				}
				lens = new lensDiv;
				lens.activate();
			}

			if ($.browser.safari)//hack per MAC
			{
				if (settings.zoomType != 'innerzoom') //se innerzoom non mostro la finestra dello zoom
				{
					stage = new stageDiv();
					stage.activate();
				}
				if ($('div.jqZoomPup').length <= 0){lens = new lensDiv();}
				lens.activate();
				(settings.alwaysOn) ? lens.center() : lens.setPosition(null);
			}
			a[0].blur();
			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)
				{
					zoomTitle.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;
				if (jQuery('.zoom_ieframe').length > 0){jQuery('.zoom_ieframe').remove();}//remove ieiframe
			}
			else
			{
				if (settings.lensReset)
				{
					switch(settings.zoomType)
					{
						case 'innerzoom': largeImage.setcenter(); break;
						default: lens.center(); break;
					}
				}
			}
			if (settings.alwaysOn){activate();}//non so se serve da provare
		}

		//smallImage
		function sImage(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 (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');
				}
				if ($.browser.safari || $.browser.opera)
				{
					$(img).css({position:'absolute',top:'0px',left:'0px'});
				}

				//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;
		}

		function lensDiv()
		{
			//creating element and adding class
			this.node = document.createElement("div");
			$(this.node).addClass('jqZoomPup');
			this.node.onerror = function()
			{
				$(lens.node).remove();
				lens = new lensDiv();
				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 >= smallImageData.w ? smallImageData.w : lensData.w) + 'px',
						height: (lensData.h >= smallImageData.h ? smallImageData.h : lensData.h) + 'px',
						position: 'absolute',
						/*cursor: 'crosshair',*/
						display: 'none',
						//border: '1px solid blue'
						borderWidth: 1+'px'
					});
				a.append(this.node);
			}
			return this;
		}
		lensDiv.prototype.activate = function()
		{
			this.loadlens();//carico la lente
			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 lensDiv();
					//	lens.activate();
					$(this.node).css({top : 0 ,left: 0});
				   	if (settings.title)
					{
						zoomTitle.loadtitle();
					}
					largeImage.setcenter();
				   	a.bind('mousemove', function(e)
				   	{
						mousePos.x = e.pageX;
						mousePos.y = e.pageY;
						largeImage.setinner(e);
					});
				break;
				default:
					(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;
		}
		lensDiv.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 ;
			}

			if (overleft())//a sinistra
			{
				lensleft = 0  + bleft;
			}
			else
			{
				if (overright())//a destra
				{
					if ($.browser.msie)
					{
						lensleft = smallImageData.w - lensData.w  + bleft + 1;
					}
					else
					{
						lensleft = smallImageData.w - lensData.w  + bleft - 1;
					}
				}
			}

			if (overtop())//in alto
			{
				lenstop = 0 + btop ;
			}
			else
			{
				if (overbottom())//sotto
				{
					if ($.browser.msie)
					{
						lenstop = smallImageData.h - lensData.h  + btop + 1 ;
					}
					else
					{
						lenstop = smallImageData.h - lensData.h - 1 + btop;
					}
				}
			}

			lensleft = parseInt(lensleft);
			lensleft = lensleft <= 0 ? 0 : lensleft;
			lenstop = parseInt(lenstop);
			lenstop = lenstop <= 0 ? 0 : 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;
		}
		lensDiv.prototype.center = function()//mostra la lente al centro dell immagine
		{
			$('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')
			{
				$('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);
			}
		}
		lensDiv.prototype.getoffset = function()//ritorna l offset
		{
			var o = {};
			o.left = parseInt(this.node.style.left) ;
			o.top =  parseInt(this.node.style.top) ;
			return o;
		}
		lensDiv.prototype.remove = function()//rimuove la lente
		{
			if (settings.zoomType == 'innerzoom')
			{
				$('div.jqZoomPup',a).fadeOut('fast',function(){$(this).remove();});
			}
			else
			{
				$('div.jqZoomPup',a).remove();
			}
		}
		lensDiv.prototype.findborder = function()
		{
			var bordertop = '';
			bordertop = $('div.jqZoomPup').css('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;
		}

		function lImage(url)
		{
			this.url = url;
			this.node = new Image();
			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 loaderDiv();
				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 stageDiv();
					stage.activate();
				}
				if (running)
				{
					lens = new lensDiv();
					lens.activate() ;
				}
				if ($('div.preload').length > 0){$('div.preload').remove();}//la attivo
			}
			return this;
		}
		lImage.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';
		}
		lImage.prototype.setinner = function(e)//setto la posizione dell immagine grande nel caso di innerzoom
		{
		  	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});
		}
		lImage.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});
		}

		function stageDiv()
		{
			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: '400px',
					height: '430px',
					display: 'none',
					zIndex: 10000,
					overflow: 'hidden'
				});

			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;
		}
		stageDiv.prototype.activate = function()
		{
			if (!this.node.firstChild){this.node.appendChild(largeImage.node);}
			if (settings.title){zoomTitle.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:350,height:350})
				.insertBefore(this.node);
		 	}
			largeImage.node.style.display = 'block';
		}
		stageDiv.prototype.remove = function()
		{
			switch(settings.hideEffect)
			{
				case 'hide': $('.jqZoomWindow').remove(); break;
				case 'fadeout': $('.jqZoomWindow').fadeOut(settings.fadeoutSpeed); break;
				default: $('.jqZoomWindow').remove(); break;
			}
		}

		function zoomTitleDiv()
		{
			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);
				}
			}
		}
		zoomTitleDiv.prototype.remove = function(){$('.jqZoomTitle').remove();}

		function loaderDiv()
		{
			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;
				}
				$(this.node).css({top: loadertop, left: loaderleft, position: 'absolute', visibility: 'visible'});//setting position
			}
			return this;
		}
		loaderDiv.prototype.getoffset = function(){return $('div.preload').offset();}
	});
}})(jQuery);
function trim(str){return str.replace(/(^\s*)|(\s*$)/g, '');}
