/* BEGIN: showpage/showpage_constants */

var GO_ICON         = "/images/common/green_go.gif";
    
var CURRENT_EPISODE_ICON        = "/images/showpage/orange_circle_large.gif",
    MOST_RECENT_EPISODE_ICON    = "/images/showpage/blue_circle_large.gif",
    VISIBLE_EPISODE_ICON        = "/images/showpage/blue_circle_medium.gif";

/* BEGIN: showpage/showpage_controller */

// show controller
function ShowController()
{
    this.showView = null;
    this.timelineView = null;
    
    this.showPageModel = null;
    this.showModel = null;
    
    this.episodeModels = [];
}

ShowController.prototype.init = function (_showPageModel) {

	this.showPageModel = _showPageModel;
	this.showPageModel.SelectedEpisode = _showPageModel.SelectedEpisode;

	this.isAuthenticated = _showPageModel.IsAuthenticated;

	this.globalSubscriptionModel = _showPageModel.GlobalSubscriptionModel;
	this.subscriptionModel = _showPageModel.SubscriptionModel;

	if (_showPageModel.NewestEpisode != null) {
		this.showModel = _showPageModel.NewestEpisode.Show;
	}
	else {
		this.showModel = _showPageModel.ShowModel;
	}

	pageModel.addPageEpisode(_showPageModel.NewestEpisode);

	this.showView = new ShowView();
	this.showView.init(this.showPageModel);

	this.optionsView = new OptionsView();
	this.optionsView.init(this.showPageModel);

	this.popupView = new PopupView();
	this.popupView.init();

	this.episodeView = new EpisodeView();

	this.timelineView = new TimelineView();
	this.timelineView.init(this.showPageModel);

	rolloverController.init();

	this.episodeModels = this.showPageModel.EpisodeModels;
	pageModel.addPageEpisodes(this.episodeModels);

	if (window.location.hash) {

		var episodeSlug = window.location.hash.replace('#', '');
		var episode = pageModel.getEpisode(episodeSlug);

		if (episode == null) {
			this.loadEpisode(window.location.hash.replace('#', ''));
			return;
		}

		this.showPageModel.SelectedEpisode = episode;
	}

	this.episodeView.init(this.episodeModels, this.showPageModel);

	var page = (this.showPageModel.InitPage != 0) ? this.showPageModel.InitPage : 1;
	this.timelineView.update(this.showPageModel, this.episodeModels, this.episodeView.getCurrentEpisode());
	pagingController.updatePaging(this.showPageModel.PagingModel);

	if (this.showPageModel.InitPopup) {
		this.popupView.open(this.showPageModel.InitPopup);
	}

	var params = '/Params/adbottom=none&embedded=true';
	if (!this.showPageModel.AutoStartMediaPlayer)
		params += '&autoplay=false&preload=false';

	$('#embeddedMediaPlayer').attr('src', '/MediaPlayer/Episode/' + this.showPageModel.SelectedEpisode.Slug + params);
}


/***************************************************************
 * Timeline controls
 ***************************************************************/ 
 
ShowController.prototype.setCustomRange = function() {

    var to = $('#tobox').val();
    var regExp = new RegExp("[0-9]{2}/[0-9]{2}/[0-9]{4}");
    
    if(!regExp.test(to))
    {
        alert("Please enter a valid date format: mm/dd/yyyy");
        return;
    }
    
    var params = {
        doRefresh : false,
        onSuccess : function(result) { theController.setRangeCallback(result); },
        onFailure : function(error) { theController.error(error); },
        method : '/WebServices/ShowPageService_v1_0.asmx/SetCustomRange',
        args : {showSlug : this.showModel.Slug,
                toDate : to}
    };
    
    webService.invoke(params);
}

