/* =======================================================

	NFS Namespace

======================================================= */

var NFS = {};


NFS.MediaBrowser = function(totalVideoPages, totalPhotoPages, ajaxLoadURL, mediaType) {
	
	this.ajaxLoadURL = ajaxLoadURL;
	
	this.activePageNum = 1;
	this.activeMediaType = (mediaType != null ? mediaType : 'videos');
	this.animOutTime = 350;
	this.animInTime = 350;
	this.numVideoPages = totalVideoPages;
	this.numPhotoPages = totalPhotoPages;
	
	this.getMediaTypeFromClassName = function(className) {
		var mediaType = '';
		switch(className){
			case 'media-more-tabs-selected-videos':
				mediaType = 'videos';
				break;
			case 'media-more-tabs-selected-photos':
				mediaType = 'photos';
				break;
			default:
		}
		return mediaType;
	}
	this.getClassNameFromMediaType = function(mediaType) {
		var className = '';
		switch(mediaType){
			case 'videos':
				className = 'media-more-tabs-selected-videos';
				break;
			case 'photos':
				className = 'media-more-tabs-selected-photos';
				break;
			default:
		}
		return className;
	}
	this.changeMediaBrowserType = function(mediaType, pageNum) {
		var self = this;
		var activeMediaType = self.getMediaTypeFromClassName( jQuery('#more-tabs').attr('class') );
		if(mediaType != self.activeMediaType){
			var className = self.getClassNameFromMediaType(mediaType);
			jQuery('#more-tabs').attr('class', className);
			self.resizePager(mediaType);
			self.updateMediaBrowserList(mediaType, pageNum);
		}
	}
	this.updateMediaBrowserList = function(mediaType, pageNum) {
		var self = this;
		
		self.activitySpinner( true );
		
		jQuery('#more-list').fadeOut(self.animOutTime, function(){
			jQuery('#more-list').load(self.ajaxLoadURL, {mediaType: mediaType, pageNum: pageNum}, function(){
				jQuery('#more-list').fadeIn(self.animInTime); self.activitySpinner( false );
			});
		});
		
		self.updateMediaBrowserPager(pageNum);
		self.activeMediaType = mediaType;
		self.activePageNum = pageNum;
		
		self.setAsidePagerPrevious( pageNum );
		self.setAsidePagerNext( pageNum );
	}
	this.updateMediaBrowserPager = function(pageNum) {
		jQuery('.media-more .pager ul li.page-number a').each( function(){
			var pageNumLink = jQuery(this);
			if(pageNumLink.html() == pageNum) {
				pageNumLink.parent().addClass('pager-active');
			} else {
				pageNumLink.parent().removeClass('pager-active');
			}
		});
	}
	
	this.setAsidePagerPrevious = function( pageNum )
	{
		if( pageNum == 1 )
		{
			jQuery('.media-more .pager ul li.pager-prev a').addClass('pager-no-prev');
		} else {
			jQuery('.media-more .pager ul li.pager-prev a').removeClass('pager-no-prev');
		}
	}
	
	this.setAsidePagerNext = function( pageNum )
	{
		var self = this;
		
		var pageNext = jQuery('.media-more .pager ul li.pager-next a');
		
		if( pageNum >= ( self.activeMediaType == 'videos' ? self.numVideoPages : self.numPhotoPages ) )
		{
			pageNext.addClass('pager-no-next');
			pageNext.unbind('click');
			pageNext.click(
				function(){ return false; }
			);
			
		} else {
			pageNext.removeClass('pager-no-next');
			pageNext.unbind('click');
			pageNext.click(
				function() { self.getPagerClickHandlerNext(); return false; }
			);
		}
	}
	
	this.activitySpinner = function( shouldStart )
	{
		jQuery('#more-list-wrapper').css("background-image" , ( shouldStart ? "url(/undercover/images/loading.gif)" : "none" ) );
	}
	
	this.resizePager = function(mediaType) {
		
		var self = this;
		var totalPages = 0;
		
		totalPages = (mediaType == 'videos' ? self.numVideoPages : self.numPhotoPages );
		
		// remove all page numbers
		jQuery('.media-more .pager ul li.page-number').each( function(){
			jQuery(this).remove();
		});
		
		// rebuild the page numbers		
		var newPages = '\n';
		for (i=1;i<=totalPages;i++) {
			newPages += '<li class="page-number"><a href="#">'+i+'</a></li>\n'
		}
		jQuery('.media-more .pager ul li.label').after(newPages);
		
		// rebind page click events
		jQuery('.media-more .pager ul li.page-number a').each( function (){
			var pageNumLink = jQuery(this);
			var pageNumLinkValue = jQuery(this).html();
			if( nfsUtils.isInt(pageNumLinkValue) ) {
				pageNumLink.click( function(){
					self.updateMediaBrowserList(self.activeMediaType, pageNumLinkValue);
					return false;
				})
			}
		});
		
		// rebind next click events
		var nextPage = jQuery('.media-more .pager ul li.pager-next a');
		nextPage.unbind('click');
		nextPage.click( 
			function() { self.getPagerClickHandlerNext(); return false; }
		);
	}
	
	this.getPagerClickHandlerPrevious = function()
	{
		var self = this;
		if(self.activePageNum > 1) {
			self.updateMediaBrowserList(self.activeMediaType, --self.activePageNum);
		}
	}
	
	this.getPagerClickHandlerNext = function()
	{
		var self = this;
		if(self.activePageNum < ( self.activeMediaType == 'videos' ? self.numVideoPages : self.numPhotoPages )) {
			self.updateMediaBrowserList(self.activeMediaType, ++self.activePageNum);
		}
	}
	
	this.bind = function(){
		
		var self = this;
		
		// Setup Media Tabs
		jQuery('#media-more-tabs-videos a').click( function(){
			self.changeMediaBrowserType('videos', 1);
			return false;
		});
		jQuery('#media-more-tabs-photos a').click( function(){
			self.changeMediaBrowserType('photos', 1);
			return false;
		});
		
		// Setup Pager
		jQuery('.media-more .pager ul li.pager-prev a').click( 
			function() { self.getPagerClickHandlerPrevious(); return false; }
		);
		jQuery('.media-more .pager ul li.pager-next a').click( 
			function() { self.getPagerClickHandlerNext(); return false; }
		);
		jQuery('.media-more .pager ul li.page-number a').each( function (){
			var pageNumLink = jQuery(this);
			var pageNumLinkValue = jQuery(this).html();
			if( nfsUtils.isInt(pageNumLinkValue) ) {
				pageNumLink.click( function(){
					self.updateMediaBrowserList(self.activeMediaType, pageNumLinkValue);
					return false;
				})
			}
		});
		
		self.setAsidePagerPrevious( this.activePageNum );
		self.setAsidePagerNext( this.activePageNum );
	}
}


