﻿// URL DES HANDLERS APPELES EN AJAX //

// Handler permettant de récupérer la liste des produit associé au produit courrant Trié et paginé
var urlHandlerProductList = "/Handlers/ProductPageResult.ashx";

// Handler appelé pour la comparaison de produit
var urlHandlerProductsToCompare = "/Handlers/ProductsToCompare.ashx";

// Handler appelé pour l'affichage de WebUserControl dans une PopUp pour les détail produit par exemple
var urlHandlerPopUpGenerator = "/Handlers/PopUpGenerator.ashx";

// Handler permettant la génération de menu avec onglet en AJAX
var urlHandlerTabbedProductMenuGenerator = "/Handlers/TabbedProductMenuGenerator.ashx";

// Handler permettant de récupérer les avis pour le produit courrant Trié et paginé
var urlHandlerInternetUsersRatingResult = "/Handlers/InternetUsersRatingResult.ashx";

// Handler permettant d'ajouter un avis pour le produit courrant
var urlHandlerInternetUsersRating = "/Handlers/InternetUsersRating.ashx";

// Handler permettant de visualiser une fiche conseil pour un produit conseil
var urlHandlerAdviceCardDetails = "/Handlers/AdviceCardDetails.ashx";

// VARIABLES PRIVEES //
var PROPERTY_SEPARATOR = '#';

// Type de produit de la page courrante
var currentPage;

// Type de produit listé
var productType;

// Selon le type de produit listé et la le type du produit courrant la comparaison de produit est indisponible 
// Exemple : Si le produit est un accessoire les telephone listé ne sont pas comparable, si le produit est un téléphone
// Et que les produits listé sont des accessoire ces accessoire ne peuvent pas être comparé
var compareProcess = false;

// Variable signalant qu'une requete ajax est en cours
var inProcess = false;

// Variable signalant qu'une autre requete a souhaité être executé
var otherRequestDemand = false;

// ENUMERATORS //

// Sens de tri Croissant ou Décroissant
var SortDirection = 
{
    Ascending : "Ascending",
    Descending : "Descending"
};

// Type de produit : téléphone / accessoire / forfait
var Category =
{
    Phone : "phone",
    Accessory : "accessory",
    Contract : "contract",
    Contract_3G : "contract_3g",
    Key3G : "key3g",
    Bundle : "bundle",
    Netbook : "netbook",
    Accessory_Netbook : "accessory_netbook"
};

// OBJET //

// Objet permettant le tri : Propriété sur laquelle trié et sens du tri
var SortObject = 
{
    SortExpression : "Brand", 
    SortDirection : SortDirection.Ascending
};


// FONCTIONS //

// Calcul la taille du conteneur pour permettre que la div ne change pas de taille lors d'un tri ou d'un changement de page
function setHeightContainerList(src, container)
{
    // On récupère la hauteur de la source
    var height = $(src).height();
    
    // Si la hauteur du conteneur est inférieur ou égale à celle récupérer jsute au dessus on lui affecte
    if($(container).height() <= height)
        $(container).css("height", height);
}

// Initialise les boutton de tri en leur enlevant les classe "on-gauche" et "on-droite"
function initializeButtonImage()
{
    // Pour chacun des input type : submit dans la div ".classement"
    $(".classement input[type='submit']").each(function(i, item)
    {
        // On supprime les 2 classe
        item = $(item);
        item.removeClass("on-gauche");
        item.removeClass("on-droite");
    });
}

// Raffraichi la liste des avis internaute, Paramètre Sort : Booleen True / False si le rafraichissement demandé est du à un tri ou pas
var refreshReviewList = function(sort)
{
    // On récupère les div contenant les avis internaute, div du pager et div contenant celle qui contient les avis
    var divResults = ".listing-avis";
    var divPager = "#pager";
    var divResultsContainer = ".avis-inter";
    
    //Si aucune requete AJAX n'est en court
    if (!inProcess)
    {
        //On precise qu'on effecture une requete
        inProcess = true;

        // On affecte la taille du container pour éviter que le container change de page lors du tri ou du changement de page
        setHeightContainerList(".milieu-bloc-liste", divResultsContainer);

        // On cache la div actuelle
        $(divResults).fadeOut(500, function() 
        {
            // Et en Callback on charge la nouvelle liste en passant en paramètre les div en question et si c'est un tri ou pas
            reviewFilters.loadList(divResults, divPager, divResultsContainer, sort);
            
        });
    }
    else
        otherRequestDemand = true;
};

