function isBody(element) { return (/^(?:body|html)$/i).test(element.tagName); }; Element.implement({ getPosition: function (relative) {
    if (isBody(this)) return { x: 0, y: 0 }; var el = this, position = { x: 0, y: 0 }; while (el) { position.x += el.offsetLeft; position.y += el.offsetTop; el = el.offsetParent; }
    var rpos = (relative) ? $(relative).getPosition() : { x: 0, y: 0 }; return { x: position.x - rpos.x, y: position.y - rpos.y };
}
}); 

var SliderBox = new Class({ Implements: [Options], numNav: new Array(), timer: null, isSliding: 0, direction: 1, slideNavActive: false, itemsAmount: 0, caption: null, captionHeight: 0, scrollerhover: false, options: { slideTimer: 8000, slideFirst: true, orientation: 'horizontal', fade: false, isPaused: false, pauseOnHover: true, transitionTime: 1100, transitionType: 'cubic:out', container: null, items: null, itemNum: 0, captions: false, captionsAnimate: false, captionsLink: false, captionsLinkText: 'Read More', slideNav: null, slideNavType: 'numbers', playBtn: null, prevBtn: null, nextBtn: null, galleryslider: false }, initialize: function (options) {
    var self = this; this.setOptions(options); self.itemsAmount = self.options.items.length; var myScroller; if (self.options.captions == true) { var captionDIV = new Element('div', { id: 'caption' }).inject(self.options.container); var captionHeight = captionDIV.getSize().y; captionDIV.setStyle('height', 0); self.caption = captionDIV; self.captionHeight = captionHeight; }
    self.options.container.setStyle('overflow', "hidden"); if (self.itemsAmount > 1) {
        if (self.options.isPaused == false && self.options.pauseOnHover == true) { self.options.container.addEvents({ 'mouseenter': function () { self.pauseIt(); }, 'mouseleave': function () { self.pauseIt(); } }); if (self.options.captions == true) { self.caption.addEvents({ 'mousehover': function () { self.pauseIt(); } }); } }
        if (self.options.playBtn != null) { self.options.playBtn.addEvents({ 'click': function () { self.pauseIt('playBtn'); } }); }
        if (self.options.prevBtn && self.options.nextBtn) {
            self.options.prevBtn.addEvents({ 'click': function () {
                if (self.isSliding == 0) {
                    if (self.options.isPaused == false) { $clear(self.timer); self.timer = self.slideIt.periodical(self.options.slideTimer, self, null); }
                    self.direction = 0; self.slideIt();
                }
            }
            }); this.options.nextBtn.addEvents({ 'click': function () {
                if (self.isSliding == 0) {
                    if (self.options.isPaused == false) { $clear(self.timer); self.timer = self.slideIt.periodical(self.options.slideTimer, self, null); }
                    self.direction = 1; self.slideIt();
                }
            }
            });
        }
        if (self.options.slideNav != null) self.slideNavActive = true; var nav_width = 0; self.options.items.each(function (el, i) {
            el.setStyle('position', "absolute"); var itemH = el.getSize().y; var itemW = el.getSize().x; if (self.options.orientation == 'vertical') { el.setStyle('top', (-1 * itemH)); el.setStyle('left', 0); } else if (self.options.orientation == 'none') { el.setStyle('left', 0); el.setStyle('top', 0); el.set('opacity', 0); } else { el.setStyle('left', (-1 * itemW)); }
            if (self.slideNavActive == true) {
                var firstElement = self.options.slideNav.getFirst('li'); if (firstElement && firstElement.getProperty('id') == null) firstElement.dispose(); var navHeading; if (self.options.slideNavType == 'titles' && ($(el).getElement('h3') != null || $(el).getElement('h4') != null)) { if ($(el).getElement('h3') != null) { navHeading = $(el).getElement('h3').get('html'); } else { navHeading = $(el).getElement('h4').get('html'); } } else if (self.options.slideNavType == 'thumbs' && $(el).getElement('img.thumb') != null) { navHeading = '<img src="' + $(el).getElement('img.thumb').get('src') + '" />'; } else { navHeading = (i + 1); }; var numItem = new Element('li', { id: 'num' + i }); var numLink = new Element('a', { 'html': navHeading }); numItem.adopt(numLink); self.options.slideNav.adopt(numItem); self.numNav.push(numLink); numLink.addEvents({ 'click': function () { self.numPress(i); } }); if (i == self.options.itemNum) { var initNum = self.numNav[i]; initNum.addClass('active'); }
                if (self.options.galleryslider == true) { nav_width = nav_width + (numItem.getSize().x); }
            }
        }); if (self.options.galleryslider == true) { self.options.slideNav.setStyle('width', nav_width); myScroller = new Scroller('slide_nav_gallery_wrapper', { area: 100, velocity: 0.2 }); myScroller.start(); $('slide_nav_gallery_wrapper').addEvent('mouseenter', function (e) { self.scrollerhover = true; }); $('slide_nav_gallery_wrapper').addEvent('mouseleave', function (e) { self.scrollerhover = false; }); }
    } else { if (self.options.playBtn != null) self.options.playBtn.setStyle('display', "none"); if (self.options.prevBtn != null) self.options.prevBtn.setStyle('display', "none"); if (self.options.nextBtn != null) self.options.nextBtn.setStyle('display', "none"); if (self.options.slideNav != null) self.options.slideNav.setStyle('display', "none"); }
}, start: function () {
    var self = this; if (self.itemsAmount > 0) {
        self.slideIt(self.options.itemNum, 0); if (self.itemsAmount > 1 && self.options.isPaused == false) { self.timer = self.slideIt.periodical(self.options.slideTimer, self, null); if (self.options.playBtn) { if (self.options.playBtn.get('text') != '') self.options.playBtn.set('text', 'Pause'); self.options.playBtn.addClass('active'); } }
        else { if (self.options.playBtn && self.options.playBtn.get('text') != '') self.options.playBtn.set('text', 'Play'); }
    }
}, slideIt: function (passedID, firstslide) {
    var self = this; var curItem = self.options.items[self.options.itemNum]; if (self.slideNavActive == true) { var curNumItem = self.numNav[self.options.itemNum]; }
    if (passedID != null) {
        if (self.options.itemNum != passedID) {
            if (self.options.itemNum > passedID) { self.direction = 0; } else { self.direction = 1; }
            self.options.itemNum = passedID;
        }
    }
    else { self.changeIndex(); }
    var newItem = self.options.items[self.options.itemNum]; if (self.direction == 0) { var curX = self.options.container.getSize().x; var newX = (-1 * newItem.getSize().x); var curY = self.options.container.getSize().y; var newY = (-1 * newItem.getSize().y); }
    else { var curX = (-1 * self.options.container.getSize().x); var newX = newItem.getSize().x; var curY = (-1 * self.options.container.getSize().y); var newY = newItem.getSize().y; }
    if (self.slideNavActive == true) { var newNumItem = self.numNav[self.options.itemNum]; newNumItem.addClass('active'); if (self.options.galleryslider == true) { var myScrollerElement = new Fx.Scroll('slide_nav_gallery_wrapper'); var browser = Browser.Engine.name + Browser.Engine.version; var newPosition = newNumItem.offsetLeft - 400; if (browser != "trident5" && browser != "trident4" && self.scrollerhover == false) { myScrollerElement.start(newPosition, 0); }; } }
    var caption_title = ''; var caption_text = ''; var caption_link = ''; var caption_link_button = ''; var caption = ''; var item_in = new Fx.Morph(newItem, { duration: self.options.transitionTime, transition: self.options.transitionType, link: 'ignore', onStart: function () {
        self.isSliding = 1; if (self.options.captions == true && self.options.items[self.options.itemNum].getElement('img').get('alt')) {
            caption_title = self.options.items[self.options.itemNum].getElement('img').get('alt'); caption_text = self.options.items[self.options.itemNum].getElement('img').get('longdesc'); if (self.options.items[self.options.itemNum].getElement('a')) { caption_link = self.options.items[self.options.itemNum].getElement('a').get('href'); caption_title = '<a href="' + caption_link + '">' + caption_title + '</a>'; caption_link_button = (self.options.captionsLink ? '<a href="' + caption_link + '" class="button_view">' + self.options.captionsLinkText + '</a>' : '') }
            caption = '<h3>' + caption_title + '</h3><p>' + (caption_text ? caption_text + '<br />' : '') + caption_link_button + '</p>'; if (self.options.captionsAnimate == true) { self.caption.set('tween', { onComplete: function () { self.caption.set('tween', { onComplete: $empty }).tween('height', self.captionHeight); self.caption.set('html', caption); } }).tween('height', 0); } else { self.caption.set('tween', { duration: 0, onComplete: function () { var instantshow = new Fx.Tween(self.caption).set('height', self.captionHeight); self.caption.set('html', caption); } }).tween('height', 0); }
        } else { if (self.options.captions == true) self.caption.set('tween', { onComplete: $empty }).tween('height', 0); }
    }, onComplete: function () { self.isSliding = 0; }
    }); if (self.itemsAmount > 1) {
        if (self.options.itemNum == 0 & firstslide == 0 & self.options.slideFirst == false) { item_in.start({ 'opacity': [1, 1], 'left': [0, 0], 'top': [0, 0] }); }
        if (self.options.orientation == 'vertical') {
            if (self.options.fade == true) { item_in.start({ 'opacity': [0, 1], 'top': [newY, 0] }); }
            else { item_in.start({ 'top': [newY, 0] }); }
        } else if (self.options.orientation == 'none') { item_in.start({ 'opacity': [0, 1] }); } else {
            if (self.options.fade == true) { item_in.start({ 'opacity': [0, 1], 'left': [newX, 0] }); }
            else { item_in.start({ 'left': [newX, 0] }); }
        }
        if (curItem != newItem) {
            var item_out = new Fx.Morph(curItem, { duration: self.options.transitionTime, transition: self.options.transitionType, link: 'ignore' }); if (self.slideNavActive == true) { curNumItem.removeClass('active'); }
            if (self.options.orientation == 'vertical') {
                if (self.options.fade == true) { item_out.start({ 'opacity': [0], 'top': [(curY)] }); }
                else { item_out.start({ 'top': [(curY)] }); }
            } else if (self.options.orientation == 'none') { item_out.start({ 'opacity': [1, 0] }); } else {
                if (self.options.fade == true) { item_out.start({ 'opacity': [0], 'left': [(curX)] }); }
                else { item_out.start({ 'left': [(curX)] }); }
            }
        }
    };
}, pauseIt: function (pauseCaller) {
    var self = this; if (self.isSliding == 0 && self.itemsAmount > 1) {
        if (self.options.isPaused == false) { self.options.isPaused = true; $clear(self.timer); if (self.options.playBtn != null) { if (self.options.playBtn.get('text') != '') self.options.playBtn.set('text', 'Play'); self.options.playBtn.removeClass('active'); } }
        else { self.options.isPaused = false; self.slideIt.delay(600, this); self.timer = self.slideIt.periodical(self.options.slideTimer, this, null); if (self.options.playBtn != null) { if (self.options.playBtn.get('text') != '') self.options.playBtn.set('text', 'Pause'); self.options.playBtn.addClass('active'); } }
    }
    if (pauseCaller == 'playBtn' && self.options.isPaused == true) { self.options.container.removeEvents('mouseenter'); self.options.container.removeEvents('mouseleave'); } else if (pauseCaller == 'playBtn' && self.options.isPaused == false) { self.options.container.removeEvents('mouseenter'); self.options.container.removeEvents('mouseleave'); self.options.container.addEvents({ 'mouseenter': function () { self.pauseIt(); }, 'mouseleave': function () { self.pauseIt(); } }); } else { };
}, changeIndex: function () {
    var self = this; var numItems = self.itemsAmount; if (self.direction == 1) {
        if (self.options.itemNum < (numItems - 1)) { self.options.itemNum++; }
        else { self.options.itemNum = 0; }
    }
    else if (self.direction == 0) {
        if (self.options.itemNum > 0) { self.options.itemNum--; }
        else { self.options.itemNum = (numItems - 1); }
    }
}, numPress: function (theIndex) {
    var self = this; if ((self.isSliding == 0) && (self.options.itemNum != theIndex)) {
        if (self.options.isPaused == false) { $clear(self.timer); self.timer = self.slideIt.periodical(self.options.slideTimer, this, null); }
        self.slideIt(theIndex);
    }
}
});
