﻿
/*
* Maille V1.4
* Objet gérant de multiples ClientArticleQuantityManager
*/

function QuantityManagerCollection(_autoButton)
{
    //booléen indiquant si aucun bouton de validation n'est associé à la collection mananger
    this.autoButton = _autoButton;
    this.managers = new Array(0);
    this.hfValid = "";
    this.validButtons = new Array(0);
    this.SpanTotal = null;
    
    this.Add = function(manager)
    {
        manager.idManager = this.managers.length;
        var tempArray = new Array(1);
        tempArray[0] = manager;
        this.managers = this.managers.concat(tempArray);
    }
    
    /*
     * Appelée à l'appui sur un bouton ajouter au panier
     */
    this.Valid = function(btnClicked)
    {
        var idManager = 0;
        if(btnClicked.getAttribute('manager') == null)
            return;
        else
            idManager = btnClicked.getAttribute('manager');
            
        this.find(idManager).Valid(btnClicked);
    }
    
    this.ValidAll = function(btnValidAll)
    {
        var ret = "";
        for(var i = 0; i<this.managers.length;i++)
        {
            if(ret!="")
                ret+="##";
            ret += this.managers[i].tblArticleQuantities.join("|");
        }    
        
        __doPostBack(btnValidAll.id,ret);
    }
    
    this.Remove = function(btnRemove)
    {
        var idA = parseInt(btnRemove.getAttribute("jsid"));
        var mgr = this.FindManagerByArticle(idA);
        var btnM = document.getElementById(btnRemove.id.replace('Remove','Moins'));
        while(parseInt(mgr.FindArticle(idA).quantity)>0)
            mgr.Moins(btnM);
        this.UpdateTotal();
    }
    
    this.FindManagerByArticle = function(idArticle)
    {
        for(var i = 0;i<this.managers.length;i++)
            for(var j = 0;j<this.managers[i].tblArticleQuantities.length;j++)
                if(this.managers[i].tblArticleQuantities[j].id == idArticle)
                    return this.managers[i];
        return null;
    }
    
    this.Plus = function(btnPlus)
    {
        var idManager = 0;
        if(btnPlus.getAttribute('manager') == null)
            return;
        else
            idManager = btnPlus.getAttribute('manager');
            
        this.find(idManager).Plus(btnPlus);
        this.UpdateButtonValid();
        this.UpdateTotal();
    }
    
    this.Moins = function(btnMoins)
    {
        var idManager = 0;
        if(btnMoins.getAttribute('manager') == null)
            return;
        else
            idManager = btnMoins.getAttribute('manager');
            
        this.find(idManager).Moins(btnMoins);
        this.UpdateButtonValid();
        this.UpdateTotal();
    }
    
    this.nextIdManager = function()
    {
        return this.managers.length;
    }
    
    this.find = function(managerId)
    {
        for(var i = 0; i<this.managers.length;i++)
            if(this.managers[i].idManager == managerId)
                return this.managers[i];
        
        return;
    }
    
    this.fillButtonsArray = function()
    {
        if(this.hfValid != "" && this.validButtons.length == 0)
        {
            this.validButtons = document.getElementById(this.hfValid).value.split('|');
            for(var i = 0;i<this.validButtons.length;i++)
                if(this.validButtons[i] != "")
                    this.validButtons[i] = this.validButtons[i].split('___');
        }
    }
    
    this.UpdateButtonValid = function()
    {     
        if(!this.autoButton)
        {
            var btnAll = document.getElementById("btnValidAllManagers");
            if(this.empty())
            {
                if(btnAll!=null)
                    btnAll.style.visibility = "hidden";
            }
            else
            {
                if(btnAll!=null)
                    btnAll.style.visibility = "visible";
            }
        }
    }
    
    this.UpdateTotal = function()
    {
        if(this.SpanTotal != null)
        {
            this.SpanTotal.innerHTML = this.GetTotal().toFixed(2);
        }
    }
    
    this.empty = function()
    {
        for(var i = 0; i<this.managers.length;i++)
        {
            if(!this.managers[i].empty())
                return false;
        }
        return true;
    }
    
    this.FindButton = function()
    {
        this.fillButtonsArray();
        for(var i = 0;i<this.validButtons.length;i++)
            if(this.validButtons[i][0] == this.tblArticleQuantities[0].id)
                return document.getElementById(this.validButtons[i][1]);
    }
    
    this.GetTotal = function()
    {
        var total = 0;
        for(var i = 0;i<this.managers.length;i++)
            for(var j = 0;j<this.managers[i].tblArticleQuantities.length;j++)
                total += (this.managers[i].tblArticleQuantities[j].quantity * this.managers[i].tblArticleQuantities[j].prix);
                
        return total;
    }
}