// Chargement d'une liste d'avis internaute selon la page souhaité et le tri souhaité
var reviewFilters =
{
    loadList : function (divResults, divPager, divResultsContainer, sort)
    {
        // Variable utilisé pour le stockage temporaire d'un avis pour affecté les valeurs dans le template
        var currentReview = null;

        // On créé une requete ajax en "POST" en appelant le handler permettant de récupérer les avis pour le produit courrant Trié et paginé
        // dont le type de retour est du json
        $.ajax({ type:"POST", url:urlHandlerInternetUsersRatingResult, data: reviewFilters.getParameters(sort), dataType: "json", beforeSend : function()
        {
            // Durant le temps que la requète se réalise et que le handler a renvoyé la liste en JSON on affiche une image de chargement
            $(divResultsContainer).append($("<div height=" + $(divResultsContainer).height() + " id=\"loading\"><img  src=\"/Content/Images/Common/ajax-loader-petit.gif\" alt=\"chargement en cours\" /></div>"));
        }, success: function(j, message)
        {
            // Lorsque les résultat sont retourné on supprime cette image et on vide tout les résultats présent auparavant
            $("#loading").remove();
            $(divResults).empty();

            // Si c'est un tri et non un changement de page on reviens à la première page
            if (sort)
                reviewFilters.currentPage = 1;

            // Si objet retourne ne possède aucun avis on affiche un message signalant que la requete n'a retourné aucun résultat
            if (j.Reviews.length == 0)
            {
                $(divResults).append("Pas de résultats");
            }
            else
            {
                // Sinon pour chaqun des Avis retourné par le handler
                for (var i = 0; i < j.Reviews.length; i++)
                {
                    // On affecte l'avis temporaire par l'avis courrant
                    currentReview = j.Reviews[i];

                    // On effectue une requete AJAX de type "GET" pour récupérer le template d'avis internaute
                    $.ajax( { async: false, type : "GET", url : "/Content/Templates/Review/Review.tpl", dataType : "text", success: function(data, message)
                    {
                        // Si l'avis n'est pas null
                        if (currentReview != null)
                        {
                            // On met en forme l'avis internaute avec le template récupérer en AJAX et rempli via le plugin jQuery.Template
                            var template = $.template(data);

                            // On ajoute au div de résultat le template avec les valeurs de l'avis courrant
                            $(divResults).append(template,
                            {
                                DateCreation: currentReview.DateCreation,
                                ImageList: currentReview.ImageList,
                                Login: currentReview.Login,
                                PositiveComment: currentReview.PositivePoints,
                                NegativeComment: currentReview.NegativePoints
                            });
                        }
                    }});
                }
            }

            // Si le nombre de page est supérieur à 1 on créé le pager des avis internaute
            if (j.NbPage > 1 )
                CreateReviewPager(divPager, reviewFilters.currentPage, j.NbPage);

            // Pour finir on affiche la div de résultat en FadeIn
            $(divResults).fadeIn(600);
            
            

            //On précise que la requete est fini
            inProcess = false;

            if (otherRequestDemand)
            {
                otherRequestDemand = false;
                refreshReviewList(false);
            }
        }});
    },

    // Fonction permettant la récupération de l'ID du Produit courrant
    getProductIdentifier: function()
    {
        var productVal = $("input[type='hidden'][class='productIdentifier']");
        reviewFilters.productID = productVal.val();
        return reviewFilters.productID;
    },

    // Créé l'objet "parameters" qui sera passé en POST lors de la requete AJAX par jQuery
    getParameters:function (fullReload)
    {
        var productVal = reviewFilters.getProductIdentifier();
        var cultureVal = reviewFilters.culture;
        var pageSizeVal = reviewFilters.pageSize;
        var currentPageVal = reviewFilters.currentPage;

        return{ full : fullReload, sortExpression : SortObject.SortExpression, sortDirection : SortObject.SortDirection, culture: cultureVal, currentPage : currentPageVal, pageSize: pageSizeVal, currentIdProduct : productVal};
    },

    // Taille par défaut d'une page pour la liste d'avis
    pageSize: 5,

    // Page courrante par défaut
    currentPage : 1,

    // Code culture par défaut
    culture: "fr-FR"
}

// Rafraichissement de la liste des Produit Associé, Paramètre Sort : Booleen True / False si le rafraichissement demandé est du à un tri 
// ou pas
var refreshList = function(sort) 
{
    // On récupère les div contenant les avis internaute, div du pager et div contenant la liste d'input permettant le tri
    var divResults = ".result";
    var divClassement = ".classement";
    var divPager = "#pager";

    //Si aucune requete est en court
    if (!inProcess) 
    {
        // On precise qu'on effecture une requete
        inProcess = true;
        
        // On affecte la taille de la div ".overflow" pour qu'elle garde sa taille lors d'un changement de page ou d'un tri
        setHeightContainerList(divResults, ".overflow");

        // On cache la div de résultat
        $(divResults).fadeOut(500, function() 
        {
            // Et en Callback on charge la nouvelle liste en passant en paramètre les div en question et si c'est un tri ou pas
            filters.loadList(divResults, divClassement, divPager, sort);
        });
    }
    else
        otherRequestDemand = true;
};

