/*  Prototype */

var Class = {
        create: function() {
                return function() {
                        this.initialize.apply(this, arguments);
                }
        }
}

Object.extend = function(destination, source) {
        for (property in source) destination[property] = source[property];
        return destination;
}

Function.prototype.bind = function(object) {
        var __method = this;
        return function() {
                return __method.apply(object, arguments);
        }
}

Function.prototype.bindAsEventListener = function(object) {
var __method = this;
        return function(event) {
                __method.call(object, event || window.event);
        }
}

function $() {
        if (arguments.length == 1) return get$(arguments[0]);
        var elements = [];
        $c(arguments).each(function(el){
                elements.push(get$(el));
        });
        return elements;

        function get$(el){
                if (typeof el == 'string') el = document.getElementById(el);
                return el;
        }
}

if (!window.Element) var Element = new Object();

Object.extend(Element, {
        remove: function(element) {
                element = $(element);
                element.parentNode.removeChild(element);
        },

        hasClassName: function(element, className) {
                element = $(element);
                if (!element) return;
                var hasClass = false;
                element.className.split(' ').each(function(cn){
                        if (cn == className) hasClass = true;
                });
                return hasClass;
        },

        addClassName: function(element, className) {
                element = $(element);
                Element.removeClassName(element, className);
                element.className += ' ' + className;
        },

        removeClassName: function(element, className) {
                element = $(element);
                if (!element) return;
                var newClassName = '';
                element.className.split(' ').each(function(cn, i){
                        if (cn != className){
                                if (i > 0) newClassName += ' ';
                                newClassName += cn;
                        }
                });
                element.className = newClassName;
        },

        cleanWhitespace: function(element) {
                element = $(element);
                $c(element.childNodes).each(function(node){
                        if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) Element.remove(node);
                });
        },

        find: function(element, what) {
                element = $(element)[what];
                while (element.nodeType != 1) element = element[what];
                return element;
        }
});

var Position = {
        cumulativeOffset: function(element) {
                var valueT = 0, valueL = 0;
                do {
                        valueT += element.offsetTop  || 0;
                        valueL += element.offsetLeft || 0;
                        element = element.offsetParent;
                } while (element);
                return [valueL, valueT];
        }
};

document.getElementsByClassName = function(className) {
        var children = document.getElementsByTagName('*') || document.all;
        var elements = [];
        $c(children).each(function(child){
                if (Element.hasClassName(child, className)) elements.push(child);
        });
        return elements;
}

Array.prototype.iterate = function(func){
        for(var i=0;i<this.length;i++) func(this[i], i);
}
if (!Array.prototype.each) Array.prototype.each = Array.prototype.iterate;

function $c(array){
        var nArray = [];
        for (var i=0;i<array.length;i++) nArray.push(array[i]);
        return nArray;
}












/* Moo */

var fx = new Object();
//base
fx.Base = function(){};
fx.Base.prototype = {
        setOptions: function(options) {
        this.options = {
                duration: 500,
                onComplete: '',
                transition: fx.sinoidal
        }
        Object.extend(this.options, options || {});
        },

        step: function() {
                var time  = (new Date).getTime();
                if (time >= this.options.duration+this.startTime) {
                        this.now = this.to;
                        clearInterval (this.timer);
                        this.timer = null;
                        if (this.options.onComplete) setTimeout(this.options.onComplete.bind(this), 10);
                }
                else {
                        var Tpos = (time - this.startTime) / (this.options.duration);
                        this.now = this.options.transition(Tpos) * (this.to-this.from) + this.from;
                }
                this.increase();
        },

        custom: function(from, to) {
                if (this.timer != null) return;
                this.from = from;
                this.to = to;
                this.startTime = (new Date).getTime();
                this.timer = setInterval (this.step.bind(this), 13);
        },

        hide: function() {
                this.now = 0;
                this.increase();
        },

        clearTimer: function() {
                clearInterval(this.timer);
                this.timer = null;
        }
}

//stretchers
fx.Layout = Class.create();
fx.Layout.prototype = Object.extend(new fx.Base(), {
        initialize: function(el, options) {
                this.el = $(el);
                this.el.style.overflow = "hidden";
                this.iniWidth = this.el.offsetWidth;
                this.iniHeight = this.el.offsetHeight;
                this.setOptions(options);
        }
});

