﻿var PLACE_AREA       = "areaTexto";
var PLACE_TEXT_CSS   = "tamanhoTexto";
var PLACE_DEGUSTACAO = "degustacao";
var PLACE_BANNER     = "bannerLateral";
var PLACE_LINKS      = "linksPatrocinados";
var CK_NAME          = "ExamePersonalizacaoFontSize";
var CK_ACTIVE        = null;
var USER_ID          = null;

var LETTERS = new Array( new Array( "9px", "tamanhoTextoPequenoOn", "tamanhoTextoPequenoOff", "Pequeno", "14px" ), 
                         new Array( "11px", "tamanhoTextoMedioOn", "tamanhoTextoMedioOff", "Medio", "15px" ), 
                         new Array( "13px", "tamanhoTextoGrandeOn", "tamanhoTextoGrandeOff", "Grande", "18px" ) );

/**
 * Retorna um array com todos os elementos de document que possuam a 
 * classe indicada em "clsName".
 *
 * @param {String} clsName
 */
function getElementsByClassName( clsName ) {
    var elements = ( document.all ) ? document.all : document.getElementsByTagName( "*" );

    clsName     = clsName.replace( /\-/g, "\\-" );
    var oRegExp = new RegExp( "\\b" + clsName + "\\b" );
    var buffer  = new Array();
    var oElement;

    for ( var i=0; i<elements.length; i++ ) {
        oElement = elements[i];

        if ( oRegExp.test( oElement.className ) ) {
            buffer.push( oElement );
        }
    }

    return buffer;
}

/**
 * Retorna o tamanho da fonte a ser redimensionada de acordo com o conteudo
 * gravado no cookie. Caso o valor do cookie seja nulo, o tamanho da fonte e
 * definido como 11px.
 *
 * @param {String} name
 */
function getCookie( name ) {
    var ckValue = readCookie( name );
    return ( ckValue != null ) ? ckValue : "11px";
}

/**
 * Cria o container de personalizacao da fonte, ou seja, o div que
 * contem as imagens para redimensionamento da fonte.
 */
function createLettersArea() {
if (document.getElementById( PLACE_AREA )) { 
    var area = document.getElementById( PLACE_AREA );

    var nodeLetters = document.createElement( "div" );
    nodeLetters.setAttribute( "id", PLACE_TEXT_CSS );
    nodeLetters.className = PLACE_TEXT_CSS;
    nodeLetters.innerHTML = updatePlaceHolder();
    area.insertBefore( nodeLetters, area.childNodes.item(0) );
}
}

/**
 * Cria o container do banner da materia.
 */
function createBannerArea() {
    var nodeBanner = document.createElement( "div" );
    nodeBanner.setAttribute( "id", PLACE_BANNER );
    nodeBanner.className = PLACE_BANNER;
    getElementsByClassName( "relacionadas" )[0].appendChild( nodeBanner );

    var txtPublicidade = document.createElement( "h5" );
    txtPublicidade.innerHTML = "Publicidade";
    nodeBanner.appendChild( txtPublicidade );

    try {
        var content = document.getElementById( "loadPublicidade" );
        content.style.display = "block";
        nodeBanner.appendChild( content );
        content.style.display = "block";
    } catch( e ) {}
}

/**
 * Cria o container dos links patrocinados.
 */
function createLinksPatrocinados() {
    var nodeLinks = document.createElement( "div" );
    nodeLinks.setAttribute( "id", PLACE_LINKS );
    nodeLinks.className = PLACE_LINKS;
    getElementsByClassName( "relacionadas" )[0].appendChild( nodeLinks );

    var nodeAbaLinks = document.createElement( "div" );
    nodeAbaLinks.setAttribute( "id", "aba" );
    nodeAbaLinks.className = "aba";
    nodeLinks.appendChild( nodeAbaLinks );

    try {
        var content = document.getElementById( "loadLinksPatrocinados" );
        content.removeChild( content.getElementsByTagName( "h1" )[0] );
        nodeLinks.appendChild( content );
        content.style.display = "block";
    } catch( e ) {}
}

/**
 * Cria o container do credito da foto.
 */
function createCreditoFoto() {
    var nodeCredito = document.createElement( "div" );
    nodeCredito.setAttribute( "id", "creditoFoto" );

    try {
        var area = getElementsByClassName( "boxImagem" )[0];

        if ( area.getElementsByTagName( "h4" )[0] ) {
            nodeCredito.innerHTML = area.getElementsByTagName( "h4" )[0].innerHTML;
            area.insertBefore( nodeCredito, area.childNodes.item(0) );
        }
    } catch( e ) {}
}

/**
 * Altera o posicionamento da fonte da materia.
 */