ShowController.prototype.setRangeCallback = function(_result) {

    if(_result.EpisodeModels) {
    
        var redirect = "/AgeVerification.aspx?ReturnUrl=/Podcasts/Feeds/" + this.showModel.Slug + "#" + _result.SelectedEpisode.Slug;
        if(_result.RequireAgeVerification) {    
            window.location = redirect;
            return;
        }

        this.showPageModel.TimelineTicks = _result.TimelineTicks;
        this.showPageModel.SelectedEpisode = _result.SelectedEpisode;
        this.showPageModel.ToDate = _result.To;
        
        this.showModel.Episodes = _result.EpisodeModels;
        this.episodeModels = _result.EpisodeModels;
        pageModel.replacePageEpisodes(this.episodeModels);
        
        this.episodeView.update(this.episodeModels, this.showPageModel, true);
        this.timelineView.update(this.showPageModel, this.episodeModels, this.episodeView.getCurrentEpisode());
        pagingController.updatePaging(_result.PagingModel);
        
        rolloverController.bindListeners();
        
        $('#embeddedMediaPlayer').attr('src', '/MediaPlayer/Episode/' + this.showPageModel.SelectedEpisode.Slug + '/Params/adbottom=none&embedded=true&autoplay=false&preload=false');
    }
    
    if(_result.ErrorPopup) {
        this.popupView.open(_result.ErrorPopup);
    }
}


/***************************************************************
 * Show methods
 ***************************************************************/ 

ShowController.prototype.updateFeed = function() {
    
    var params = {
        doRefresh : false,
        onSuccess : function(result) { window.location.reload() },
        onFailure : function(error) { theController.error(error); },
        method : '/WebServices/ShowPageService_v1_0.asmx/UpdateFeed',
        args : {showSlug : this.showModel.Slug}
    };
    
    webService.invoke(params);
}

ShowController.prototype.updateImages = function() {
    
    var params = {
        doRefresh : false,
        onSuccess : function(result) { window.location.reload() },
        onFailure : function(error) { theController.error(error); },
        method : '/WebServices/ShowPageService_v1_0.asmx/UpdateImages',
        args : {showSlug : this.showModel.Slug}
    };
    
    webService.invoke(params);
}


/***************************************************************
 * Tagging methods
 ***************************************************************/ 

ShowController.prototype.addTag = function() {

    var tag = this.optionsView.getTagValue();
    
    var params = {
        doRefresh : false,
        onSuccess : function(result) { theController.addTagCallback(result); },
        onFailure : function(error) { theController.error(error); },
        method : '/WebServices/ShowPageService_v1_0.asmx/AddTag',
        args : {showSlug : this.showModel.Slug,
                tagString : tag}
    };
    
    webService.invoke(params);
}

ShowController.prototype.addTagCallback = function(_result) {

    this.optionsView.addTag(_result);
}

ShowController.prototype.removeTag = function(tagid) {

    var tag = this.optionsView.getTagValue();
    
    var params = {
        doRefresh : false,
        onSuccess : function(result) { theController.removeTagCallback(result); },
        onFailure : function(error) { theController.error(error); },
        method : '/WebServices/ShowPageService_v1_0.asmx/RemoveTag',
        args : {showSlug : this.showModel.Slug,
                tagId : tagid}
    };
    
    webService.invoke(params);
}

ShowController.prototype.removeTagCallback = function(_result) {

    this.optionsView.removeTag(_result);
}



/***************************************************************
 * Episode methods
 ***************************************************************/ 

ShowController.prototype.toggleEpisodeDescription = function(_slug){

    var episode = this.getEpisode(_slug);
    this.episodeView.toggleDescription(episode);
}

ShowController.prototype.selectEpisode = function(_slug) {

    var episode = this.getEpisode(_slug);
    
    this.episodeView.setCurrentEpisode(episode, episode.Slug == this.showPageModel.NewestEpisode.Slug, true);
    this.timelineView.update(this.showPageModel, this.episodeModels, this.episodeView.getCurrentEpisode());
}

ShowController.prototype.loadEpisode = function(_slug) {

    var params = {
        doRefresh : false,
        onSuccess : function(result) { theController.setRangeCallback(result); },
        onFailure : function(error) { theController.error(error); },
        method : '/WebServices/ShowPageService_v1_0.asmx/LoadEpisode',
        args : {episodeSlug : _slug}
    };
    
    webService.invoke(params);
}

ShowController.prototype.popupExperience = function(_slug) {

    var episode = this.getEpisode(_slug);
    this.popupView.open("experiencePopupTemplate", episode);
}
 