fx.Height = Class.create();
Object.extend(Object.extend(fx.Height.prototype, fx.Layout.prototype), {
        increase: function() {
                this.el.style.height = this.now + "px";
        },

        toggle: function() {
                if (this.el.offsetHeight > 0) this.custom(this.el.offsetHeight, 0);
                else this.custom(0, this.el.scrollHeight);
        }
});

fx.Width = Class.create();
Object.extend(Object.extend(fx.Width.prototype, fx.Layout.prototype), {
        increase: function() {
                this.el.style.width = this.now + "px";
        },

        toggle: function(){
                if (this.el.offsetWidth > 0) this.custom(this.el.offsetWidth, 0);
                else this.custom(0, this.iniWidth);
        }
});

//fader
fx.Opacity = Class.create();
fx.Opacity.prototype = Object.extend(new fx.Base(), {
        initialize: function(el, options) {
                this.el = $(el);
                this.now = 1;
                this.increase();
                this.setOptions(options);
        },

        increase: function() {
                if (this.now == 1 && (/Firefox/.test(navigator.userAgent))) this.now = 0.9999;
                this.setOpacity(this.now);
        },

        setOpacity: function(opacity) {
                if (opacity == 0 && this.el.style.visibility != "hidden") this.el.style.visibility = "hidden";
                else if (this.el.style.visibility != "visible") this.el.style.visibility = "visible";
                if (window.ActiveXObject) this.el.style.filter = "alpha(opacity=" + opacity*100 + ")";
                this.el.style.opacity = opacity;
        },

        toggle: function() {
                if (this.now > 0) this.custom(1, 0);
                else this.custom(0, 1);
        }
});

//transitions
fx.sinoidal = function(pos){
        return ((-Math.cos(pos*Math.PI)/2) + 0.5);
        //this transition is from script.aculo.us
}
fx.linear = function(pos){
        return pos;
}
fx.cubic = function(pos){
        return Math.pow(pos, 3);
}
fx.circ = function(pos){
        return Math.sqrt(pos);
}






/* LITEBOX */

var fileLoadingImage = "includes/litebox/loading.gif";
var fileBottomNavCloseImage = "includes/litebox/closelabel.gif";
var resizeSpeed = 6;        // controls the speed of the image resizing (1=slowest and 10=fastest)
var borderSize = 10;        //if you adjust the padding in the CSS, update this variable

var imageArray = new Array;
var activeImage;

if(resizeSpeed > 10){ resizeSpeed = 10;}
if(resizeSpeed < 1){ resizeSpeed = 1;}
resizeDuration = (11 - resizeSpeed) * 100;

Object.extend(Element, {
        hide: function() {
                for (var i = 0; i < arguments.length; i++) {
                        var element = $(arguments[i]);
                        element.style.display = 'none';
                }
        },
        show: function() {
                for (var i = 0; i < arguments.length; i++) {
                        var element = $(arguments[i]);
                        element.style.display = '';
                }
        },
        getWidth: function(element) {
                   element = $(element);
                   return element.offsetWidth;
        },
        setWidth: function(element,w) {
                   element = $(element);
                element.style.width = w +"px";
        },
        getHeight: function(element) {
                element = $(element);
                return element.offsetHeight;
        },
        setHeight: function(element,h) {
                   element = $(element);
                element.style.height = h +"px";
        },
        setTop: function(element,t) {
                   element = $(element);
                element.style.top = t +"px";
        },
        setSrc: function(element,src) {
                element = $(element);
                element.src = src;
        },
        setInnerHTML: function(element,content) {
                element = $(element);
                element.innerHTML = content;
        }
});

Array.prototype.removeDuplicates = function () {
        for(i = 1; i < this.length; i++){
                if(this[i][0] == this[i-1][0]){
                        this.splice(i,1);
                }
        }
}

Array.prototype.empty = function () {
        for(i = 0; i <= this.length; i++){
                this.shift();
        }
}

var Lightbox = Class.create();