/*
* Maille V1.4
* Objet gérant la modification des quantités ajoutées au panier dans par exemple ficheProduit.aspx
* Gère l'affichage des boutons + - en fonctions des stocks
* Manière de faire la chose du côté client, sans rechargement de la page
*/
function ClientArticleQuantityManager(_autoButton)
{
    //tableau représentant les différents articles (en réalité format), leur quantité, leur stock,...
    this.tblArticleQuantities = new Array(0);
    //booléen indiquant si aucun bouton de validation n'est associé au mananger
    this.autoButton = _autoButton;
    this.nbArticles = 0;
    this.idManager = -1;
    this.hfValid = "";
    this.SpanTotal = null;
    
    //Obsolète mais utilisé, changer et utiliser validButton
    this.validButtons = new Array(0);
    
    this.validButton = null;
    
    //ajoute un article au tableau d'article
    this.Add = function(article)
    {
        var tempArray = new Array(1);
        tempArray[0] = article;
        this.tblArticleQuantities = this.tblArticleQuantities.concat(tempArray);
    }
    
    //recherche dans le tableau d'articles l'article correpondant à l'id en paramètre
    this.FindArticle = function(idArticle)
    {
        if(this.tblArticleQuantities.length <= 0)
            return null;
            
        for(var i = 0; i < this.tblArticleQuantities.length; i++)
        {
            if(this.tblArticleQuantities[i].id == idArticle)
                return this.tblArticleQuantities[i];
        }
        
        return null;
    }
    
    //clique sur le bouton "+" des quantités d'un produit
    this.Plus = function(btnPlus)
    {
        if(btnPlus.getAttributeNode('jsid') != null )
        {
            var idA = btnPlus.getAttributeNode('jsid').value;
            var article = this.FindArticle(idA);
            if(article.Available())
            {
                article.quantity++;
                var oppBtn = this.GetOppositeButton(btnPlus);
                oppBtn.style.visibility = "visible";
            }
            
            if(!article.Available())
                btnPlus.style.visibility = "hidden";
                
            this.UpdateLabel(btnPlus.id,article);
            this.UpdateButtonValid();
            this.UpdateTotal();
        }
    }
    
    //clique sur le bouton moins des quantités d'un p roduit
    this.Moins = function(btnMoins)
    {
        if(btnMoins.getAttributeNode('jsid') != null )
        {
            var idA = btnMoins.getAttributeNode('jsid').value;
            var article = this.FindArticle(idA);
            if(article.quantity > 0)
                article.quantity--;
            
            if(article.quantity == 0)
                btnMoins.style.visibility = 'hidden';
            
            if(article.Available())
            {
                var btnPlus = this.GetOppositeButton(btnMoins);
                btnPlus.style.visibility = 'visible';
            }
            
            this.UpdateLabel(btnMoins.id,article);
            this.UpdateButtonValid();
            this.UpdateTotal();
        }
    }
    
    //update du label affichant la quantité à ajouter au panier
    this.UpdateLabel = function(clientId, article)
    {
        var str ="";
        if(clientId.match("LinkButtonPlus"))
            str = "LinkButtonPlus";
        else if(clientId.match("LinkButtonMoins"))
            str = "LinkButtonMoins";
            
        var reg = new RegExp(str,"g");
        var spanId;

        //idManager à -1 signifie que le manager n'est dans aucune collection de manager
        if(this.idManager == -1)
            spanId = clientId.replace(reg,"labelQuantity");
        else // Sinon le label modifié doit être celui du bon article, on le retrouve en rajoutant l'idmanager à la fin
            spanId = clientId.replace(reg,"labelQuantity"+this.idManager);
            
        var spanQtt = document.getElementById(spanId);
        if(article.quantity <10)
            spanQtt.innerHTML = "&nbsp;"+article.quantity;
        else
            spanQtt.innerHTML = article.quantity;
    }
    
    this.fillButtonsArray = function()
    {
        if(this.hfValid != "" && this.validButtons.length == 0)
        {
            this.validButtons = document.getElementById(this.hfValid).value.split('|');
            for(var i = 0;i<this.validButtons.length;i++)
                if(this.validButtons[i] != "")
                    this.validButtons[i] = this.validButtons[i].split('___');
        }
    }
    
    this.UpdateButtonValid = function()
    { 
        if(!this.autoButton)
        {
            var btn = this.FindButton();
            if(this.empty())
            {
                btn.style.color = "gray";
                btn.onclick = "javascript:return false;";
                btn.href = "javascript:;";
                btn.style.cursor = "default";
            }
            else
            {
                //si le manager n'est associée a aucune collection de manager
                if(this.idManager == -1)
                    btn.onclick = function(){ mgr.Valid(this);return false;};
                else
                    btn.onclick = function(){mgrCollection.Valid(this);return false;};
                btn.style.color = "";
                btn.href = "javascript:;";
                btn.style.cursor = "pointer";
            }
        }
    }
    
    this.FindButton = function()
    {
        if(this.validButton != null)
            return this.validButton;
        this.fillButtonsArray();
        for(var i = 0;i<this.validButtons.length;i++)
            if(this.validButtons[i][0] == this.tblArticleQuantities[0].id)
            {
                if(document.getElementById(this.validButtons[i][1])!=null)
                    return document.getElementById(this.validButtons[i][1]);
            }
            else 
            {
                var id = 0;
                var oldId = 0;
                for(var j = 0; j<this.tblArticleQuantities.length;j++)
                    if(!this.validButtons[i][0].match(this.tblArticleQuantities[j].id))
                        id = this.tblArticleQuantities[j].id;
                     else
                        oldId = this.tblArticleQuantities[j].id;
                this.validButtons[i][0] = id;
                return this.FindButton();
            }
    }
    
    //si passe en paramètre un bouton plus, retourne le bouton moins correspondant
    //et inversement
    this.GetOppositeButton = function(btn)
    {
        if(btn.id.match("ButtonMoins") != null)
        {
            var reg = new RegExp("(ButtonMoins)","g");
            return document.getElementById(btn.id.replace(reg,'ButtonPlus'));
        }
        else if(btn.id.match("ButtonPlus") != null)
        {
            var reg2 = new RegExp("(ButtonPlus)","g");
            return document.getElementById(btn.id.replace(reg2,"ButtonMoins"));
        }
        else return null;
    }
    
    this.Valid = function(btnValid)
    {
        if(!this.empty())
        {
            var ret = this.tblArticleQuantities.join("|");
            __doPostBack(btnValid.id,ret);
        }
        return;
    }
    
    this.InitQuantities = function()
    {
        for(var i = 0;i<this.tblArticleQuantities.length;i++)
            this.tblArticleQuantity[i].quantity = 0;
    }
    
    //teste toutes les quantités des articles du manager et return true si au moins une est supérieure à 0
    this.empty = function()
    {
        for(var i = 0; i<this.tblArticleQuantities.length;i++)
            if(this.tblArticleQuantities[i].quantity > 0)
                return false;
                
        return true;
    }
    
    this.UpdateTotal = function()
    {
        if(this.SpanTotal != null)
        {
            this.SpanTotal.innerHTML = this.GetTotal().toFixed(2);
        }
    }
        
    this.GetTotal = function()
    {
        var total = 0;
        for(var j = 0;j<this.tblArticleQuantities.length;j++)
            total += (this.tblArticleQuantities[j].quantity * this.tblArticleQuantities[j].prix);
                
        return total;
    }
}