NFS.NewsBrowser = function(totalNewsPages, ajaxLoadURL) {
	
	this.totalNewsPages = totalNewsPages;
	this.ajaxLoadURL = ajaxLoadURL;
	
	this.activePageNum = 1;
	this.animOutTime = 350;
	this.animInTime = 350;
	this.newsItemsPerPage = 6;

	this.updateNewsBrowserList = function(pageNum) {
		var self = this;
		
		self.activitySpinner( true );
		
		jQuery('#more-list').fadeOut(self.animOutTime, function(){
			jQuery('#more-list').load(ajaxLoadURL, {pageNum: pageNum}, function(){
				jQuery('#more-list').fadeIn(self.animInTime); self.activitySpinner( false );
			});
		});
		self.updateNewsBrowserPager(pageNum);
		self.activePageNum = pageNum;
		
		
		self.setAsidePagerPrevious( pageNum );
		self.setAsidePagerNext( pageNum );
	}
	this.updateNewsBrowserPager = function(pageNum) {
		jQuery('.news-more .pager ul li.page-number a').each( function(){
			var pageNumLink = jQuery(this);
			if(pageNumLink.html() == pageNum) {
				pageNumLink.parent().addClass('pager-active');
			} else {
				pageNumLink.parent().removeClass('pager-active');
			}
		});
	}
	
	this.activitySpinner = function( shouldStart )
	{
		jQuery('#more-list-wrapper').css("background-image" , ( shouldStart ? "url(/undercover/images/loading.gif)" : "none" ) );
	}
	
	this.setAsidePagerPrevious = function( pageNum )
	{
		if( pageNum == 1 )
		{
			jQuery('.news-more .pager ul li.pager-prev a').addClass('pager-no-prev');
		} else {
			jQuery('.news-more .pager ul li.pager-prev a').removeClass('pager-no-prev');
		}
	}
	
	this.setAsidePagerNext = function( pageNum )
	{
		var self = this;
		
		var pageNext = jQuery('.news-more .pager ul li.pager-next a');
		
		if( pageNum >= this.totalNewsPages )
		{
			pageNext.addClass('pager-no-next');
			pageNext.unbind('click');
			pageNext.click(
				function(){ return false; }
			);
			
		} else {
			pageNext.removeClass('pager-no-next');
			pageNext.unbind('click');
			pageNext.click(
				function() { self.getPagerClickHandlerNext(); return false; }
			);
		}
	}
	
	this.getPagerClickHandlerPrevious = function()
	{
		var self = this;
		if(self.activePageNum > 1) {
				self.updateNewsBrowserList(--self.activePageNum);
			}
	}
	
	this.getPagerClickHandlerNext = function()
	{
		var self = this;
		if(self.activePageNum < self.totalNewsPages) {
				self.updateNewsBrowserList(++self.activePageNum);
		}
	}
	
	this.bind = function(){
		
		var self = this;
		
		// Setup Pager
		jQuery('.news-more .pager ul li.pager-prev a').click( 
			function() { self.getPagerClickHandlerPrevious(); return false; }
		);
		jQuery('.news-more .pager ul li.pager-next a').click( 
			function() { self.getPagerClickHandlerNext(); return false; }
		);
		jQuery('.news-more .pager ul li.page-number a').each( function (){
			var pageNumLink = jQuery(this);
			var pageNumLinkValue = jQuery(this).html();
			if( nfsUtils.isInt(pageNumLinkValue) ) {
				pageNumLink.click( function(){
					self.updateNewsBrowserList(pageNumLinkValue);
					return false;
				})
			}
		});
		
		self.setAsidePagerPrevious( this.activePageNum );
		self.setAsidePagerNext( this.activePageNum );
	}
}


