var Modulos = Modulos || {};
Modulos.Arquivo = {
  
  parent : function(elem,tagName){
    do
    {
      elem=elem.parentNode;
    }
    // busca pai até encontrar elemento de tag igual a 'tagName' 
    while(elem.parentNode && !this.isTag(elem,"body") && !this.isTag(elem,tagName))
   
    return !this.isTag(elem,"body")?elem:false;
  },
  
  hasParentByClass : function(elem,clsName){
    do
    {
      elem=elem.parentNode;
    }
    // busca pai até encontrar elemento de tag igual a 'tagName' 
    while(!this.isTag(elem,"body") && (" "+elem.className+" ").indexOf(" "+clsName+" ")===-1 )

    return !this.isTag(elem,"body");
  },
  

  
  isTag : function(elem,tagName){
    return elem!==null && elem.tagName && elem.tagName.toLowerCase()===tagName;
  },
  
  getChildNodesByTagName : function( elem, tagName ){
    var nodes=[];
    
    for( var i=0; i<elem.childNodes.length; i++ ){
      if( this.isTag( elem.childNodes[i], tagName ) ){
        nodes.push( elem.childNodes[i] );
      }
    }
    
    return nodes;
  },
  
  select : function(elem){
    var ul=this.parent(elem,"ul");
    var ulClone, li = [];

    // verifica se já existe lista em exibição
    if( this.isTag(ul.parentNode.parentNode.nextSibling, "ul") ){
      // remove lista em exibição
      ul.parentNode.parentNode.parentNode.removeChild( ul.parentNode.parentNode.nextSibling );
      li = this.getChildNodesByTagName( ul, "li" );
      // limpa classes dos anos
      for( var i=0; i<li.length; i++ ){
       li[i].getElementsByTagName("p")[0].className="";
      }
    }
    // coloca clone de lista no local de exibição
    ulClone=elem.getElementsByTagName("ul")[0].cloneNode(true);
    ulClone.className+=" eventos";
    ul.parentNode.parentNode.parentNode.insertBefore(ulClone,ul.parentNode.parentNode.nextSibling);
    // coloca classe no item selecionado
    elem.getElementsByTagName("p")[0].className+=" ativo";    
  },
  
  getElementId : function(elem){
    // verifica a pre-existência de um id
    if( elem.id === "" || elem.id === null || (typeof elem.id).toLowerCase()==="undefined" ){
      // cria id baseado em timestamp
      elem.id = "arquivo_abas_"+(new Date()).getTime();
    }
    return elem.id;
  },
  
  click : function( evt ){
    var parent = Modulos.Arquivo;
    var target = parent.Events.target(evt); // target do evento
    var ul = target.parentNode.getElementsByTagName("ul")[0]; // lista a ser exibida
    var parentElem = parent.parent(target,"ul"); // container do modulo
    var sentido;
    var li, contents = [];
    
    // verifica se o evento foi disparado pelo click dentro do modulo de arquivo
    if(parent.isTag(target,"p") && parent.hasParentByClass(target,"arquivo-abas") ){
      // verifica se o click não veio do botão do rotativo
      
      if( (" "+target.className+" ").indexOf(" botao ") === -1 ){
        parent.select(parent.parent(target,"li"));
      }else if( (typeof carrossel).toLowerCase()!=="undefined" && !carrossel.rodando  ){ // se o click veio de um botão do rotativo e se o carrossel não esta em movimento
        // verifica o sentido do movimento
        switch( target.className.match( /(^| )(anterior|proximo)( |$)/ )[2] ){
          case "proximo" : sentido=1; break;
          case "anterior" : 
            sentido=-1;
            li = parent.getChildNodesByTagName( ul, "li" );
            for( var i=0; i<li.length; i++ ){
              contents[ li[i].getElementsByTagName("p")[0].innerHTML ] = li[i].getElementsByTagName("ul")[0];
              li[i].removeChild( li[i].getElementsByTagName("ul")[0] );
            }
          break;
        }
        
        carrossel.mover({
          to:sentido,
          id:parent.getElementId(ul)
        });
        
        if( sentido===-1 )
        {
          window.setTimeout( function(){
            li = parent.getChildNodesByTagName( ul, "li" );
            for( var i=0; i<li.length; i++ ){
              li[i].appendChild( contents[ li[i].getElementsByTagName("p")[0].innerHTML ] );            
            }
            delete contents;
          }, 1000 );
        }
      }
      
    }

  },
  
  doCarrossel : function( mod ){
    var ul = mod.getElementsByTagName("ul")[0];
    var li = ul.getElementsByTagName("li")[0];
    var conteudo, p;
    
    // verifica se existem mais itens do que aparecem na lista para exibir o carrossel
    if( Math.round(mod.offsetWidth / li.offsetWidth) < ul.getElementsByTagName("ul").length ){
      // adiciona a classe 'carrossel' ao elemento
      conteudo = mod.getElementsByTagName("div")[0].getElementsByTagName("div")[0];
      mod.getElementsByTagName("div")[0].className += " carrossel";
      
      // adiciona botão anterior do carrossel
      p = document.createElement("p");
      p.className = "botao anterior";
      p.appendChild( document.createTextNode("Anterior") );
      conteudo.insertBefore( p, conteudo.firstChild );
      
      // adiciona botão proximo do carrossel
      p = document.createElement("p");
      p.className = "botao proximo";
      p.appendChild( document.createTextNode("Próximo") );
      conteudo.appendChild( p );
      
      if( (typeof carrossel).toLowerCase()==="undefined" ){
        throw new Error("Biblioteca 'carrossel' não esta definida");
      }
    }
  },
  
  Events : {
    add : function(elem,evt,fun){
      if(document.addEventListener)
        elem.addEventListener(evt,fun,false);
      else if (document.attachEvent)
        elem.attachEvent("on"+evt,fun,false);
    },
    
    remove : function(elem,evt,fun){
      if(document.removeEventListener)
        elem.removeEventListener(evt,fun,false);
      else if (document.attachEvent)
        elem.dettachEvent("on"+evt,fun,false);
    },
    
    target : function(evt){
      return evt.target || evt.srcElement;
    }
  },
  
  init : function(){
    var parent = this;
    var init = function(evt){
      var div;
      
      if( evt )
      {
        div = document.getElementsByTagName("div");
        parent.Events.add( document, "click", parent.click );
        
        for(var i=0; i<div.length; i++){
          if( (" "+div[i].className+" ").indexOf(" arquivo-abas ")!==-1 ){
            parent.select( div[i].getElementsByTagName("ul")[0].getElementsByTagName("li")[0] );
            parent.doCarrossel( div[i] );
          }
        }
      }
    }
    
    this.Events.add( window, "load", init );
    init.call(this);
  }
  
  
} 
Modulos.Arquivo.init();