/*
* Représentation d'un article (une ligne format dans ficheProduit.aspx)
*/
function ClientArticleQuantityImage(idArt, qtt, stk,prix,compterBase)
{
    this.id = idArt;
    this.quantity = qtt;
    this.baseQuantity = qtt;
    this.stock = stk;
    this.prix = prix;
    if(compterBase != false)
        this.compterB = true;
    else
        this.compterB = false;
    
    this.Available = function()
    {
        return parseInt(this.quantity) < parseInt(this.stock);
    }
    
    this.toString = function()
    {
        if(this.stock > 0)
        {
            var q = 0;
            if(this.compterB)
                q = this.quantity - parseInt (this.baseQuantity);
            else 
                q = this.quantity;
            return this.id+"_"+q;
        }
        else
            return this.id+"_"+0;
    }
}

/*
 * id = idarticle
 * qtt = quantite en cours de demande
 * stock = stock dispo
 */
function InitAttributes(mgrCollection,id,qtt,stock,prix)
{
    var manager = mgrCollection.managers[mgrCollection.managers.length-1];
    if(parseInt(stock)<0)
	stock = 0;
    manager.Add(
        new ClientArticleQuantityImage(id,qtt,stock,prix));
        
    var btnM = document.getElementById(id+"LinkButtonMoins");
    var btnP = document.getElementById(id+"LinkButtonPlus");
        
    var lblQtt =  document.getElementById(id+"labelQuantity");
    if(lblQtt != null)
        lblQtt.setAttribute('id',lblQtt.id.toString()+manager.idManager);
    
    if(btnM != null && btnP!=null)
    {
        btnM.setAttribute('manager',manager.idManager);
        btnP.setAttribute('manager',manager.idManager);
        
        if(qtt< parseInt(stock))
            btnP.style.visibility = 'visible';
        else
            btnP.style.visibility = 'hidden';
        
        if(qtt>0)
            btnM.style.visibility = 'visible';
        else
            btnM.style.visibility = 'hidden';
    }        
}