NFS.CommentBrowser = function(assetId, totalCommentPages, ajaxLoadURL) {
	
	this.activeCommentPage = 1;
	this.totalCommentPages = totalCommentPages;
	this.ajaxLoadURL = ajaxLoadURL;
	this.assetId = assetId;
	
	this.hasMoreComments = function() {
		var self = this;
		if(self.totalCommentPages > self.activeCommentPage) {
			return true;
		} else {
			return false;
		}
	}
	
	this.bind = function() {
		
		var self = this;
		
		if(this.hasMoreComments()) {
			jQuery('#expander-container').slideDown('fast');
		}
		
		jQuery('#expander').click( function(){
			
			var expander = this;
			
			jQuery(expander).fadeOut('fast', function(){
				
				var comments = document.createElement("div");
				var getPageNum = self.activeCommentPage;
				
				jQuery(comments).hide().load(self.ajaxLoadURL, {assetId: assetId, commentPageNum: getPageNum}, function(){
					if( self.hasMoreComments() ) {
						jQuery(expander).fadeIn('fast', function(){
							jQuery('#comment-list-container').append(comments);
							jQuery(comments).slideDown('slow');
						});
					} else {
						jQuery('#expander-container').fadeOut('fast', function(){
							jQuery('#comment-list-container').append(comments);
							jQuery(comments).slideDown('slow');
						});
					}
				});
			});
			self.activeCommentPage++;
			return false;
		});
	}
}


