﻿/// <reference path="./Cineplex.js" />

Agility.RegisterNamespace("Cineplex.MovieListing");

(function(MovieListing) {
    MovieListing.pageSize = 10; //page size
    MovieListing.formId = "movieListingForm";
    MovieListing.releaseStateLabels = {};
    MovieListing.defaultTitle="";
    MovieListing.moviesUrl="";

 

    var _isFirstLoad = true;

    $(function() {

        var loc = Cineplex.UserContext.GetCurrentLocation()
        var MovieListingDefaultState = new Cineplex.UserContext.CurrentStateConstructor('ML', '0', '', '', '', '', '', '', '','NP','');
        //if user has cookies disabled show data from server
        
        if (Cineplex.UserContext.IsCookieEnabled() == false) {


        }
        //retrieve the state for this page, and store it in an object;
        //bind the save as favourite action
        Cineplex.CurrentState = Cineplex.UserContext.GetState();
       
        //revert to default if this is not a postback
        if (Cineplex.CurrentState.PN != 'ML') {
            Cineplex.CurrentState = MovieListingDefaultState;
            Cineplex.UserContext.SetState(Cineplex.CurrentState);


        }
        //set title based on state
        getStateTitle(Cineplex.CurrentState.SE);
        //fix encoding for dates
        
        Cineplex.CurrentState.ED= Cineplex.CurrentState.ED.replace(/%[0-9]{1,4}F/g,'/'); 
        Cineplex.CurrentState.ST= Cineplex.CurrentState.ST.replace(/%[0-9]{1,4}F/g,'/'); 
    
        //fix the left padding for this module
        $('#MovieListing').css('margin-left', '-10px');
        Cineplex.CurrentState.SE=="NW"?$('#movie-release-state-nowplaying').attr('checked', false):function(){};

        //bind to form submit
        $('#' + MovieListing.formId).submit(function() {
            var location = Cineplex.UserContext.GetCurrentLocation();
            _populateListings(location, 0);

            return false;
        });

                //bind the skinned dropdowns
        $("#lstMovieListingRating").CineplexCombo({
            onchange: function(selected) {
                $('#txtRating').val($(selected).attr('typeid'));
                return false;
            }
        });

        $("#movie-release-state-nationwide").bind('click',function()
        {
        _refreshNationWideSearch();
        window.location=_getReturnUrl();
        return false;

        });

        //bind the skinned dropdowns
        $("#lstMovieListingGenre").CineplexCombo({
            onchange: function(selected) {
                $('#txtGenre').val($(selected).attr('genreid'));
                return false;
            }
        });

        //bind the skinned dropdowns
        $("#lstMovieListingType").CineplexCombo({
            onchange: function(selected) {
         $('#txtType').val($(selected).attr('typeid'));
                return false;
            }
        });

    
    $(".RatingMessage").find("a").live('click',function(){
    _refreshPageByWarning($(this).attr("rel"));
       window.location=_getReturnUrl();
    return false;
    });



        //bind the save as favourite action
        $("#lnkSaveMovieFavourite").click(function() {
            var filmID = parseInt($(this).attr("filmID"));
            if (!isNaN(filmID)) {
                Cineplex.UserContext.AddFavoriteMovie(filmID);
                return false;
            }
        });
  $("input[type=text]").bind('click',function(){$(this).val("");});
  $("#movie-listing-name").bind('blur',function(){$(this).val()==""?$(this).val(MovieListing.defaultTitle):function(){};});
        //bind advanced search button

    $("#btnAdvancedSearch").bind('click',function(){
     _refreshPageAdv();
      window.location=_getReturnUrl();
     return false;
    });

        //show adv filter click
        $('#ShowMovieListingAdvancedFilters').click(function() {
            MovieListing.showAdvancedFilterPanel();
            return false;
        });

        //view map click
        $("#viewmap").click(Cineplex.MapTheatres);

        //calendar
        $('#adv-release-start').datepicker({
            duration: "",
            buttonImage: Agility.ResolveUrl('~/Images/Buttons/btnCalendar.png'),
            buttonText: 'mm/dd/yy',
            buttonImageOnly: true,
            showOn: 'both',
            altFormat: 'mm/dd/yy',
            onSelect: function(dateText, input) {
                var label = $(this).data('labelObj');
                //hide
                if (dateText != "") {
                    label.css({ textIndent: -10000 });
                }
            }
        });

        $('#adv-release-end').datepicker({
            duration: "",
            buttonImage: Agility.ResolveUrl('~/Images/Buttons/btnCalendar.png'),
            buttonText: 'mm/dd/yy',
            buttonImageOnly: true,
            showOn: 'both',
            altFormat: 'mm/dd/yy',
            onSelect: function(dateText, input) {
                var label = $(this).data('labelObj');
                //hide
                if (dateText != "") {
                    label.css({ textIndent: -10000 });
                }
            }
        });

        //label overlays
    

        //location search
        var setLocation = function() {
            Cineplex.UserContext.SetCurrentLocation($("#movie-listing-location").val(), function(){});
            _refreshPage();
            return false;
        };

        //add autocomplete to location field
        $("#movie-listing-location").autocomplete(Agility.ResolveUrl("~/Services/LocationAutoComplete.ashx"));

      

        $("#movie-listing-refresh-button").click(function() {
            setLocation();
          window.location=_getReturnUrl();
            return false;
        });
        //add data to input fields
         _populateInputFields();
        //check for location
        var location = Cineplex.UserContext.GetCurrentLocation();

        //Get page index
        var pageIndex = Cineplex.CurrentState.PG;


        //if (pageIndex != undefined) {
            //pageIndex = pageIndex - 1;
       // }

        //location
      
            _populateListings(location, pageIndex);
        
    });

    function _refreshPage()
    {
    var s = Cineplex.CurrentState;
    s.PG=0;
    s.SE=$(".input-state:checked").val();
    $("#movie-listing-name").val()!= MovieListing.defaultTitle?s.TA=encodeURI($("#movie-listing-name").val()):s.TA="";
    s.GE="";
    s.RA="";
    s.ST="";
    s.WA="";
    s.ED=""; 
    s.TY=""; 
    Cineplex.UserContext.SetState(Cineplex.CurrentState);
    

    }

    function _refreshPageAdv()
    {
      var s = Cineplex.CurrentState;
    s.PG=0;
    s.SE=$(".input-state:checked").val();
    $("#movie-listing-name").val()!= MovieListing.defaultTitle?s.TA=encodeURI($("#movie-listing-name").val()):s.TA="";
    s.GE=$("#txtGenre").val();
    s.RA=$(".ddTitle").find(".textTitle").eq(2).text();
    s.ST=$("#adv-release-start").val();
    s.ED=$("#adv-release-end").val(); 
    s.WA="";
    s.TY=$("#txtType").val();
   // s.TY= $(".ddTitle").find(".textTitle").eq(1).text();

    Cineplex.UserContext.SetState(s);
    }

  function _refreshPageByWarning(warning)
    {

      Cineplex.CurrentState = new Cineplex.UserContext.CurrentStateConstructor('ML', '0', '', '', warning, '', '', '', '',$(".input-state:checked").val(),'');
     Cineplex.UserContext.SetState(Cineplex.CurrentState);
    
    }


    function _refreshNationWideSearch()
    {
     Cineplex.CurrentState = new Cineplex.UserContext.CurrentStateConstructor('ML', '0', '', '', '', '', '', '', '','NW','');
     Cineplex.UserContext.SetState(Cineplex.CurrentState);
    }


    function _populateInputFields()
    {
    var s = Cineplex.CurrentState;
  
   // s.GE=$("#txtGenre").val();
    $("#txtRating").val(s.RA);
    s.ST==""?  $('#adv-release-start-label').css({"display":"inline"}).labelOver('over-apply'):$("#adv-release-start").val(s.ST);
    s.ED==""? $('#adv-release-end-label').css({"display":"inline"}).labelOver('over-apply'):$("#adv-release-end").val(s.ED); 
    s.TY!=""?$("#txtType").val(s.TY):function(){}; 
    s.TY!=""?$(".ddTitle").find(".textTitle").eq(1).text($("#lstMovieListingType").find("a[typeid="+s.TY+"]").text()):function(){};
    s.RA!=""?$(".ddTitle").find(".textTitle").eq(2).text(s.RA):function(){};
   
    s.GE!=""? $("#lstMovieListingGenre").find("a[genreid="+ s.GE+"]").click():function(){};
    s.SE!=""? $(".input-state[value='"+ s.SE+"']").click():function(){};
    //If there is no advanced field, don't display
  if(s.ED!=""|| s.GE!="" || s.ED!="" || s.ST!="" || s.RA!="")
    {
    $("#divAdvancedFilter").show();
    $("#ShowMovieListingAdvancedFilters").hide();
    }
  
    }


    function _populateListings(location, pageIndex) {
   
        //load spinner
        //set the height so we don't "jump"
       // $("#movie-listing-results").show().css("minHeight", $("#mp").height()).css("overflow", "hidden");
       $("#movie-listing-results").show().css("overflow", "hidden");

        //Show spinner
        $("#movie-listing-results").html(Cineplex.AjaxSpinner());

        //Hide pager
        $('#pnlMovieListingPager').hide();
         
        //determine location
        if (location == undefined ||location == null) {
          $("#movie-listing-name").val(MovieListing.defaultTitle);
          $("#movie-listing-results").html("<div class='NoResultsMessage'>" + Cineplex.UserContext.NoLocationMessage() + "</div>");

        } else {
            $("#movie-listing-location").val(location);
        }

        //fix page
        //if (pageIndex == undefined) {
          //  pageIndex = 0;
       // }

        //Scroll back to top        
        if (!_isFirstLoad) {
            $(document).scrollTo($("#MovieListing"), {
                duration: 500,
                easing: "swing",
                onAfter: function() {
                    $("#movie-listing-results").css("minHeight", null).css("overflow", 'auto');
                }
            });
        }

        _isFirstLoad = false;

        //Load data
       

         MovieListing.BuildWarningLinks = function(warnings) {
            var split = warnings.split(","),
            resultArr = [],
            linkHtml, warning;
          
            for (var i = 0; i < split.length; i++) {
                warning = _trim(split[i]);
                linkHtml = "<a  rel=\""+encodeURIComponent(warning)+"\" href=\"" +  MovieListing.moviesUrl + "?state=ALL&warning=" + encodeURIComponent(warning) + "\">" + warning + "</a>";
                resultArr.push(linkHtml);
            }
            return resultArr.join(", ");
        }


            MovieListing.GetEncodedRating = function(rating) {
            var encodedRating = encodeURIComponent(rating);
            return encodedRating;
        }





        MovieListing.GetMovies(location, pageIndex, function(data) {
           
            //Update the title
           

            //Clear min height
            $("#movie-listing-results").css("minHeight", null);

            //build ui
             data.term!=""? $("#movie-listing-name").val(data.term):$("#movie-listing-name").val(MovieListing.defaultTitle);
            if (data == undefined || (data.d != undefined && data.d.length == 0)) {
                if (Cineplex_errMovieListingSearchNotCompleted != undefined) {
                    $("#movie-listing-results").html('<div class="NoResultsMessage">' + Cineplex_errMovieListingSearchNotCompleted + '</div>');
                }
            } else {
                $("#now-showing-label").html(renderTotalPageCount(MovieListing.pageSize,data.total,pageIndex));
                var results = $('#movie-listing-results');
                results.setTemplateElement('movie-listing-template');
                results.setParam("renderExclusiveContent", _renderExclusiveContent);
                results.processTemplate(data.d);

                //Init
                Cineplex.InitializeAjaxPager($("#pnlMovieListingPager"), MovieListing.pageSize, pageIndex, data.total, function(newPageIndex) {
                    _populateListings(location, newPageIndex);
                });

                //Show pager
                $('#pnlMovieListingPager').show();

                //load the similar cities
                $("#pnlSimilarCities").SimilarCities(function(newLocation) {
                    Cineplex.UserContext.SetCurrentLocation(newLocation, function(setLoc) {
                        _populateListings(setLoc);
                    });
                });
            }
        });
    }



    function renderTotalPageCount(PageSize, DisplayCount ,PageIndex)
        {
         if (Cineplex.GetCurrentLanguage()  == "en-us")
					{
                        return ("<span class='H2'>Displaying " + DisplayingLabel(PageSize,DisplayCount,PageIndex) + " Results</span>");
					}
					else
					{
						return("<span class='H2'>Affichage " + DisplayingLabel(PageSize,DisplayCount,PageIndex) +  " résultats</span>");						
					}


        }

function DisplayingLabel(PageSize,DisplayCount,PageIndex)
		{
      

			var strOf = " of ";
            if (Cineplex.GetCurrentLanguage()  != "en-us")
			{
				strOf = " du ";
			}

			if (PageSize >= DisplayCount)
			{
				//Only 1 page:
				return "1 - " + DisplayCount;
			}
			else if (PageIndex * PageSize+(PageSize) > DisplayCount)
			{
				//Last Page
				return ((PageSize * (PageIndex)) + 1)+ " - " + (DisplayCount)+ strOf + DisplayCount;
			}
			else
			{
				return ((PageSize * (PageIndex)) + 1)+ " - " + (PageSize * PageIndex +(PageSize)) + strOf + DisplayCount;
			}
		}
    
   function getStateTitle(st)
        {
    //
                var h2 = $('#MovieListingTitle');
                if (st == "NW") {
                    h2.text(h2.attr("title") + " " + $("#movie-release-state-nationwide").text());
                }
                else if (st == "CS") {
                    h2.text(h2.attr("title") + " " + MovieListing.releaseStateLabels.cs);
                }
                else if (st== "ALL") {
                    h2.text(h2.attr("title") + " " + MovieListing.releaseStateLabels.all);
                }
 


        }

    function showAdvancedListings(fields)
    {
    var j=0;
    for (i=0;i<fields.length;i++)
        {
         if(fields[i].v!="")
            {
            $("#" + fields[i].e).val(fields[i].v);
            j++;
            }  
        }
    }

    function _getReturnUrl()
    {
      return Cineplex.GetCurrentLanguage() == "fr-ca"?Agility.ResolveUrl("~/Films.aspx"):Agility.ResolveUrl("~/Movies.aspx");
    }

    function _renderExclusiveContent(str) {
        if (str == null || str == "") return "";

        var div = $('<div></div>');
        div.html(str);

        return '<div class="ExclusiveContent">' + div.text() + "</div>";
    }

    MovieListing.GetMovies = function(location, pageIndex, callback) {
        if (callback != null && typeof callback != "function") {
            alert("MovieListing.GetMovies: Callback arg is not a function");
            return;
        }

        if (location == null || location.length == 0) {
            return false;
        }

        var url = Agility.ResolveUrl('~/Services/MovieLookup.ashx?func=getMovieListings&callback=?');

        var query =  MovieListing.BuildRequestString() + "&page=" + pageIndex + "&pagesize=" + MovieListing.pageSize +"&location="+location;
       
        $.getJSON(url, query,
			function(data) {
			    //data class = { total : 99, d : [{ Title : "", ImageUrl : "", ReleaseDate : "", Runtime : "", Genre : "", Showtimes : "", TrailerUrl: "", FilMRating : { ImageUrl: "", Description: "", Warning: "" }}, ...
			    //                                  { Title : "", ImageUrl : "", ReleaseDate : "", Runtime : "", Genre : "", Showtimes : "", TrailerUrl: "", FilMRating : { ImageUrl: "", Description: "", Warning: "" } }] }
			    callback(data);
			});
    }

    MovieListing.closeAdvancedFilterPanel = function() {
        var filter = $('#divAdvancedFilter');
        filter.slideUp(500, function() {
            $('#' + MovieListing.formId + ' .Search').css('margin-bottom', '30px');
            $('#ShowMovieListingAdvancedFilters').show();
        });
    }

    MovieListing.showAdvancedFilterPanel = function() {
        $('#' + MovieListing.formId + ' .Search').slideDown(250, function() {
            $(this).css('margin-bottom', '14px');
            var filter = $('#divAdvancedFilter');

            filter.slideDown(500, function() {
                $('#ShowMovieListingAdvancedFilters').hide();
            });
        });
    }

    

    function _trim(str) {
        return str.replace(/^\s+/, "").replace(/\s+$/, "");
    }

    MovieListing.BuildRequestString = function()
    {
    var s=Cineplex.CurrentState;
    var warning= s.WA!=""?"&warning="+s.WA:"";
    var actor = Agility.QueryString("actor")?"&actor=" + Agility.QueryString("actor"):"";
    return "rating="+s.RA +"&start=" +s.ST +"&end="+s.ED+"&state=" + s.SE + "&type=" +s.TY+"&movietitle=" + decodeURI(s.TA)+"&genre="+s.GE+warning + actor;
    }

    


     MovieListing.BuildTrailerLinks=function(Url)
     {
  
     if(Cineplex.GetCurrentLanguage()=="en-us")
     {
         return Url.replace('videosfr.','videos.')
     }
     else
        {
        return Url.replace('videos.','videosfr.')
        }
     

     }

    MovieListing.BuildGenreLinks = function(genres) {


    var genrelist= $("#lstMovieListingGenre");
        var split = (genres || "").split(","),
            resultArr = [],
            linkHtml, genre;
        for (var i = 0; i < split.length; i++) {
            genre = _trim(split[i]);
            linkHtml = "<a href=\"" + Cineplex.MovieListing.moviesUrl + "?state=ALL&genre=" +genrelist.find("a:contains('"+ genre+"')").attr("genreid")  + "\">" + genre + "</a>";
            resultArr.push(linkHtml);
        }
        return resultArr.join(", ");
    }

  
    

})(Cineplex.MovieListing);
