/* Silently create the mcd namespace if it does not exist */
if (typeof mcd === 'undefined') {
	var mcd = {};
}

mcd.gallery = (function() {

    var app, util, omniture, init

    var $dom = mcd.dom;
    var $event = mcd.event;
    var $util = mcd.util;

    util = {

        /**
        * Applies a class (or absence of a class [reverse]) as an effectively-unique identifier
        * 
        * @param {HTMLNodeList} list
        * @param {Integer} index
        * @param {String} klass
        * @param {Bool} reverse
        */
        setUniqueClass: function(list, index, klass, reverse) {
            if (!reverse) {
                $util.each(list, function(v, i) {
                    $dom.removeClass(v, klass);
                });

                $dom.addClass(list[index], klass);
            }
            else {
                $util.each(list, function(v, i) {
                    $dom.addClass(v, klass);
                });

                $dom.removeClass(list[index], klass);
            }
        },
        
        /**
		 * Finds and return nearest parent element of a specified tag
		 * 
		 * @param {String} tag
		 * @param {HTMLElement} start
		 */
		findParent : function(tag, start) {
        	var tag = tag.toUpperCase();
        	
			while (start.parentNode) {
				start = start.parentNode;
				
				if (start.tagName == tag) {
					return start;
				}
			}
			
			return false; 
		},
		
		findIndex : function(array, target) {
			for (var i = 0; i < array.length; i++) {
				if (array[i] == target) return i;
			}
			return -1;
		}
    }

    app = {

        activeThumbIndex: 0,
        activeTabIndex: 0,
        slider: null,

        /**
        * Applies the selected thumb to the portrait.
        * 
        * @param {HTMLElement} thumb
        */
        play: function(thumb) {
    		
    		if (document.getElementById('download')) {
    		    $dom.removeClass(document.getElementById('download'), 'disabled');
    			
    		}
			
			var alt = thumb.getElementsByTagName('img')[0].alt;
    	
    		app.resetPortraitContent();
            
            // get ext
            var slashed = thumb.href.split('/');
            var ext = slashed[slashed.length - 1].split('.')[1];
			
			if(ad300x250 != ""){
			    document.getElementById('adFrame300x250').src = "/Thomas/script/adRefresh.html?tag=" + ad300x250;
			}
			if(ad728x90 != ""){
			    document.getElementById('adFrame728x90').src = "/Thomas/script/adRefresh.html?tag=" + ad728x90;
			}

            // test ext and embed correctly
            switch(ext) {
				case 'swf' : app.playSwf(thumb);
					break;
				case 'pdf' : app.playPdf(thumb);
					break;
				default : app.playImg(thumb);
			}
			
			
			var pn = s.pageName.split(':');
			s.pageName = pn[0] + ':' + pn[1] + ':' + pn[2] + ':' + alt;
			s.prop7 = alt.toLowerCase();
			var hier = s.hier1.split(',');
			s.hier1 = hier[0] + ',' + hier[1] + ',' + alt.toLowerCase();	
			
			var s_code = s.t(); if (s_code) document.write(s_code);
		
        },
		
		playSwf : function(thumb) {
			 swfobject.embedSWF(thumb.href, 'portrait-content', '580', '450', '10', '', {}, {
            	'wmode' : 'transparent'
            });
		},
		
		playPdf : function(thumb) {
			
			var href = thumb.href.replace('.pdf', '.jpg').replace('/pdf', '/img');
        	var img = document.createElement('img');
        	
			img.setAttribute('src', href);
            document.getElementById('portrait-content').appendChild(img);
            			
            if (document.getElementById('download')) {
				var download = document.getElementById('download');
            	download.href = thumb.href;
            	download.setAttribute('target', '_blank');
            	$dom.removeClass(download, 'disabled');
            }
		},
		
		playImg : function(thumb) {
			var img = document.createElement('img');
        	img.setAttribute('src', thumb.href);
            document.getElementById('portrait-content').appendChild(img);
            
            var span = document.createElement('span');
            span.innerHTML = "Right click on the image and select 'Set as Background'"
            document.getElementById('portrait-content').appendChild(span);
            
            if (document.getElementById('download')) {
    			$dom.addClass(document.getElementById('download'), 'disabled');
    		}
		},
		
		resetPortraitContent : function() {
			// delete old
    		document.getElementById('portrait-content').parentNode.removeChild(document.getElementById('portrait-content'));
    		
    		// create new
            var pc = document.createElement('div');
            pc.setAttribute('id', 'portrait-content');
            document.getElementById('portrait').appendChild(pc);
		},

        /**
        * My station link stuff
        */
        myStation : {
        	el : null,
        	send : function() {
	        	if (!$dom.hasClass(app.myStation.el, 'disabled')) {
	        		var request = mcd.http.request({
		        		'uri' : app.myStation.el.href,
		        		'onreadystatechange' : function() {
							
							if (request.readyState === 4) {
								
		        				if (request.status === 200) {
		        					
		        					$dom.removeClass(app.myStation.el, 'loading');
		        					
		        					if (request.responseText == '"n/a"') {
		        					// FAIL
		        						var login = document.getElementById('session-management').getElementsByTagName('a')[0];
		        						window.location.href = login.href + '?returnUrl=' + app.myStation.el.getAttribute('href');
		        					}
		        					else {
		        					// SUCCESS
		        						app.myStation.el.innerHTML = 'Added!';
		        						$dom.addClass(app.myStation.el, 'disabled');
		        					}
		        				}
		        			}
		        			else {
		        				$dom.addClass(app.myStation.el, 'loading');
		        			}
		        		}
		        	});
				
		        	request.send('');
	        	}
        	},
        	update : function(thumb) {
        		if (!$dom.hasClass(document.body, 'videos')) {        			
        			app.myStation.el.href = app.myStation.el.href.split('=')[0] + '=' + thumb.getAttribute('id');
        		}
        		app.myStation.el.innerHTML = 'add to my station'
            	$dom.removeClass(app.myStation.el, 'disabled');
        	},
        	init : function() {
        		app.myStation.el = document.getElementById('add-to-my-station');
        		
        		var id = (app.myStation.el.href.split('=')[1] && app.myStation.el.href.split('=')[1] !== 'default') ? app.myStation.el.href.split('=')[1] : '';
        		
                if (id.length > 0) {
            	    app.selectById(id);
                }
                else {
            	    app.selectTab(app.tabs[0], 0);
                }
                
        	}
        },
        
        updateCounter : function() {
        	var range = document.getElementById('thumb-range');
        	var total = document.getElementById('thumb-total');
        	
        	var rangeStart = (app.slider.index * app.slider.itemsPerStep) - (app.slider.itemsPerStep - 1);
        	var rangeText = rangeStart + ' - ';
        	
        	if ((rangeStart + (app.slider.itemsPerStep - 1)) <= app.thumbs.length) {
        		rangeText += rangeStart + (app.slider.itemsPerStep - 1);
        	}
        	else {
        		rangeText += app.thumbs.length;
        	}
        	
        	range.innerHTML = rangeText;
        	total.innerHTML = app.thumbs.length;
        },
        
        selectById : function(id) {
			if (document.getElementById(id)) {
				var list = util.findParent('ul', document.getElementById(id));	
				var listIndex = util.findIndex(app.thumbLists, list);
				var thumb = document.getElementById(id);
				var thumbs = list.getElementsByTagName('a');
			
				var standby = [thumb];
				var standbyHTML = [thumb.innerHTML];
				
				$util.each(thumbs, function(v, i) {
					if (v.id != id) {
						standby.push(v);
						standbyHTML.push(v.innerHTML);	
					}
				});
				
				list.innerHTML = '';
				
				for (var i = 0; i < standby.length; i++) {
					var li = document.createElement('li');
					standby[i].innerHTML = standbyHTML[i];
					li.appendChild(standby[i]);
					list.appendChild(li);
				}

				app.selectTab(app.tabs[listIndex], listIndex);
			}
        },

        selectTab : function(tab, i) {
            app.activeTabIndex = i;
            app.activeThumbIndex = 0;
            app.thumbs = app.thumbLists[app.activeTabIndex].getElementsByTagName('a');
            
            util.setUniqueClass(app.tabs, app.activeTabIndex, 'active');
            util.setUniqueClass(app.thumbLists, app.activeTabIndex, 'hide', true);
            util.setUniqueClass(app.thumbs, app.activeThumbIndex, 'active');
            
            app.selectThumb(app.thumbs[0], 0);

            app.resetSlider();
            
            app.updateCounter();
            
        },

        selectThumb: function(thumb, i) {
            app.activeThumbIndex = i;
            util.setUniqueClass(app.thumbs, app.activeThumbIndex, 'active');
            
            app.myStation.update(thumb);
            
            app.play(thumb);
        },

        /**
        * Initializes the thumbs slider.
        * Requires slider.js
        */
        resetSlider: function() {
            app.slider = mcd.slider({
                list: app.thumbLists[app.activeTabIndex],
                items: app.thumbs,
                itemMargin: 16,
                itemsPerStep: 4,
                next: document.getElementById('next'),
                previous: document.getElementById('previous')
            });
        },

        init : function() {
        	
            app.thumbLists = $dom.getElementsByAttribute('class', 'thumbs', document.body, 'ul', true);
            app.thumbs = app.thumbLists[app.activeTabIndex].getElementsByTagName('a');
            app.tabs = document.getElementById('tabs').getElementsByTagName('a');

            app.myStation.init();
           
            /** EVENTS */

            $util.each(app.thumbLists, function(list, listIndex) {

                var thumbs = list.getElementsByTagName('a');

                $util.each(thumbs, function(thumb, i) {
                    $event.add(thumb, 'click', function(e) {
                        $event.preventDefault(e);
                        if (app.activeThumbIndex !== i) app.selectThumb(thumb, i)
                    });
                });

                if (listIndex > 0 && listIndex != app.activeTabIndex) mcd.dom.addClass(list, 'hide')
            });

            $util.each(app.tabs, function(tab, i) {
                $event.add(tab, 'click', function(e) {
                    $event.preventDefault(e);
                    if (app.activeTabIndex !== i) app.selectTab(tab, i);
                });
            });

            if (document.getElementById('replay')) {
                $event.add(document.getElementById('replay'), 'click', function(e) {
                    $event.preventDefault(e);
                    app.play(app.thumbs[app.activeThumbIndex]);
                });
            }

            $event.add(document.getElementById('next'), 'click', function(e) {
                $event.preventDefault(e);
                
                app.slider.next();
                app.updateCounter();
            });
            
            $event.add(document.getElementById('previous'), 'click', function(e) {
                $event.preventDefault(e);
                
                app.slider.previous();
                app.updateCounter();
            });
            
            if (document.getElementById('prev-con')) {
	            $event.add(document.getElementById('prev-con'), 'click', function(e) {
	            	$event.preventDefault(e);
	            	
	            	if (app.activeThumbIndex > 0) {
	            		var newIndex = app.activeThumbIndex - 1;
	            		app.selectThumb(app.thumbs[newIndex], newIndex);
	            		
	            		if (newIndex < ((app.slider.index * app.slider.itemsPerStep) - app.slider.itemsPerStep)) {
	                     	app.slider.previous();
	                    }
	            		
	            		app.slider.refreshIndex(app.activeThumbIndex);
	            		app.updateCounter();
	            	}
	            });
            }
            
            if (document.getElementById('next-con')) {
	            $event.add(document.getElementById('next-con'), 'click', function(e) {
	            	$event.preventDefault(e);
	            	
	            	if (app.thumbs.length > (app.activeThumbIndex + 1)) {
	            		var newIndex = app.activeThumbIndex + 1;
	            		app.selectThumb(app.thumbs[newIndex], newIndex);
	            		
	            		app.slider.refreshIndex(app.activeThumbIndex);
	            		app.updateCounter();
	            	}
	            });
            }
            
            $event.add(app.myStation.el, 'click', function(e) {
        	$event.preventDefault(e);
        	app.myStation.send();
            });
        }
    }

    // START
    mcd.dom.ready(function() {
    	if (!mcd.dom.hasClass(document.body, 'videos')) {
    		app.init();
    	}
    	else {
    	        
	        $event.add(document.getElementById('add-to-my-station'), 'click', function(e) {
		    $event.preventDefault(e);
			app.myStation.el = document.getElementById('add-to-my-station');
		    app.myStation.send();
		
	        });
    		    
    	}
    });
    
    return {
    	'update' : app.myStation.update
    }
})();