ShowController.prototype.getEpisode = function(_slug){

    for(var i=0; i < this.episodeModels.length; i++) {
    
        if(this.episodeModels[i].Slug == _slug) {
            return this.episodeModels[i];
        }
    }
    
    if(this.showPageModel.NewestEpisode.Slug == _slug) {
        return this.showPageModel.NewestEpisode;
    }
    
    if(this.showPageModel.OldestEpisode.Slug == _slug) {
        return this.showPageModel.OldestEpisode;
    }
    
    return null;
}


/***************************************************************
 * PagingController callbacks
 ***************************************************************/ 
 
ShowController.prototype.pagingNumber = function(_num) {

    var params = {
        doRefresh : false,
        onSuccess : function(result) { theController.setRangeCallback(result); },
        onFailure : function(error) { theController.error(error); },
        method : '/WebServices/ShowPageService_v1_0.asmx/SetOffset',
        args : {showSlug : this.showModel.Slug,
                offset : (_num)}
    };
    
    webService.invoke(params);
}


/***************************************************************
 * Error Events
 ***************************************************************/ 
 
ShowController.prototype.error = function(_result) {

    alert("error");
}

/* BEGIN: showpage/showpage_show_view */

// show view
function ShowView()
{
}

ShowView.prototype.init = function(_pageModel) {

    if(_pageModel.BannerUrl) {
    
        var bannerHtml = "<div style='width: 480px; margin-bottom: 10px; overflow: hidden;'>";
        bannerHtml += "<img src='" + _pageModel.BannerUrl + "'>";
        bannerHtml += "</div>";
    
        $('#showHead').prepend(bannerHtml);
    }
}

/* BEGIN: showpage/showpage_episode_view */

// episode view
function EpisodeView()
{
    this.currentEpisode = null;
    
    this.episodeTemplate    = TrimPath.parseDOMTemplate("episodeTemplate");
}

EpisodeView.prototype.init = function(_episodeModels, _showPageModel) {

    this.currentEpisode = _showPageModel.SelectedEpisode;

    for (var i = 0; i < _episodeModels.length; i++) {
    
        this.updateTemplate(_episodeModels[i]);
    }
}

EpisodeView.prototype.update = function (_episodeModels, _showPageModel, _setHash) {

    var episodeHtml = new StringBuilder();
    for (var i = 0; i < _episodeModels.length; i++) {

        episodeHtml.append(this.episodeTemplate.process(_episodeModels[i]));
    }

    $("#episodes").html(episodeHtml.toString());
    $('#episodesTopbar').show();

    for (var i = 0; i < _episodeModels.length; i++) {

        this.updateTemplate(_episodeModels[i]);

        subscriptionController.updateSubscription(_episodeModels[i]);

        ratingController.updateRatings(_episodeModels[i]);
        favoriteController.updateFavorite(_episodeModels[i]);

        subscriptionController.updateEpisodeCount(_episodeModels[i].Show);
        rolloverController.updateHud(_episodeModels[i]);
    }

    ratingController.bindListeners();
    favoriteController.bindListeners();

    this.setCurrentEpisode(_showPageModel.SelectedEpisode, _showPageModel.SelectedEpisode.Slug == _showPageModel.NewestEpisode.Slug, _setHash);
}

EpisodeView.prototype.setCurrentEpisode = function(_episode, _mostRecent, _setHash) {

    if(_setHash) {
        window.location.replace("/Podcasts/Feeds/" + theController.showModel.Slug + "#" + _episode.Slug);
    }

    this.currentEpisode = _episode;
}

EpisodeView.prototype.updateTemplate = function(_episode) {

    if(_episode.Media == "unknown") {
        var explaination = "<span class='small'>This entry does not contain any audio or video.</span>";
        $('.' + _episode.Type + "_" + _episode.Slug + "_mediaControls").html(explaination);        
    }
    
    var descriptionHeight = $('.Episode_' + _episode.Slug + '_description').height();
    if (descriptionHeight > EPISODE_DESCRIPTION_HEIGHT) {
        $('.Episode_' + _episode.Slug + '_description').height(EPISODE_DESCRIPTION_HEIGHT);
        $('.Episode_' + _episode.Slug + '_toggleDescription').css('display', '');
    } else {
        $('.Episode_' + _episode.Slug + '_toggleDescription').remove();
    }
}

