$(window).load(function () {
	
	var $GenreLi = $('#GenreList ul').find('li.prototype').removeClass('prototype');
	var $StationLi = $('#StationList ul').find('li.prototype').removeClass('prototype');
	var $NavStack = [];
	var Station;
	var adCallback;
	var DocRoot = '';
	
	if (document.location.href.indexOf('?')>0) {
		DocRoot = document.location.href.substr(0, document.location.href.indexOf('?'));
	} else {
		DocRoot = document.location.href;
	}
	
	
	function lastNavigation() {
		return $NavStack[$NavStack.length-1];
	}
	
	function pushNavigation(name, element) {
		$NavStack.push({name: name, element: element});
	}

	function popNavigation() {
		return $NavStack.pop();
	}
	
	function updateNavigation() {
		if ($NavStack.length>1) {
			$("#NavTitle").text(lastNavigation().name);
			$("#Nav .back").unbind('click').click(function (e) {
				popNavigation().element.hide().filter(function () { return this.id=='Station'; }).each(function () {
					$("#NowPlaying").show().unbind('click').click(function (e) {
						$(this).hide();
						lastNavigation().element.hide();
						pushNavigation($("#Station").find(".name").text(), $("#Station").show());
						updateNavigation();
						e.preventDefault();
						return false;
					});
				});
				if ($NavStack.length<=1) {
					$("#Nav .back").hide();
				}
				lastNavigation().element.show();
				$("#NavTitle").text(lastNavigation().name);
				e.preventDefault();
				return false;
			}).show();
		} else if ($NavStack.length) {
			$("#NavTitle").text(lastNavigation().name);
			$("#Nav .back").hide();
		} else {
			$("#Nav .back").hide();
		}
	}
	
	function fetchGenres(frequencyrange, page) {
		if (!page) {
			page = 1;
		}
		$('#Loading').show();
		$.ajax({
			cache: false,
			dataType: "json",
			data: {root: frequencyrange},
			error: function (data, status, error) {
				$('#Loading').hide();
			},
			success: function (data, status) {
				if (status == 'success') {
					showGenreList(data, {root: frequencyrange}, page);
				}
				$('#Loading').hide();
			},
			type: "POST",
			url: DocRoot+"?q=genres/"+frequencyrange+"/"+page
		});
	}
	
	function fetchStations(frequencyrange, genre, page) {
		if(!page) {
			page = 1;
		}
		$('#Loading').show();
		$.ajax({
			cache: false,
			data: {root: frequencyrange},
			dataType: "json",
			error: function (data, status, error) {
				$('#Loading').hide();
			},
			success: function (data, status) {
				if (status == 'success') {
					showStationList(data, {root: frequencyrange, genre: genre}, page);
				}
				$('#Loading').hide();
			},
			type: "POST",
			url: DocRoot+"?q=stations/"+genre+"/"+page
		});
	}
	
	function showGenreList(genres, stack, page) {
		if (!page) {
			page = 1;
		}
		if (lastNavigation().element.attr("id")!=="GenreList") {
			lastNavigation().element.hide();
			pushNavigation("Genres", $("#GenreList"));
			updateNavigation();
		}
		$("#GenreList ul:first").replaceWith("<ul />");
		$("#GenreList .pagination").empty();
		for(var i=1;i<=genres.pages && genres.pages>1;i++) {
			$("<a>&bull;</a>").attr("href", "#genres/"+stack.root+"/"+i).click(function (e) {
				fetchGenres(stack.root, this.href.substr(this.href.lastIndexOf("/")+1));
				e.preventDefault();
				return false;
			}).appendTo("#GenreList .pagination").filter(function () { return i==page; }).addClass("current");
			$("#GenreList .pagination").append("&nbsp;");
		}
		$.each(genres.genres, function () {
			var $li = $GenreLi.clone();
			var genre = this;
			$li.find('a.name').text(this.name).each(function () {
				this.href += genre.psk;
				$li.find('a').click(function (e) {
					var url = DocRoot+($(this).attr('href').replace(/#/, "?q="));
					fetchStations(stack.root, genre.psk);
					e && e.preventDefault();
					return false;
				});
			});
			$("#GenreList ul:first").append($li);
		});
		$("#GenreList").show();
		return true;
	}
	
	function showRoot() {
		$('#Loading').hide();
		pushNavigation("Radiolicious", $("#Root"));
		updateNavigation();
		$('#Root').show().
			find('ul li a').
				click(function (e) {
					var oldHref = $(this).attr('href');
					var baseName = oldHref.substr(oldHref.lastIndexOf('/')+1);
					
					fetchGenres(baseName);

					e && e.preventDefault();
					return false;
				}).
			end();
	}
	

	function showStation(station, stack) {
		$Station = $("#Station");
		if (station.logourl) {
			$Station.find('.logo').attr({src: station.logourl});
			$Station.find('.logo').show();
		} else {
			$Station.find('.logo').hide();
		}
		$Station.find('.about').text(station.aboutcomment);
		$Station.find('.name').text(station.name);
		$("#NowPlaying").hide();
		if ($('#Embed object')[0] && $('#Embed object')[0].object) {
			$('#Embed object')[0].object.filename = DocRoot+'/station/'+station.psk+'.asx'; // station.Streams[0].url;
		} else {
			$("#Embed object").attr({data: DocRoot+'/station/'+station.psk+'.asx', type: station.mimetype});
			$("#Embed object param[name=Filename]").attr({value: DocRoot+'/station/'+station.psk+'.asx'});
			$("#Embed embed").attr({src: DocRoot+'/station/'+station.psk+'.asx', mimetype: station.mimetype});
			$("#Embed").html($("#Embed").html());
		}
		Station = station;
		pushNavigation(station.name, $("#Station"));
		lastNavigation().element.hide();
		$Station.show();
		updateNavigation();
		return true;
	}
	
	function showStationList(stations, stack, page) {
		if (!page) {
			page = 1;
		}
		$StationList = $("#StationList");
		if (lastNavigation().element.attr("id")!=="StationList") {
			lastNavigation().element.hide();
			pushNavigation("Stations", $StationList);
			updateNavigation();
		}
		$StationList.find("ul").replaceWith("<ul />");
		$StationPagination = $StationList.find(".pagination").empty();
		for(var i=1;i<=stations.pages && stations.pages>1;i++) {
			$("<a>&bull;</a>").attr("href", "#stations/"+stack.root+"/"+i).click(function (e) {
				fetchStations(stack.root, stack.genre, this.href.substr(this.href.lastIndexOf("/")+1));
				e.preventDefault();
				return false;
			}).appendTo($StationPagination).filter(function () { return i==page; }).addClass("current");
			$StationPagination.append("&nbsp;");
		}
		$.each(stations.stations, function () {
			var $li = $StationLi.clone();
			var station = this;
			$li.find('.name').text(this.name);
			if (this.MetroStation && this.MetroStation.Metro && this.MetroStation.Metro.metro) {
				$li.find('.metro').text(this.MetroStation.Metro.metro);
			}
			$li.find('a').click(function (e) {
				this.href += station.psk;
				$("#Loading").show();
				if (showStation(station, $.extend({station: station.psk}, station))) {
					$StationList.hide();
				}
				$("#Loading").hide();
				
				e && e.preventDefault();
				return false;
			});
			$StationList.find("ul").append($li);
		});
		$StationList.show();
		return true;
	}
	
	function adLoop() {
		var data = {};
		if (Station && Station.psk) {
			data.stationfk = Station.psk;
		}
		$.ajax({
			cache: false,
			data: data,
			dataType: "json",
			complete: function (data, status, error) {
				adCallback =setTimeout(adLoop, 30000);
			},
			success: function (data, status) {
				showAd(data);
			},
			type: "POST",
			url: DocRoot+"/ad"
		});
	}
	
	function showAd(ad) {
		$("#Advert").empty().append('<a><img /></a>').find('a').attr({href: ad.url, target: "_blank"}).click(function () {
				$.ajax({async: false, url: DocRoot+"/adclick&psk="+ad.psk});
				return true;
			}).
			find('img').attr({src: "images/ads/"+ad.filename+".png"});
	}
	
	showRoot();
	adLoop();
});