/*
Classe représentant un objet OPTION
Contient uniquement les propriétés servant à l'affichage


Pré-requis :
nommer les objets HTML représentant les cases à cocher "Chk_[compteur]"
nommer l'objet HTML du panier représentant là où doivent être afficher les options PnlPanierOptions (nom aspx)
*/

var CCollectionGroupesOptions = {
    groupesOptions : [],        //tableau de tous les groupes d'options
    idPanierOptions : '',       //id de l'élément HTML (div) qui contient les options à afficher dynamiquement
    idTitrePanierOptions : '',  //id de l'élément HTML (div) qui contient les options à afficher dynamiquement + le titre "Options" + le montant global
    idMontantMois : '',         //id de l'élément HTML (span) qui contient le montant du forfait
    idMontantTotalOption : '',  //id de l'élément HTML (div) qui contient le montant total des options
    idMontantTotalMois : '',    //id de l'élément HTML (div) qui contient le montant total forfait+options
    idMontantTotalMobile : '',  //id de l'élément HTML (div) qui contient le montant total mobile + livraison
    idMontantTotal : '',        //id de l'élément HTML (div) qui contient le montant total de la vente (total mois + mobile + livraison)
    
    idPrixForfait : '',         //id de l'élément HTML (input hidden) qui contient le montant utilisé pour calculer le total par mois (forfait + options)
    idPourcentageReduction : '',//id de l'élément HTML (input hidden) qui contient le pourcentage de réduction à appliquer au prix du forfait
    idPrixTelephone : '',       //id de l'élément HTML (input hidden) qui contient le montant utilisé pour calculer le total de la vente (mobile + livraison)
    idBlocRemiseAssurance:'',  //id du bloc qui contient l'ensemble du Libellés et montant de la remise Assurance
    idLblRemiseAssurance:'',    //id de l'élément HTML qui contient le libellé de l'option de la remise Assurance
    idMontantRemiseAssurance:'', //id de l'élément HTML qui contient le montant de la remise Assurance
    PrixRemiseAssurance : '',   //id de l'élément HTML (input hidden) qui contient le montant utilisé pour calculer le total de la vente (mobile + livraison)
    applicationRemiseAssurance:'',//Paramètre qui permet de savoir s'il faut appliquer ou pas la remise Assurance du premier mois
    idPrixLivraison : '',       //id de l'élément HTML (input hidden) qui contient le montant utilisé pour calculer le total de la vente (mobile + livraison)
    
    //le parametre "id"....
    //le parametre "options" est un tableau de COption
    ajouterGroupeOption : function(p_id, p_options, p_estAffiche) {
        var nouveauGroupeOption = new CGroupeOption(p_id, p_options, p_estAffiche);
        this.groupesOptions.push(nouveauGroupeOption);   //ajout du nouveau groupe d'option au tableau des groupes d'options
    },
    
    //méthode lancée au cochage d'une des options simple
    afficherOption : function(p_idGroupeOption, p_estAffiche) {
        // on parcoure la liste des options
        for(var i=0; i<this.groupesOptions.length; i++) {
            if (this.groupesOptions[i].id == p_idGroupeOption) {
                this.groupesOptions[i].afficher(p_estAffiche);
                break;
            }
        }
        this.calculerTotaux();
    },
    //méthode lancée au cochage d'une des options multiple
    afficherOptionListe : function(p_idGroupeOption, p_idOptionSelectionnee, p_idPrix, p_idChampIdOption, p_estAffiche) {
       
        // on parcoure la liste des options
        for(var i=0; i<this.groupesOptions.length; i++) {
            if (this.groupesOptions[i].id == p_idGroupeOption) {
                this.groupesOptions[i].afficherListe(p_idOptionSelectionnee, p_idChampIdOption, p_estAffiche);
                if(p_idGroupeOption == "ASSU" && this.applicationRemiseAssurance == "true") {
                    if (p_idPrix != null) {
                    //document.getElementById(p_idPrix).innerHTML = arrondirPrixGras(this.groupesOptions[i].getMontantAffiche(), true);
                    //Affichage de la remise Assurance 1er mois
                    	if(p_estAffiche) {
                            for(var j=0; j<this.groupesOptions[i].options.length; j++) 
                            {
                                if(this.groupesOptions[i].options[j].id == p_idOptionSelectionnee)
                                {
                            	    this.PrixRemiseAssurance = this.groupesOptions[i].options[j].prix;
                                	
                                    if (navigator.appName == "Microsoft Internet Explorer")
                                        document.getElementById(this.idBlocRemiseAssurance).style.display = 'block';
                                    else
                                        document.getElementById(this.idBlocRemiseAssurance).style.display = 'table-row';
                                        
                                    document.getElementById(this.idLblRemiseAssurance).innerHTML = this.groupesOptions[i].options[j].libelle;
                                    document.getElementById(this.idMontantRemiseAssurance).innerHTML = arrondirPrixGras(- this.groupesOptions[i].options[j].prix,true);
                                }
                            }
                        } else {
                      	    document.getElementById(this.idBlocRemiseAssurance).style.display = 'none';
                      	    this.PrixRemiseAssurance = 0;
                      	}
                      } else {
                      	document.getElementById(this.idBlocRemiseAssurance).style.display = 'none';
                      	this.PrixRemiseAssurance = 0;
                      }
//                    if (document.getElementById(p_idPrix).innerHTML == 'GRATUIT')
//                        document.getElementById(p_idPrix).className = 'tarif-option-gratuit';
//                    else
//                        document.getElementById(p_idPrix).className = '';
                }
                break;
            }
        }
        this.calculerTotaux();
    },
    
    //méthode mettant à jour le montant total des options affichées
    calculerTotaux : function() {
        //montant total des options
        var montantTotal = 0;
        for(var i=0; i<this.groupesOptions.length; i++) {
            montantGroupeOption = this.groupesOptions[i].getMontantAffiche() + "";
            montantTotal += parseFloat(montantGroupeOption.replace(",", "."));
        }
        //document.getElementById(this.idMontantTotalOption).innerHTML = arrondirPrixGras(montantTotal, false);
        /*if (montantTotal == 0) {
            if (this.idTitrePanierOptions != '') {
                document.getElementById(this.idTitrePanierOptions).style.display = "none";
            }
        } else {
            if (this.idTitrePanierOptions != '') {
                document.getElementById(this.idTitrePanierOptions).style.display = "block";
            }
        }*/
        
        //montant total par mois (forfait + options)
        var montantForfaitStr = document.getElementById(this.idPrixForfait).value;
        var montantForfait = parseFloat(montantForfaitStr.replace(",", "."));
        if (document.getElementById(this.idPourcentageReduction).value) {
            if (document.getElementById(this.idPourcentageReduction).value != "") {
                var pourcentageReductionStr = document.getElementById(this.idPourcentageReduction).value;
                var pourcentageReduction = parseFloat(pourcentageReductionStr.replace(",", ".")) / 100;
                montantForfait = Math.round((montantForfait - (montantForfait*pourcentageReduction))*100)/100;
            }
        }
        document.getElementById(this.idMontantMois).innerHTML = arrondirPrixGras(montantForfait, false);
        document.getElementById(this.idMontantTotalMois).innerHTML = arrondirPrixGras(montantForfait+montantTotal, false);
        
        //montant total de la vente (mobile + livraison)
        var montantMobileStr = document.getElementById(this.idPrixTelephone).value;
        var montantMobile = parseFloat(montantMobileStr.replace(",", "."));
        var montantLivraisonStr = document.getElementById(this.idPrixLivraison).value;
        var montantLivraison = parseFloat(montantLivraisonStr.replace(",", "."));

        var montantRemiseAssurance = this.PrixRemiseAssurance;
       document.getElementById(this.idMontantTotalMobile).innerHTML = arrondirPrixGras(montantMobile+montantLivraison-montantRemiseAssurance, false);
        
        //montant total de la commande (total mois + mobile + livraison)
        document.getElementById(this.idMontantTotal).innerHTML = arrondirPrixGras(montantForfait+montantTotal+montantMobile+montantLivraison-montantRemiseAssurance, false);
    },
    
    //fonction permettant d'affecter une réduction Famille nombreuse ou Demandeur d'emploi au forfait
    appliquerReduction : function(pourcentageForfait) {
        document.getElementById(this.idPourcentageReduction).value = pourcentageForfait;
        this.calculerTotaux();
    },
    
    //fonction affichant toutes les options (à afficher) dans le panier (lancé au chargement de la page)
    afficherTout : function() {
        // on parcoure la liste des options
        for(var i=0; i<this.groupesOptions.length; i++) {
            if (this.groupesOptions[i].options.length == 1) {
                //c'est une option simple
                this.groupesOptions[i].afficher(this.groupesOptions[i].estAffiche);
            } else {
                //c'est une liste
                idOptionSelectionnee = this.groupesOptions[i].getIdOptionSelectionne();
                
                if(this.groupesOptions[i].id == "ASSU" && this.applicationRemiseAssurance == "true")
                        for(var j=0; j<this.groupesOptions[i].options.length; j++) 
                        {
                            if(this.groupesOptions[i].options[j].id == idOptionSelectionnee)
                            {
                                this.PrixRemiseAssurance = this.groupesOptions[i].options[j].prix;
                                if (navigator.appName == "Microsoft Internet Explorer")
                                    document.getElementById(this.idBlocRemiseAssurance).style.display = 'block';
                                else
                                    document.getElementById(this.idBlocRemiseAssurance).style.display = 'table-row';
                                document.getElementById(this.idMontantRemiseAssurance).innerHTML = arrondirPrixGras(- this.groupesOptions[i].options[j].prix,true);
                            }
                        }
                
                this.groupesOptions[i].afficherListe(idOptionSelectionnee, null, this.groupesOptions[i].estAffiche);
                //on ne gère pas l'affichage du tarif car c'est pris en charge par le datalist aspx
            }
        }
        
    }
};