// Chargement d'une liste de produit associé
var filters =
{
    loadList: function(divResults, divClassement, divPager, sort) {
        // Variable temporaire stockant le produit parcourus
        var currentProduct = null;

        // On créé une requete ajax en "POST" en appelant le Handler permettant de récupérer la liste des produit associé au produit 
        // courrant Trié et paginé dont le type de retour est du json
        $.ajax({ type: "POST", url: urlHandlerProductList, data: filters.getParameters(sort), dataType: "json", beforeSend: function() {
            // Durant le temps que la requète se réalise et que le handler a renvoyé la liste en JSON on affiche une image de chargement
            $(".overflow").append($("<div id=\"loading\"><img  src=\"/Content/Images/Common/ajax-loader-petit.gif\" alt=\"chargement en cours\" /></div>"));
        }, success: function(j, message) {
            // Lorsque les résultat sont retourné on supprime cette image et on vide tout les résultats présent auparavant
            $("#loading").remove();
            $(divResults).empty();

            // Si c'est un tri on revient à la première page de la liste
            if (sort)
                filters.currentPage = 1;

            // Si la liste de produit retourné ne contient pas d'élément
            if (j.Products.length == 0) {
                // On affiche "Pas de résultats"
                $(divResults).append("Pas de résultats");

                // On cache le bouton de comparaison de produit
                if (compareProcess)
                    $("#linkComparePage_bottom").css("display", "none");
            }
            else {
                // Sinon on créé un conteneur récupérer la liste de produit avec leur template pour l'affecter à terme dans divResult
                var conteneur;

                // Si le produit de la fiche produit courrant est un accessoire le conteneur est une div de classe .access-compat
                if (currentPage == Category.Accessory)
                    conteneur = $('<div class="access-compat"></div>');
                // Sinon c'est un tableau dont la classe depend du type de produit listé
                else
                    conteneur = $('<table cellpadding="0" cellspacing="0" width="592" class=\"' + productType + '\"></table>');

                // Pour chacun des produits
                for (var i = 0; i < j.Products.length; i++) {
                    // On récupère le produit courrant
                    currentProduct = j.Products[i];

                    // on récupère un template dont le nom du fichier est présent dans une propriété du produit courrant
                    $.ajax({ async: false, type: "GET", url: "/Content/Templates/" + currentProduct.TemplateFileName, dataType: "text", success: function(data, message) {
                        if (currentProduct != null) {
                            if (currentProduct.Phone != null || currentProduct.Accessory != null || currentProduct.ThirdGKey != null || currentProduct.Netbook != null) {
                                var dispo;

                                if (currentProduct.Phone != null)
                                    dispo = currentProduct.Phone.Dispo;
                                else if (currentProduct.ThirdGKey != null)
                                    dispo = currentProduct.ThirdGKey.Dispo;
                                else if (currentProduct.Netbook != null)
                                    dispo = currentProduct.Netbook.Dispo;
                                else
                                    dispo = currentProduct.Accessory.Dispo;

                                var mediaWebUrl;
                                var mediaShopUrl;
                                var stockLabel = "En stock";
                                switch (dispo) {
                                    case 1:
                                        mediaWebUrl = "/Content/Images/Common/Various/picto-internet-petit-on.png";
                                        mediaShopUrl = "/Content/Images/Common/Various/picto-magasin-petit-on.png";
                                        break;
                                    case 2:
                                        mediaWebUrl = "/Content/Images/Common/Various/picto-internet-petit-on.png";
                                        mediaShopUrl = "/Content/Images/Common/Various/picto-magasin-petit-off.png";
                                        break;
                                    case 3:
                                        mediaWebUrl = "/Content/Images/Common/Various/picto-internet-petit-off.png";
                                        mediaShopUrl = "/Content/Images/Common/Various/picto-magasin-petit-on.png";
                                        break;
                                    case 4:
                                        mediaWebUrl = "/Content/Images/Common/Various/picto-internet-petit-off.png";
                                        mediaShopUrl = "/Content/Images/Common/Various/picto-magasin-petit-off.png";
                                        stockLabel = "Pas de stock";
                                        break;
                                    default:
                                        break;
                                }
                            }

                            //On met en forme le produit avec un template
                            var template = $.template(data);

                            if (currentProduct.Contract != null) {
                                conteneur.append(template,
                                {
                                    Id: currentProduct.Id,
                                    ODRUrl: currentProduct.ODRImageUrl,
                                    ImageSaleFlash: currentProduct.ImageSaleFlash,
                                    Brand: currentProduct.Brand,
                                    Name: currentProduct.Name,
                                    UnitPrice: currentProduct.UnitPrice,
                                    DecimalPrice: currentProduct.DecimalPrice,
                                    Url: currentProduct.Url,
                                    Term: currentProduct.Contract.Term,
                                    Advantage: currentProduct.Contract.Advantage,
                                    TypeName: currentProduct.Contract.TypeName,
                                    FormattedPrice: currentProduct.Contract.FormattedPrice
                                });
                            }
                            else if (currentProduct.Phone != null) {
                                conteneur.append(template,
                                {
                                    Id: currentProduct.Id,
                                    IdReference: currentProduct.IdReference,
                                    ODRUrl: currentProduct.ODRImageUrl,
                                    ImageSaleFlash: currentProduct.ImageSaleFlash,
                                    FlagName: currentProduct.FlagName,
                                    FlagUrl: currentProduct.FlagImageUrl,
                                    Brand: currentProduct.Brand,
                                    Name: currentProduct.Name,
                                    UnitPrice: currentProduct.UnitPrice,
                                    UnitSpecialPrice: currentProduct.UnitSpecialPrice,
                                    DecimalPrice: currentProduct.DecimalPrice,
                                    DecimalSpecialPrice: currentProduct.DecimalSpecialPrice,
                                    MediaUrl: currentProduct.MediaUrl,
                                    Url: currentProduct.Url,
                                    WebUrl: mediaWebUrl,
                                    ShopUrl: mediaShopUrl,
                                    StockLabel: stockLabel,
                                    StockStoreUrl: currentProduct.Phone.StockStoreUrl
                                });
                            }
                            else if (currentProduct.Netbook != null) {
                                conteneur.append(template,
                                {
                                    Id: currentProduct.Id,
                                    ODRUrl: currentProduct.ODRImageUrl,
                                    FlagUrl: currentProduct.FlagImageUrl,
                                    FlagName: currentProduct.FlagName,
                                    Brand: currentProduct.Brand,
                                    Name: currentProduct.Name,
                                    UnitPrice: currentProduct.UnitPrice,
                                    UnitSpecialPrice: currentProduct.UnitSpecialPrice,
                                    DecimalPrice: currentProduct.DecimalPrice,
                                    DecimalSpecialPrice: currentProduct.DecimalSpecialPrice,
                                    MediaUrl: currentProduct.MediaUrl,
                                    Url: currentProduct.Url,
                                    WebUrl: mediaWebUrl,
                                    ShopUrl: mediaShopUrl,
                                    StockLabel: stockLabel,
                                    StockStoreUrl: currentProduct.Netbook.StockStoreUrl
                                });
                            }
                            else if (currentProduct.ThirdGKey != null) {
                                conteneur.append(template,
                                {
                                    Id: currentProduct.Id,
                                    ODRUrl: currentProduct.ODRImageUrl,
                                    FlagUrl: currentProduct.FlagImageUrl,
                                    FlagName: currentProduct.FlagName,
                                    Brand: currentProduct.Brand,
                                    Name: currentProduct.Name,
                                    UnitPrice: currentProduct.UnitPrice,
                                    UnitSpecialPrice: currentProduct.UnitSpecialPrice,
                                    DecimalPrice: currentProduct.DecimalPrice,
                                    DecimalSpecialPrice: currentProduct.DecimalSpecialPrice,
                                    MediaUrl: currentProduct.MediaUrl,
                                    Url: currentProduct.Url,
                                    WebUrl: mediaWebUrl,
                                    ShopUrl: mediaShopUrl,
                                    StockLabel: stockLabel,
                                    StockStoreUrl: currentProduct.ThirdGKey.StockStoreUrl
                                });
                            }
                            else {
                                conteneur.append(template,
                                {
                                    Id: currentProduct.Id,
                                    ODRUrl: currentProduct.ODRImageUrl,
                                    FlagUrl: currentProduct.FlagImageUrl,
                                    FlagName: currentProduct.FlagName,
                                    ClassName: currentProduct.Accessory.ClassName,
                                    Name: currentProduct.Name,
                                    UnitPrice: currentProduct.UnitPrice,
                                    UnitSpecialPrice: currentProduct.UnitSpecialPrice,
                                    DecimalPrice: currentProduct.DecimalPrice,
                                    DecimalSpecialPrice: currentProduct.DecimalSpecialPrice,
                                    MediaUrl: currentProduct.MediaUrl,
                                    Url: currentProduct.Url,
                                    WebUrl: mediaWebUrl,
                                    ShopUrl: mediaShopUrl,
                                    StockLabel: stockLabel,
                                    StockStoreUrl: currentProduct.Accessory.StockStoreUrl
                                });
                            }
                        }
                    }
                    });
                }

                $(divResults).append(conteneur);
            }

            //On créé le pager
            if (j.NbPage > 1) {
                $(divPager).show();
                CreatePager(divPager, filters.currentPage, j.NbPage);
            }
            else
                $(divPager).hide();

            $(divResults).fadeIn(600, function() {
                if (compareProcess) {
                    initCompareCheckbox();

                    if (productType == Category.Contract)
                        initCompatibleContract();
                    else
                        initCompatibleDetails("tr", "input[type='checkbox']", "a.toPopup", "CompatibleDetails");
                }
                else {
                    if (currentPage != Category.Accessory)
                        initCompatibleDetails("tr", "input[type='hidden']", "a.toPopup", "CompatibleDetails");
                    else
                        initCompatibleDetails(".bloc-phone", "input[type='hidden']", ".visuel", "ZoomProduct");
                }
                setHeightContainerList(".result", ".overflow");
            });

            //On précise que la requete est fini
            inProcess = false;

            if (otherRequestDemand) {
                otherRequestDemand = false;
                refreshList(false);
            }
        }
        });
    },

    getProductIdentifier: function() {
        var productVal = $("input[type='hidden'][class='productIdentifier']");
        filters.productID = productVal.val();
        return filters.productID;
    },

    //Créé l'objet "parameters" qui sera passé en GET lors de la requete AJAX par JQuery
    getParameters: function(fullReload) {
        var propertyVal = filters.getProperties();
        var currentProductPage = currentPage;
        var categoryVal = productType;
        var productVal = filters.getProductIdentifier();
        var cultureVal = filters.culture;
        var pageSizeVal = filters.pageSize;
        var currentPageVal = filters.currentPage;
        var sortDirection;

        if ($(".sortDirection").length == 0)
            sortDirection = SortDirection.Ascending;
        else
            sortDirection = $(".sortDirection").val();

        return { full: fullReload, currentProductPage: currentProductPage, category: categoryVal, sortExpression: SortObject.SortExpression, sortDirection: /*SortObject.SortDirection*/sortDirection, culture: cultureVal, currentPage: currentPageVal, pageSize: pageSizeVal, currentIdProduct: productVal, properties: propertyVal };
    },
    getProperties: function() {
        var property = "";
        $(".ddlFilter").each(function(i, item) {
            var itemValue = $(item).val();
            if (itemValue != "Tous") {
                if (property != "") {
                    property += PROPERTY_SEPARATOR;
                }

                var hiddenFieldValue = $(item).parent().find("input:hidden.ddlKey").val();
                if (hiddenFieldValue == null) {
                    hiddenFieldValue = $(item).parent().parent().find("input:hidden.ddlKey").val();
                }

                var itemValue = $(item).val();
                property += hiddenFieldValue + "=" + itemValue;
            }
        });
        return property;
    },

    pageSize: 6,
    currentPage: 1,
    culture: "fr-FR"
}

