// check dependencies
if (typeof(MochiKit.DOM) == 'undefined')
{
    throw new Exception('Movies.js requires MochiKit.DOM.');
}

if (typeof(MoviesLib) == 'undefined')
{
    MoviesLib = {};
}

MoviesLib.COOKIE_AVAILABILITY = "AV";

/*
 *  Sets country availability cookie from checkbox value and refreshes page. 
 *  @param e Unique signal identifier. 
 */
MoviesLib.onAvailabilitySelectChanged = function(e)
{
    var checkbox = e.src();    
    if (checkbox.checked) {
        setCookie(MoviesLib.COOKIE_AVAILABILITY, 1);   
    } else { 
        setCookie(MoviesLib.COOKIE_AVAILABILITY, 0);    
    }      

    // need to do this to reset paging
    MoviesLib.reloadPage(function(query) {
        query["pageOffset"] = null; // reset paging
    });
}

MoviesLib.onGenreSelectChanged = function(e)
{
    var genre = e.src().value;

    MoviesLib.reloadPage(function(query) {
        query["tags"] = genre == "" ? null : genre;
        query["pageOffset"] = null; // reset paging
    });
}

// handle paging
VideoLib.handlePageOffset = function(offset) 
{
    MoviesLib.reloadPage(function(query) {
        query["pageOffset"] = offset;
    });
}

// handle sorting
VideoLib.handleSort = function(criteria, order) {
    MoviesLib.reloadPage(function(query) {
        query["sortCriteria"] = criteria;
        query["sortOrder"] = order;
        query["pageOffset"] = null; // reset paging
    });
}

MoviesLib.reloadPage = function(changeCallback)
{
    var parts = location.href.split("?");
    var query = parts.length > 1 ? MochiKit.Base.parseQueryString(parts[1]) : {};

    // let caller change the query
    if (changeCallback && typeof(changeCallback) == 'function')
    {
        changeCallback(query);
    }

    query["&"] = null; // workaround for MochiKit bug
    var queryString = MochiKit.Base.queryString(query);
    location.href = parts[0] + (queryString.length > 0 ? "?" + MochiKit.Base.queryString(query) : "");
}

MoviesLib.convertSliderValueToTP = function(sliderValue)
{
    // keep in sync with BrowseResultListModel TIME_PERIOD_... enum
    // slider values are: "Today" "Last 7 Days" "Last 30 Days" "Last Year"  "All Time"
    switch(sliderValue)
    {
        case 0:
            // TIME_PERIOD_DAY
            return 2;
        case 1:
            // TIME_PERIOD_WEEK
            return null; // default!!
        case 2:
            // TIME_PERIOD_THIRTY_DAYS
            return 4;
        case 3:
            // TIME_PERIOD_YEAR
            return 5;
        case 4:
            // TIME_PERIOD_OVERALL
            return 0;
    }
}

MoviesLib.convertTPToSliderValue = function(tp)
{
    // keep in sync with BrowseResultListModel TIME_PERIOD_... enum
    switch(tp)
    {
        // TIME_PERIOD_OVERALL
        case 0:
            return 4;
        // TIME_PERIOD_DAY 
        case 2:
            return 0;
        // TIME_PERIOD_WEEK 
        case 3:
            return 1;
        // TIME_PERIOD_THIRTY_DAYS 
        case 4:
            return 2;
        // TIME_PERIOD_YEAR 
        case 5:
            return 3;
    }
}
MoviesLib.onSliderValueChanged = function(newValue, oldValue)
{
    var parts = location.href.split("?");
    var query = parts.length > 1 ? MochiKit.Base.parseQueryString(parts[1]) : {};
    query["tp"] = MoviesLib.convertSliderValueToTP(newValue);
    query["&"] = null; // workaround for MochiKit bug
    query["pageOffset"] = null; // reset paging
    var queryString = MochiKit.Base.queryString(query);
    location.href = parts[0] + (queryString.length > 0 ? "?" + MochiKit.Base.queryString(query) : "");
}

MoviesLib.handleLoad = function()
{
    MochiKit.Iter.forEach(MochiKit.DOM.getElementsByTagAndClassName("input", "availabilitySelect"), function(availabilitySelect) {
        //using onclick event because the checkbox onchange event doesn't fire in IE until the user 'blur's the element by clicking elsewhere.     
        MochiKit.Signal.connect(availabilitySelect, 'onclick', MoviesLib.onAvailabilitySelectChanged); 
    });
    MochiKit.Iter.forEach(MochiKit.DOM.getElementsByTagAndClassName("select", "genreSelect"), function(genreSelect) {
        MochiKit.Signal.connect(genreSelect, 'onchange', MoviesLib.onGenreSelectChanged);
    });
    var sliderDiv = MochiKit.DOM.getElement("popularSlider");
    if (sliderDiv)
    {
        var sliderInitialValue = typeof(MoviesLib.tpInitialValue) != 'undefined' ? 
            MoviesLib.convertTPToSliderValue(MoviesLib.tpInitialValue) : 1;
        // slider values are from 0 to 4 with increment of 1
        MoviesLib.slider = new Jaman.Slider(sliderDiv, 0, 4, sliderInitialValue, 1);
        MoviesLib.slider.setHandlers(MoviesLib.onSliderValueChanged);
    }
}

MochiKit.DOM.addLoadEvent(MoviesLib.handleLoad);
