/* variable declaration */
var _rrMgr = null;
var _allAirings = null;

var _nextAirsInfoDiv;
var _viewUpcomingAiringsLink;
var _viewUpcomingAiringsLinkDiv;
var _intWmid;
var _name;
var _tmsid;
var _imgSrc;
var _imgSrc2;

/* constants */
var _maxAiringsShown = 30;
var _noneFoundMessage = "Sorry, no airings of this episode were found in the next ten days.";
var _timeOutMessage = "Sorry, there was an error retrieving listings information. " + 
                        "<a href=\"javascript:location.reload();\">" + 
                            "<b>Retry</b>" + 
                        "</a>";


function onLoadPage()
{
    _nextAirsInfoDiv = GE("tvEpisodeInfo_nextAirsInfoDiv");
    _loadingImageDiv = GE("tvEpisodeInfo_loadingImageDiv");
    _viewUpcomingAiringsLinkDiv = GE("tvEpisodeInfo_viewUpcomingAiringsLinkDiv");
    _viewUpcomingAiringsLink = GE("tvEpisodeInfo_viewUpcomingAiringsLink");
    
    if (_viewUpcomingAiringsLink != null)
    {
        _viewUpcomingAiringsLink.innerHTML = "";
    }
    
    _intWmid = GE("ep_intwmid");
    _name = GE("ep_name");
    _tmsid = GE("ep_tmsid");
    _imgSrc = GE("ep_imgsrc");
    _imgSrc2 = GE("ep_imgsrc2");
    _loadingImgSrc = GE("ep_loadingimgsrc");
    _loadingImgStyle = GE("ep_loadingimgstyle");

    // tv provider fields
    setUpTVProviderVariables();
    
    _messageDiv = _nextAirsInfoDiv;
    
    _searchingMessage = "<img class=\"" + _loadingImgStyle + "\" alt=\"Retrieving Listings Information\" src=\"" + _loadingImgSrc + "\"/>";
    
    _rrMgr = createRRObject();
}

function callAllAiringsFunction()
{
    // search on provided intWmid
    getAllAirings(((_name != null) ? _name.value : null), _intWmid.value);
        
    setTimeout("timeout();", _util_timeOutTime);
}

function handleError()
{
    _nextAirsInfoDiv.style.display = "block";
    _nextAirsInfoDiv.innerHTML = _timeOutMessage;
    _loadingImageDiv.style.display = "none";
    
    updateHeadendDisplayForError();
}

function handleNoData()
{
    _nextAirsInfoDiv.style.display = "block";
    _nextAirsInfoDiv.innerHTML = _noneFoundMessage;
    _loadingImageDiv.style.display = "none";
}

function getNumAiringsForSeries()
{
    var onComplete = function(result)
    {
        if (_name != null)
        {
            var numAiringsString = getNumberOfFutureAirings(result, _name.value)
            var airingOrAirings, allOrThe;
            if (numAiringsString == " 1")
            {
                airingOrAirings = "airing";
                allOrThe = "the";
            }
            else
            {
                airingOrAirings = "airings";
                allOrThe = "all";
            }
            
            _name.value = elipseText(_name.value, 110);
            
            if (_viewUpcomingAiringsLink != null)
            {
                _viewUpcomingAiringsLink.innerHTML = 
                    "View " + allOrThe + numAiringsString + " " + airingOrAirings + " of '" + _name.value + "'";
            }
        }
            
        _searchingForNumAirings = false;
    }

    _searchingForNumAirings = true;
    if (_tmsid != null)
    {
        _rrMgr.getAllAiringsWithEncode(null, null, onComplete, _tmsid.value);
    }
    else if (_name != null)
    {
        _rrMgr.getAllAiringsWithEncode(_name.value, null, onComplete);
    }
}

function handleErrorInGettingNumAirings()
{
    if (_viewUpcomingAiringsLink != null)
    {
        _viewUpcomingAiringsLink.innerHTML = "View all airings of '" + _name.value + "'";
    }
}