// On change la classe d'un bouton pour affiche la fleche ascendante
function AscendingSort(buttonImage)
{
    buttonImage.addClass("on-droite");
    buttonImage.removeClass("on-gauche");
}

// On change la classe d'un bouton pour affiche la fleche descendante
function DescendingSort(buttonImage)
{
    buttonImage.removeClass("on-droite");
    buttonImage.addClass("on-gauche");
}

// Créé le pager / affecte les événement clic
function CreatePager(divPager, currentPage, nbPage) 
{
    filters.currentPage = currentPage;
    PageClick = function(pageClickedNumber) 
    {
        filters.currentPage = pageClickedNumber;
        refreshList(false);
    };
    $(divPager).pager({ pagenumber: filters.currentPage, pagecount: nbPage, buttonClickCallback: PageClick });
}

// Créé le pager / affecte les événement clic
function CreateReviewPager(divPager, currentPage, nbPage) 
{
    reviewFilters.currentPage = currentPage;
    PageClick = function(pageClickedNumber) 
    {
        reviewFilters.currentPage = pageClickedNumber;
        refreshReviewList(false);
    };
    $(divPager).pager({ pagenumber: reviewFilters.currentPage, pagecount: nbPage, buttonClickCallback: PageClick });
}

function initUsersRating() 
{
    //On créé le pager uniquement si le change input en hidden est présent
    if ($("#pager input:hidden").length > 0)
        CreateReviewPager("#pager", 1, $("#pager input:hidden").val());

    SortObject.SortDirection = SortDirection.Descending;
    SortObject.SortExpression = "DateCreation";
    $(".select-sortexpression").change(function()
    {
        if($(this).val() != "0")
        {
            switch($(this).val())
            {
                case "DateCreationDescending":
                    SortObject.SortDirection = SortDirection.Descending;
                    SortObject.SortExpression = "DateCreation";
                break;
                case "DateCreationAscending":
                    SortObject.SortDirection = SortDirection.Ascending;
                    SortObject.SortExpression = "DateCreation";
                break;
                case "RatingDescending":
                    SortObject.SortDirection = SortDirection.Descending;
                    SortObject.SortExpression = "Rating";
                break;
                case "RatingAscending":
                    SortObject.SortDirection = SortDirection.Ascending;
                    SortObject.SortExpression = "Rating";
                break;
            }
            refreshReviewList(true);
        }
        return false;
    });


    $(".soumettre-avis").click(function() 
    {
        showProductRatingPopup();
        //showPopUp(urlHandlerPopUpGenerator, { WucType: "InternetUsersRating", IdProduct: $(".productIdentifier").val() }, "POST");
        return false;
    });
}

