//Array que armazena todos os objetos produtos
var Produtos = new Array();
//Objeto que armazena a configuração
var ConfigUtil = new ConfigObj();

function ConfigObj()
{
    try
    {
        this.Carrinho = 
        {
            URLCarrinho: "carrinho.aspx?IDSite="+IDSite+"&IDProduto=",
            Redirect: true,
            Mensagem: "Item Adicionado ao Carrinho"
        }
        this.Mensagens = 
        {
            Erro:
            {
                GradeItemInexistente: "Item Inexistente"
            }
        }
        this.Precos = 
        {
            Trocar: true,
            CasoNulo_Texto: "Consulte",
            CasoNulo_MostraTexto: true
        };
        this.Imagens = 
        {
            Trocar: true,
            CasoNulo_Src: "Consulte",//endereco src de alguma imagem para ser mostrada quando nao houver nenhuma outra.
            CasoNulo_MostraImagem: false
        };
        this.Estoques = 
        {
            Validar:false, 
            Mensagem:"Item Esgotado"
        };
    }
    catch (e){}
}

function AddProduto(produto)
{
    try
    {
	produto.Index = Produtos.length;
        Produtos[produto.Index] = produto;
    }
    catch (e){alert(e);}
}

//CreateProdObject
function CPO(prodid, preco, precopromocao, imagemdetalhe1, targetdiv_preco, target_imagem, target_button, desc1id, desc2id, desc3id, desc4id, desc5id, desc1nome, desc2nome, desc3nome, desc4nome, desc5nome, itensgrade)
{
    try
    {
        this.Index = 0;
        this.ID = prodid;
        this.UniqueID = CPUID(prodid);
        this.Preco = preco;
        this.PrecoPromocao = precopromocao;
        this.ImagemDetalhe1 = imagemdetalhe1;
        this.TargetDiv_Preco = targetdiv_preco;
        this.TargetImagem = target_imagem;
        this.TargetButton = target_button;
        
        var descritores = new Array();
        descritores[0] = new CDO(desc1id, desc1nome);
        descritores[1] = new CDO(desc2id, desc2nome);
        descritores[2] = new CDO(desc3id, desc3nome);
        descritores[3] = new CDO(desc4id, desc4nome);
        descritores[4] = new CDO(desc5id, desc5nome);
        this.Descritores = descritores;
        
        this.QtdeDescritores = GQDV(descritores);
        this.QtdeTotalDescritores = descritores.length;
        this.ExisteDescritores = this.QtdeDescritores > 0;
        
        //Objetos da Grade
        try
        {
            this.Grade = itensgrade;
            this.Grade.QtdeItens = this.Grade.length;//-1
        } 
        catch(e){}
    }
    catch (e){}
}


function AddCarrinho(prodIndex)
{
    try
    {
        var Produto = new Object();
        Produto = Produtos[prodIndex];
        
        //Se existir a combinação do item da grade
        if (ExisteItemGradeValido(Produto))
        {
            var endereco = ConfigUtil.Carrinho.URLCarrinho + Produto.ID;
            
            //Se tiver que validar o estoque
            if (ConfigUtil.Estoques.Validar)
            {
                //Se o estoque estiver valido
                if (Produto.Grade[GetGradeSelectedItem(Produto)].Estoque > 0)
                {
                    if (Produto.ExisteDescritores)
                        endereco += GetGradeSelectedItemsURL(Produto, GetGradeSelectedItem(Produto));
                    
                    //Se quiser redirecionar
                    if (ConfigUtil.Carrinho.Redirect)
                        window.location.href = endereco;
                    else
                        AddCarrinhoIframe(endereco);
                }
                else
                    alert(ConfigUtil.Estoques.Mensagem);
            }
            else
            {
                if (Produto.ExisteDescritores)
                    endereco += GetGradeSelectedItemsURL(Produto, GetGradeSelectedItem(Produto));
                
                //Se quiser redirecionar
                if (ConfigUtil.Carrinho.Redirect)
                    window.location.href = endereco;
                else
                    AddCarrinhoIframe(endereco);
            }            
        }
        else
        {
            alert(ConfigUtil.Mensagens.Erro.GradeItemInexistente);
        }
        
        
    }
    catch (e){}
}

