(function($, window, document){

	$.videoselector = (function(){
		var API_GET = 'get';
		var CLASS = 'videoselector';
		var _settings;
		var _page = 0;
		var _visibleWidth;
		var _contentWidth;
		var _numpages;
		var _itempadding;
		var __construct = function(container)
		{
			var track = _track.init();
			container.addClass(CLASS).css({'position':'relative', 'overflow':'hidden'}).append(track);
			_css();
			_visibleWidth = container.width() - track.find('.previous').outerWidth() - track.find('.next').outerWidth();
			track.find('.next').bind({
				click : function(e)
				{
					_setPage(Number(_page)+1);
				}
			});
			track.find('.previous').bind({
				click : function(e)
				{
					_setPage(Number(_page)-1);
				}
			});
		};
		var _setVideoID = function(video_id)
		{
			_track.setSelected(video_id);
		};
		var _setPage = function(page)
		{
			if (page < 0 || page > _numpages)
				return;
			_page = page;
			_track.move(_page);
		};
		var _get = function()
		{
			$.get(_settings.api + API_GET + '/' + _parseConditions() , function(d){
				_track.setContent(d);
				if (typeof(_settings.onLoad) == 'function')
					_settings.onLoad();
			});
		};
		var _css = function()
		{
			$('.videoselector').css( {'text-align':'left', '--background-color':'#000'});
			$('.videoselector .track .previous, .videoselector .track .next').css({'top':'0', 'width':'50px', 'height':'100%', 'position':'absolute', 'z-index':'1', 'background-color':'#000', 'cursor':'pointer'});
			$('.videoselector .track .previous div.sprite, .videoselector .track .next div.sprite').css({'background':'url(http://media.rockstargames.com/products/rockstar/video_selector/assets/img/global/arrows.png) no-repeat', 'width':'13px', 'height':'17px', 'position':'absolute', 'top':'35px', 'left':'50%', 'margin-left':'-6px'});
			$('.videoselector .track .previous:hover div.sprite').css({'background-position':'0 -17px'});
			$('.videoselector .track .next div.sprite').css({'background-position':'-13px 0'});
			$('.videoselector .track .next:hover div.sprite').css({'background-position':'-13px -17px'});
			$('.videoselector .track .previous').css({'left':'0'});
			$('.videoselector .track .next').css({'right':'-2px'});
			$('.videoselector .track ul').css({'margin':'0', 'padding':'0 50px', 'list-style':'none', '___width':'100%', 'position':'relative'});
			$('.videoselector .track ul li').css({'width':'160px', 'display':'inline-block', zoom:1, '*display':'inline', 'vertical-align':'top', cursor:'pointer'});
			$('.videoselector .track ul li.last').css({'margin-right':'0'});
			$('.videoselector .track ul li img').css({border:'2px solid transparent'});
			$('.videoselector .track ul li span.title').css({'font-size':'11px', 'margin-top':'3px', display:'block', 'text-transform':'uppercase', 'font-weight':'bold', 'text-align':'center'});
			$('.videoselector .track ul li.selected span.title').css({'color':'#f00'});
		
		};
		var _parseConditions = function()
		{
			var cond = [];
			for (var a in _settings.conditions)
				cond.push(a+"="+_settings.conditions[a]);
			cond = cond.join('&');
			return "?"+cond;
		};
		var _config = function(c)
		{
			if (typeof(c.api) === 'undefined')
				return;
			_settings = c;
		};
		var _track = (function(){
			var instance;
			var selected_video_id;
			var __construct = function()
			{
				instance = $('<div />').addClass('track').append(_leftArrow()).prepend(_rightArrow());
				return instance;
			};
			var _setContent = function(content)
			{
				if (typeof(instance) === 'undefined')
					return;
				instance.append(content);
				_css();
				instance.find('li.video').bind({
					click : function()
					{
						if (typeof(_settings.onClick) == 'function')
							_settings.onClick($(this).attr('video_id'));
					}
				});
				var item = instance.find('li:eq(0)');
				var totalitems = instance.find('li').length;
				var itemwidth = item.outerWidth(true);
				_itempadding = parseInt(item.css('margin-right'));
				var itemsperpage = Math.floor((_visibleWidth+_itempadding)/itemwidth);
			
				_numpages = totalitems/itemsperpage;
				if (_numpages <= 1)
				{
					instance.find('.previous').css({'visibility':'hidden'});
					instance.find('.next').css({'visibility':'hidden'});
					instance.find('ul').css({'margin':'0 auto'});
				}
				var p = -1;
				instance.find('li').each(function(){
					var m = $(this).index()%itemsperpage;
					if (m == 0)
						p++;
					$(this).attr('page', p);
					if (Number($(this).index())+1 == $(this).parent().children().length)
						$(this).addClass('last');
				});
				_contentWidth = itemwidth * totalitems + instance.find('.previous').outerWidth(true) + instance.find('.next').outerWidth(true);
				instance.find('ul').css({'width':_contentWidth + "px"});
			};
			var _leftArrow = function()
			{
				return $('<div />').addClass('previous').append($('<div />').addClass('sprite'));
			};
			var _rightArrow = function()
			{
				return $('<div />').addClass('next').append($('<div />').addClass('sprite'));
			};
			return {
				init : function()
				{
					return __construct();
				},
				setContent : function(content)
				{
					_setContent(content);
				},
				setSelected : function(video_id)
				{
					if (typeof(selected_video_id) != 'null')
						instance.find('li.video[video_id='+selected_video_id+']').removeClass('selected');
					selected_video_id = video_id;
					var li = instance.find('li.video[video_id='+selected_video_id+']').addClass('selected');
					$.videoselector.setPage(li.attr('page'));
				},
				move : function(page)
				{
					var item = instance.find('ul').find('li[page="'+page+'"]:eq(0)');
					if (typeof(item) === 'undefined')
						return;
					var off = Number(item.position().left - instance.find('.previous').width())*-1;
					instance.find('ul').stop(true).animate({'left':off + 'px'}, 250);
				}
			}
		})();
		return {
			init : function(container){
				return __construct(container);
			},
			get : function()
			{
				_get();
			},
			config : function(config)
			{
				_config(config);
			},
			showVideo : function(video_id)
			{
				_setVideoID(video_id);
			},
			settings : function()
			{
				return _settings;
			},
			setPage : function(page)
			{
				_setPage(page);
			},
			updateFromAddress : function()
			{
				var video = $.address.parameter('video');
				if (typeof(video) !== 'undefined')
					_setVideoID(video);
			},
			getYoutubeId : function(video_id)
			{
				var youtube_id = $(".videoselector .track ul li.video[video_id="+video_id+"]").attr('youtube');
				return youtube_id;
			}
		}
	})();

})(jQuery, window, document);
