var TVNTIME = {

	globals: {
		serverOffset: '1'
	},

	start: function() {
		this.getServerTime();
	},

	getServerTime: function() {
		var root = this;

		$.get("/time", function(data) {
			TVNTIME.globals.serverTime = Date.parse(data);
			root.getClientOffset();
		});
	},

	getClientOffset: function() {
		var root = this;

		// Time calculations
		var serverTime = TVNTIME.globals.serverTime,
			serverOffset = parseInt(TVNTIME.globals.serverOffset);

		if(typeof TVNTIME.globals.epgOffset != 'undefined') {
			var	epgOffset = parseInt(TVNTIME.globals.epgOffset),
				clientOffset = parseInt($.cookie('timeZoneOffset'));
		} else {
			var clientOffset = 0;
		}

		// Global variables
		if(clientOffset == 0 || typeof clientOffset == 'undefined') {
			TVNTIME.globals.programOffset = 0;
		} else {
			TVNTIME.globals.programOffset = (clientOffset - epgOffset);
		}
		TVNTIME.globals.clientTime = (serverTime.clone().addHours(- serverOffset + clientOffset));

		// Timezone specific functions (for two channels)
		function runTimeSpecificFunctions() {
			if(TVNTIME.globals.showTimeCity) {
				root.specific.showTimeCity();
			}
			if(TVNTIME.globals.changeOffset) {
				root.specific.changeOffset();
			}
		}

		// Timezone releated functions (for all channels)
		function runTimeReleatedFunctions() {
			if(TVNTIME.globals.programSidebar) {
				root.releated.programSidebar();
			}
			if(TVNTIME.globals.showNearestTransmission) {
				root.releated.showNearestTransmission();
			}
		}

		// Run time specific/releated functions
		if(typeof TVNTIME.globals.epgOffset != 'undefined') {
			runTimeSpecificFunctions();
		}
		runTimeReleatedFunctions();
	},

	specific: {
		changeOffset: function() {
			var offset = TVNTIME.globals.programOffset;

			dates = $('.timeOffset').each(function() {
				$target = $(this);
				nd = Date.parse($(this).find('em').text());
				if(parseInt($.cookie('timeZoneOffset'))==11){ //only if melbourne is selected and time offset is 11 hours
					nd.addHours(parseInt($("#melbournePolandDifference").text(),10));
				}else{
					nd.addHours(offset);
				}
				$target.html(nd.toString("H:mm") + '<em style="display: none;">' + nd.toString("yyyy-MM-dd HH:mm:ss") + '</em>');
			});
		},

		showTimeCity: function() {
			var $links = $('.changeTimeZone a');

			function getOffset(el) {
				var $that = el,
					start = $that.attr('href').search(/offset\[/) + 7,
					end = $that.attr('href').search(/\]city/);

				offset = $that.attr('href').substring(start,end);
				return offset;
			}

			function getCity(el) {
				var $that = el,
					start = $that.attr('href').search(/city\[/) + 5,
					end = $that.attr('href').length - 1;

				city = $that.attr('href').substring(start,end);
				return city;
			}

			$links.each(function() {
				var $that = $(this),

				offset = getOffset($that);
				city = getCity($that);
				if(offset == $.cookie('timeZoneOffset') && city == $.cookie('timeZoneCity')) {
					$('.changeTimeZone dt span').html($(this).text());
				}
			});

			$links.bind('click', function(e) {
				var europeSubdomain = TVN.globals.domainEurope,
					usaSubdomain = TVN.globals.domainUsa;

				var off = getOffset($(this));
				var city = getCity($(this));
				$.cookie('timeZoneOffset', off, {path: '/', domain: TVN.globals.idomain});
				$.cookie('timeZoneCity', city, {path: '/', domain: TVN.globals.idomain});
				if(off < 0){
					window.location = 'http://' + usaSubdomain + location.pathname;
				} else {
					window.location = 'http://' + europeSubdomain + location.pathname;
				}
				e.preventDefault();
			});
		}
	},

	releated: {
		programSidebar: function() {
			var definitions = $('#telecastBox').find('dt'),
				descriptions = $('#telecastBox').find('dd'),
				curTimer = false;

			definitions.toggleClass("on");
			definitions.next().addClass("hidden");

			function initScript() {
				showActualPrograms(TVNTIME.globals.clientTime);
				programMenu();
				bindDefinitions();
				scrollProgram();
			}

			function showActualPrograms(currentDate) {
				var cur = currentDate,
					$actual = [],
					$all = [];

				$actual = [];
				$all = [];

				$('.telecastTime').each(function() {
					d = Date.parse($(this).find('em').text());

					$all.push(d);
					if(cur.compareTo(d) < 0) {
						$actual.push(d);
					}
				});

				for ( var int = 0; int <= (Math.floor(($all.length - $actual.length) / 3) - 1); int++) {
					$('#telecastBox dt.active').next().hide().addClass('hidden');

					var test = $('#telecastBox dt.disabled:lt(3)').removeClass("disabled"),
					test2 = $('#telecastBox dt.active').removeClass("active");

					test2.addClass("disabledd");
					test.addClass("active");
				}
			}

			function programMenu() {
				var today = TVNTIME.globals.clientTime,
					counted = today.clone();

				$('#telecastMenu a').unbind('click').bind('click', function(e) {
					var that = $(this);

					$.ajax({
						type: 'GET',
						url: this.href,
						success: function(data) {
							$('#sideBar').empty().append(data);

							$('#telecastBox').find('dt').toggleClass("on");
							$('#telecastBox').find('dt').next().addClass("disabled");
							programMenu();
							bindDefinitions();
							scrollProgram();

							var dayOffset = parseInt(that.attr('href').split('/')[1]);

							switch (dayOffset) {
								case 1:
									var date = counted.add(1).days();
								break;
								case 2:
									var date = counted.add(2).days();
								break;
								default:
									var date = counted;
							}

							showActualPrograms(date);
						}
					});
					e.preventDefault();
				});
			}

			function bindDefinitions() {
				$('#telecastBox').find('dt').unbind('click').bind('click', function(e) {
					$(this).addClass('scrolled');
					if($('#telecastBox dt.scrolled').size() > 1) {
						$('#telecastBox dt.active').removeClass('on').next().hide().addClass('hidden');
						$('#telecastBox dt').removeClass('scrolled');
						$(this).addClass('scrolled');
					}

					$(this).next().slideToggle('fast').toggleClass('hidden');
					$(this).toggleClass("on").toggleClass("arrow");

					e.preventDefault();
				});
			}

			function scrollProgram() {
				$('#telecastButtonDown').unbind('click').bind('click', function(e) {

					if($('#telecastBox dt.disabled:lt(3)').length > 0) {

						// Show scroll button
						if($('#telecastButtonUp').hasClass('hided')) {
							$('#telecastButtonUp').removeClass('hided');
						}

						// Hide items which have been displaying more informations
						$('#telecastBox dt.active').next().hide().addClass('hidden');

						var test = $('#telecastBox dt.disabled:lt(3)').removeClass("disabled"),
						test2 = $('#telecastBox dt.active').removeClass("active");

						test2.addClass("disabledd");
						test.addClass("active");
					}

					// Hide when there is no more items left
					if($('#telecastBox dt.disabled').length == 0) {
						if($(this).hasClass('hided')) {

						} else {
							$(this).addClass('hided');
						}
					}

					e.preventDefault();
				});

				$('#telecastButtonUp').unbind('click').bind('click', function(e) {

					// Show scroll button
					if($('#telecastButtonDown').hasClass('hided')) {
						$('#telecastButtonDown').removeClass('hided');
					}

					// Check if there are any items to scroll
					if($('#telecastBox dt.disabledd').length > 0) {

						// Hide items which have been displaying more informations
						$('#telecastBox dt.active').next().hide().addClass('hidden');

						// Hide items which are not supposed to be active anymore
						test2 = $('#telecastBox dt.active').removeClass("active");
						test2.addClass("disabled");

						// Show last 3 items
						$('#telecastBox dt.disabledd').filter(function(index) {
							var length = $('#telecastBox dt.disabledd').length,
								newIndex = index + 1;

							if(newIndex > (length - 3)) {
								var test = $(this).removeClass("disabledd");
								test.addClass("active");
							}
						});
					}

					// Hide when there is no more items left
					if($('#telecastBox dt.disabledd').length == 0) {
						if($(this).hasClass('hided')) {

						} else {
							$(this).addClass('hided');
						}
					}

					e.preventDefault();
				});
			}

			initScript();
		},

		showNearestTransmission: function() {

			$transmissions = [];
			timer = false;

			function setNearestDates() {
				var cur = TVNTIME.globals.clientTime;

				$('#nearestProgramTransmission li').each(function() {
					d = Date.parse($(this).text());
					d.addHours(TVNTIME.globals.programOffset);

					if(cur.compareTo(d) < 0) {
						$transmissions.push(d);
					}
				});

				if(typeof $transmissions[0] == 'object') {

					date = $transmissions[0];

					if(typeof TVNTIME.globals.epgOffset != 'undefined') {
						$timeZone = $('<br /><em></em>');
						$('.incomingTransmition p').append($timeZone).find('em:last').html($('.changeTimeZone dt span').text());
					}

					$('.incomingTransmition p span').html(date.toString("H:mm"));
					$('.incomingTransmition p em:first').html(date.toString("dd MMMM, dddd"));
					if($('#transmissionInProgram')) {
						$('#transmissionInProgram span').html(date.toString("dd MMMM, dddd,"));
						$('#transmissionInProgram em:first').html(date.toString("H:mm"));
					}
				} else {
					$('.incomingTransmition').hide();
					if($('#transmissionInProgram')) {
						$('#transmissionInProgram').empty();
					}
				}
			}

			setNearestDates();
		}
	}
}

$(function() {
	TVNTIME.start();
});