function getAllAirings(name, intWmid)
{
    var onComplete = function(result)
    {
        _listingsFound = true;
        
        getNumAiringsForSeries();
        setTimeout("timeout();", _util_elipsisTimeoutTime);
            
        _allAirings = result;
        
        if (!_timedOut) 
        {
            renderResults();
        }
        
        if (_viewUpcomingAiringsLink != null)
        {
            _viewUpcomingAiringsLinkDiv.style.display = "block";
            _viewUpcomingAiringsLink.innerHTML = ""
        }
        
        updateHeadendDisplay();
    }
    
    _rrMgr.getAllAiringsWithEncode(name, intWmid, onComplete);
}

function recordAiring(episodeIndex, airingIndex, recordSeries)
{
    _rrMgr.doRecord(_allAirings, episodeIndex, airingIndex, recordSeries, null);
}

function renderResults()
{
    if (_allAirings.shows.length == 0)
    {
        handleNoData();
        return;
    }

    var airingsIndices, episode, airingsArray, airing;
    /* Episode and Airing object members: 
        *   episode:("Title","ProgramID","Categories","LeadActors","Actors",
                     "Description","Directors","EpisodeTitle","Hosts","LeadHost",
                     "MPAA","OtherCredits","StarRating","Year");
        *
        *   airing:("ChanID","Affiliate","CallLetters","Duration",
                    "StartTime","Repeat","TVRating","Channel");
        */
    
    // get the next _maxAiringsShown airings in order by start time
    episode = _allAirings.shows[0];
    airingsArray = getNextAirings(episode);
    
    var prevAiring = null;
    _loadingImageDiv.style.display = "none";
    _nextAirsInfoDiv.style.display = "block";
    _nextAirsInfoDiv.innerHTML = "";

    table = document.createElement("table");
    table.cellSpacing = 0;    
    table.cellPadding = 0;
    
    var hasValidAirings = false;

    for (var i = 0; i < episode.Schedule.length && i < _maxAiringsShown; ++i) 
    {
        airing = airingsArray[i];
    
        // check for duplicate (if headend is default) and for only future or current airings
        if (isValidAiring(airing, prevAiring) == false) 
        {
            continue;
        }
        hasValidAirings = true;
                
        prevAiring = airing;
        
        var d = new Date();
        d.setTime(airing.StartTime);
        d = getLocalTime(d);
        
        // create the row
        tr = table.insertRow(-1);
                  
        // Date
        td = tr.insertCell(-1);
        td.className = "tvEpisodeInfo_nextAirsItemCell";
        td.innerHTML = getDateString(d);
        
        // Time
        td = tr.insertCell(-1);
        td.className = "tvEpisodeInfo_nextAirsItemCell";
        td.innerHTML = getTimeString(d);
        
        // Channel
        td = tr.insertCell(-1);
        td.className = "tvEpisodeInfo_nextAirsItemCell";
        td.innerHTML = getChannelOrNetworkInfo(_rrMgr, airing);
        
        // Duration
        td = tr.insertCell(-1);
        td.className = "tvEpisodeInfo_nextAirsItemCell";
        td.innerHTML = airing.Duration + " mins"
        
        d = td = tr = null;
    }

    if (hasValidAirings)
    {
        _nextAirsInfoDiv.appendChild(table);
    }
    else
    {
        // if no valid airings found, handle no data
        handleNoData();
    }
}

function getNextAirings(episode)
{
    var airingsArray = new Array(_maxAiringsShown);
    
    for (var i = 0; i < episode.Schedule.length; ++i)
    {
        insertAiringInSortedArray(airingsArray, episode.Schedule[i]);
    }
    
    return airingsArray;
}

// insert airing and indices into sorted arrays
function insertAiringInSortedArray(a, airing)
{
    // trying to insert something that doesn't belong simply return
    if ( a[_maxAiringsShown-1] != null && 
         a[_maxAiringsShown-1].StartTime < airing.StartTime)
    {
        return;
    }
    
    // loop through and push back all the other ones along the way
    for (var i = _maxAiringsShown - 2; i >= 0; i--)
    {
        if (a[i] != null && a[i].StartTime <= airing.StartTime)
        {
            a[i+1] = airing;
            return;
        }
        a[i+1] = a[i];
    }
    
    // array is empty, place at the front
    a[0] = airing;
}