function AddCarrinhoIframe(endereco)
{
    try
    {
        var ifrm = document.createElement("IFRAME");

        ifrm.frameborder = 0;
        ifrm.height = 0;
        ifrm.width = 0;
        ifrm.style.display = "none";
        ifrm.scrolling = "no";
        ifrm.src = endereco;
        window.document.body.appendChild(ifrm);
        
        alert(ConfigUtil.Carrinho.Mensagem);
    }
    catch (e){}
}

function ExisteItemGradeValido(Produto)
{
    try
    {
        var gradeIndex = GetGradeSelectedItem(Produto);
        
        return gradeIndex > -1;
    }
    catch (e){}
}

//CreateClickHandler
function CCH(prodIndex, tipo, css, value)
{
    try
    {
        var div = document.createElement("DIV");
        if(tipo.toString().toLowerCase().trim() == "botao")
        {
            var botao = document.createElement("INPUT");
            botao.setAttribute("type","button");
            botao.setAttribute("value", value);
            botao.setAttribute("class", css);
            botao.setAttribute("onClick", "AddCarrinho("+prodIndex+");");
            
            div.appendChild(botao);
        }
        else
        {
            var link = document.createElement("A");
            link.innerHTML = value;
            link.setAttribute("class", css);
            link.setAttribute("href", "javascript:AddCarrinho("+prodIndex+");");
            
            div.appendChild(link);
        }
        
        document.write(div.innerHTML);
    }
    catch (e){}
}

//CreateDescritorObject
function CDO(descid, descnome)
{
    try
    {
        this.ID = descid;
        this.Nome = descnome;
    }
    catch (e){}
}

//CreateProdUniqueID
function CPUID(prodid)
{
    try
    {
        var indice = 0;
        for(var i=0; i<Produtos.length; i++)
        {
            if(Produtos[i].ID.trim() == prodid.trim())
                indice++;
        }
        
        return prodid.toString() + "_" + indice.toString();
        
    }
    catch (e){}
}

//GetQtdeDescritoresValidos
function GQDV(descritores)
{
    try
    {
        var qtde = 0;
        for(var i=0; i<descritores.length; i++)
        {
            if(descritores[i].ID.trim() != "" && descritores[i].ID.trim() > 0)
                qtde++;
        }
        
        return qtde;
    }
    catch (e){}
}

//CreateDescritorSelect
function CDS(prodIndex, descritor, css)
{
    try
    {
        Produto = Produtos[prodIndex];
        
        if (Produto.ExisteDescritores)
        {
            if (descritor <= Produto.QtdeDescritores)
            {
                var div = document.createElement("div");
                var ddl = CSO(Produto, descritor, css);
                        
                div.appendChild(ddl);
                document.write(div.innerHTML);
            }
        }
    }
    catch (e){}
}

//CreateSelectObject
function CSO(Produto, descritor, css)
{
    try
    {
    
        var ddl = document.createElement("select");
        ddl.id = "ddl_" + Produto.UniqueID + "_" + descritor;
        ddl.appendChild(new CDDLO("["+Produto.Descritores[descritor-1].ID+"]","["+Produto.Descritores[descritor-1].Nome+"]"));
        ddl.setAttribute("onChange","ReLoadDDL("+Produto.Index+",this);");
        ddl.setAttribute("class", css);
        
        var list = new Array();
        for(var i=0; i< Produto.Grade.QtdeItens; i++)
        {
            try
            {
                list[i] = Produto.Grade[i].Descritores[descritor-1].Nome;
            }
            catch (e){}
        }
        
        list.sort();
        list = RD(list, true);
        
        
        for(var i=0; i< list.length; i++)
        {
            for(var x=0; x<Produto.Grade.QtdeItens; x++)
            {
                var desc = Produto.Grade[x].Descritores[descritor-1];
                if(desc.Nome.trim() == list[i].trim())
                {
                    ddl.appendChild(new CDDLO(desc.ID,desc.Nome));
                    break;
                }
            }
        }
        
        return ddl;
    }
    catch (e){}
}

