ITV.showcards = function() {

	var showcardId = ITV.showcardId
	var showcard = ITV.showcard
	var seasons = ITV.seasons || {}
	var hasEpisodeDetail = false
	var feed = 0
	var $feed = $("ul.feed")
	var $recs = $("ul.recommendations")
	var $news = $("ul.news")
	var $post = $("#wallPost")
	var $seasons = $("#seasons")
	var $episodes = $("#episodes")
	var isAdmin = ITV.user && ITV.user.permissions && ITV.user.permissions.isAdmin
		
	$("select").selectBox()
	$(".accordion > article").click(accordionClick)
    $(".accordion > article a").click(stopClick) // prevent it from changing the accordion
	$seasons.bind("change", onSeasonChange)
	$episodes.bind("change", updateHash)
	$(".showcards .fav").live("click", favorite)
	$("a.checkIn").live("click", checkIn)
	$(window).bind("hashchange", checkForProgramChanges)    
	
	$post.setupWallPost({
		showcardId: showcardId,
		type: "comment"
	})
	$news.fetchNews(showcardId)
	$recs.fetchShowcardRecs(showcardId)
	feed = $feed.startFeed(showcardId)

	
	sortSeasons(seasons)
	checkForProgramChanges()
		
	function checkIn(e) {           
		ITV.showShareUI(showcard)
	}

    function stopClick(e) {
        return false
    }
	
	function accordionClick(e) {
		$(this).toggleClass("active")
	}
	
	function checkForProgramChanges() {
		updateEpisodeHeader()
		updateDetails()
	}
	
	function getSeasonForProgramId(programId) {
		for (var season in seasons) {
			for (var i = 0; i < seasons[season].length; i++) {
				if (seasons[season][i].programId === programId) {
					return season
				}
			}
		}
		return false
	}
	
	function getFirstSeason() {
		for (var season in seasons) {
			return season
		}	
	}
	
	function getFirstProgramIdForSeason(season) {
		return seasons[season][0].programId
	}
	
	function updateEpisodeHeader() {
		var programId = location.hash.replace("#", "")
		var noProgramId = !programId
		var season = programId ? getSeasonForProgramId(programId) : getFirstSeason()
		$seasons.selectBox('value', season)
		populateEpisodesForSeason(season)
		programId = programId || getFirstProgramIdForSeason(season)
		$episodes.selectBox("value", programId)
		if (noProgramId) $episodes.trigger("change")
	}
	
	function onSeasonChange() {
		var season = $seasons.val()
		populateEpisodesForSeason(season)
		$episodes.trigger("change")
	}

	function populateEpisodesForSeason(season) {
		if (!season) return
		var html = ""
		var title = ""
		var program = {}
		var episode = ""
		$episodes.empty()
		for (var i = 0; i < seasons[season].length; i++) {
			program = seasons[season][i]
			episode = program.episode ? program.episode : ""
			title = program.episodeTitle ?  program.episodeTitle : program.airDate
	        html += "<option value=" +  program.programId + " data-program-id='" +  program.programId + "'>" + episode + " " + title + "</option>"
		}
		$episodes.html(html).selectBox('refresh')
	}
	
	function updateHash() {
		var id = $episodes.val()
		if (id) location.hash = id
	}
	
	function favorite(e) {
		
		e.preventDefault()
		
		if (!ITV.loggedIn) return
		
		var isFavorite = $(this).hasClass("isFavorite")
		var $self = $(this)
		
		$(this).toggleClass("isFavorite")
		
		$.ajax({
			url: ITV.urls.favorite.replace(":showcardId", showcardId),
				type: isFavorite ? "DELETE" : "PUT",
			success: function(e) {
				$self.text(!isFavorite ? "Remove" : "Favorite")
			},
			error: function(e) {
				alert("Could not modify favorites!")
			}
		})
	}
	       
	function updateDetails() {
		var programId = location.hash.replace("#", "")
		if (!programId) return
		$.get(ITV.urls.details.replace(":showcardId", showcardId).replace(":programId", programId), function(program) {
			var episode  = "Season " + program.season + ", Episode " + program.episode
			var $article = $("article.episodeDetails")
			var episodeTitle = program.episodeTitle !== program.description ? program.episodeTitle : ""
			$article.find(".description").text(program.description || "").end()
				.find(".airDate").text(program.airDate || "").end()
				.find(".episodeTitle").text(episodeTitle || "").end()
				.find(".episode").hide().end()
                .find(".xfinityRecord").attr("data-episodeTitle", episodeTitle || "").end()
			if (program.season && program.episode) $article.find(".episode").text(episode).show()
			hasEpisodeDetail = true

            // re-draw xfinity buttons
			var x = new Xfinity().drawButtons()
		})
	}
			
		
	function sortSeasons(seasons) {

		for (var season in seasons) {
			seasons[season].sort(sortByEpisode)
		}	
		
		function sortByEpisode(a, b) {
			if (a.episode && b.episode) {						
				return parseInt(a.episode, 10) - parseInt(b.episode, 10)
			} else {
				return a.airDate > b.airDate
			}
		}
	}
}