Lightbox.prototype = {

       initialize: function() {
        if (!document.getElementsByTagName){ return; }
        var anchors = document.getElementsByTagName('a');

        for (var i=0; i<anchors.length; i++){
                var anchor = anchors[i];

                var relAttribute = String(anchor.getAttribute('rel'));

                if (anchor.getAttribute('href') && (relAttribute.toLowerCase().match('lightbox'))){
                        anchor.onclick = function () {myLightbox.start(this); return false;}
                }
        }

var objBody = document.getElementsByTagName("body").item(0);

var objOverlay = document.createElement("div");
objOverlay.setAttribute('id','overlay');
objOverlay.onclick = function() { myLightbox.end(); return false; }
objBody.appendChild(objOverlay);

var objLightbox = document.createElement("div");
objLightbox.setAttribute('id','lightbox');
objLightbox.style.display = 'none';
objBody.appendChild(objLightbox);

var objOuterImageContainer = document.createElement("div");
objOuterImageContainer.setAttribute('id','outerImageContainer');
objLightbox.appendChild(objOuterImageContainer);

var objImageContainer = document.createElement("div");
objImageContainer.setAttribute('id','imageContainer');
objOuterImageContainer.appendChild(objImageContainer);

var objLightboxImage = document.createElement("img");
objLightboxImage.setAttribute('id','lightboxImage');
objImageContainer.appendChild(objLightboxImage);

var objHoverNav = document.createElement("div");
objHoverNav.setAttribute('id','hoverNav');
objImageContainer.appendChild(objHoverNav);

var objPrevLink = document.createElement("a");
objPrevLink.setAttribute('id','prevLink');
objPrevLink.setAttribute('href','#');
objHoverNav.appendChild(objPrevLink);

var objNextLink = document.createElement("a");
objNextLink.setAttribute('id','nextLink');
objNextLink.setAttribute('href','#');
objHoverNav.appendChild(objNextLink);

var objLoading = document.createElement("div");
objLoading.setAttribute('id','loading');
objImageContainer.appendChild(objLoading);

var objLoadingLink = document.createElement("a");
objLoadingLink.setAttribute('id','loadingLink');
objLoadingLink.setAttribute('href','#');
objLoadingLink.onclick = function() { myLightbox.end(); return false; }
objLoading.appendChild(objLoadingLink);

var objLoadingImage = document.createElement("img");
objLoadingImage.setAttribute('src', fileLoadingImage);
objLoadingLink.appendChild(objLoadingImage);

var objImageDataContainer = document.createElement("div");
objImageDataContainer.setAttribute('id','imageDataContainer');
objImageDataContainer.className = 'clearfix';
objLightbox.appendChild(objImageDataContainer);

var objImageData = document.createElement("div");
objImageData.setAttribute('id','imageData');
objImageDataContainer.appendChild(objImageData);

var objImageDetails = document.createElement("div");
objImageDetails.setAttribute('id','imageDetails');
objImageData.appendChild(objImageDetails);

var objCaption = document.createElement("span");
objCaption.setAttribute('id','caption');
objImageDetails.appendChild(objCaption);

var objNumberDisplay = document.createElement("span");
objNumberDisplay.setAttribute('id','numberDisplay');
objImageDetails.appendChild(objNumberDisplay);

var objBottomNav = document.createElement("div");
objBottomNav.setAttribute('id','bottomNav');
objImageData.appendChild(objBottomNav);

var objBottomNavCloseLink = document.createElement("a");
objBottomNavCloseLink.setAttribute('id','bottomNavClose');
objBottomNavCloseLink.setAttribute('href','#');
objBottomNavCloseLink.onclick = function() { myLightbox.end(); return false; }
objBottomNav.appendChild(objBottomNavCloseLink);

var objBottomNavCloseImage = document.createElement("img");
objBottomNavCloseImage.setAttribute('src', fileBottomNavCloseImage);
objBottomNavCloseLink.appendChild(objBottomNavCloseImage);

overlayEffect = new fx.Opacity(objOverlay, { duration: 400 });
overlayEffect.hide();

imageEffect = new fx.Opacity(objLightboxImage, { duration: 250, onComplete: function() { imageDetailsEffect.custom(0,1); }});
imageEffect.hide();

imageDetailsEffect = new fx.Opacity('imageDataContainer', { duration: 300, onComplete: function() { navEffect.custom(0,1); }});
imageDetailsEffect.hide();

navEffect = new fx.Opacity('hoverNav', { duration: 100 });
navEffect.hide();
},

start: function(imageLink) {

hideSelectBoxes();

var arrayPageSize = getPageSize();
Element.setHeight('overlay', arrayPageSize[1]);
overlayEffect.custom(0,0.8);

imageArray = [];
imageNum = 0;

if (!document.getElementsByTagName){ return; }
var anchors = document.getElementsByTagName('a');

// if image is NOT part of a set..
if((imageLink.getAttribute('rel') == 'lightbox')){
       // add single image to imageArray
       imageArray.push(new Array(imageLink.getAttribute('href'), imageLink.getAttribute('title')));
} else {
// if image is part of a set..

       // loop through anchors, find other images in set, and add them to imageArray
       for (var i=0; i<anchors.length; i++){
               var anchor = anchors[i];
               if (anchor.getAttribute('href') && (anchor.getAttribute('rel') == imageLink.getAttribute('rel'))){
                       imageArray.push(new Array(anchor.getAttribute('href'), anchor.getAttribute('title')));
               }
       }
       imageArray.removeDuplicates();
       while(imageArray[imageNum][0] != imageLink.getAttribute('href')) { imageNum++;}
}

var arrayPageSize = getPageSize();
var arrayPageScroll = getPageScroll();
var lightboxTop = arrayPageScroll[1] + (arrayPageSize[3] / 15);

Element.setTop('lightbox', lightboxTop);
Element.show('lightbox');
this.changeImage(imageNum);
},

changeImage: function(imageNum) {

activeImage = imageNum;        // update global var

// hide elements during transition
Element.show('loading');
imageDetailsEffect.hide();
imageEffect.hide();
navEffect.hide();
Element.hide('prevLink');
Element.hide('nextLink');
Element.hide('numberDisplay');

imgPreloader = new Image();
// once image is preloaded, resize image container
imgPreloader.onload=function(){
       Element.setSrc('lightboxImage', imageArray[activeImage][0]);
       myLightbox.resizeImageContainer(imgPreloader.width, imgPreloader.height);
}
imgPreloader.src = imageArray[activeImage][0];
},

resizeImageContainer: function( imgWidth, imgHeight) {

this.wCur = Element.getWidth('outerImageContainer');
this.hCur = Element.getHeight('outerImageContainer');

wDiff = (this.wCur - borderSize * 2) - imgWidth;
hDiff = (this.hCur - borderSize * 2) - imgHeight;

reHeight = new fx.Height('outerImageContainer', { duration: resizeDuration });
reHeight.custom(Element.getHeight('outerImageContainer'),imgHeight+(borderSize*2));
reWidth = new fx.Width('outerImageContainer', { duration: resizeDuration, onComplete: function() { imageEffect.custom(0,1); }});
reWidth.custom(Element.getWidth('outerImageContainer'),imgWidth+(borderSize*2));

if((hDiff == 0) && (wDiff == 0)){
       if (navigator.appVersion.indexOf("MSIE")!=-1){ pause(250); } else { pause(100);}
}

Element.setHeight('prevLink', imgHeight);
Element.setHeight('nextLink', imgHeight);
Element.setWidth( 'imageDataContainer', imgWidth + (borderSize * 2));
Element.setWidth( 'hoverNav', imgWidth + (borderSize * 2));

this.showImage();
},

showImage: function(){
        Element.hide('loading');
        myLightbox.updateDetails();
        this.preloadNeighborImages();
},

updateDetails: function() {

         // Element.show('caption');
         // Element.setInnerHTML( 'caption', imageArray[activeImage][1]);

        if(imageArray.length > 1){
                // Element.show('numberDisplay');
                // Element.setInnerHTML( 'numberDisplay', eval(activeImage + 1) + " of " + imageArray.length);
        }

        myLightbox.updateNav();
},

updateNav: function() {

        /*
        // if not first image in set, display prev image button
        if(activeImage != 0){
                Element.show('prevLink');
                document.getElementById('prevLink').onclick = function() {
                        myLightbox.changeImage(activeImage - 1); return false;
                }
        }

        // if not last image in set, display next image button
        if(activeImage != (imageArray.length - 1)){
                Element.show('nextLink');
                document.getElementById('nextLink').onclick = function() {
                        myLightbox.changeImage(activeImage + 1); return false;
                }
        }
        */


        this.enableKeyboardNav();
},

enableKeyboardNav: function() {
        document.onkeydown = this.keyboardAction;
},

disableKeyboardNav: function() {
        document.onkeydown = '';
},

keyboardAction: function(e) {
        if (e == null) { // ie
                keycode = event.keyCode;
        } else { // mozilla
                keycode = e.which;
        }

        key = String.fromCharCode(keycode).toLowerCase();

        if((key == 'x') || (key == 'o') || (key == 'c')){        // close lightbox
                myLightbox.end();
        } else if(key == 'p'){        // display previous image
                if(activeImage != 0){
                        myLightbox.disableKeyboardNav();
                        myLightbox.changeImage(activeImage - 1);
                }
        } else if(key == 'n'){        // display next image
                if(activeImage != (imageArray.length - 1)){
                        myLightbox.disableKeyboardNav();
                        myLightbox.changeImage(activeImage + 1);
                }
        }
},

preloadNeighborImages: function(){

        if((imageArray.length - 1) > activeImage){
                preloadNextImage = new Image();
                preloadNextImage.src = imageArray[activeImage + 1][0];
        }
        if(activeImage > 0){
                preloadPrevImage = new Image();
                preloadPrevImage.src = imageArray[activeImage - 1][0];
        }

},

end: function() {
        this.disableKeyboardNav();
        Element.hide('lightbox');
        imageEffect.toggle();
        overlayEffect.custom(0.8,0);
        showSelectBoxes();
}
}