//CreateDDLOption
function CDDLO(optvalue, opttext)
{
    try
    {
        var o = document.createElement("OPTION");
        var oText = document.createTextNode(opttext);
        o.appendChild(oText);
        o.setAttribute("value",optvalue);
            
        return o;
    }
    catch (e){}
}

function ReLoadDDL(prodIndex, ddl)
{
    try
    {
        var Produto = new Object();
        Produto = Produtos[prodIndex];
        var descritor = parseInt(ddl.id.substring(ddl.id.lastIndexOf("_")+1));
        
        if(ExisteNextDDL(Produto, descritor))
        {
        
            var nextDescritor =  descritor+1;        
            ClearDDL(Produto, nextDescritor);
            LoadNextDDL(Produto, descritor);
                    
        }
        else
        {
            //Verifica se foi encontrado algum item da grade
            if (ExisteItemGradeValido(Produto))
            {
                //Pega o indice do item da grade
                var gradeIndex = GetGradeSelectedItem(Produto);
                
                //Verifica se é para trocar o preço do produto
                if (ConfigUtil.Precos.Trocar)
                {
                    var preco = Produto.Grade[gradeIndex].Preco;
                    if(preco.toString().trim() == "0,00")
                    {
                        if(ConfigUtil.Precos.CasoNulo_MostraTexto)
                            preco = ConfigUtil.Precos.CasoNulo_Texto;
                        else
                            preco = Produto.Preco;
                    }
                    SDC(Produto.TargetDiv_Preco, preco);
                }
                
                //Verifica se é para trocar a imagem do produto
                if (ConfigUtil.Imagens.Trocar)
                {
                    var src = Produto.Grade[gradeIndex].Imagem;
                    if(src.toString().trim() == "")
                    {
                        if(ConfigUtil.Imagens.CasoNulo_MostraImagem)
                            src = ConfigUtil.Imagens.CasoNulo_Src;
                        else
                            src = Produto.ImagemDetalhe1;
                    }
                    SIS(Produto.TargetImagem, src);
                }
            }
        }
    }
    catch(e){}
}

//SetDivContent
function SDC(divid, conteudo)
{
    try
    {
        var divTemp = getElement(divid);
        divTemp.innerHTML = conteudo;
    }
    catch (e){}
}
//SetImageSource
function SIS(imgid, imgname)
{
    try
    {
        var imgTemp = getElement(imgid);
        var imgPath = imgTemp.src.substring(0,imgTemp.src.lastIndexOf("/")+1);
        imgTemp.src = imgPath + imgname;
    }
    catch (e){}
}

function ExisteNextDDL(produto, descritor)
{
    try
    {
        var Produto = new Object();
        Produto = produto;
        
        if(descritor < Produto.QtdeDescritores)
            return true;
        else
            return false;
    }
    catch (e){}
}

function ClearDDL(Produto, descritor)
{
    try
    {
        var ddl = getElement("ddl_" + Produto.UniqueID + "_" + descritor);
        while (ddl.options.length > 0)
        {
            ddl.removeChild(ddl.options[0]);
            //ddl.options[0] = null;
        }
    }
    catch (e){}
}