var CGroupeOption = function() { this.initialiser.apply(this, arguments);};     //permet de simuler un constructeur
CGroupeOption.prototype = {
    id : '',
    options : Array(),
    estAffiche : false,
    
    //constructeur
    constructor : CGroupeOption,
    initialiser : function(p_id, p_options, p_estAffiche) {
        this.id = p_id;
        this.options = p_options;
        this.estAffiche = p_estAffiche;
    },
    
    //méthode qui retourne le montant de l'option qui est actuellement affichée (0 si aucun affichage)
    getMontantAffiche : function() {
        var montant = 0;
        if (this.estAffiche) {
            //on recherche l'option qui est affichée
            for(var j=0; j<this.options.length; j++) {
                if (this.options[j].estAffiche) {
                    montant = this.options[j].prix;
                    //break;  //on sort de la boucle, mis en commentaire pour ne conserver que le dernier
                }
            }
        }
        return montant;
    },
    
    //méthode d'affiche d'une option simple
    afficher : function(p_estAffiche) {
        if (p_estAffiche != null)
            this.estAffiche = p_estAffiche;

        if (this.estAffiche) {
            this.options[0].afficher(this.id, null);
        } else {
            //on supprime l'option du panier
            this.supprimerPanier();
            this.options[0].estAffiche = false;
        }
    },
    
    //méthode d'affiche d'une option multiple
    afficherListe : function(p_id, p_idChampIdOption, p_estAffiche) {
        if (this.estAffiche) {
        
            //on supprime l'option qui est affichée actuellement
            for(var i=0; i<this.options.length; i++) {
                if (this.options[i].estAffiche = true) {
                    this.options[i].estAffiche = false;
                    //on supprime l'option du panier
                    this.supprimerPanier();
                    //break;    //mis en commentaire car bizarrement, les .estAffiche sont remis à true tout le temps
                }
            }
        }
        this.estAffiche = p_estAffiche;
        //on recherche l'option à marquer comme affichée
        if (this.estAffiche) {
            for(var j=0; j<this.options.length; j++) {
                if ((this.options[j].id == p_id) && this.estAffiche) {
                    this.options[j].afficher(this.id, p_idChampIdOption);
                    break;
                }
            }
        }
    },
    
    //méthode retournant l'id de l'option qui est affichée (sélectionnée)
    getIdOptionSelectionne : function() {
        for(var i=0; i<this.options.length; i++) {
            if (this.options[i].estAffiche == true) {
                return this.options[i].id;
            }
        }
        return null;
    },
    
    //méthode qui supprime visuellement du panier le groupe d'option
    supprimerPanier : function() {
        var elementHTML = document.getElementById('DivPanierOption_' + this.id);
        if (elementHTML != null)
            {
            document.getElementById(CCollectionGroupesOptions.idPanierOptions).removeChild(elementHTML);
                //var tblBodys = document.getElementById(CCollectionGroupesOptions.idPanierOptions).getElementsByTagName('tbody');
//                if (tblBodys.length>0)
//                {
//                    tblBodys[0].removeChild(elementHTML);
//                 }
            }
    }
}