NFS.CommentPoster = function(itemID, assetID, isLoggedInWithPersona) {
	
	this.itemID = itemID;
	this.assetID = assetID;
	this.comment = "";
	this.isLoggedInWithPersona = isLoggedInWithPersona;
	
	this.bind = function(){
		
		var self = this;
		
		if(self.isLoggedInWithPersona) {
			jQuery('form#comment-form').unbind('submit');
			jQuery('form#comment-form').submit( function() {
			
				window.NFSDefaultLocalizedCommentSubmitPost = String( jQuery('form#comment-form div.comment-form-tools input').text() );
				
				self.comment = jQuery('textarea#comment-form-text').val();
				
				if( self.comment == window.NFSDefaultLocalizedCommentText )
				{
			
					jQuery('form#comment-form div.comment-form-tools input').css('display','none');
						var coords = jQuery('form#comment-form').offset();
						var cssLeft = coords.left + 114;
						var cssTop = coords.top + 16;
						jQuery('#comment-text-required').css('left', cssLeft).css('top', cssTop).fadeIn('fast');
						jQuery('#comment-text-required .tool-close').click( function(){
							jQuery('#comment-text-required.tool-tip').fadeOut('fast');
							//jQuery('.comment-form-tools a').text( window.NFSDefaultLocalizedCommentSubmitPost );
							jQuery('form#comment-form div.comment-form-tools input').css('display','block');
						});
						
						return false;
				}
				
				//surl = String( jQuery('form#comment-form #comment-form-surl').attr('value') );
				surl = String( window.location );
				
				surlHashPos = surl.indexOf( "#" );
				
				if( surlHashPos != -1 )
				{
					surl = surl.substring( 0 , surlHashPos );
				}
				
				jQuery('form#comment-form #comment-form-surl').val( (surl + "#post-comment") )
				
			});
		} else {
			
			jQuery('form#comment-form div.comment-form-tools input').remove();
			
			jQuery('form#comment-form div.comment-form-tools').append('<a href="' + loginURL + '">' + window.NFSDefaultLocalizedCommentLoginRequired + '</a>');
					
			var textArea = jQuery('textarea#comment-form-text');
			textArea.unbind('focus');
			textArea.bind('focus', function(){
				var coords = jQuery('form#comment-form').offset();
				var cssLeft = coords.left + 114;
				var cssTop = coords.top + 16;
				jQuery('#comment-login-required').css('left', cssLeft).css('top', cssTop).fadeIn('fast');
				jQuery('#comment-login-required .tool-close').click( function(){
					jQuery('#comment-login-required.tool-tip').fadeOut('fast');
				});
			});
		}
	}
}


NFS.RatingSelector = function(mediaType, mediaID, ajaxLoadURL, isLoggedIn) {
	
	this.mediaType = mediaType;
	this.mediaID = mediaID;
	this.ajaxLoadURL = ajaxLoadURL;
	this.isLoggedIn = isLoggedIn;
	
	this.rate = function(numStars) {
		
		var self = this;
		
		nfsUtils.setRatingStars( numStars );
		
		var vote = document.createElement("div");
		jQuery(vote).load(self.ajaxLoadURL, {mediaType: self.mediaType, mediaID: self.mediaID, mediaRating: numStars} ,
			function(data)
			{
				isValidRatingRegExp = new RegExp( "([0-9]+)\!([0-9]+)" , "i" );
				
				if( isValidRatingRegExp.test( String(data) ) )
				{
				/*
					separatorPos = String(data).indexOf( "!" );
					
					newRating		= String(data).substring(0,separatorPos - 1 );
					totalComments	= String(data).substring(separatorPos+1);
				*/
					
					newRating = RegExp.$1;
					totalComments = RegExp.$2;
					
					nfsUtils.setRatingStars(newRating);
					
					oldCommentText = String( jQuery('#content-rating #content-rating-total').text() );
					jQuery('#content-rating #content-rating-total').text( String( oldCommentText.replace( /[0-9]+/ , totalComments ) ) );
					
				} else {
					//FIXXX: uncaught error
				}
			}
		);
		
	}
	
	this.bind = function() {
		
		var self = this;
		
		if(self.isLoggedIn == true) {
			jQuery('#content-rating-map area').each( function(){
				var area = this;
				jQuery(area).click( function(){
					var numStars = jQuery(area).attr('meta');
					self.rate(numStars);		
					return false;
				});
			});
		} else {
			jQuery('#content-rating-map area').each( function(){
				var area = this;
				jQuery(area).click( function(){
					var coords = jQuery('#content-rating').offset();
					var cssLeft = coords.left - 12;
					var cssTop = coords.top - 4;
					jQuery('#rating-login-required.tool-tip').css('left', cssLeft).css('top', cssTop).fadeIn('fast');
					jQuery('#rating-login-required .tool-close').click( function(){
						jQuery('#rating-login-required.tool-tip').fadeOut('fast');
					});
					return false;
				});
			});
		}
	}
}