// -- Custom Functions -- //

//Initilise les checkbox de chacune des "petites" fihe produit dans le resultat de la recherche
function initCompareCheckbox()
{
    var idAlreadyInSession = new Array();
    $.ajax({ type:"POST", url:urlHandlerProductsToCompare, data: {get: true, type: productType }, dataType: "json", cache:false, success: function(result, message)
    {
        if (result != null)
            idAlreadyInSession = result;

        $("tr input[type='checkbox']").each(function(i, item)
        {
            item = $(item);

            //On check les checkbox qui donc l'id produit est deja en session
            if ( (jQuery.inArray(parseInt(item.val()), idAlreadyInSession) != -1) && !item[0].checked)
            {
                item.click();
            }

            //On change le design des checkbox
            item.checkize(
            {
                checked:"/Content/Images/Forms/Common/checkbox-checked.png",
                unchecked:"/Content/Images/Forms/Common/checkbox-not-checked.png"
            });
        
            item.change(function()
            {
                currentItem = $(this);
                $.ajax({ type:"POST", url:urlHandlerProductsToCompare, data: { idProduct: currentItem.val(), type: productType }, dataType: "json", success: function(j, message)
                {
                    if(j.length > 0)
                    {
                        var position = jQuery.inArray(parseInt(currentItem.val()), j);

                        //Si apres un click, l'id ne figure pas dans la liste, c'est soit il vient d'être supprimé, soit la liste est déjà pleine
                        if (position == -1)
                        {
                            //La liste est deja pleine
                            if (j.length == 4 && currentItem[0].checked)
                            {
                                alert("Vous ne pouvez pas choisir plus de 4 produits à comparer.");
                                currentItem.parent().find("img").click();
                            }
                        }
                    }
                }});
            });
        });
    }});
}

