/*20120215-1537*/

modMan.namespaces.create('scoreboardTicker', function ($, CONTEXT_DATA, TOOLS){

	var ScoreboardTicker = this;

	var container = null,
		settings = {
			selector: '.scoreboard-ticker',
			json: {
				//url: 'http://hlg.trrsf.com.br/atm/3/sports/scoreboard/ticker/_js/test.json',
				url: 'http://p1.trrsf.com/contentAPI/get?prd=live&srv=getListGamesResults&contentType=json&callback=json_scoreboard_ticker&country=BR',
				wrapperName: 'json_scoreboard_ticker'
			},
			defaultChampionshipId: null,
			vocabulary: {
				pt: {
					finished: 'Encerrado',
					finishedWithPenaltis: 'Final com pênaltis',
					tabs: {
						open: 'Acompanhe os jogos',
						closed: 'Últimos resultados'
					},
					allChampionships: 'Todos os campeonatos',
					filterBy: 'filtrar por:',
					europeanFootball: 'Futebol Europeu',
					live: 'ao vivo',
					minuteByMinute: 'minuto a minuto'
				},
				es: {
					finished: 'Finalizado',
					finishedWithPenaltis: 'Definición por penales',
					tabs: {
						open: 'Sigue los partidos',
						closed: 'Ultimos resultados'
					},
					allChampionships: 'Todos los campeonatos',
					filterBy: 'filtrar por:',
					europeanFootball: 'Fútbol Europeo',
					live: 'en vivo',
					minuteByMinute: 'minuto a minuto'
				},
				en: {
					finished: 'Finished',
					finishedWithPenaltis: 'Decided on penalties',
					tabs: {
						open: 'Follow the games',
						closed: 'Latest Results'
					},
					allChampionships: 'All championships',
					filterBy: 'filter by:',
					europeanFootball: 'European Football',
					live: 'live',
					minuteByMinute: 'minute by minute'
				}
			},
			interval: 60 * 1000
		},
		cachedData = null,
		tab = 'open',
		championshipId = null,
		carousel = null,
		containerCarousel = null;

	// filter vocabulary by language
	settings.vocabulary = settings.vocabulary[modMan.globals.page.lang];

	jQuery.extend(this, {

		init: function (config) {

			settings = $.extend(settings, config);
			container = $(settings.selector);

			if (container.length === 0) {
				return;
			}

			containerCarousel = container.find('.scoreboard-ticker-carousel');

			// request dependencies
			modMan.require.files({
				dependencies: [
					'http://s1.trrsf.com.br/atm/3/core/_js/jquery.trrListCarousel.js',
					'http://s1.trrsf.com.br/atm/3/core/_js/jquery.droplist.js',
					'http://s1.trrsf.com.br/atm/3/core/_js/jquery.mousewheel.js',
					'http://s1.trrsf.com.br/atm/3/core/_js/jquery.jScrollPane.js'
				],
				success: function () {
					ScoreboardTicker.getData();
					ScoreboardTicker.timer();
				}
			});

		},

		tabs: (function (){

			var ctnTabs = null;

			return {

				create: function (counter) {

					var html = '',
						generateItem;

					ctnTabs = container.find('.scoreboard-ticker-tabs');
					ctnTabs.find('ul').remove();

					// helper
					generateItem = function (scopedTab, vocabulary) {

						if (counter[scopedTab] > 0) {
							return '<li class="' + ((tab == scopedTab) ? 'selected' : 'regular') + '"><a href="#' + scopedTab + '">' + vocabulary + '</a></li>';
						}

						return '';

					};

					// markup
					html += '<ul>';
					html += generateItem('open', settings.vocabulary.tabs.open);
					html += generateItem('closed', settings.vocabulary.tabs.closed);
					html += '</ul>';

					// append
					ctnTabs.append(html);

					// apply events
					ScoreboardTicker.tabs.events();

					// create droplist
					ScoreboardTicker.droplist.create();

				},

				events: function () {

					container.find('.scoreboard-ticker-tabs li').bind('click', function (e) {
						e.preventDefault();

						// reset
						championshipId = null;

						// style
						$(this).addClass('selected').siblings().removeClass('selected');

						// set status
						tab = $(this).find('a').attr('href').match(/\w+$/g);

						// interface
						ScoreboardTicker.droplist.create();
						ScoreboardTicker.mountInterface();

					});

				}

			};

		}()),

		droplist: (function (){

			var ctnDroplist;

			return {

				create: function () {

					var html = '',
						champs = ScoreboardTicker.treatData.champs(cachedData),
						champ,
						match,
						i,
						j,
						show,
						totalShown = 0,
						european;

					// get container
					ctnDroplist = container.find('.ctn-droplist');
					ctnDroplist.empty();

					// markup
					html += '<p>' + settings.vocabulary.filterBy + '</p>';
					html += '<ul class="droplist">';
					html += '<li><a href="#">' + settings.vocabulary.allChampionships + '</a></li>';

					// loop champs
					for (i = 0; i < champs.length; i = i + 1) {
						champ = ScoreboardTicker.treatData.champ(champs[i]);

						show = false;

						// loop matches
						for (j = 0; j < champ.matches.length; j = j + 1) {

							match = ScoreboardTicker.treatData.match(champ.matches[j]);

							if (match.tab == tab) {
								show = true;
								totalShown = totalShown + 1;
							}

						}

						if (show && champ.name !== undefined) {
							html += '<li><a href="#' + champ.id + '">' + champ.name + '</a></li>';
						}

					}

					european = ScoreboardTicker.treatData.european();
					if (european.active == 1) {
						html += '<li class="european"><a href="#">' + settings.vocabulary.europeanFootball + '</a></li>';
					}

					html += '</ul>';

					if (totalShown > 0) {

						ctnDroplist.append(html);
						ScoreboardTicker.droplist.customize();

					}

				},

				customize: function () {

					ctnDroplist.find('ul').droplist({
						customScroll: true,
						height: 120
					}, ScoreboardTicker.droplist.afterCustomize);

				},

				afterCustomize: function () {

					// set item to show championship name after reload
					if (championshipId) {
						this.set(ctnDroplist.find('li a[href$="#' + championshipId + '"]').parent());
					}

					// attach events
					ScoreboardTicker.droplist.events(this);

				},

				setChampionshipId: function (obj) {
					championshipId = parseInt(obj.get().match(/\d+$/g), 10) || null;
				},

				events: function (obj) {

					var el = null;

					obj.list.find('li').bind('click', function (evt) {
						evt.preventDefault();

						el = $(this);

						if (el.hasClass('european')) {
							window.location.href = ScoreboardTicker.treatData.european().url;
							return false;
						}

						obj.set(el);
						obj.close();

						ScoreboardTicker.droplist.setChampionshipId(obj);
						ScoreboardTicker.mountInterface();

					});

				}

			};

		}()),

		getData: function (config) {

			var options = {
				wrapperName: settings.json.wrapperName,
				url: settings.json.url,
				cache: false,
				callback: function (response) {

					// error
					if (response.error === true) {
						modMan.log.critical(response.error);
						return false;
					}

					// cache
					cachedData = response;

					// mount
					ScoreboardTicker.mountInterface();

					// remove loading
					container.removeClass('loading');

				}
			};

			modMan.tools.jsonP(options);

		},

		treatData: (function (){

			return {

				champs: function (data) {

					var arr = data.ESPORTES.CAMPEONATOS.CAMPEONATO;

					return (arr.length === undefined) ? [arr] : arr;

				},

				champ: function (data) {

					data.id = data.ID;
					data.name = data['NOME_' + modMan.globals.page.lang.replace('pt', 'br').toUpperCase()];

					data.matches = data.PARTIDAS.PARTIDA;
					data.matches = (data.matches.length === undefined) ? [data.matches] : data.matches;

					return data;

				},

				match: function (data) {

					// date
					data.date = data.DATAHORA;
					data.splitedDate = data.date.match(/\d+/g);
					data.readableDate = data.splitedDate[2] + '/' + data.splitedDate[1] + '/' + data.splitedDate[0];
					data.readableTime = data.date.match(/ .{5}/g);
					data.datetime = parseInt(data.date.replace(/\D*/gi, ''), 10);

					switch (data.STATUS) {
					case 'W':
						data.status = 'future';
						data.tab = 'open';
						break;
					case 'L':
						data.status = 'live';
						data.tab = 'open';
						break;
					case 'F':
						data.status = 'finished';
						data.tab = 'closed';
						break;
					}

					// narration related
					data.narration = data.NARRACOES[modMan.globals.page.country];
					if (data.narration !== undefined) {
						data.url = data.URL[modMan.globals.page.country].URL_EVENTO;
						data.hasVideo = (data.URL[modMan.globals.page.country].VIDEO !== undefined) ? true : false;
						data.order = parseInt(('00' + (data.narration.P || '99')).match(/\d{2}$/g)[0], 10);
						data.orderReversed = 99 - data.order;
					}

					// other
					data.info =  data.STATUS_PARTIDA['STATUS_PARTIDA_' + modMan.globals.page.lang.toUpperCase()];
					data.infoId = data.STATUS_PARTIDA.STATUS_ID;
					data.penaltis = (data.infoId == 8);

					// home team
					data.home = data.EQUIPES.MANDANTE;
					data.home.flag = data.home.BANDEIRA;
					data.home.name = data.home['NOME_' + modMan.globals.page.lang.replace('pt', 'br').toUpperCase()];
					data.home.score = {
						regular: data.RESULTADO.PLACAR_MANDANTE + '',
						penalty: data.RESULTADO.PENALTI_MANDANTE + ''
					};

					// away team
					data.away = data.EQUIPES.VISITANTE;
					data.away.flag = data.away.BANDEIRA;
					data.away.name = data.away['NOME_' + modMan.globals.page.lang.replace('pt', 'br').toUpperCase()];
					data.away.score = {
						regular: data.RESULTADO.PLACAR_VISITANTE + '',
						penalty: data.RESULTADO.PENALTI_VISITANTE + ''
					};

					return data;

				},

				european: function () {

					var european = {};

					european = cachedData.ESPORTES.EUROPEU;
					european.active = european.ATIVO;
					european.text = european.TEXTO;
					european.url = european.URL;

					return european;

				}

			};

		}()),

		countEventsByType: function (champs) {

			var i,
				j,
				champ,
				match,
				counter = {
					open: 0,
					closed: 0
				};

			for (i = 0; i < champs.length; i = i + 1) {
				champ = ScoreboardTicker.treatData.champ(champs[i]);

				for (j = 0; j < champ.matches.length; j = j + 1) {
					match = ScoreboardTicker.treatData.match(champ.matches[j]);

					if (match.narration !== undefined) {
						counter[match.tab] = counter[match.tab] + 1;
					}

				}
			}

			return counter;

		},

		updateStatus: function (counter) {

			if (counter[tab] === 0) {
				if (counter.open === 0) {
					tab = 'closed';
				}
			}

			return status;

		},

		mountInterface: function () {

			var data,
				html = '',
				i,
				j,
				champs = ScoreboardTicker.treatData.champs(cachedData),
				champ,
				european,
				match,
				counter = ScoreboardTicker.countEventsByType(champs),
				collection = [],
				isDefaultId;

			html += '<ul>';

			// update status
			ScoreboardTicker.updateStatus(counter);

			// european
			european = ScoreboardTicker.treatData.european();

			if (european.active == 1 && championshipId === null && status != 'F') {

				html += '<li class="item-soccer item-european">';
				html += '<div class="content">';
				html += '<p class="title"><a href="' + european.url + '">' + settings.vocabulary.europeanFootball + '</a></p>';
				html += '<p class="text">' + european.text + '</p>';
				html += '<p class="ico"><a href="' + european.url + '"><em class="ico-hed ico-hed-minmin">minuto a minuto</em></a></p>';
				html += '</div>';
				html += '</li>';

			}

			// loop champs to feed collection
			for (i = 0; i < champs.length; i = i + 1) {
				champ = ScoreboardTicker.treatData.champ(champs[i]);

				isDefaultId = settings.defaultChampionshipId === champ.id;

				// filter by champ?
				if (championshipId === null || championshipId === champ.id || isDefaultId) {

					if (isDefaultId){
						championshipId = settings.defaultChampionshipId;
						settings.defaultChampionshipId = null;
					}

					// loop matches
					for (j = 0; j < champ.matches.length; j = j + 1) {

						match = ScoreboardTicker.treatData.match(champ.matches[j]);
						match.champ = champ;

						if (tab == match.tab && match.narration !== undefined) {
							collection.push(match);
						}

					}

				}

			}

			// group by datetime and order by "order" property
			collection.sort(function (a, b) {

				if (a.datetime == b.datetime) {
					return a.order > b.order ? 1 : -1;
				}
				else {
					return a.datetime - b.datetime;
				}

			});

			// loop collection
			for (i = 0; i < collection.length; i = i + 1) {

				match = collection[i];

				// mount
				html += '<li class="item-soccer">';
					html += '<div class="content">';

					// first line
					html += '<p class="status">';

						if ((match.penaltis) && (match.status == 'finished') || (match.home.score.penalty > 0) || (match.away.score.penalty > 0)) {
							html += settings.vocabulary.finishedWithPenaltis;
						}
						else if (match.status == 'live') {
							html += match.info;
						}
						else if (match.status == 'finished') {
							html += settings.vocabulary.finished;
						}
						else {
							html += match.readableTime;
						}

						if ((match.penaltis) && (match.home.score.penalty > 0) || (match.away.score.penalty > 0)) {
							html += '&nbsp;&nbsp;|&nbsp;&nbsp;' + match.home.score.penalty + ' x ' + match.away.score.penalty;
						}

					html += '</p>';

					// teams
					html += '<p class="shields">';

					html += '<img src="' + match.home.flag + '" alt="' + match.home.name + '" title="' + match.home.name + '" />';

					if (match.home.score.regular != 'undefined') {
						html += '&nbsp;' + match.home.score.regular;
					}

					html += '<span>&nbsp;x&nbsp;</span>';

					if (match.away.score.regular != 'undefined') {
						html += match.away.score.regular + '&nbsp;';
					}

					html += '<img src="' + match.away.flag + '" alt="' + match.away.name + '" title="' + match.away.name + '" />';

					html += '</p>';

					// live or minmin icons
					if (match.hasVideo) {
						if ((match.status === 'future')) {
							html += '<p><a href="' + match.url + '"><em class="ico-hed ico-hed-live ico-hed-live-disabled">' + settings.vocabulary.live + '</em></a></p>';
						}
						if ((match.status === 'live') || (match.status === 'finished')) {
							html += '<p><a href="' + match.url + '"><em class="ico-hed ico-hed-live">' + settings.vocabulary.live + '</em></a></p>';
						}
					}
					if (match.url) {
						if ((match.status === 'future')) {
							html += '<p><a href="' + match.url + '"><em class="ico-hed ico-hed-minmin ico-hed-minmin-disabled">' + settings.vocabulary.minuteByMinute + '</em></a></p>';
						}
						if ((match.status === 'live') || (match.status === 'finished')) {
							html += '<p><a href="' + match.url + '"><em class="ico-hed ico-hed-minmin">' + settings.vocabulary.minuteByMinute + '</em></a></p>';
						}
					}

					// layer
					html += '<div class="layer">';
						html += '<span class="arrow"></span>';
						html += '<p>' + match.champ.name + '</p>';
						html += '<p>';

							html += '<span class="highlight">' + match.home.name + '</span>';

							if ((match.penaltis) && (match.home.score.penalty != 'undefined') && (match.home.score.penalty > 0) || (match.away.score.penalty > 0)) {
								html += '&nbsp;&nbsp;(' + match.home.score.penalty + ')';
							}

							if (match.home.score.regular != 'undefined') {
								html += '&nbsp;&nbsp;<span class="highlight">' + match.home.score.regular + '</span>';
							}

							html += '&nbsp;x&nbsp;';

							if (match.away.score.regular != 'undefined') {
								html += '<span class="highlight">' + match.away.score.regular + '</span>&nbsp;&nbsp;';
							}

							if ((match.penaltis) && (match.away.score.penalty != 'undefined') && (match.home.score.penalty > 0) || (match.away.score.penalty > 0)) {
								html += '(' + match.away.score.penalty + ')&nbsp;&nbsp;';
							}

							html += '<span class="highlight">' + match.away.name + '</span>';

						html += '</p>';

						// date and time
						html += '<p>' + match.readableDate + '&nbsp;&nbsp;|&nbsp;&nbsp; ' + match.readableTime;

						// status
						if (match.penaltis && match.status == 'finished') {
							html +=  '&nbsp;&nbsp;|&nbsp;&nbsp;' + settings.vocabulary.finishedWithPenaltis;
						}
						else if (match.status == 'finished') {
							html +=  '&nbsp;&nbsp;|&nbsp;&nbsp;' + settings.vocabulary.finished;
						}
						else if (match.info && match.status != 'future') {
							html += '&nbsp;&nbsp;|&nbsp;&nbsp;' + match.info;
						}

						html += '</p>';

					html += '</div>';
					// end layer

					html += '</div>';
				html += '</li>';

			}

			html += '</ul>';

			ScoreboardTicker.tabs.create(counter);
			ScoreboardTicker.render(html);
			ScoreboardTicker.carousel();

		},

		render: function (html) {

			var el = container.find('.scoreboard-ticker-carousel');
			el.html('<a class="prev" href="#"></a><a class="next" href="#"></a>' + html);

		},

		timer: function () {

			window.setInterval(function () {
				ScoreboardTicker.getData();
			}, settings.interval);

		},

		carousel: function () {

			carousel = containerCarousel.find('ul').trrListCarousel({
				scrollAmount: 765,
				duration: 350,
				previousButtonSelector: '.scoreboard-ticker .prev',
				nextButtonSelector: '.scoreboard-ticker .next'
			});

			ScoreboardTicker.createLayers();

		},

		createLayers: function () {

			var remove,
				removeAll,
				layer = null,
				layerLeft = 0,
				CONTAINER_PADDING_LEFT = 24,
				ITEM_WIDTH = 153,
				trrCtnContent = $('#trr-ctn-content');

			removeAll = function () {

				containerCarousel.find('.selected').removeClass('selected');
				container.find('> .layer').remove();

				trrCtnContent.css('position', 'static').css('z-index', '0');

			};

			carousel.$interface.items.bind('mouseenter', function (evt) {
				evt.stopPropagation();

				remove = false;
				removeAll();

				// must be on top of advertising
				trrCtnContent.css('position', 'relative').css('z-index', '996');

				$(this).addClass('selected');

				// clone and append
				layer = $(this).find('.layer').clone();
				container.append(layer);

				// recover element
				layer = container.find('> .layer');

				// events
				layer.bind('mouseenter', function (evt) {
					evt.stopPropagation();

					remove = false;

				}).bind('mouseleave', function (evt) {
					evt.stopPropagation();

					removeAll();

				});

				// position it
				layerLeft = CONTAINER_PADDING_LEFT + $(this).position().left + parseInt(carousel.$interface.listContainer.css('left'), 10) + ((ITEM_WIDTH - layer.outerWidth()) / 2);

				if (layerLeft < 0) {
					layerLeft = 0;
				}

				layer.css('left', layerLeft).css('display', 'none').fadeIn(350);

			}).bind('mouseleave', function (evt) {
				evt.stopPropagation();

				remove = true;

				window.setTimeout(function () {
					if (remove) {
						removeAll();
					}
				}, 300);

			});

		}

	});

	this.startCommonBehaviors = function(){
		this.init();
	};

});