function modifyFonteMateria() {
    try {
        var nodeFonte      = getElementsByClassName( "inicioTexto" )[0];
        var fonteMateria   = "<span class='inicioTexto' style='visibility: visible; font: normal 9px/14px Verdana;'>" + nodeFonte.innerHTML + "</span>";
        var firstParagraph = nodeFonte.nextSibling.innerHTML;

        nodeFonte.nextSibling.innerHTML = fonteMateria + firstParagraph;
        document.getElementById( PLACE_AREA ).removeChild( nodeFonte );
    } catch( e ) {}
}


/**
 * Altera a propriedade float do primeiro p.sep do DIV "areaTexto"
 * caso existe imagem na materia - bug no IE
 */
function ajustaMateriaSemFoto() {
    try {
		var firstSep = $$('div#areaTexto p.sep')[0];
		if (firstSep && firstSep.nextSibling.className == 'boxImagem') {
			firstSep.style.styleFloat = 'none';
		}
    } catch( e ) {}
}

/**
 * Compara o valor armazenado no cookie de personalizacao e define
 * o estilo das imagens de redimensionamento da fonte.
 */
function updatePlaceHolder() {
    CK_ACTIVE = getCookie( CK_NAME );

    var content = "<h4>Tamanho da fonte:</h4>";

    for (var i=0; i<LETTERS.length; i++){
        content += ( CK_ACTIVE == LETTERS[i][0] ) 
                       ? "<a href='javascript:void(0);' id='" + LETTERS[i][1] + "' onclick='updateFont(\"" + LETTERS[i][0] + "\");'><span>" + LETTERS[i][3] + " | </span></a>"
                       : "<a href='javascript:void(0);' id='" + LETTERS[i][2] + "' onclick='updateFont(\"" + LETTERS[i][0] + "\");'><span>" + LETTERS[i][3] + " | </span></a>";
    }

    return content;
}

/**
 * Altera o tamanho da fonte de todo o conteudo pertencente ao escopo
 * da materia. Todas as tags HTML especificadas em "elements"
 * deverao ser modificadas.
 *
 * @param {String} fontSize
 */
function updateFont( fontSize ) {
	if (! document.getElementById( PLACE_TEXT_CSS )) {
		return;
       }

    createCookie( CK_NAME, fontSize, null );
    document.getElementById( PLACE_TEXT_CSS ).innerHTML = updatePlaceHolder();

    var content    = document.getElementById( PLACE_AREA );
    var elements   = new Array( "p", "td", "th", "ul", "ol", "dl", "caption", "h6", "h4" );
    var lineHeight = ( ( CK_ACTIVE == LETTERS[0][0] ) ? 
                       LETTERS[0][4] : ( ( CK_ACTIVE == LETTERS[1][0] ) ? LETTERS[1][4] : LETTERS[2][4] ) );

    for ( var i=0; i<elements.length; i++ ) { 
        try {
            var e = content.getElementsByTagName( elements[i] );

            for ( var j=0; j<e.length; j++ ) {
                e[j].style.fontSize   = fontSize;
                e[j].style.lineHeight = lineHeight;
            }
        } catch( e ) {}
    }

    updateDataUser();
}

/**
 * Grava a personalizacao do usuario autenticado no Banco de Dados.
 */
function updateDataUser() {
    if ( logado() ) {
        PersonalizacaoController.saveUserPreferences( [{chave:"tamanho.fonte",preferenciaUsuarioId:USER_ID,valor:CK_ACTIVE}] );
    }
}

/**
 * Carrega as configuracoes padroes.
 * Os links patrocinados e a area de personalizacao do tamanho da fonte 
 * serao exibidos somente quando o conteudo de degustacao nao existir.
 */
function init() {
    if ( ( document.getElementById( PLACE_AREA ) ) && ( !document.getElementById( PLACE_DEGUSTACAO ) ) ) {
        modifyFonteMateria();
		ajustaMateriaSemFoto();

        if ( logado() ) {
            PersonalizacaoController.loadUserPreferences( function( prefs ) {
                var fontSize = getCookie( CK_NAME );

                for ( var i=0; i<prefs.length; i++ ) {
                    if ( prefs[i].chave == "tamanho.fonte" ) {
                        USER_ID = prefs[i].preferenciaUsuarioId;
                        fontSize = prefs[i].valor;
                        break;
                    }
                }

                updateFont( fontSize );
            } );
        } else {
            CK_ACTIVE = getCookie( CK_NAME );
            updateFont( CK_ACTIVE );
        }
    }

    try {
        // Inicializa o servico de comentarios (@see comentarios.js)
        initComentarios();
    } catch( e ) {}
}

addLoadEvent( init );
