// 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   = 'http://www.guidetobelize.info/images-global/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);

}