// Base Config.
document.domain = "uol.com.br";
var $ = function(id) { return document.getElementById(id) }
var forumHasComments = false;

// Parser URL
var loc=location.href;
var locForumPost=loc.substring(loc.indexOf("#")+1);

// COMMENTS COUNTER
function commentText(qtd)
{
	totalComments = (qtd>0) ? qtd : "";
  return totalComments;
}

function commentCounter()
{
	try
	{
		postComments = $('post'+locForumPost).firstChild.nodeValue;
	}
	catch(err)
	{
    postComments = $('post'+forumFirstPost).firstChild.nodeValue;
	}
	
	if(postComments==1)
	{
		textToTitle = "Comentário";
	}
	else
	{
		textToTitle = ""+postComments+" Comentários";
	}
	
	try
	{
		frames['iframe'+locForumPost].document.getElementById('comentTitle').innerHTML=textToTitle;
	}
	catch(err)
	{
		frames['iframe'+forumFirstPost].document.getElementById('comentTitle').innerHTML=textToTitle;
	}
}


// POSTS MANIPULATION
var naoMove = 1;

function loadIframe(action,postId,blogId)
{
  $('iframe'+postId).src = "http://navblog.uol.com.br/comment.html?postFileName="+postId+"&idBlog="+blogId+"&forumView="+action;
}

function showHide(action,postId,blogId,comments)
{
  var botOpine = $('botOpine'+postId);
  var botLer   = $('botLer'+postId);
	forumHasComments = comments;


	switch (action)
	{
		case "write":
			botOpine.style.display = "none";
  		botLer.style.display   = "block";
			loadIframe(action,postId,blogId);
			break;

		case "read":
			botOpine.style.display = "block";
  		botLer.style.display   = "none";
			loadIframe(action,postId,blogId);
			break;

		default:
			if(forumHasComments==true)
			{
				botOpine.style.display = "block";
				botLer.style.display   = "none";
			}
			else
			{
				botOpine.style.display = "none";
				botLer.style.display   = "none";
			}
	}
}

var UOLLib = UOLLib || {}; 