EpisodeView.prototype.toggleDescription = function(_episode){

    if($('.Episode_' + _episode.Slug + '_toggleImage').attr('src') == MORE_ICON) {
    
        $('.Episode_' + _episode.Slug + '_description').css('height', '');
        $('.Episode_' + _episode.Slug + '_toggleImage').attr('src', LESS_ICON);
        $('.Episode_' + _episode.Slug + '_toggleText').html("less");
                
    } else {
    
        $('.Episode_' + _episode.Slug + '_description').css('height', EPISODE_DESCRIPTION_HEIGHT);
        $('.Episode_' + _episode.Slug + '_toggleImage').attr('src', MORE_ICON);
        $('.Episode_' + _episode.Slug + '_toggleText').html("more");
    }
}

EpisodeView.prototype.getCurrentEpisode = function() {

    return this.currentEpisode;
}



/* BEGIN: showpage/showpage_timeline_view */

// timeline view

var ICON_SMALL_WIDTH = 6;
var ICON_MEDIUM_WIDTH = 12;
var ICON_LARGE_WIDTH = 24;

var ICON_WIDTH = 24;
var ICON_HEIGHT = 24;

function TimelineView()
{
    this.timelineDotTemplate            = TrimPath.parseDOMTemplate("timelineDotTemplate");
    this.timelineTicksTemplate          = TrimPath.parseDOMTemplate("timelineTicksTemplate");
    this.timelineDatesTemplate          = TrimPath.parseDOMTemplate("timelineDatesTemplate");
    this.pagingTemplate                 = TrimPath.parseDOMTemplate("pagingTemplate");
}

TimelineView.prototype.init = function(_showPageModel)
{

}

TimelineView.prototype.update = function(_showPageModel, _episodeModels, _currentEpisode) {
    
    var timelineModel = _showPageModel.TimelineModel;
    
    if(!$.browser.msie || $.browser.version != 6)
    {
        $('#episodeTimelinePanel').show();
    
        if(_episodeModels[0].Slug == _showPageModel.NewestEpisode.Slug) {
            $('#mostRecentEndcap').hide();
            $('#timeline').width(660);
        } else {
            $('#mostRecentEndcap').show();
            $('#timeline').width(620);
        }
        
        var timeline = {
            ticks : new Array()
        };
        
        //var w = 0;
        //var p = 0;
        for(var i=0; i < timelineModel.TimelineTicks.length; i++) {
        
            var tick = {
                date : timelineModel.TimelineTicks[i].Date,
                year : timelineModel.TimelineTicks[i].Year,
                width : ($('#timeline').width() * timelineModel.TimelineTicks[i].Percent) - 2,
                index : i
            }
            
            //p += timelineModel.TimelineTicks[i].Percent;
            
            if(Math.floor(tick.width) > 0) {
                //w += tick.width + 2;
                timeline.ticks.push(tick);
            }
        }
        //alert(p + "% :: " + w + "px");
        
        var ticksHtml = this.timelineTicksTemplate.process(timeline);
        
        if(timeline.ticks[timeline.ticks.length-1].width < 30) timeline.ticks[timeline.ticks.length-1].width = 30;
        var datesHtml = this.timelineDatesTemplate.process(timeline);
                
        var dots = new StringBuilder();
        for(var i=timelineModel.TimelineEpisodes.length - 1; i >= 0; i--) {
        
            var dotHtml = this.renderDot(timelineModel.TimelineEpisodes[i], _currentEpisode, _showPageModel, ((timelineModel.TimelineEpisodes.length-1) - i), $('#timeline').width());
            dots.append(dotHtml);
        }
        
        if(_episodeModels[0].Slug != _showPageModel.NewestEpisode.Slug) {
        
            var dotHtml = this.renderDot(_showPageModel.NewestEpisode, _currentEpisode, _showPageModel, timelineModel.TimelineEpisodes.length, 660);
            dots.append(dotHtml);
        }
        
        $('#timeline').html(ticksHtml);
        $('#timelineDots').html(dots.toString());
        $('#timelineDates').html(datesHtml);
        
        this.setBindings();
    }
    
    $('#tobox').val(_showPageModel.ToDate);
    
    if(timelineModel.TimelineEpisodes[0].Slug != _showPageModel.NewestEpisode.Slug) {
        $('.' + (timelineModel.TimelineTicks.length-1) + '_tick').css("border-right", "0px");
    }
}