function getPageScroll(){

var yScroll;

if (self.pageYOffset) {
        yScroll = self.pageYOffset;
} else if (document.documentElement && document.documentElement.scrollTop){         // Explorer 6 Strict
        yScroll = document.documentElement.scrollTop;
} else if (document.body) {// all other Explorers
        yScroll = document.body.scrollTop;
}

arrayPageScroll = new Array('',yScroll)
return arrayPageScroll;
}

function getPageSize(){

var xScroll, yScroll;

if (window.innerHeight && window.scrollMaxY) {
        xScroll = document.body.scrollWidth;
        yScroll = window.innerHeight + window.scrollMaxY;
} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
        xScroll = document.body.scrollWidth;
        yScroll = document.body.scrollHeight;
} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
        xScroll = document.body.offsetWidth;
        yScroll = document.body.offsetHeight;
}

var windowWidth, windowHeight;
if (self.innerHeight) {        // all except Explorer
        windowWidth = self.innerWidth;
        windowHeight = self.innerHeight;
} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
        windowWidth = document.documentElement.clientWidth;
        windowHeight = document.documentElement.clientHeight;
} else if (document.body) { // other Explorers
        windowWidth = document.body.clientWidth;
        windowHeight = document.body.clientHeight;
}

if(yScroll < windowHeight){
        pageHeight = windowHeight;
} else {
        pageHeight = yScroll;
}

// for small pages with total width less then width of the viewport
if(xScroll < windowWidth){
        pageWidth = windowWidth;
} else {
        pageWidth = xScroll;
}

arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight)
return arrayPageSize;
}

function getKey(e){
if (e == null) { // ie
        keycode = event.keyCode;
} else { // mozilla
        keycode = e.which;
}
key = String.fromCharCode(keycode).toLowerCase();

if(key == 'x'){
}
}

function listenKey () {        document.onkeypress = getKey; }

function showSelectBoxes(){
selects = document.getElementsByTagName("select");
for (i = 0; i != selects.length; i++) {
        selects[i].style.visibility = "visible";
}
}


function hideSelectBoxes(){
selects = document.getElementsByTagName("select");
for (i = 0; i != selects.length; i++) {
        selects[i].style.visibility = "hidden";
}
}

function pause(numberMillis) {
var now = new Date();
var exitTime = now.getTime() + numberMillis;
while (true) {
        now = new Date();
        if (now.getTime() > exitTime)
                return;
}
}

function initLightbox() { myLightbox = new Lightbox(); }