var COption = function() { this.initialiser.apply(this, arguments);};     //permet de simuler un constructeur
COption.prototype = {
    id : '',
    libelle : '',
    prix : 0,
    estAffiche : false,
    
    //constructeur
    constructor : COption,
    initialiser : function(p_id, p_libelle, p_prix, p_estAffiche) {
        this.id = p_id;
        this.libelle = p_libelle;
        this.prix = p_prix.replace(",", ".");
        this.estAffiche = p_estAffiche;
    },
    
    //méthode qui affiche visuellement l'option dans le panier
    afficher : function(p_idGroupeOption, p_idChampIdOption) {
        this.estAffiche = true;
        if ((this.prix) > 0) {
            //on affiche l'option (libellé + prix) dans le panier
            var idElement = 'DivPanierOption_' + p_idGroupeOption;
            var existe = true;
            var elementHTML = document.getElementById(idElement);
            if (elementHTML == null) {
                elementHTML = document.createElement("tr");
                elementHTML.id = 'DivPanierOption_' + p_idGroupeOption;
                existe = false;
            }
            
            var elementTdLibelle = document.createElement("td");
            elementTdLibelle.className = 'left';
            var cellText = document.createTextNode(this.libelle);
            elementTdLibelle.appendChild(cellText);
            
            var elementTdPrix = document.createElement("td"); 
            elementTdPrix.className = 'right';
            elementTdPrix.innerHTML = arrondirPrix(this.prix) + '&euro;';
            
            elementHTML.appendChild(elementTdLibelle);
            elementHTML.appendChild(elementTdPrix);
            
            document.getElementById(CCollectionGroupesOptions.idPanierOptions).appendChild(elementHTML);
            
//            var tblBody;
//            var tblBodys = document.getElementById(CCollectionGroupesOptions.idPanierOptions).getElementsByTagName('tbody');
//            if (tblBodys.length>0)
//                tblBody = tblBodys[0];
//            else {
//                tblBody = document.createElement("tbody");
//                document.getElementById(CCollectionGroupesOptions.idPanierOptions).appendChild(tblBody);
//            }
            
            //elementHTML.innerHTML = '<td class="libelleOptions">' + this.libelle + '</td><td class="tarifsOptions">' + arrondirPrix(this.prix) + '&euro;</td>'
            //elementHTML.innerHTML = '<div class="text">' + this.libelle + '</div><span class="price">' + arrondirPrix(this.prix) + '&euro;</span>'
//            if (!existe)
//            {
//                tblBody.appendChild(elementHTML);
//            }

        }
        if (p_idChampIdOption != null) {
            document.getElementById(p_idChampIdOption).value = this.id;
        }
    }
};

//fonction qui force l'affichage de 2 chiffres après la virgule
function arrondirPrix(p_montant) {
    var montantStr = p_montant + "";
    var montantChiffres = montantStr.replace(",", ".");
    var montantArrondi = (Math.round(montantChiffres*100)/100) + "";  //on transforme en chaine de caractères
    montantArrondi = montantArrondi.replace(".", ",");
    
    var position = montantArrondi.indexOf(",");
    if (position == -1)
        montantArrondi += ",00";
    //rajout des 2 chiffres après la virgule
    while (montantArrondi.indexOf(",") + 3 > montantArrondi.length)
    {
        montantArrondi += "0";
    }
    return montantArrondi;
}

//fonction qui force la partie entière en gras (et qui arrondi aussi)
function arrondirPrixGras(p_montant, p_aGratuit) {
    var montantGras = arrondirPrix(p_montant);
    if ((montantGras == "0,00") && p_aGratuit) {
        montantGras = "GRATUIT";
    } else {
        var position = montantGras.indexOf(",");
        if (montantGras.substring(0, position) == "NaN")
            montantGras = "N/A";
        else
            montantGras = "<strong>" + montantGras.substring(0, position) + "</strong>" + montantGras.substring(position) + "&euro;";
    }
    return montantGras;
}