UOLLib.Forum = {
  
  // permalink do grupo de discussão
  "permalink" : null,
  
  /**
   *  Metodo de definição do atributo permalink
   *  @type {Method}
   *  @param {String} permalink Permalink do grupo
   *  
   */              
  "setPermalink" : function(permalink)
  {
    this.permalink = permalink;
  },
  
  /**
   *  Função de acesso ao atributo permalink
   *  @type {Method}
   *  @return {String} Permalink do grupo
   *  
   */              
  "getPermalink" : function()
  {
    return this.permalink.replace("#","%");
  },
    
  /**
   * Retorna se a página é um endereço de permalink
   * @type {Method}
   * @return {Boolean} True caso seja um permalink ou false
   * 
   */              
  "isPermalinkPage" : function()
  {
    return location.href.match( /.*\/arch[0-9_-]+\.html(\?.*)?#[0-9_-]+/ )?true:false;
  },
  
  /**
   * Carrega o permalink do RSS do blog e dispara o evento "onGetPermalink" no final
   * @type {Method}
   * 
   */           
  "loadPermalinkFromRSS" : function()
  {
    var parent = this;
    this.Libs.load( "UOLLib.ajax", function()
    {
      var ajax = new UOLLib.ajax();
      ajax.open({
        "url" : location.protocol+"//"+location.host+"/index.xml",
        "callback" : function()
        {
          var permalink = this.request.responseXML.getElementsByTagName("item")[0].getElementsByTagName("link")[0].firstChild.nodeValue;
          parent.setPermalink(permalink);
          parent.Events.runEvent( "onGetPermalink" );
        }
      })
    })    
  },
  
  /**
   *  Carrega imagem com Click UOL
   *  @type {Method}   
   *  @param {String} ref Nome da referência
   *  @param {String} param Parametro a ser passado para imagem
   * 
   */              
  "requestClickUOL" : function(ref,param)
  {
    var img = document.createElement("img");
    img.width = 0;
    img.height = 0;
    img.border = 0;
    img.src = "http://click.uol.com.br/?rf="+ref+"&u=http://img.uol.com.br/x.gif?aud="+param;
    
    document.getElementsByTagName("body")[0].appendChild(img);
  },
  
  /**
   * Retorna a referência do Click UOL
   * @type {Method}
   * @return {String} Referência para Click UOL
   * 
   */         
  "getClickUOLReference" : function()
  {
    return "gd-" + location.host.replace( /forum\.([^\.]+)\..*/g,"$1" );
  },
  
  /**
   * Executa rotina de chamada para o Click UOL
   * @type {Method}
   * 
   */           
  "doClickUOL" : function()
  {
    var parent = this;
    this.Events.addEventListener("onGetPermalink", function()
    {
      parent.requestClickUOL( parent.getClickUOLReference(), parent.getPermalink() );
    });
    
    if( this.isPermalinkPage() )
    {
      this.setPermalink(location.href);
      this.Events.runEvent( "onGetPermalink" );
    }
    else
    {
      this.loadPermalinkFromRSS();
    }
  },
  
  "init" : function()
  {
    var parent = this;
    
    this.BrowserEvents.add( window, "load", function()
    {
      parent.doClickUOL();
    } );
    
  }
}

UOLLib.Forum.Events = {
  // repositorio de listeners e funções para eventos
  "listeners" : [],
  
  /**
   *  Adiciona evento
   *  @type {Method}
   *  @param {String} Nome do evento
   *  @return {Array} Array de funções do evento
   *  
   */                 
  "addEvent" : function(event)
  {
    if( !(event in this.listeners) )
    {
      this.listeners[event] = [];
    }
    
    return this.listeners[event];
  },
  
  /**
   *  Remove evento
   *  @type {Method}
   *  @param {String} Nome do evento
   *  
   */              
  "removeEvent" : function(event)
  {
    if( event in this.listeners )
    {
      this.listeners.splice(event,1);
    }
  },
  
  /**
   * Executa evento
   * @type {Method}
   * @param {String} Nome do evento
   * @[param] {Mixed} Parametro a ser passado para função   
   * 
   */              
  "runEvent" : function(event)
  {
    if( event in this.listeners )
    {
      for( var i in this.listeners[event] )
      {
        // verifica se a posição no array é uma função para executa-la
        if( typeof this.listeners[event][i].listener !== "funcution" )
        {
          // dispara função ligada ao evento com um parametro recebido caso exista
          this.listeners[event][i].listener( arguments[1] );
        }
      }
    }
  },
  
  /**
   *  Adiciona listener de evento
   *  @type {Method}
   *  @param {String} Nome do evento
   *  @param {Function} Função a ser executada no evento
   *  @param {Boolean} É um listener priritário   
   *  @return {Object} Objeto do listener
   *   
   */
   "addEventListener" : function( event, listener )
   {
      var prioritary = arguments[2] || false;
      
      this.addEvent(event);
      this.listeners[event][prioritary?"unshift":"push"]( {"id" : this.listeners[event].length, "listener" : listener} );
      
      return { "event":event, "id":this.listeners[event].length-1 };
   },
   
   /**
    * Remove listener de evento
    * @type {Method}
    * @param {Object} Objeto do listener
    * 
    */                
   "removeEventListener" : function(obj)
   {
      // verifica se existe array de listeners
      if( typeof this.listeners[obj.event] !== "undefined" )
      {
        // faz interação com o array de listeners
        for( var i in this.listeners[obj.event] )
        {
          // caso o id do listener seja o mesmo do objeto passado
          if( this.listeners[obj.event][i].id === obj.id )
          {
            // retira do array
            this.listeners[obj.event].splice(i,1);
            // sai da interação
            break;
          }
        }
      }     
   }                 
};

UOLLib.Forum.BrowserEvents =  {
    
  /**
   * Retorna false para os eventos padroes
   * @param {Object} e Evento
   */
  preventDefault : function(e){
    if(e.preventDefault) e.preventDefault();
    else e.returnValue = false; 
  }, 
  
  /**
   * Adicionar eventos
   * @param {Object} elem Elemento HTML
   * @param {String} event Evento (click, mouseover, mouseout, ...)
   * @param {Function} fun Função adicionada ao evento
   */
  add : function(elem,event,fun){
    if(document.attachEvent)
      elem.attachEvent('on'+event,fun);
    else if(document.addEventListener)
      elem.addEventListener(event,fun,true);
  }

};

UOLLib.Forum.Libs = {
  
  /**
   *  Metodo de chamada do script
   *  @param {String} url URL da lib
   *  
   */           
  "appendScript" : function(url)
  {
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src = url;
    
    document.getElementsByTagName("head")[0].appendChild(script);
  },
  
  
  /**
   *  Metodo que retorna se um objeto esta definido
   *  @param {String} objName Nome do objeto
   *  @return {Boolean} True caso esteja definido ou False
   *  
   */              
  "isDefined" : function(objName)
  {
    return eval("typeof "+objName).toLowerCase()!=="undefined";
  },
  
  /**
   * Metodo de carregamento da lib
   * @param {String} libName Nome da lib a ser carregada
   * @param {Function} callback Função de callback na detecção do objeto
   * @param {String} [url] URL da lib a ser carregada
   * @param {String} [objName] Nome do objeto a ser carregado
   * 
   */         
  "load" : function( libName, callback, url, objName )
  {
    url = url || "http://lib.uol.com.br/"+libName.toLowerCase()+"/"+libName.toLowerCase()+".js";
    objName = objName || libName;
    
    var parent = this;
    var interval;
    
    if( !this.isDefined(objName) )
    {
      this.appendScript(url);
    }
    interval = window.setInterval( function()
    {
      if( parent.isDefined(objName) )
      {
        window.clearInterval(interval);
        callback();
      }
    },100);
  }
};

UOLLib.Forum.init();