TimelineView.prototype.setBindings = function() {

    $('.dot').bind('mouseover', function(event) {
    
        $(this).find('.dotRollover').show();

        var h = $(this).find('.container').height();
        $(this).find('.dotRollover').css("top", -h + "px");
    });
    
    $('.dot').bind('mouseout', function(event) {    
        $(this).find('.dotRollover').hide();
    });
}

TimelineView.prototype.renderDot = function(_episodeModel, _currentEpisode, _showPageModel, _index, _width) {

    if(_episodeModel.Slug == _currentEpisode.Slug) {
        var image = CURRENT_EPISODE_ICON;
        var icon_w = ICON_LARGE_WIDTH;
    } else if(_episodeModel.Slug == _showPageModel.NewestEpisode.Slug) {
        var image = MOST_RECENT_EPISODE_ICON;
        var icon_w = ICON_LARGE_WIDTH;
    } else {
        var image = VISIBLE_EPISODE_ICON;
        var icon_w = ICON_MEDIUM_WIDTH;
    }
        
    var x = (_width * _episodeModel.RelativeDateRangePlacement) - ((this.previousDot != undefined) ? ((this.previousDot.x) + this.previousDot.w + ((icon_w - this.previousDot.w)/2)) : (icon_w/2));

    var dot = {
        x : x,
        slug : _episodeModel.Slug,
        title : _episodeModel.Title,
        image : image,
        alt : _episodeModel.PubDateString
    }

    this.previousDot = {
        x : (_width * _episodeModel.RelativeDateRangePlacement),
        w : icon_w
    };
    
    return this.timelineDotTemplate.process(dot);
}

/* BEGIN: showpage/showpage_popup_view */

function PopupView()
{
}

PopupView.prototype.init = function() {

    popupController.initPopup("experiencePopupTemplate");
    popupController.initPopup("noEpisodesPopupTemplate");
    popupController.initPopup("episodeBlockedPopupTemplate");
    popupController.initPopup("showContainsNoEpisodesPopupTemplate");
    
    popupController.init();
}

PopupView.prototype.open = function(_popupId, _data) {

    popupController.displayPopupX(_popupId, _data);
}

PopupView.prototype.close = function() {

    popupController.hidePopup();
}

/* BEGIN: showpage/showpage_options_view */

/***************************************************************
 * Constructor
 ***************************************************************/ 
 
function OptionsView()
{
    this.tagTemplate = TrimPath.parseDOMTemplate("tagTemplate");
}

/***************************************************************
 * Initializers
 ***************************************************************/ 
 
OptionsView.prototype.init = function(_showPage) {

    var tagsHtml = "";
    for(var i=0; i < _showPage.Tags.length; i++) {
        tagsHtml += this.tagTemplate.process(_showPage.Tags[i]);
    }
    $('#tags').html(tagsHtml);
    
    if(theController.isAuthenticated) {
        $('#addTag').show();
    }

    this.bindTagListeners();
}


/***************************************************************
 * Tag functions
 ***************************************************************/ 
 
OptionsView.prototype.bindTagListeners = function() {


    $('input#tagInput').bind('keyup', function(_event) {
        if(_event.keyCode == 13) {
            theController.addTag();
        }
    });
}

OptionsView.prototype.addTag = function(_tag) {

    var html = this.tagTemplate.process(_tag);
    $('#tags').append(html);
    
    $('#tagInput').val("");
}

OptionsView.prototype.removeTag = function(_tag) {

    $('#' + _tag.Id + "_tag").remove();
}

OptionsView.prototype.getTagValue = function() {

    return $('#tagInput').val().trim();
}

