  /*
 * playlist.js 
 * Date Created: March 13, 2009
 * Requires: jquery 1.2.3
 * Author: Brandon Quintana
 */

jQuery(function($) {
	
	$.fn.playlist = function(settings) {
		return this.each(function() {
			/* Initialize
			-------------------------------------------*/
			/**
	 		* @method init
	 		**/
			this.init = function(settings) {
				var $this = this;
				this.s = {
					tabSelector: 'span.tab-playlist',
					sortDateSelector: 'input#sort-date',
					sortNameSelector: 'input#sort-name',
					displayAllSelector: 'input#display-all',
					displayHDSelector: 'input#display-hd',
					displayMoviesSelector: 'input#display-movies',
					displaySportsSelector: 'input#display-sports',
					displayKidsSelector: 'input#display-kids',
					contentSelector: 'div#page-content',
					playlistItemSelector: 'a.trigger',
					playlistSelector: 'div.playlist',
					pageSelector: 'a.page',
					dynamicTriggerSelector: 'ul.dynamicTrigger',
					dynamicTargetSelector: 'div.dynamicTarget',
					folderSelector: 'a.folder',
					meta : {
						settings: {
							sort: '',
							display: 'all'
						}
					},
					positionImage: true
				};
				if (settings) $.extend(this.s, settings);
			
				this.n = {
					content: $(this.s.contentSelector),
					playlist: $(this.s.playlistSelector),
					dynamicTarget: $(this.s.dynamicTargetSelector)
				}
			
				this.c = {
					data: {
						show: [],
						page: []
					} 
					
				}
				
				this._eventManager();
				
				this.fetchFirstShow();
			};

			/* Private Methods
			-------------------------------------------*/
			/**
			 * @method _eventManager()
			 **/		
			this._eventManager = function() {
				var $this = this;
				
				$(document.body).bind('click', this.s, function(e) {
					var target = $(e.target);

					if (target.is(e.data.sortDateSelector)) {
						$this._setMetaSettings({sort: ''});
					}
				
					if (target.is(e.data.sortNameSelector)) {
						$this._setMetaSettings({sort: 'title'});
					}
				
					if (target.is(e.data.displayAllSelector)) {
						$this._setMetaSettings({display: 'all'});
					}
				
					if (target.is(e.data.displayHDSelector)) {
						$this._setMetaSettings({display: 'hd'});
					}
				
					if (target.is(e.data.displayMoviesSelector)) {
						$this._setMetaSettings({display: 'tivo:ca.413902'});
					}
				
					if (target.is(e.data.displaySportsSelector)) {
						$this._setMetaSettings({display: 'tivo:ca.413905'});
					}
				
					if (target.is(e.data.displayKidsSelector)) {
						$this._setMetaSettings({display: 'tivo:ca.413897'});
					}
				
					if (target.is(e.data.pageSelector)) {
						$this._loadPage(target);
						return false;
					}
					
					if (target.is(e.data.folderSelector)) {
						target.blur();
						$this._getFolder(target);
					}
						
					if (target.is(e.data.playlistItemSelector)) {
						target.blur();
						$this._getShow(target);
						return false;
					}
				});
				
				$(this.s.tabSelector).bind('click', this.s, function(e) {
					var target = $(e.target);
					$this.fetchFirstShow(target.parents('a').attr('href'));
				});
			}
			
			/**
			 * @method _setMetaSettings()
			 * @param settings
			 **/		
			this._setMetaSettings = function(settings) {
				if (settings) $.extend(this.s.meta.settings, settings);
				var url = 'go.do?def=' + this.s.def ; 
				if(this.s.meta.settings.sort != '')
					url+='&orderBy=' + this.s.meta.settings.sort;
				if (this.s.meta.settings.display == 'hd')
					url += '&hdtv=true';
				else if (this.s.meta.settings.display != 'all')
					url += '&categoryId=' + this.s.meta.settings.display;
				
				var $this = this;
			
				$this._removeLoading();
			
				if (typeof this.c.data.page[url] != 'undefined') {
					this.n.content.html(this.c.data.page[url]);
					this.n.content.fadeIn();
					$this.fetchFirstShow();
				} else {
					this._showLoading(this.n.content);
					this.n.content.load(url, null, function(responseText, status, XMLHttpRequest) { 
						$this._cacheData(responseText, status, XMLHttpRequest, 'page', url);
						$this._removeLoading();
						$this.n.content.fadeIn();
						$this.fetchFirstShow(); // fetch first show AFTER the list is loaded
					});
					
					this.n.content.bind('ajaxError', function(){
						$this._removeLoading();
						$this.n.content.load('<p>Page not found.</p>');
					});
				}
			};

			/**
			 * @method _loadPage()
			 * @param settings
			 **/		
			this._loadPage = function(trigger) {
				var url = trigger.attr('href');
				var $this = this;
				$this._removeLoading();
			
				if (typeof this.c.data.page[url] != 'undefined') {
					this.n.content.html(this.c.data.page[url]);
					this.n.content.fadeIn();
					this.fetchFirstShow();
				} else {
					this._showLoading(this.n.content);
					this.n.content.load(url, null, function(responseText, status, XMLHttpRequest) { 
						$this._cacheData(responseText, status, XMLHttpRequest, 'page', url);			
						$this._removeLoading();
						$this.n.content.fadeIn();
						$this.fetchFirstShow();
					})
					
					this.n.content.bind('ajaxError', function(){
						$this._removeLoading();
						$this.n.content.load('<p>Page not found.</p>');
					});
				}
				
				$('html,body').animate({scrollTop: 0}, 1000);
			};
		
			/**
			 * @method _getShow()
			 * @params trigger
			 **/
			this._getShow = function(trigger) {
				if(trigger.length > 0) {
					var url = trigger.attr('href');
					var $this = this;
					$this._removeLoading();

					this.n.dynamicTarget = trigger.parents(this.s.playlistSelector).find(this.s.dynamicTargetSelector);
				
					var li = trigger.parents(this.s.playlistSelector).find(this.s.dynamicTriggerSelector + ' li');
					li.removeClass('active');
				
					trigger.parent().addClass('active')
			
					if(this.s.positionImage) {
						var playlistTop = trigger.parents(this.s.playlistSelector).offset().top;
						var viewTop = $(window).scrollTop();
						var padding = viewTop > playlistTop ? viewTop - playlistTop : 0;
						this.n.dynamicTarget.css({paddingTop: padding + 'px'});
					}

					if (typeof this.c.data.show[url] != 'undefined') {
						this.n.dynamicTarget.hide();
						this.n.dynamicTarget.html(this.c.data.show[url]);
						this.n.dynamicTarget.fadeIn();
					} else {
						this._showLoading(this.n.dynamicTarget);
						this.n.dynamicTarget.load(url, null, function(responseText, status, XMLHttpRequest) { 
							$this._removeLoading();
							$this._cacheData(responseText, status, XMLHttpRequest, 'show', url);
							$this.n.dynamicTarget.fadeIn();
						});
					
						this.n.dynamicTarget.bind('ajaxError', function(){
							$this._removeLoading();
							$this.n.dynamicTarget.load('<p>Content not found.</p>');
						});
					}
				}
			};
		
			/**
		 	* @method _cacheData()
		 	* @params responseText
		 	* @params status
		 	* @params XMLHttpRequest
		 	* @params type
		 	* @params url
		 	**/
			this._cacheData = function(responseText, status, XMLHttpRequest, type, url) {
				switch(type) {
					case 'page':
						this.c.data.page[url] = responseText;
						break;
					case 'show':
						this.c.data.show[url] = responseText;
						break;
				}
			};
			
			/**
			 * @method _getFolder()
			 * @params trigger
			 **/
			this._getFolder = function(trigger) {
				var li = trigger.parent();
				var url = 'go.do?def=nowplaying.folder.body&collectionId=' + trigger.attr('rel');
				var $this = this;
			
				if (typeof this.c.data.show[url] != 'undefined') {
					li.find('ul').slideToggle();
				} else {
					var ul = li.append('<ul></ul>').find('ul');
					ul.load(url, null, function(responseText, status, XMLHttpRequest) { 
						$this._cacheData(responseText, status, XMLHttpRequest, 'show', url);
						// the next call _getShow() will show expand the folder, no need to do so here.
						//ul.slideToggle();
						ul.css("display", "block");
					});
					
					ul.bind('ajaxError', function(){
						ul.load('<li>Content not found.</li>');
						ul.css("display", "block");
					});
				}
			};
		
			/**
			 * @method _showLoading()
			 * @params target
			 **/
			this._showLoading = function(target) {
				var target = $(this.s.playlistSelector + ".section:visible");
				$('body').append('<div class="loading"><img src="/assets/images/findtv/icons/loading_animation.gif" /></div>');
				$('div.loading').css({
					'position': 'absolute',
					'height': target.height() + 2,
					'width': target.width() + 2,
					'top': target.offset().top + parseInt(target.css('padding-top')),
					'left': target.offset().left + 1,
					'padding': '0',
					opacity: 0.75,
					'z-index': '5000',
					'background': '#fff'
				});
				var img = $('div.loading img').css({
					 'position': 'absolute',
					 'top': '100px',
					 'left': '50%',
					 'margin-left': '-16px',
					 'margin-top': '-20px' 
				});
				// if scroll pass the loading icon, re-position to scroll view
				if (img.offset().top < $(window).scrollTop()) {
					img.css({
						'top': 2 * parseInt(img.css('top')) + $(window).scrollTop() - img.offset().top
					});
				}				
			};

			/**
			 * @method _removeLoading()
			 * @params target
			 **/
			this._removeLoading = function() {
				$('div.loading').remove();
			};
		
			/* Public Methods
			-------------------------------------------*/
			/**
			 * @method fetchFirstShow()
			 * @param settings
			 **/		
			this.fetchFirstShow = function(selector) {
				if(selector)
					this._getShow($(selector + ' ' + this.s.playlistItemSelector + ':first'));
				else
					this._getShow($(this.s.playlistItemSelector + ':first'));
			};
			
			//Call initialize
			this.init(settings);
		});
	}	
});

jQuery(document).ready(function($) {
	$('div#now-playing').playlist({def: 'nowplaying.content.body'});
	$('div#todo').playlist({ def: 'todo.content.body'});
	$('div#recent').playlist({positionImage: false});
});


function OpenPopup(vThis, url){

	var popup;
		if (document.getElementById('popupWindow') == null) {
			popup = document.createElement('div'); 
			popup.setAttribute('id','popupWindow'); 
			jQuery('body').append(popup); 
		}
		else { jQuery('div#popupWindow').hide(); }
		jQuery(vThis).load(url).show();

}

 