function GetGradeSelectedItem(Produto)
{
    try
    {
        //Acha o indice do item da grade
        var gradeIndex = -1;        
        for (var x=0; x < Produto.Grade.QtdeItens; x++)
        {
            var isvalid = true;
            for (var i=1; i <= Produto.QtdeDescritores; i++)
            {
                ddlTemp = getElement("ddl_" + Produto.UniqueID + "_" + i);
                
                if (Produto.Grade[x].Descritores[i-1].ID.toString().trim() != ddlTemp.value.toString().trim())
                    isvalid = false;
            }
            
            if(isvalid)
            {
                gradeIndex=x;
                break;
            }
        }
        
        return gradeIndex;
    }
    catch(e) {}
}

function GetGradeSelectedItemsURL(Produto, gradeIndex)
{
    try
    {
        var endereco = "";
      
        for (var i=1; i <= Produto.QtdeDescritores; i++)
        {
            var Descritor = "&IDDescritor" + i.toString() + "=" + Produto.Descritores[i-1].ID;
            var ItemDescritor = "&IDItemDescritor" + i.toString() + "=" + Produto.Grade[gradeIndex].Descritores[i-1].ID;
            
            endereco += Descritor + ItemDescritor;
        }
        
        return endereco;
    }
    catch(e) {}
}

function LoadNextDDL(Produto, descritor)
{
    try
    {
        var ddlAtual = getElement("ddl_" + Produto.UniqueID + "_" + descritor);
        var ddlNext = getElement("ddl_" + Produto.UniqueID + "_" + (parseInt(descritor)+1));
        
        ddlNext.appendChild(new CDDLO("["+Produto.Descritores[descritor].ID+"]","["+Produto.Descritores[descritor].Nome+"]"));
        
        //Neste For, verifica se a combinação de descritores alterados até agora bate com alguma combinação
        //da grade de produtos, os que baterem são adicionados ao array "list" para ser ordenado e removidas 
        //as duplicidades
        var list = new Array();
        var contTemp = 0;
        for(var i=0; i< Produto.Grade.QtdeItens; i++)
        {
            var isvalid = true;
            for(var x=1; x<=descritor; x++)
            {
                try
                {
                    var valorItem = Produto.Grade[i].Descritores[x-1].ID;
                    var ddlTemp = getElement("ddl_" + Produto.UniqueID + "_" + x);
                    
                    if(valorItem.toString().trim() != ddlTemp.value.toString().trim())
                        isvalid = false;
                }
                catch (e){}
            }
            
            try
            {
                if(isvalid)
                {
                    list[contTemp] = Produto.Grade[i].Descritores[descritor].Nome;
                    contTemp++;
                }
            }
            catch (e){}
        }
        
        //Ordena os nomes - Alfabética 
        list.sort();
        //Remove as duplicidades
        list = RD(list, true);
        
        //Adiciona os objetos Option ao DDL
        for(var i=0; i< list.length; i++)
        {
            for(var x=0; x<Produto.Grade.QtdeItens; x++)
            {
                var desc = Produto.Grade[x].Descritores[descritor];
                if(desc.Nome.trim() == list[i].trim())
                {
                    ddlNext.appendChild(new CDDLO(desc.ID,desc.Nome));
                    break;
                }
            }
        }
        
    }
    catch (e){}
}

/*
**************************************
* Remove Duplicated Function v1.1    *
* Autor: Carlos R. L. Rodrigues      *
**************************************
*/
//Remove Duplicated
function RD(a, s){
    try
    {
        var p, i, j;
        if(s) for(i = a.length; i > 1;){
            if(a[--i] == a[i - 1]){
                for(p = i - 1; p-- && a[i] == a[p];);
                i -= a.splice(p + 1, i - p - 1).length;
            }
        }
        else for(i = a.length; i;){
            for(p = --i; p > 0;)
                if(a[i] == a[--p]){
                    for(j = p; --p && a[i] == a[p];);
                    i -= a.splice(p + 1, j - p).length;
                }
        }
        return a;
    }catch (e){}
};

//Função getElementById em qualquer navegador
function getElement(obj) {
    try
    {
        if(document.all) 
            return document.all[obj];
        else
          return document.getElementById(obj);
    }
    catch (e){}
}
