var Adclient = function(){

    var labels = {
        "espacos":[], // define as posicoes possiveis para receberem os banners
        "vitrine":""
    }

    function init(){
        var params = {};
        // Verifica se existem espacos cadastrados
        if(labels.espacos.length > 0){
            // load banners
            params = {
                "espacos":labels.espacos,
                "callback":function(json){
                    var j = eval(json);
                    var qtd = j["banners"].length;
                    for(var i=0;i<qtd;i++){
                        var b = j["banners"][i];
                        var espaco = getEspacoBanner(b["tipo"]);
                        espaco.setVisualizacao(b["proximo"]);
                        var banner = new Banner(b["sequencial"], b["link"], b["formato"], b["tipo"], b["source"], b["largura"], b["altura"]);
                        BannerManager.loadBanner(banner, espaco);
                    }
                }
            }
            // TODO: Terminar o callback dos banners amanha
            Requisicao.getBanners(params);
        } else {
            //alert("Nenhum espaço para receber um banner");
        }       
    }

    function initVitrine(){
        var params = {};
        if(labels.vitrine != ""){
            var e = labels.vitrine
            params = {
                "espaco":e,
                "callback":function(json){
                    var j = eval(json);
                    var size = j["vitrine"].length;
                    var str = "";
                    for(var i=0;i<size;i++){
                        var l1 = j["vitrine"][i]["linha1"];
                        var l2 = j["vitrine"][i]["linha2"];
                        var img = j["vitrine"][i]["source"];
                        var link = j["vitrine"][i]["link"];
                        var sequencial = j["vitrine"][i]["sequencial"];
                        str += "<a href=\""+Path.root()+"/banner/log/?sequencial="+sequencial+"&link="+link+"\" target=\"_blank\">";
                        str +=  "<img src=\""+img+"\" />";
                        if((l1 != null && jQuery.trim(l1) != "") || (l2 != null && jQuery.trim(l1) != "")){
                            str +=  "<span class=\"dtexto\">";
                            str +=      (l1 == null || jQuery.trim(l1) == "") ? "" : "<span class=\"dtitulo\">"+l1+"</span>";
                            str +=      (l2 == null || jQuery.trim(l2) == "") ? "" : "<span class=\"dbairro\">"+l2+"</span>";
                            str +=  "</span>";
                        }
                        str += "</a>";
                    }
                    if(size == 1){
                        str += str;
                    }
                    jQuery(e.getId()).empty().append(str);
                    // Inicia o slideshow
                    jQuery(e.getId()).cycle({
                        fx:     'scrollHorz',
                        speed:  500,
                        timeout:8000,
                        next:   '#nextBtn',
                        prev:   '#prevBtn'
                    });
                }
            }
            Requisicao.getVitrine(params);
        }
    }

    /**
     * Adiciona um espaco de vitrine que existe na pagina
     */
    function addEspacoVitrine(espaco){
        labels.vitrine = espaco;
    }

    /**
     * Adiciona um espaco de banner existente na pagina
     */
    function addEspacoBanner(espaco){
        labels.espacos.push(espaco);
    }

    /**
     * Retorna o espaco do banner a partir de seu tipo
     */
    function getEspacoBanner(tipo){
        var qtd = labels.espacos.length;
        for(var i=0;i<qtd;i++){
            if(labels.espacos[i].getTipo() == tipo){
                return labels.espacos[i];
            }
        }
        return false;
    }

    /**
     * Classe responsável por exibir os banners nos
     * seus devidos lugares
     */
    var BannerManager = function(){
        /**
         * Exibe um banner em um determinado espaco
         */
        function loadBanner(banner, espaco){
            switch(banner.getFormato().toUpperCase()){
                case FormatoBanner.FLASH:
                    loadFlashBanner(banner, espaco);
                    break;
                case FormatoBanner.IMAGEM:
                    loadImageBanner(banner, espaco);
                    break;
                default:
                    alert("Formato de banner não conhecido");
                    break;
            }
        }

        /**
         * Exibe um banner no formato flash
         */
        function loadFlashBanner(banner, espaco){
            var id = "swfid"+espaco.getId().replace("#", "");
            jQuery(espaco.getId()).empty();
            jQuery(espaco.getId()).append("<div id='"+id+"'></div>");
            var link = "?oas="+Path.root()+"/banner/log/?sequencial="+banner.getSequencial()+"&link="+banner.getLink();
            //swfobject.embedSWF(banner.getSource()+link, id, banner.getWidth(), banner.getHeight(), "9.0.0", "expressInstall.swf",{},{"wmode":"transparent","movie":link});

            var str = '<object height="90" width="728" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"><param value="'+banner.getSource()+link+'" name="movie"><param value="true" name="loop"><param value="false" name="menu"><param value="opaque" name="wmode"><param value="high" name="quality"><embed height="90" width="728" wmode="opaque" type="application/x-shockwave-flash" swliveconnect="FALSE" bgcolor="#FFFFFF" quality="high" menu="false" loop="true" src="'+banner.getSource()+link+'"></object>';
            jQuery("#"+id).empty().append(str);
        }

        /**
         * Exibe um banner no formato de imagem
         */
        function loadImageBanner(banner, espaco){
            //alert("Carregando banner de imagem");
            var a = "<a href='"+Path.root()+"/banner/log/?sequencial="+banner.getSequencial()+"&link="+banner.getLink()+"' target='_blank'>";
            a += "<img src='"+banner.getSource()+"' />";
            a += "</a>";
            jQuery(espaco.getId()).html(a);
        }

        return {
            loadBanner  : loadBanner
        }
    }();

    /**
     * Classe que representa um banner
     */
    function Banner(sequencial, link, formato, tipo, source, width, height){
        var labels = {
            "sequencial": sequencial || "",
            "link"      : link || "",
            "formato"   : formato || "",
            "tipo"      : tipo || "",
            "source"    : source || "",
            "width"     : width || "",
            "height"    : height || ""
        }
        function getSequencial() { return labels.sequencial; }
        function getLink() {return labels.link;}
        function getFormato() {return labels.formato;}
        function getTipo() {return labels.tipo;}
        function getSource() {return labels.source;}
        function getWidth() { return labels.width; }
        function getHeight() { return labels.height; }
        function toString(){
            var str = "{";
            str += "\"sequencial\":\""+labels.sequencial+"\"";
            str += ",\"link\":\""+labels.link+"\"";
            str += ",\"formato\":\""+labels.formato+"\"";
            str += ",\"tipo\":\""+labels.tipo+"\"";
            str += ",\"source\":\""+labels.source+"\"";
            str += ",\"width\":\""+labels.width+"\"";
            str += ",\"height\":\""+labels.height+"\"";
            str += "}";
            return str;
        }

        return {
            getSequencial   : getSequencial,
            getLink         : getLink,
            getFormato      : getFormato,
            getTipo         : getTipo,
            getSource       : getSource,
            getWidth        : getWidth,
            getHeight       : getHeight,
            toString        : toString
        }
    }

    /**
     * Classe que define os espacos dos banners
     */
    function EspacoBanner(id, tipo){
        var labels = {
            "id"    : id || "",
            "tipo"  : tipo || ""
        }
        // Define o default do espaco de banner
        if(jQuery.cookie(labels.tipo) == undefined){
            jQuery.cookie(labels.tipo, -1, {path:"/"});
        }

        function getId() {return labels.id;}
        function getTipo() {return labels.tipo;}
        function getVisualizacao() {return jQuery.cookie(labels.tipo);}

        /**
         * Define qual a visualizacao atual
         */
        function setVisualizacao(indice){
            //alert("definindo visualizacao "+indice);
            jQuery.cookie(labels.tipo, indice, {path:"/"});
        }

        function toString(){
            var str = "{";
            //str += "\"id\":\""+labels.id+"\""; // Não tem necessidade de utilizar a ID no toString
            str += "\"tipo\":\""+labels.tipo+"\"";
            str += ",\"visualizacao\":\""+getVisualizacao()+"\"";
            str += "}";
            return str;
        }

        return {
            getId           : getId,
            getTipo         : getTipo,
            getVisualizacao : getVisualizacao,
            setVisualizacao : setVisualizacao,
            toString        : toString
        }
    }

    /**
     * Define os possiveis formatos de banners
     */
    var FormatoBanner = {
        "FLASH"     : "FLASH",
        "IMAGEM"    : "IMAGEM"
    }

    /**
     * Define os tipos dos banners
     */
    var TipoBanner = {
        "BANNER_TOPO"               : "BANNER_TOPO",
        "BANNER_LATERAL"            : "BANNER_LATERAL",
        "BANNER_LATERAL_FLUTUANTE"  : "BANNER_LATERAL_FLUTUANTE",
        "VITRINE"                   : "VITRINE"
    }

    /**
     * Classe utilizada para fazer as requisicoes dos banners
     */
    var Requisicao = function(){
        /**
         * Consulta os banners a partir dos espacos disponiveis
         */
        function getBanners(params){
            var size = params["espacos"].length;
            var espacos = "[";
            for(var i=0;i<size;i++){
                espacos += ((i > 0) ? "," : "")+ params["espacos"][i].toString()
            }
            espacos += "]";
            jQuery.getJSON(Path.root()+"/banners/?callback=?",
            {
                "espacos": espacos
            },
            function(json){
                if(params["callback"] != undefined){
                    params["callback"](json);
                }
            });
        }

        /**
         * Consulta as imagens da vitrine
         */
        function getVitrine(params){
            jQuery.getJSON(Path.root()+"/vitrine/?callback=?",
            {
                "vitrine":params["espaco"].getTipo()
            },
            function(json){
                if(params["callback"] != undefined){
                    params["callback"](json);
                }
            });
        }

        return {
            getBanners  : getBanners,
            getVitrine  : getVitrine
        }
    }();


    return {
        // Métodos
        init            : init,
        initVitrine     : initVitrine,
        addEspacoBanner : addEspacoBanner,
        addEspacoVitrine: addEspacoVitrine,
        
        // Classes
        Banner          : Banner,
        EspacoBanner    : EspacoBanner,
        TipoBanner      : TipoBanner

    }
}();