// -- DEBUT FICHE FORFAIT -- //
function initContractPage()
{
    initCustomCheckBox(".colones-options input[type='checkbox']");
    //initCustomCheckBox(".cbCommon");
    generateTabbedMenu(".menu.options li", ".colones-options", ".group");
}

// -- DEBUT FICHE FORFAIT -- //
function initBundlePage()
{
    //initCustomCheckBox(".colones-options input[type='checkbox']");
    //initCustomCheckBox(".cbCommon");
    initCustomCheckBox(".colones-options.contract input[type='checkbox']");
    generateTabbedMenu(".menu.options.products li", ".colones-options.products", ".group-product");
    generateTabbedMenu(".menu.options.contract li", ".colones-options.contract", ".group");
}

// -- Menu en onglet sur page accessoire et mobile -- //
function initProductTabbedMenu()
{
    $(".menu.ajax li").each(function(i, item)
    {
        var parent = $(this);
        item = $(this).find("input[type='submit']");

        item.click(function() 
        {
            if(!parent.hasClass("actif"))
            {
                pageTracker._trackEvent('DetailProduit', productType , item.val());
                $(".menu.ajax").find(".actif").removeClass("actif");
                parent.addClass("actif");
                insertBottomControl(item.attr("class"), $("input[type='hidden'][class='productIdentifier']").val());
            }
            return false;
        }).focus(function() {
            $(this).blur();
        });
    });
}

// -- Ajoute un controle en bas de page au clic sur les onglets -- //
function insertBottomControl(typeButton, idProduct)
{
    if($(".ajax-content").length == 0)
        $(".milieu-bloc-liste").wrapInner("<div class=\"ajax-content\"></div>");

    $(".ajax-content").hide(1, function()
    {
        var wucType;

        switch(typeButton)
        {
            case "bt1":
                wucType = "TabTechnicalCharacteristics";
            break;
            case "bt2":
                wucType = "TabExpertOpinion";
            break;
            case "bt3":
                wucType = "TabInternetUsersRating";
            break;
            case "bt4":
                if (productType == Category.Contract)
                    wucType = "TabCompatibleContract";
                else if (productType == Category.Phone)
                    wucType = "TabCompatiblePhones";
                else if (productType == Category.Netbook)
                    wucType = "TabCompatibleNetbook";
                else if (productType == Category.Accessory_Netbook)
                    wucType = "TabCompatibleNetBookAccessories";
                else
                    wucType = "TabCompatibleAccessories";
            break;
        }

        $.ajax({ type:"POST", url : urlHandlerTabbedProductMenuGenerator, data: { WucType : wucType, IdProduct : idProduct}, dataType: "html", cache:false, beforeSend : function()
        {
            $(".milieu-bloc-liste").append($("<div id=\"loading\"><img  src=\"/Content/Images/Common/ajax-loader-petit.gif\" alt=\"chargement en cours\" /></div>"));
        }, 
        success: function(j, message)
        {
            $(".milieu-bloc-liste").empty().append("<div class=\"ajax-content\"></div>");
            $(".ajax-content").css("display","none").append(j).fadeIn(600);
            
            switch(typeButton)
            {
                case "bt1":
                    if(currentPage != Category.Contract)
                        initSlideShow(".bandeau-gris", ".txt-carac", true, false, true);

                    $(".menu.ajax").removeClass("forfait");
                break;
                case "bt2":
                    $(".menu.ajax").removeClass("forfait");
                case "bt3":
                    initUsersRating();
                    $(".menu.ajax").removeClass("forfait");
                break;
                case "bt4":
                    initializeEvents();

                    if(productType == Category.Contract)
                        $(".menu.ajax").addClass("forfait");
                break;
            }
        }
        });
    });
}

// Initialise les clic sur les liens détail pour afficher la mini fiche produit -- //
function initCompatibleDetails(container, selector, clickToOpen, zoomMode)
{
    $(container).each(function(i, item)
    {
        item = $(item);

        var idProduct = item.find(selector).val();
        item.find(clickToOpen).click(function(event) 
        {
            event.preventDefault();
            var callBack = function()
            {
//                $(".soumettre-avis-top").click(function() 
//                {
//                    showPopUp(urlHandlerPopUpGenerator, { WucType: "InternetUsersRating", IdProduct: idProduct }, "POST");
//                    return false;
//                });
                initSlideShow(".bandeau-gris", ".txt-carac", true, true)
            };
            showPopUp(urlHandlerPopUpGenerator,{ WucType : zoomMode, IdProduct : idProduct, Category: $(".listedCategoryProduct").val(),IdProductIdentifier : $(".productIdentifier").val()},"POST", callBack);

            return false;
        });
    });
}

// -- Initialise les forfait compatible page mobile avec forfait -- //
function initCompatibleContract()
{
    $("tr").each(function(i, item)
    {
        item = $(item);

        var idProduct = item.find("input[type='checkbox']").val();

        item.find(".choisir a").click(function() 
        {
            $.ajax({ type:"POST", url : urlHandlerPopUpGenerator, data: {WucType: "ContractTop", IdProduct : idProduct}, dataType: "html", cache:false, beforeSend : function()
            {
                $(".forfait-compatible").empty();
                $(".milieu-bloc-liste").append($("<div id=\"loading\"><img  src=\"/Content/Images/Common/ajax-loader-petit.gif\" alt=\"chargement en cours\" /></div>"));
                $('html, body').animate({scrollTop: $(".bt-comparer").offset().top}, 1000);
            },
            success: function(result, message)
            {
                $("#loading").remove();
                $(".bt-comparer").after("<div class=\"forfait-compatible\">"+result+"</div>");
                initContractPage();
            }});

            return false;
        });
    });
}

