

(function($){

	/* THIS IS WHERE THE MAGIC HAPPENS */

	$.nbaGetOptions = function($this, optionDefaults) {
		var options = {};

		var castAttribute = function(value, type) {
		
			switch (type) {
				case "boolean" : return (value.toLowerCase() == "true");
				case "number"  : return new Number(value)+0;
				case "string"  : return value + "";
				default : return null;
			}
		}

		for (var x in optionDefaults) {
			var attribute = $this.attr(x);
		
			if (typeof attribute == "undefined") {
				options[x] = optionDefaults[x][1];
				continue; 
			}
			
			options[x] = castAttribute(attribute, optionDefaults[x][0]);
		}

		return options;
	}
	
	/* WRAPPERS */


  /*** TAKEOVER ***/

  $.fn.nbaTakeover = function(options) {

    var optionDefaults = {
			openEvent : ['string', 'click'],
      toggleSelector : ['string', '.toggle'],
			showOnLoad : ['boolean', false],
			showOnLoadDuration : ['number', 20], // Seconds
			showOnLoadRepeatDelay : ['number', 2] // Minutes
    };

    return this.each(function() {
			var $this = $(this);
			var options = $.extend(options, $.nbaGetOptions($(this), optionDefaults));

      $this.takeover({
        event: options["openEvent"],
        toggle: options["toggleSelector"],
        showOnLoad: options["showOnLoad"],
        openDurationSeconds: options["showOnLoadDuration"],
        cookieDurationDays: options["showOnLoadRepeatDelay"]
      });
    });

  };


	$.fn.nbaTabs = function(options) {
	
		var optionDefaults = {			
			navSelector : ["string", ''],
			contentSelector : ["string", ''],
			currentClass : ["string", 'current'],
			hoverNavClass : ["string", 'hover'],
			transition : ["string", 'none'],
			auto : ["number", 0],
			duration : ["number", .2],
			navEnabled : ["boolean", true],
			defaultTab : ["string", '1']
		}; 

		return this.each(function() {

			var $this = $(this);
			var options = $.extend(options, $.nbaGetOptions($(this), optionDefaults));
			
			if (!options["navSelector"]) { return; }
		
			var numberOfNavItems = $(options["navSelector"]).length;
			var initialIndex = (options["defaultTab"] == "random" ? Math.floor(Math.random() * numberOfNavItems) : new Number(options["defaultTab"]) - 1);
			$this.Tabs({
				index : initialIndex,
				current : options["currentClass"],
				hover : options["hoverNavClass"],
				effect : options["transition"],
				duration : options["duration"] * 1000,
				tabs : options["contentSelector"],
				navs : options["navSelector"]
			});
					
		});
	}


	/*** NBA SCROLLER **/

	$.fn.nbaScroller = function(options) {
	
		var optionDefaults = {
			prevSelector : ['string', ''],
			nextSelector : ['string', ''],
			tocSelector : ['string', ''], 
			viewportSelector : ['string', '.scroller_viewport'],
			holderSelector : ['string', '.scroller_item'],
			panelSelector : ['string', '.scroller_items'],

			panelHoverClass : ['string', 'highlighted'],
			activeTocClass : ['string', 'active'],
		   enabledNavClass : ['string', 'enabled'],
			disabledNavClass : ['string', 'disabled'],
			hoverNavClass : ['string', 'hover'],

			effect : ['string', 'sinoidal'],
			navEnabled : ['boolean', true],
			wrap : ['boolean', false],
			autoScroll : ['boolean', false],
			scroll : ['number', 1],
			duration : ['number', 1],
			defaultPanel : ['number', 1]
		};

		return this.each(function() {

			var $this = $(this);
			var options = $.extend(options, $.nbaGetOptions($(this), optionDefaults));
			if ($this.css('display')=='none') return;

			var $panel = $this.find(options.panelSelector).hover(function() {$(this).toggleClass(options.panelHoverClass)})

			var $toc = null;
			if (options.tocSelector != '') { 
				var pages = Math.ceil($panel.length/options.scroll);
				$toc = $this.find(options.tocSelector).Toc({pages:pages}); 
			}

			var $prev  = $this.find(options.prevSelector).hover( function() {
				$(this).toggleClass(options.hoverNavClass)
			}).click(function(){
				if($toc) { $toc.Toc('prev'); }

				$this.Scroller('prev')
			});

			var $next  = $this.find(options.nextSelector).hover( function() {
				$(this).toggleClass(options.hoverNavClass)
			}).click(function(){
				if($toc) { $toc.Toc('next'); }
				$this.Scroller('next');
			});

			var callback = function(e) {
				if (e.disabled) {
					$prev.toggleClass(options.disabledNavClass);
					$next.toggleClass(options.disabledNavClass);
					return;
				}
				if (!e.options.wrap) {
					$prev.toggleClass(options.disabledNavClass, e.at.first);
					$next.toggleClass(options.disabledNavClass, e.at.last);
				}
			}

			$this.Scroller({
				viewport: options.viewportSelector,
				holder: options.holderSelector,
				panels: options.panelSelector,
				navEnabled : options.navEnabled,
				wrap: options.wrap,
				scroll : options.scroll,
				callback : callback
			});

		});
	}
	

	/*** NBA TOP STORY ***/

	$.fn.nbaTopStory = function(options) {

		var optionDefaults = {			
			navSelector : ["string", ''],
			contentSelector : ["string", ''],
			currentClass : ["string", 'current'],
			hoverNavClass : ["string", 'hover'],
			transition : ["string", 'none'],
			auto : ["number", 0],
			duration : ["number", .2],
			navEnabled : ["boolean", true],
			defaultTab : ["string", '1']
		};
	
		return this.each(function() {

			var $this = $(this);
			var options = $.extend(options, $.nbaGetOptions($(this), optionDefaults));
			
			if (!options["navSelector"]) { return; }
		
			var numberOfNavItems = $(options["navSelector"]).length;
			var initialIndex = (options["defaultTab"] == "random" ? Math.floor(Math.random() * numberOfNavItems) : new Number(options["defaultTab"]) - 1);

			var callback = $.noop;

/*
			var setVideo = function($tabs) {
				$tabs.find('.play_video').html("");
				var $tab = $tabs.find('.top_story_items .'+options.currentClass)
				if (!$tab.hasClass('play_video')) return;
				var data = $tab.data('kal');
				var id = data.id;
			
				$('<div></div>').attr('id', data.id).appendTo($tab);
		
				swfobject.embedSWF(
					data.href, 
					data.id, 
					"670", 
					"377", 
					"9.0.0", 
					false, 
					{
						entryid : data.id,
						externalInterfaceDisabled : "false",
						autoPlay: "false"
					}, 
					{ 
						allowScriptAccess: "always",
						allowNetworking: "all",
						allowFullScreen: "true",
						wmode: "transparent",
						autoPlay: "false"
					},
					{
						name : data.id,
						allowFullScreen : "true",
						allowNetworking : "all",
						allowScriptAccess : "always", 
						height : "670", 
						width : "377",
						data : "http://www.kaltura.com/kwidget/wid/_192572/ui_conf_id/1703742"
					}
				);

			}
*/
			if (!!options.auto) {
 
				var autoActive = true;

				var si = setInterval(function() {
					$this.data('nextTab')();
				}, options.auto*1000);

				var scroller = $this.find('.scrollerModule');

				var eventSelectors = [
					options["navSelector"], 
					options["contentSelector"], 
					scroller.attr('prevselector'), 
					scroller.attr('nextselector')
				].join(",");

				var scrollAmt = new Number(scroller.attr("scroll"))+0 || 1;


				callback = function($tab) {
					if (!autoActive) return;
					var currIndex = $tab.find('.'+options.currentClass).index();
					var shouldScroll = (Math.ceil((currIndex+1)/scrollAmt) != Math.ceil((currIndex)/scrollAmt));
					if (shouldScroll) { scroller.Scroller('next') }
				//	setVideo($tab);
				}

				$this.find(eventSelectors).click(function(event){ $(this).unbind(event); clearInterval(si); autoActive=false;})
			} else {
			//	callback = setVideo;
			}

			$this.Tabs({
				index : initialIndex,
				current : options["currentClass"],
				hover : options["hoverNavClass"],
				effect : options["transition"],
				duration : options["duration"] * 1000,
				tabs : options["contentSelector"],
				navs : options["navSelector"],
				callback : callback
			});


			// find top story video tabs
			$videos = $this.find('.top_story_items .play_video');
			// embed videos
/*
			$videos.each(function() { 
				var href = $.trim($(this).contents().filter(function(){ return(this.nodeType == 3); }).text());
				var id = href.match(/([\w]+)$/);
				if (!id) return;
				id = id[1];
				$(this).data('kal', {id:id, href:href});
				$(this).contents().remove();
			})
*/
		//	setVideo($this);
/*

*/


		})
	
	}

})(jQuery);