NFS.PhotoPlayer = function() {
	
	var self = this;
	
	this.bind = function() {
		jQuery('#photoPlayer').click( function(){
			jQuery('#expandedPhoto').modal();
		});
	}
}


NFS.LanguageSelector = function(pageType, isLocaleSet) {
	
	this.pageType = pageType;
	this.isLocaleSet = isLocaleSet;
	
	this.href = location.href;
	this.href = nfsUtils.remove(this.href, '&lang=', 2);
	this.href = nfsUtils.remove(this.href, '?lang=', 2);
	this.href = nfsUtils.remove(this.href, '&region=', 2);
	this.href = nfsUtils.remove(this.href, '?region=', 2);
	
	this.queryStringExists = ( this.href.indexOf('?') >= 0 ) ? true : false;
	this.queryStringPrepend = ( this.queryStringExists ) ? '&' : '?';
	
	this.bind = function() {
	
		var self = this;
		
		jQuery('#lang-list li').each( function() {
			var langAnchor = jQuery(this).find('a');
			var langAnchorHref = jQuery(langAnchor).attr('href');
			
			if( langAnchorHref.indexOf('http://') < 0 ) {
				var newLangAnchorHref = self.href + self.queryStringPrepend + langAnchorHref;
				jQuery(langAnchor).attr('href', newLangAnchorHref);
			}
		});
		
		jQuery('#header-nav-side-lang').click( function() {
			var langSelectorPadding = 12;
			var langSelectorWidth = jQuery('#lang-selector-container').width();
			var globeCoords = jQuery(this).offset();
			var globeWidth = jQuery(this).width();
			var cssLeft = globeCoords.left - langSelectorWidth + globeWidth + langSelectorPadding;
			jQuery('#lang-selector-container').css("left", cssLeft).fadeIn("fast").fadeTo("fast", 0.94);
			
			jQuery('#lang-selector-container #lang-close a').click( function() {
				jQuery('#lang-selector-container').fadeOut("fast");	
				return false;
			});
			
			return false;
		});
		
		if(self.isLocaleSet == false) {
			jQuery('#header-nav-side-lang').click();
		}
	}
	
	this.show = function() {
		
		jQuery('#header-nav-side-lang').click();
		
	}
}


NFS.NonDefaultNavLanguageSelector = function(pageType, isLocaleSet) {
	
	this.pageType = pageType;
	this.isLocaleSet = isLocaleSet;
	
	this.href = location.href;
	this.href = nfsUtils.remove(this.href, '&lang=', 2);
	this.href = nfsUtils.remove(this.href, '?lang=', 2);
	this.href = nfsUtils.remove(this.href, '&region=', 2);
	this.href = nfsUtils.remove(this.href, '?region=', 2);
	
	this.queryStringExists = ( this.href.indexOf('?') >= 0 ) ? true : false;
	this.queryStringPrepend = ( this.queryStringExists ) ? '&' : '?';
	
	this.bind = function() {
	
		var self = this;
		
		jQuery('#lang-list li').each( function() {
			var langAnchor = jQuery(this).find('a');
			var langAnchorHref = jQuery(langAnchor).attr('href');
			
			if( langAnchorHref.indexOf('http://') < 0 ) {
				var newLangAnchorHref = self.href + self.queryStringPrepend + langAnchorHref;
				jQuery(langAnchor).attr('href', newLangAnchorHref);
			}
		});
		
//		jQuery('#header-nav-side-lang').click( function() {
		if(self.isLocaleSet == false) {
			var langSelectorPadding = 12;
			var langSelectorWidth = jQuery('#lang-selector-container').width();
			var globeCoords = jQuery('#header').offset();
			var globeWidth = jQuery('#header').width();
			var cssLeft = globeCoords.left - langSelectorWidth + globeWidth + langSelectorPadding;
			jQuery('#lang-selector-container').css("left", cssLeft).fadeIn("fast").fadeTo("fast", 0.94);
			
			jQuery('#lang-selector-container #lang-close a').click( function() {
				jQuery('#lang-selector-container').fadeOut("fast");	
				return false;
			});
		
//			return false;
//		});
		}
	}
}