function initializeEvents()
{
    SortObject.SortDirection = SortDirection.Ascending;

    // On récupère le type de produit à lister en récupérant la classe du premier tableau présent 
    productType = $("input[type='hidden'][class='listedCategoryProduct']").val();
    sortExpressionField = $(".sortExpressionField");
    if(sortExpressionField.length > 0 && sortExpressionField.val() != "")
    {
        SortObject.SortExpression = sortExpressionField.val();
        if (productType == Category.Netbook || productType == Category.Key3G || productType == Category.Phone || productType == Category.Contract)
        {
            compareProcess = true;
        }
    }
    else
    {
        if (currentPage != Category.Accessory) 
        {
            if (currentPage != Category.Contract && (productType == Category.Netbook || productType == Category.Key3G || productType == Category.Phone || productType == Category.Contract))
            {
               if(productType == Category.Contract)
                    SortObject.SortExpression = "Price";
                else
                    SortObject.SortExpression = "Brand";

                compareProcess = true;
            }
            else if(currentPage == Category.Contract)
            {
                SortObject.SortExpression = "Price";
                compareProcess = true;
            }
            else
                SortObject.SortExpression = "ProductName";
        }
        else
            SortObject.SortExpression = "Brand";
    }

    $(".classement input[type='submit']").click(function() 
    {
        initializeButtonImage();
        var hiddenFieldValue = $(this).parent().find("input:hidden").val();
        var sortDirection = $("input[type='hidden'][class='sortDirection']");
        var buttonImage = $(this).parent().find(".fleches");

        if (hiddenFieldValue == SortObject.SortExpression) {
            switch (sortDirection.val()) {
                case SortDirection.Ascending:
                    sortDirection[0].value = SortDirection.Descending;
                    DescendingSort(buttonImage);
                    break;
                case SortDirection.Descending:
                    sortDirection[0].value = SortDirection.Ascending;
                    AscendingSort(buttonImage);
                    break;
            }
        }
        else {
            sortDirection[0].value = SortDirection.Ascending;
            AscendingSort(buttonImage);
        }

        SortObject.SortExpression = hiddenFieldValue;
        SortObject.SortDirection = sortDirection.val();

        refreshList(true);

        return false;
    });

    $(".ddlFilter").change(function() {
        refreshList(true);
    }
    );
    

    if (compareProcess) 
    {
        //Ajout de la vérification qu'au moins 1 produit a été ajouté pour aller sur la page "compare"
        $("#linkComparePage_bottom").click(function(event) 
        {
            event.preventDefault();
            var item = $(this);
            $.ajax({ type: "POST", url: urlHandlerProductsToCompare, data: {get: true, type: productType, url: document.URL}, dataType: "json", cache: false, success: function(result, message) 
            {
                if (result != null && result.length > 0)
                    document.location = item[0].href;
                else
                    alert("Vous devez sélectionner au moins un produit à comparer.");
            }});
        });

        //On cache les boutons compare s'il n'y a pas de résultats
        if ($(".result table").length == 0)
            $("#linkComparePage_bottom").css("display", "none");
    }
    
    initCompareCheckbox();

    //On créé le pager uniquement si le change input en hidden est présent
    if ($("#pager input:hidden").length > 0)
        CreatePager("#pager", 1, $("#pager input:hidden").val());

    if (productType == Category.Contract) {
        initCompatibleContract();
    }
    else if (compareProcess) {
        initCompatibleDetails("tr", "input[type='checkbox']", "a.toPopup", "CompatibleDetails");
    }
    else {
        if (currentPage != Category.Accessory)
            initCompatibleDetails("tr", "input[type='hidden']", "a.toPopup", "CompatibleDetails");
        else
            initCompatibleDetails(".bloc-phone", "input[type='hidden']", ".visuel", "ZoomProduct");
    }
}

var bAutoOpenRating; // = $.cookie('COOKIE_AUTO_OPEN_RATING') == null ? false : true;
if ($.cookie('COOKIE_AUTO_OPEN_RATING') == null || $.cookie('COOKIE_AUTO_OPEN_RATING') == '0')
    bAutoOpenRating = false;
else
    bAutoOpenRating = true;

/**
 * Document Ready
 */
