// Should only contain code that is used on the Movies Home page.

if (typeof(JAMAN) == 'undefined') {
    JAMAN = {};
}

JAMAN.Movies = (function() {
    var MOVIE_SUMMARY_MAX_LENGTH = 106; // fits 80 'W's
    var MOVIE_TITLE_MAX_LENGTH = 33; // fits 25 'W's

    var ratings = [,50, 50, 50, 50];
    var ratingSliders = [];
    
    var self;
    
    // the currently selected movie
    var currMovie;
    
    var currentFetchMovieAjaxCall;
    
    // html elements of the movies in the carousel
    var movieElements = {};
    
    var rater;
    var buyBox;
    var carouselSlider;
    
    var isInitialPageLoad = true;
    var isMoodFromQueryParamsOrCookies = false;
    //var isTrailerRendered = false;
    
    var setRatingsForMovieFinder = function(r1, r2, r3, r4) {
        ratingSliders[1].setValue(r1 > 0 ? r1 : 50);
        ratingSliders[2].setValue(r2 > 0 ? r2 : 50);
        ratingSliders[3].setValue(r3 > 0 ? r3 : 50);
        ratingSliders[4].setValue(r4 > 0 ? r4 : 50);
        
        ratings[1] = r1 > 0 ? r1 : 50;
        ratings[2] = r2 > 0 ? r2 : 50;
        ratings[3] = r3 > 0 ? r3 : 50;
        ratings[4] = r4 > 0 ? r4 : 50;
    };
    
    var carouselMovieOnClick = function(e) {
        e.preventDefault();
        var videoId = e.src().id.substring(6);
        fetchMovie(videoId);
    };
    
    var carouselMovieOnMouseOver = function(e) {
        if (e.src().id != ("movie_" + currMovie.id)) {
            e.src().className += " hover";
        }
    };

    var carouselMovieOnMouseOut = function(e) {
        if (e.src().id != ("movie_" + currMovie.id)) {
            e.src().className = "movie";
        }
    };
    
    var goButtonOnClick = function() {
        if (!isInitialPageLoad) {
            $('goButton').className = 'disabled';
        }
        
        var args = {
            "theAction": "getMoviesByRatings",
            "pageSize": 15
        };
        
        if (isInitialPageLoad && !isMoodFromQueryParamsOrCookies) {
            // this block should only be entered on page load. in all other cases we'll be making the query based on the ratings.
            args.moodVideoID = currMovie.id;
        } else {
            args.r1 = ratings[1];
            args.r2 = ratings[2];
            args.r3 = ratings[3];
            args.r4 = ratings[4];
        }
        
        MochiKit.Style.hideElement('pageListDiv');
        MochiKit.Style.showElement('movieCarouselSpinner');
        
        var getRelatedMoviesRequest = VideoLib.makeRequest("/movies/", args);
        
        getRelatedMoviesRequest.addCallback(function(resp) {
            var objs = MochiKit.Base.evalJSON(resp.responseText);
            MochiKit.DOM.replaceChildNodes($('pageListDiv'), null);
            
            if (isInitialPageLoad && !isMoodFromQueryParamsOrCookies) {
                objs = [currMovie].concat(objs);
            }
            
            if (objs.length > 15) {
                objs = objs.slice(0, 15);
            }
            
            movieElements = {};
            
            var movie;
            for (var i = 0; i < objs.length; i++) {
                var obj = objs[i];
                
                var bannerFree;
                if (obj.isFree) {
                    bannerFree = DIV({'class':'global-banner-free','style':'position:absolute;top:-1px;right:-1px;'});
                }
                var thumbnail = DIV({"class":"movieThumbnail","id":obj.id}, IMG({"src":obj.smallThumbnailUrl}), bannerFree);
                if (typeof(obj.isAvailable) != "undefined" && !obj.isAvailable) {
                    MochiKit.DOM.appendChildNodes(thumbnail, Jaman.imagePNG("/misc/notavailable_18.png", 18, 18, "unavailable"));
                }
                var title = A({"href":obj.url,"id":obj.id}, obj.title);
                var defaultGenre = (obj.defaultGenre) ? obj.defaultGenre : "";
                movie = DIV({"class":"movie","id":"movie_" + obj.id}, thumbnail, DIV({"class":"smallBodyText1 title"}, title), DIV({"class":"smallBodyText1 genre"},defaultGenre));
                
                MochiKit.Signal.connect(movie, "onmouseover", carouselMovieOnMouseOver);
                MochiKit.Signal.connect(movie, "onmouseout", carouselMovieOnMouseOut);
                MochiKit.Signal.connect(movie, "onclick", carouselMovieOnClick);
                MochiKit.DOM.appendChildNodes($("pageListDiv"), movie);
                movieElements[obj.id] = [movie, obj];
            }
            MochiKit.DOM.appendChildNodes($("pageListDiv"), DIV({"class":"clear"}));
            $('goButton').className = '';
            
            MochiKit.Style.showElement('pageListDiv');
            MochiKit.Style.hideElement('movieCarouselSpinner');
            
            var lastMovie = $(movie.id);
            var lastMovieRightEdge = lastMovie.offsetLeft + lastMovie.clientWidth + 10 /*right margin*/;
            var maxViewPortOffset = 1;
            if (lastMovieRightEdge > 557) {
                $('carouselSlider').style.display =
                    $('sliderLeft').style.display =
                    $('sliderRight').style.display = 'block';
                var maxViewPortOffset = lastMovieRightEdge - 557 /* View port width*/;                    
                carouselSlider = new Jaman.Slider($("carouselSlider"), 1, maxViewPortOffset, 1, 1);
                var handler = function(newVal) {
                    var pageListDiv = $("pageListDiv");
                    pageListDiv.style.left = -newVal + "px";
                };
                carouselSlider.setHandlers(handler, handler /* for dragging! */);
            } else {
                // hide slider if right edge of last movie does not exceed viewport width
                $('carouselSlider').style.display =
                    $('sliderLeft').style.display =
                    $('sliderRight').style.display = 'none';
            }
            $("pageListDiv").style.left = '0px';
            
            // making the call to fetch the movie for the movie details pane after the carousel call has been completed.
            fetchMovie(objs[0].id);
        });
    };
    
    var fetchMovie = function(videoId) {
        if (movieElements[currMovie.id]) {
            movieElements[currMovie.id][0].className = "movie";
        }
        movieElements[videoId][0].className += " selected";
        
        // hack to set the currMovie ID instead of waiting for the AJAX call to complete otherwise the mouseout mouseover events will not be in sync
        currMovie.id = videoId;
        
        if (currentFetchMovieAjaxCall) {
            currentFetchMovieAjaxCall.cancel();
        }
        
        currentFetchMovieAjaxCall = VideoLib.makeRequest(VideoLib.FETCH_THUMBNAIL_XML_ACTION_URL, {
            "videoID": videoId,
            "theAction": VideoLib.FETCH_THUMBNAIL_XML_ACTION_VALUE
        });
        
        currentFetchMovieAjaxCall.addCallback(function(resp) {
            var obj = MochiKit.Base.evalJSON(resp.responseText);
            updateMovieDetailPane(obj[0]);
        });
    };
    
    // Updated the movie detail pane. Expects a movie object as parameter.
    var updateMovieDetailPane = function(obj) {
        currMovie = obj;    
        VideoLib.currentVideoID = obj.id; // for trailer views.
        
        $("movieTitle").innerHTML = '<a href="' + obj.link + '">' + MochiKit.DOM.escapeHTML(obj.title.truncate(MOVIE_TITLE_MAX_LENGTH)) + '</a>';
        rater.resetRatings(obj.rating.user, obj.rating.average);
        rater.setAssociatedObject(obj.id);
        MochiKit.DOM.replaceChildNodes($("numOfRatings"), obj.rating.count);
        MochiKit.DOM.replaceChildNodes($("avgRating"), Math.round(obj.rating.average) / 20);
        MochiKit.DOM.replaceChildNodes($("numOfReviews"), A({"href":obj.link},obj.reviews + " review(s)"));
        MochiKit.DOM.replaceChildNodes($("movieSummary"), obj.description.truncate(MOVIE_SUMMARY_MAX_LENGTH),
            SPAN({"class":"smallBodyText1"},
            " ", A({"href":obj.link}, "See movie details >")));
        MochiKit.DOM.replaceChildNodes($("country"), obj.country);
        $('genre').innerHTML = obj.defaultGenre;
        MochiKit.DOM.replaceChildNodes($("language"), obj.language);
        MochiKit.DOM.replaceChildNodes($("duration"), obj.duration);
        
        if ((VideoLib.hasFlashVersion && "" != obj.trailer) || (VideoLib.hasQuicktime1 && "" != obj.quickTimeTrailer1)) {
            // trailer available
            $('movieImageHolder').style.display = "none";
            $('player').style.display = "block";
            
            if (!isInitialPageLoad) {
                VideoLib.setVideo(obj.trailer, obj.thumbnail, obj.size, obj.id, obj.title, obj.duration, obj.quickTimeTrailer1);
                var intervalId = window.setInterval(function() {
                    if (null != VideoLib.thisMovie()) {
                        VideoLib.setVideo(obj.trailer, obj.thumbnail, obj.size, obj.id, obj.title, obj.duration, obj.quickTimeTrailer1);
                        window.clearInterval(intervalId);
                    }
                }, 100);
            }
        } else {
            // no trailer; use image preview
            if (VideoLib.thisMovie()) {
                // after we pause the movie thisMovie() returns null
                try {
                    VideoLib.thisMovie().handlePause();
                } catch (e) {
                    // IE doesn't like this call for some reason and throws an error. We catch it and do nothing so the code can continue!
                    // Vikram says this is because the we can't interact with the movie object since it's hidden and it only loads if it is displayed.
                }
            }
            $('player').style.display = "none";
            $('movieImageHolder').style.display = "block";
            $('movieImageHolder').innerHTML = '<img src="' + obj.thumbnail + '" id="movieImage" />';
        }
        
        isInitialPageLoad = false;
        
        // Show unavailable text or buy box
        if (typeof(movieElements[currMovie.id][1].isAvailable) != "undefined" && !movieElements[currMovie.id][1].isAvailable) {
            MochiKit.DOM.replaceChildNodes($('buyBox'), DIV({'class':'unavailable'}, 'Sorry this movie is not yet available in your country.'));
        } else {
            // this call needs to be made before setVideo()
            MochiKit.DOM.replaceChildNodes($('buyBox'), buyBox.getDOM());
            buyBox.setVideo(obj);
        }

        // log profile view.
        VideoLib.clickedViewProfile(obj.id);
    };
    
    return {
        ratingClicked: function(initialMovieId, rating, image) {
            var deferred = VideoLib.setRating(initialMovieId, rating);
            if (!deferred) return;
            deferred.addCallbacks(function(resp) {
                Jaman.Rater.setRatingForObj(initialMovieId, rating, image);
                var getMovie = VideoLib.makeRequest(VideoLib.FETCH_THUMBNAIL_XML_ACTION_URL, {
                    "videoID": initialMovieId,
                    "theAction": VideoLib.FETCH_THUMBNAIL_XML_ACTION_VALUE
                });
                
                getMovie.addCallback(function(resp) {
                    var obj = MochiKit.Base.evalJSON(resp.responseText);
                    obj = obj[0];
                    if (initialMovieId == currMovie.id) {
                        MochiKit.DOM.replaceChildNodes($("numOfRatings"), obj.rating.count);
                        MochiKit.DOM.replaceChildNodes($("avgRating"), Math.round(obj.rating.average) / 20);
                    }
                });
            }, function(err) {
                VideoLib.logAtTop(err.faultString);
                Jaman.Rater.resetRatingFor(image);
            });
        },
        getCurrentMovie: function() {
            return currMovie;
        },
        init: function(params) {
            self = this;
            
            currMovie = params.firstMovie;
            
            for (var i = 1; i <= 4; i++) {
                ratingSliders[i] = new Jaman.Slider($("slider" + i), 0, 100, 50, 10);;
            }
            ratingSliders[1].setHandlers(function(newValue, oldValue) {
                    ratings[1] = Math.max(1, newValue);
            });
            ratingSliders[2].setHandlers(function(newValue, oldValue) {
                    ratings[2] = Math.max(1, newValue);
            });
            ratingSliders[3].setHandlers(function(newValue, oldValue) {
                    ratings[3] = Math.max(1, newValue);
            });
            ratingSliders[4].setHandlers(function(newValue, oldValue) {
                    ratings[4] = Math.max(1, newValue);
            });
            
            if (!params.ratingFromParam1) {
                // read mood ratings from promo movie
                setRatingsForMovieFinder(
                    parseInt(currMovie.rating1),
                    parseInt(currMovie.rating2),
                    parseInt(currMovie.rating3),
                    parseInt(currMovie.rating4)
                );
            } else {
                setRatingsForMovieFinder(
                    params.ratingFromParam1,
                    params.ratingFromParam2,
                    params.ratingFromParam3,
                    params.ratingFromParam4
                );
                isMoodFromQueryParamsOrCookies = true;
            }
            
            buyBox = new Jaman.BuyBox("buyBox", true, 0, "moviesBody_buybox");
            
            // attach event handler to Go button
            MochiKit.Signal.connect($('goButton'), 'onclick', goButtonOnClick);
            
            // init rater.
            rater = new Jaman.Rater("main_movie_rater", 10, function(r, vid) { JAMAN.Movies.ratingClicked(vid, r, "main_movie_rater"); }, Jaman.Rater.SIZE_LARGE_BLUE, currMovie.rating.user, currMovie.rating.average, currMovie.id);
            $("main_movie_rater_div").appendChild(rater.getDOM());
            
            goButtonOnClick();

            YAHOO.util.Connect.asyncRequest('GET',
                '/movies/?theAction=fetch_recommended_videos&' + VideoLib.PARAM_IS_XML_REQUEST_NAME + '=' + VideoLib.PARAM_TRUE_VALUE, {
                    success:function(o) {
                        var j = YAHOO.lang.JSON.parse(o.responseText);
                        $('recommendations-' + (VideoLib.getSessionID() ? 'more' : 'less')).innerHTML = j.content;
                        var scriptElt = document.createElement('script');
                        scriptElt.innerHTML = j.recommendation_init_fn;
                        document.getElementsByTagName('head')[0].appendChild(scriptElt);
                    }
                });
        }
    };
})();