NFS.sphereLanguageSelector = function() {
		
	this.href = location.href;
	this.href = nfsUtils.remove(this.href, '&lang=', 2);
	this.href = nfsUtils.remove(this.href, '?lang=', 2);
	this.href = nfsUtils.remove(this.href, '&region=', 2);
	this.href = nfsUtils.remove(this.href, '?region=', 2);
	
	this.queryStringExists = ( this.href.indexOf('?') >= 0 ) ? true : false;
	this.queryStringPrepend = ( this.queryStringExists ) ? '&' : '?';
	
	jQuery('#lang-selector-container').removeClass('html-selector').addClass('sphere-selector');
	
	var self = this;
	
	jQuery('#lang-list li').each( function() {
		var langAnchor = jQuery(this).find('a');
		var langAnchorHref = jQuery(langAnchor).attr('href');
		
		if( langAnchorHref.indexOf('http://') < 0 ) {
			var newLangAnchorHref = self.href + self.queryStringPrepend + langAnchorHref;
			jQuery(langAnchor).attr('href', newLangAnchorHref);
		}
	});
	
	var langSelectorWidth = jQuery('#lang-selector-container').width();
	var sphereContainerWidth = jQuery('#container').width();
	var cssLeft = sphereContainerWidth - langSelectorWidth;
	
	jQuery('#lang-selector-container').css("left", cssLeft).fadeIn("fast").fadeTo("fast", 0.94);
	
	jQuery('#lang-selector-container #lang-close a').unbind('click');
	
	jQuery('#lang-selector-container #lang-close a').click( function() {
		jQuery('#lang-selector-container').fadeOut("fast");	
		return false;
	});
	
}


// Utility Functions

nfsUtils = {
	isInt : function(x) {
		var y = parseInt(x);
		if (isNaN(y)) return false;
		return x==y && x.toString()==y.toString(); 
	},
	isFloat : function(x) {
		var y = parseFloat(x);
		var z = parseInt(x);
		if(isNaN(y)) return false;
		return y!=z;
		return true;
	},
	getNumPages : function(itemsPerPage, totalItems){
		if(totalItems < 1) return 0;
		var divided = totalItems/itemsPerPage;
		if(this.isFloat(divided)) {
			return Math.floor(divided) + 1;
		} else {
			return Math.floor(divided);
		}
	},
	/*	
	*	Remove all occurrences of a token in a string
	*		s	string to be processed
	*		t	token to be removed
	*		e	number of extra chars to remove
	*		returns new string
	*/
	remove : function(s, t, e) {
		i = s.indexOf(t);
		r = "";
		if (i == -1) return s;
		r += s.substring(0,i) + nfsUtils.remove(s.substring(i + t.length+e), t, e);
		return r;
	},
	
	setRatingStars : function(numStars) {
		
		var className = 'rating-stars-3';
		var imgTitle = '&#9733;&#9733;&#9733;&#9734;&#9734;';
		var imgSource = 'images/rating_3_lg.png';
		
		switch( numStars ) {
			case '1' : 
				className = 'rating-stars-1';
				imgTitle = '&#9733;&#9734;&#9734;&#9734;&#9734;';
				imgSource = 'images/rating_1_lg.png';
				break;
			case '2' : 
				className = 'rating-stars-2';
				imgTitle = '&#9733;&#9733;&#9734;&#9734;&#9734;';
				imgSource = 'images/rating_2_lg.png';
				break;
			case '3' : 
				className = 'rating-stars-3';
				imgTitle = '&#9733;&#9733;&#9733;&#9734;&#9734;';
				imgSource = 'images/rating_3_lg.png';
				break;
			case '4' : 
				className = 'rating-stars-4';
				imgTitle = '&#9733;&#9733;&#9733;&#9733;&#9734;';
				imgSource = 'images/rating_4_lg.png';
				break;
			case '5' : 
				className = 'rating-stars-5';
				imgTitle = '&#9733;&#9733;&#9733;&#9733;&#9733;';
				imgSource = 'images/rating_5_lg.png';
				break;
			default:
				break;
		}
		
		jQuery('#content-rating img')
			.removeClass()
			.addClass(className)
			.attr('title', imgTitle)
			.attr('src', imgSource);
	}
};