$(document).ready(function() {

    //On stylise les select
    $(".body select.ddlFilter").selectbox();

//on retaille les div de select et on les masques.
    $(".operateur div.jquery-custom-selectboxes-replaced").width("65px");
    $(".type div.jquery-custom-selectboxes-replaced").width("60px");
    $(".prix-mois div.jquery-custom-selectboxes-replaced").width("60px");
    $(".marque div.jquery-custom-selectboxes-replaced").width("65px");
    $(".prix div.jquery-custom-selectboxes-replaced").width("60px");
    $("div.jquery-selectbox-list").css("display", "none");
    
    
    if ($(".menu.ajax").length > 0) {
        if ($(".etoiles.ligne-expert").length > 0) {
            $(".etoiles.ligne-expert").click(function() {
                var parent = $(".menu.ajax").find(".bt2").parent();
                if (!parent.hasClass("actif")) {
                    $(".menu.ajax").find(".actif").removeClass("actif");
                    parent.addClass("actif");
                    insertBottomControl("bt2", $("input[type='hidden'][class='productIdentifier']").val());
                }
                return false;
            }).focus(function() {
                $(this).blur();
            });
        }

        if ($(".etoiles.ligne-internautes").length > 0) {
            $(".etoiles.ligne-internautes").click(function() {
                var parent = $(".menu.ajax").find(".bt3").parent();
                if (!parent.hasClass("actif")) {
                    $(".menu.ajax").find(".actif").removeClass("actif");
                    parent.addClass("actif");
                    insertBottomControl("bt3", $("input[type='hidden'][class='productIdentifier']").val());
                }
                return false;
            }).focus(function() {
                $(this).blur();
            });
        }

        initProductTabbedMenu();
    }

    currentPage = $("input[type='hidden'][class='categoryProduct']").val();

    initializeEvents();

    if (currentPage == Category.Contract || currentPage == Category.Contract_3G)
        initContractPage();
    else if (currentPage == Category.Bundle)
        initBundlePage();
    else {
        $(".soumettre-avis-top").live("click", showProductRatingPopup);
        if ($(".soumettre-avis").length > 0)
            initUsersRating();

        $(".advice-card-popup").click(showAdviceCardDetails);
    }

    // POPUP : Ouverture automatique
    if (document.location.href.indexOf("r=1") != -1 && !bAutoOpenRating) {
        $.cookie('COOKIE_AUTO_OPEN_RATING', '1');
        showProductRatingPopup();
    }
    else
        $.cookie('COOKIE_AUTO_OPEN_RATING', '0');

    colorSelector("#filter .couleurs");

    $("#lPrint").click(function() {
        window.print();
        return false;
    });

    $("#lFacebookLink").click(function() {
        u = location.href;
        t = document.title;
        window.open('http://www.facebook.com/sharer.php?u=' + encodeURIComponent(u) + '&t=' + encodeURIComponent(t), 'sharer', 'toolbar=0,status=0,width=626,height=436');
        pageTracker._trackEvent('ActionVirales', 'PArtageFacebook', document.title.replace(' - Tél And Com', ''));
        return false;
    });
});

function showVideo()
{
    showPopUp(urlHandlerPopUpGenerator,
    {
        WucType: "ViewProductVideo",
        IdProduct: $(".productIdentifier").val()
    }, "POST");
}

function showProduct(url)
{
    var link = $("<a href='" + url + "'></a>");
    link.click(function()
    {
        showPopUp(urlHandlerPopUpGenerator,
        {
            WucType: "ZoomMultiView",
            IdProduct: $(".productIdentifier").val(),
            UrlActualZoomImage: url
        },
        "POST",
        function()
        {
            $(".aZoomMultiView").click(ZoomMultiView_Click);
        });

        return false;
    });

    link.click();
}

var ZoomMultiView_Click = function(e)
{
    e.preventDefault();

    var urlZoom = $(this).attr("href");

    $("#pZoomMultiView").fadeOut("slow", function(){
        $("#pZoomMultiView").html('<img src=\"' + urlZoom + '\" />').fadeIn("slow");
    });
};

// POP DE VOTE
var showProductRatingPopup = function()
{
    showPopUp(urlHandlerPopUpGenerator,
    {
        WucType: "InternetUsersRating",
        IdProduct: $(".productIdentifier").val(),
        IdReference: $(".referenceIdentifier").val()
    },
    "POST",
    function()
    {
        $('input[type=radio].star').rating();

        // Validation du vote
        $("#SubmitInternetUsersRating").click(function() 
        {
            pageTracker._trackEvent('DonnerAvis', productType , document.title.replace(' - Tél And Com', ''), $(":radio.star:checked").val() );
            $.ajax({ type: "POST",
                url: urlHandlerInternetUsersRating,
                data: {
                    idCustomer: $(".internet-users-rating-id-customer").val(),
                    idProduct: $(".internet-users-rating-id-product").val(),
                    idReference: $(".internet-users-rating-id-reference").val(),
                    rating: $(":radio.star:checked").val(),
                    noRatting: $("#noRatting:checked").val(),
                    positivePoints: $(".internet-users-rating-positive-points").val(),
                    negativePoints: $(".internet-users-rating-negative-points").val(),
                    idLanguage: $(".internet-users-rating-id-language").val(),
                    nickname: $(".internet-users-rating-nickname").val()
                },
                dataType: "data",
                cache: false,
                success: function(result, message)
                {
                    $("#pRattingError").hide();
                    if (result == "ERROR_RATTING_NULL")
                    {
                        
                        $("#pRattingError").show();
                    }
                    else
                    {
                        $(".donnez-avis").css("display", "none");
                        $("#DivSendCustomerRattingOk").css("display", "block");
                    }
                }
            });
        });
    });

    return false;
}

// POPUP FICHE CONSEIL
var showAdviceCardDetails = function()
{
    showPopUp(urlHandlerPopUpGenerator,
    {
        WucType: "AdviceCardDetails",
        IdProduct: $(".productIdentifier").val()
    },
    "POST");

    return false;
}