
(function(){
    if (typeof(console) == "undefined" || console == null) {
        console = new Object;
        console.log = function(){
        };
    }
    var Dom = YAHOO.util.Dom;
    var Event = YAHOO.util.Event;
    var Conn = YAHOO.util.Connect;
    
	// Constants
    var PAGESIZE = 6;
    var GETPANES = 2;
    var MAINPATH = "http://media.townhall.com/Townhall/reu/r/";
    var THUMBPATH = "http://media.townhall.com/Townhall/reu/c/";
    var SCROLLSPEED = .5;
    var NUMOFPHOTOS = 24; // Max # of photos to retrieve at once
	
    YAHOO.namespace("hosts");
    /**
     * The slideshow class is used to display a photo slideshow for a host gallery
     * @module hosts
     * @class	 Slideshow
     * @namespace TOWNHALL.hosts
     * @requires  yahoo,dom,event,connect
     */
    YAHOO.hosts.Slideshow = function(){
    
        var self = null;
        
        
        
        // Variables
        this._count = 0;
        this._data = {}; // Filled upon init
        this._guids = {};
        this._current = 0;
        this._start = 0;
        this._end = 0;
        this._scrollDistance = 0;
        this._isLoading = false;
        this._slideshowurl = '';
        this._slideshowPlaying = false;
        this._slideshowTimer = null;
        
        
        
        
    }
    YAHOO.hosts.Slideshow.prototype = {
    
        /**
         * Initializes the Slideshow
         *
         * @method init
         * @param {object} config The configuration object to use for initialization
         * @private
         *
         */
        init: function(config){
            try {
                self = this;
                self.connectionStatus = new YAHOO.util.CustomEvent('connection success');
                self._count = config.count;
                self._guids = config.photoGuids;
                self._current = config.current;
                self._start = config.first;
                self._end = config.last;
                self._slideshowurl = config.slideshowurl;
                for (var i = 0; i < config.thumbs.Data.length; i++) {
                    self._data['img' + (config.first + i)] = config.thumbs.Data[i];
                }
                
                // Assign all elements
                self.thumbs = Dom.getElementsByClassName("thumbs", "div", "slideshow-bottom")[0];
                if (navigator.appName.indexOf("Microsoft") > -1) 
                    self.thumbs.style.position = "";
                
                self.list = Dom.getElementsByClassName('list', 'UL', self.thumbs)[0];
                self.first = Dom.getElementsByClassName('first', 'A', "slideshow-bottom")[0];
                self.prev = Dom.getElementsByClassName('prev', 'A', "slideshow-bottom")[0];
                self.next = Dom.getElementsByClassName('next', 'A', "slideshow-bottom")[0];
                self.last = Dom.getElementsByClassName('last', 'A', "slideshow-bottom")[0];
                self.photoPrevButton = Dom.getElementsByClassName('prev', 'A', "slideshow-top")[0];
                self.photoNextButton = Dom.getElementsByClassName('next', 'A', "slideshow-top")[0];
				self.play = Dom.getElementsByClassName('play', 'A', "slideshow-bottom")[0];
                self.info = Dom.get("info");
                self.info.description = Dom.getElementsByClassName('description', 'span', self.info)[0];
                self.tempImage = new Image();
                self.photo = Dom.getElementsByClassName('mainphoto', 'img', 'photo')[0];
                //	            self.busy = Dom.getElementsByClassName('busyimg', 'div', 'photo-wrap')[0];
                self.panes = Dom.getElementsByClassName('item', 'li', self.thumbs);
                
                self.createCarousel();
                self.preloadImages();
                
                self.HistoryManager.init();
                //	            self.doTools();
            
            } 
            catch (err) {
                console.log(err);
            }
        },
        toggleSlideshow: function(e){
            if (e) 
                Event.stopEvent(e);
            if (self._slideshowPlaying) {
                self._slideshowPlaying = false;
                if (self._slideshowTimer) 
                    window.clearTimeout(self._slideshowTimer);
            }
            else {
               
                self._slideshowPlaying = true;
                self.advanceSlideshow();
            }
        },
        advanceSlideshow: function(){
            self.photoNext();
            if (self._current != self._count) {
                if (self._slideshowTimer) 
                    window.clearTimeout(self._slideshowTimer);
                self._slideshowTimer = window.setTimeout(self.advanceSlideshow, 3000);
            }
            else {
                self.toggleSlideshow(null);
            }
        },
       
        createCarousel: function(){
            try {
                var r = Dom.getRegion(self.panes[0]);
                self._scrollDistance = r.right - r.left;
                self.panes.total = Math.ceil(self._count / PAGESIZE);
               
                self.panes.current = Math.ceil(self._current / PAGESIZE);
                self.anim = new YAHOO.util.Scroll(self.thumbs, {
                    scroll: {}
                }, SCROLLSPEED, YAHOO.util.Easing.easeOut);
                self.animNext = new YAHOO.util.Scroll(self.thumbs, {
                    scroll: {}
                }, SCROLLSPEED, YAHOO.util.Easing.easeOut);
                self.animPrev = new YAHOO.util.Scroll(self.thumbs, {
                    scroll: {}
                }, SCROLLSPEED, YAHOO.util.Easing.easeOut);
                self.thumbs.selected = Dom.get('img' + self._current);
                Dom.addClass(self.thumbs.selected, 'active');
                
                self.attachEventListeners();
                self.updateNav();
                self.checkNextPane();
            } 
            catch (err) {
                console.log(err);
            }
        },
        resetCarousel: function(e){
            if (e) 
                Event.stopEvent(e);
            self._current = 1;
            if (self._data['img1']) {
                self.getFirst();
                var thumb = Dom.get('img1');
                self.changeThumb(null, thumb);
            }
            else {
                self.getFirst();
                self.connectionStatus.subscribe(function(){
                    if (self._current == 1) {
                        self.getFirst();
                        var thumb = Dom.get('img1');
                        self.changeThumb(null, thumb);
                    }
                });
            }
        },
        scrollToView: function(){
            if (self.anim.isAnimated()) {
                var oldPane = self.panes.current;
                var newPane = self.getPane();
                if (newPane != oldPane) {
                    if (newPane > oldPane) {
                        self.getNext();
                    }
                    else 
                        if (newPane < oldPane) {
                            self.getPrev();
                        }
                }
            }
        },
        getFirst: function(e){
            if (e) 
                Event.stopEvent(e);
            if (self.panes.current > 1) {
                self.panes.current = 1;
                if (self._data['img1']) {
                    self.buildImages('p');
                }
                else {
                    self.Data.get('f');
                    self.connectionStatus.subscribe(function(){
                        if (self.panes.current == 1) {
                            buildImages('p');
                        }
                    });
                }
            }
        },
        getPrev: function(e){
            if (e) 
                Event.stopEvent(e);
            if ((self.panes.current > 1) && (self.checkPrevPane() == true) && !self.animPrev.isAnimated()) {
                self.panes.current--;
                self.buildImages('p');
            }
        },
        getNext: function(e){
            if (e) 
                Event.stopEvent(e);
            if (((self.panes.current + 1) <= self.panes.total) && (self.checkNextPane() == true) && !self.animNext.isAnimated()) {
                self.panes.current++;
                self.buildImages('n');
            }
        },
        getLast: function(e){
        
            if (e) 
                Event.stopEvent(e);
            if (self.panes.current < self.panes.total) {
                self.panes.current = self.panes.total;
                if (self._data['img' + self._count]) {
                    self.buildImages('n');
                }
                else {
                    self.Data.get('l');
                    self.connectionStatus.subscribe(function(){
                        if (self.panes.current == self.panes.total) {
                            self.buildImages('n');
                        }
                    });
                }
            }
        },
        checkPrevPane: function(){
            var checkPane = self.panes.current - GETPANES;
            var lastPhotoInPane = checkPane * PAGESIZE;
            if (lastPhotoInPane < 1) 
                lastPhotoInPane = 1;
            if (!self._data['img' + lastPhotoInPane] && !self._isLoading) {
                self.Data.get('p');
                self.connectionStatus.subscribe(function(){
                    if (self.panes.current > 1 && self.panes.current < self.panes.total) {
                        self.checkPrevPane();
                    }
                });
            }
            var prevPane = self.panes.current - 1;
            var firstPhotoInPane = (prevPane * PAGESIZE) - (PAGESIZE - 1);
            if (self._data['img' + firstPhotoInPane]) {
                return true;
            }
            else {
                return false;
            }
        },
        checkNextPane: function(){
        
            var checkPane = self.panes.current + GETPANES;
            var lastPhotoInPane = checkPane * PAGESIZE;
            if (lastPhotoInPane > self._count) 
                lastPhotoInPane = self._count;
            if (!self._data['img' + lastPhotoInPane] && !self._isLoading) {
                self.Data.get('n');
                self.connectionStatus.subscribe(function(){
                    if (self.panes.current > 1 && self.panes.current < self.panes.total) {
                        self.checkNextPane();
                    }
                });
            }
            var nextPane = self.panes.current + 1;
            var lastPhotoInPane = nextPane * PAGESIZE;
            if (self._data['img' + lastPhotoInPane] || (nextPane == self.panes.total)) {
                return true;
            }
            else {
                return false;
            }
        },
        scrollNext: function(e){
            if (e) {
                Event.stopEvent(e);
            }
            function beforeScroll(){
            }
            function afterScroll(){
                self.list.removeChild(self.panes.old);
                self.thumbs.scrollLeft = 0;
            }
            self.animNext.attributes.scroll.to = [self._scrollDistance, 0];
            self.animNext.onComplete.subscribe(afterScroll);
            self.animNext.animate();
        },
        scrollPrev: function(e){
            if (e) {
                Event.stopEvent(e);
            }
            function beforeScroll(){
            }
            function afterScroll(){
                self.list.removeChild(self.panes.old);
                self.thumbs.scrollLeft = 0;
            }
            self.animPrev.attributes.scroll.to = [0, 0];
            self.animPrev.onComplete.subscribe(afterScroll);
            self.animPrev.animate();
        },
        getPane: function(){
            if (self._current == self._count) {
                var pane = self.panes.total;
            }
            else {
                var pane = Math.ceil(self._current / PAGESIZE);
            }
            return pane;
        },
        photoPrev: function(e){
            if (e && (typeof e == 'object')) {
                Event.stopEvent(e);
            }
            if ((self._current > 1) && (!self.anim.isAnimated()) && (self._data['img' + (self._current - 1)])) {
                var photo = self._current - 1;
                var thumb = Dom.get('img' + photo);
                if (!thumb) {
                    var thumb = self._current - 1;
                    self.showPhoto(null, thumb, 'p');
                }
                else {
                    self._current--;
                    self.changeThumb(null, thumb);
                }
            }
        },
        photoNext: function(e){
    
            if (e && (typeof e == 'object')) {
                Event.stopEvent(e);
            }
            if ((self._current <= (self._count)) && (!self.anim.isAnimated()) && ((self._data['img' + (self._current + 1)]) || (self._current + 1) == (self._count + 1))) {
                var photo = self._current + 1;
                if (photo > self._count) {
                    var thumb = Dom.get('img' + self._count);
                }
                else {
                    var thumb = Dom.get('img' + photo);
                }
                if (!thumb) {
                    var thumb = self._current + 1;
                    self.showPhoto(null, thumb, 'n');
                }
                else {
                    self._current++;
                    self.changeThumb(null, thumb);
                }
            }
        },
        updatePhotoNav: function(){
          /* if (self._current == self._count) {
                self.info.navText.innerHTML = self._count + ' of ' + self._count;
            }
            else {
                self.info.navText.innerHTML = self._current + ' of ' + self._count;
            }*/
        },
        preloadImages: function(){
            if (self._data['img' + (self._current - 1)]) {
                var prev2 = new Image();
                prev2.src = MAINPATH + self._data['img' + (self._current - 1)].Location;
            }
            if (self._data['img' + (self._current + 1)]) {
                var next2 = new Image();
                next2.src = MAINPATH + self._data['img' + (self._current + 1)].Location;
            }
        },
        updateNav: function(d){
           /* var end = PAGESIZE * self.panes.current;
            var start = end - (PAGESIZE - 1);
            if (end > self._count) 
                end = self._count;
            if (end < 1) 
                end = 1;
            if (start < 1) 
                start = 1;
            if (start > self._count) 
                start = self._count;
            self.loadingTemp = self.nav.innerHTML = start + ' - ' + end + ' of ' + self._count;*/
        },
        
        changeThumb: function(e, obj){
            if (e) 
                Event.stopEvent(e);
            if (typeof obj === 'string' || typeof obj === 'number') {
                var id = 'img' + obj;
                var obj = Dom.get(id);
            }
            else {
                if (obj.o) {
                    obj = obj.o;
                }
            }
            if (!obj) {
                return false;
            }
            
            self._current = parseInt(obj.id.replace("img", ""), 10);
            self.changeImage(self._current);
            
            self.clearSelected();
            self.thumbs.selected = obj;
            self.showSelected();
            self.updatePhotoNav();
            self.scrollToView();
            self.preloadImages();
        },
        showPhoto: function(e, id, direction){
            if (e) 
                Event.stopEvent(e);
            if (id) {
                self._current = id;
                self.panes.current = self.getPane();
                if (!direction) 
                    direction = '';
                self.buildImages(direction);
                self.changeThumb(null, id);
            }
        },
        clearSelected: function(){
            if (self.thumbs.selected) {
                Dom.removeClass(self.thumbs.selected, 'active');
            }
        },
        showSelected: function(){
            if (self.thumbs.selected) {
                Dom.addClass(self.thumbs.selected, 'active');
            }
        },
        refreshSelected: function(){
            var ePhoto = Dom.get('img' + self._current);
            if (ePhoto) {
                self.thumbs.selected = ePhoto;
                self.showSelected();
            }
        },
        changeImage: function(currentImage){
            var img = self._data['img' + currentImage];
            if (!img) 
                return false;
            Dom.addClass(self.busy, 'show');
            document.title = img.Title;
            self.tempImage.src = MAINPATH + img.Location;
            self.photo.alt = img.Title;
           
            self.info.description.innerHTML = img.Description;
            
            self.callPV(img.PhotoGuid);
            try {
                YAHOO.util.History.navigate("photoViewer", img.PhotoGuid);
                createCookie("CurrentPhoto", img.PhotoGuid);
            } 
            catch (e) {
                document.location.hash = 'photoViewer=' + img.PhotoGuid;
            }
            
        },
        callPV: function(guid){
            var img = new Image;
            img.src = '/photos/pageview.ashx/?guid=' + guid;
        },
        buildImages: function(direction){
            var end = self.panes.current * PAGESIZE;
            var start = end - (PAGESIZE - 1);
            if (end > self._count) 
                end = self._count;
            if (start < 1) 
                start = 1;
            function buildEmptyThumbs(ul){
                for (var i = 1; i < PAGESIZE; i++) {
                    var li = document.createElement('LI');
                    li.innerHTML = '';
                    ul.appendChild(li);
                }
            }
            var item = document.createElement('LI');
            item.className = "item";
            var ul = document.createElement('UL');
            item.appendChild(ul);
            var html = [];
            if (start > self._count) {
                //buildEmptyThumbs(ul);
                return;
            }
            else {
                for (var x = start; x <= end; x++) {
                    var image = self._data['img' + x];
                    if (!image) 
                        continue;
                    html[html.length] = '<li>';
                    html[html.length] = '<a href="' + self._slideshowurl + image.UrlTitle + '/' + image.PhotoGuid + '" id="img' + x + '">';
                    html[html.length] = '<img src="' + THUMBPATH + image.Location + '" alt="' + image.Title + '" />';
                    html[html.length] = '</a>';
                    html[html.length] = '</li>';
                    if (x == end) {
                        var pane = html.join('\n');
                        ul.innerHTML = pane;
                    }
                    if (x == self._count) {
                        buildEmptyThumbs(ul);
                    }
                }
            }
            switch (direction) {
                case 'p':
                    self.panes.old = Dom.getFirstChild(self.list);
                    Dom.insertBefore(item, self.panes.old);
                    self.thumbs.scrollLeft = self._scrollDistance;
                    self.scrollPrev();
                    self.checkPrevPane();
                    break;
                case 'n':
                    self.list.appendChild(item);
                    self.panes.old = Dom.getFirstChild(self.list);
                    self.scrollNext();
                    self.checkNextPane();
                    break;
                default:
                    self.list.innerHTML = '';
                    self.list.appendChild(item);
                    self.checkPrevPane();
                    self.checkNextPane();
                    break;
            }
            self.refreshSelected();
            self.updateNav();
        },
        
        attachEventListeners: function(){
          
            function getThumb(e){
                Event.stopEvent(e);
                var target = Event.getTarget(e);
                while (self.checkTarget(target, 'A') !== true) {
                    if (!target) 
                        return false;
                    target = target.parentNode;
                }
                self.changeThumb(null, target);
            }
            
            Event.on(self.play, 'click', self.toggleSlideshow);
            Event.on(self.thumbs, 'click', getThumb);
            Event.on(self.tempImage, 'load', function(){
                if (typeof rt_done == 'function') {
                    rt_done(true);
                };
                //Dom.removeClass(self.busy, 'show');
                try {
                    self.photo.src = self.tempImage.src;
                } 
                catch (err) {
                    console.log(err);
                }
            });
            Event.addListener(self.first, 'click', function(e){
                if (e) 
                    Event.stopEvent(e);
                self.getFirst();
            });
            Event.addListener(self.prev, 'click', function(e){
                if (e) 
                    Event.stopEvent(e);
                self.getPrev();
            });
            Event.addListener(self.next, 'click', function(e){
                if (e) 
                    Event.stopEvent(e);
                self.getNext();
            });
            Event.addListener(self.last, 'click', function(e){
                if (e) 
                    Event.stopEvent(e);
                self.getLast();
            });
            Event.addListener(self.photoPrevButton, 'click', function(e){
                if (e) 
                    Event.stopEvent(e);
                self.photoPrev();
            });
            Event.addListener(self.photoNextButton, 'click', function(e){
                if (e) 
                    Event.stopEvent(e);
                self.photoNext();
            });
        },
        checkTarget: function(obj, el){
            if (obj == null) 
                return false;
            if (obj.nodeName == el) {
                return true;
            }
            else {
                return false;
            }
        },
        showLoading: function(){
            self._isLoading = true;
            //self.loadingTemp = self.nav.innerHTML;
            //self.nav.innerHTML = "Loading...";
        },
        hideLoading: function(){
            self._isLoading = false;
            //self.nav.innerHTML = self.loadingTemp;
        }
    };
    
    YAHOO.hosts.Slideshow.prototype.HistoryManager = function(){
        function init(){
            var $H = YAHOO.util.History;
            var module = "photoViewer";
            var historyIFrame = 'yui-history-iframe';
            var historyField = 'yui-history-field';
            var bookMarkedState = $H.getBookmarkedState(module);
            var initialState = bookMarkedState || self._data['img' + self._current].PhotoGuid;
            var iframe = document.createElement('IFRAME');
            iframe.id = historyIFrame;
            var input = document.createElement('INPUT');
            input.type = 'hidden';
            input.id = historyField;
            document.body.appendChild(iframe);
            document.body.appendChild(input);
            function stateChangeHandler(state){
                if (!state) 
                    return false;
                for (var i = 0; i < self._count; i++) {
                    if (self._guids['img' + i] == state && self._data['img' + self._current].PhotoGuid != state) {
                        if (!self._data['img' + i]) {
                            self._current = i;
                            try {
                                self.Data.get('c');
                            } 
                            catch (err) {
                                console.log(err);
                            }
                            self.connectionStatus.subscribe(function(){
                                if (self._data['img' + self._current]) {
                                    self.showPhoto(null, self._current, true);
                                }
                            });
                        }
                        else {
                            self.showPhoto(null, i, true);
                            return;
                        }
                    }
                }
            }
            $H.register(module, initialState, stateChangeHandler);
            try {
                $H.initialize(historyField, historyIFrame);
            } 
            catch (e) {
            }
            $H.onReady(function(){
                var currentState = $H.getCurrentState(module);
                stateChangeHandler(currentState);
            });
        }
        return {
            init: init
        }
    }();
    YAHOO.hosts.Slideshow.prototype.Data = function(){
        function buildImageIDList(d){
            var aImageID = [];
            var limit = NUMOFPHOTOS;
            var start = Math.ceil((self.panes.current * PAGESIZE)) - (PAGESIZE - 1);
            var end = Math.ceil(self.panes.current * PAGESIZE);
            
            if (d == 'p') {
                var from = end - limit;
                if (from < 1) 
                    from = 1;
                var to = end;
            }
            else 
                if (d == 'f') {
                    var to = limit;
                    if (to > self._count) 
                        to = self._count;
                    var from = 1;
                }
                else 
                    if (d == 'l') {
                        var to = self._count;
                        var from = to - limit;
                        if (from < 1) 
                            from = 1;
                    }
                    else 
                        if (d == 'c') {
                            var from = self._current;
                            var to = from + limit;
                            if (to > self._count) 
                                to = self._count;
                        }
                        else {
                            var from = start;
                            var to = from + limit;
                            if (to > self._count) 
                                to = self._count;
                        }
            
            var aRange = [];
            var aIndex = new Object;
            for (var x = 0; from <= to; x++) {
                if (from <= to && !self._data['img' + from]) {
                    aIndex[self._guids['img' + from]] = from;
                    aImageID[aImageID.length] = self._guids['img' + from];
                    aRange[aRange.length] = from;
                }
                from++;
            }
            sImageID = aImageID.join(',');
            var parameters = {
                list: sImageID,
                from: aRange[0],
                to: aRange[aRange.length - 1],
                index: aIndex
            }
            return parameters;
        }
        function getImages(d, r){
            var oReturn = buildImageIDList(d);
            if (!oReturn) 
                return false;
            var sImageID = oReturn.list;
            if (sImageID == '') {
                self.connectionStatus.fire('connection successful');
                return true;
            }
            var from = oReturn.from;
            var to = oReturn.to;
            var params = '/photos/photos.asmx/GetData?guids=' + sImageID;
            var callback = {
                success: getDataSuccess,
                failure: getDataFailure
            }
            
            var connect = Conn.asyncRequest('GET', params, callback);
            self.showLoading();
            function getDataSuccess(o){
                try {
                    var response = o.responseText;
                    var json = eval("(" + response + ")");
                    //eval('var json = ' + response + ';');
                    var dataObj = json.Data;
                    var aln = json.Data.length;
                    var index = oReturn.index;
                    if (aln > 0) {
                        for (var x = 0; x < aln; x++) {
                            var guid = dataObj[x].PhotoGuid;
                            self._data['img' + index[guid]] = dataObj[x];
                        }
                    }
                    self.hideLoading();
                    self.connectionStatus.fire('connection successful');
                } 
                catch (err) {
                    console.log(err);
                }
            }
            function getDataFailure(o){
                self.hideLoading();
            }
        }
        
        return {
            get: getImages
        }
    }();
})();

