Abas = {
  "CLASS_NAME_SELECT" : "ativo",
  "CLASS_NAME_UNSELECT" : "",
  
  "CLASS_NAME_SHOW" : "exibe",
  "CLASS_NAME_HIDE" : "",
  
  "showingElement" : null,
  "selectedElement" : null,
  
  "id" : null,
  
  "select" : function(elem)
  {
    if( this.selectedElement !== null )
    {
      this.unselect(this.selectedElement);
    }
    
    if( !this.isTagName(elem,"li") )
    {
      elem = this.getParent(elem,"li");
    }
    
    this.Classes.removeClass( elem, this.CLASS_NAME_UNSELECT );
    this.Classes.addClass( elem, this.CLASS_NAME_SELECT );
    
    this.selectedElement = elem;
  },
  
  "unselect" : function(elem)
  {
    if( !this.isTagName(elem,"li") )
    {
      elem = this.getParent(elem,"li");
    }
    
    this.Classes.removeClass( elem, this.CLASS_NAME_SELECT );
    this.Classes.addClass( elem, this.CLASS_NAME_UNSELECT );
  },
  
  "isTagName" : function( elem, tagName )
  {
    return elem.tagName.toLowerCase() === tagName.toLowerCase()
  },
  
  "getParent" : function( elem, tagName )
  {
    var parent = elem;

    while( !this.isTagName( parent, tagName ) )
    {
      parent = parent.parentNode;
    }
    
    return parent;
  },
  
  "getElementByLink" : function(elem)
  {
    return document.getElementById( this.id+"-"+elem.getAttribute("href").replace( /^.*#/, "" ) );
  },
  
  "hide" : function()
  {
    if( this.showingElement !== null )
    {
      this.Classes.removeClass( this.showingElement, this.CLASS_NAME_SHOW );
      this.Classes.addClass( this.showingElement, this.CLASS_NAME_HIDE );
      this.unselect(this.selectedElement);
      this.showingElement = null;
    }
  },
  
  "show" : function(elem)
  {
    if( this.showingElement !== null )
    {
      this.hide();
    }
    
    this.Classes.removeClass( elem, this.CLASS_NAME_HIDE );
    this.Classes.addClass( elem, this.CLASS_NAME_SHOW );
    this.showingElement = elem;
  },
  
  "click" : function(evt)
  {
    var title;
    
    this.events.preventDefault(evt);
    this.toggle(this.events.target(evt));
    location.hash = this.events.target(evt).getAttribute("href").replace( /^.*#/, "" );
    
    // resolve problema de title da página no IE
    title = document.title;
    window.setTimeout(function(){
      document.title = title
    },100);
  },
  
  "toggle" : function(link)
  {
    var display = this.getElementByLink(link);

    this.show(display);
    this.select(link);
  },
  
  "events" : {
    
    /**
     * 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);
    },
    
    target : function(e){
      if(e.currentTarget) return e.currentTarget;
      else if (e.srcElement) return e.srcElement;
      else return false;
    }
  
  },
  
  "Classes" : {
    
    /**
     *  Gera array com classes do elemento
     *  @type {Method}
     *  @param {DOM Object} Elemento DOM
     *  @return {Array} Classes do elemento    
     *  
     */
    "getArrayFromClassName" : function( obj )
    {
      return obj.className.split(" ");
    },
    
    /**
     *   Gera string com array de classes
     *   @type {Method}
     *   @param {Array} Classes do elemento
     *   @return {String} ClassName do elemento
     *   
     */               
    "getClassNameFromArray" : function( arr )
    {
      return arr.toString().replace(/,/g," ");
    },
    
    /**
     *  Verifica se a classe existe 
     *  @param {DOM Object} Elemento DOM
     *  @param {String} Classe a ser procurada
     *  @return {Boolean} Classe existente   
     *  
     */              
    "existsClass" : function( obj, cls )
    {
      var arr = this.getArrayFromClassName(obj);
      var exists = false;
      
      for( var i in arr )
      {
        if( arr[i] === cls )
        {
          exists = true;
          break;
        }
      }
      
      return exists;
    },
    
    /**
     *  Adiciona classe ao elemento
     *  @type {Method}
     *  @param {DOM Object} Elemento DOM
     *  @param {String} Classe a ser adicionada
     *  
     */                 
    "addClass" : function( obj, cls )
    {
      var arr;
      
      if( !this.existsClass(obj,cls) )
      {
        arr = this.getArrayFromClassName( obj );
        arr.push(cls);
        obj.className = this.getClassNameFromArray(arr);
      } 
    },
    
    /**
     *  Remove classe do elemento
     *  @type {Method}
     *  @param {DOM Object} Elemento DOM
     *  @param {String} Classe a ser removida
     *  
     */              
    "removeClass" : function( obj, cls )
    {
      var arr = this.getArrayFromClassName( obj );
      
      for( var i in arr )
      {
        if( arr[i] === cls )
        {
          arr.splice(i,1);
          break;
        }
      }
      
      obj.className = this.getClassNameFromArray(arr);
    },
    
    /**
     *  Troca classe do elemento
     *  @type {Method}
     *  @param {DOM Object} Elemento DOM
     *  @param {String} Classe a ser removida
     *  @param {String} Classe a ser adicionada
     *  
     */      
    "changeClass" :  function( obj, oldCls, newCls )
    {
      this.removeClass( obj, oldCls );
      this.addClass( obj, newCls );
    }
    
  },

  
  "init" : function(id)
  {
    var parent = this;
    this.events.add(window,"load",function()
    {
      var a = document.getElementById(id).getElementsByTagName("a");
      var hash = location.hash.replace("#","");
      var preDefined = null;

      parent.id = id;
      
      for( var i=0; i<a.length; i++ )
      {
        parent.events.add(a[i],"click",function(evt)
        {
          parent.click(evt);
        });
        if( a[i].getAttribute("href").replace( /^.*#/, "" )===hash )
        {
          preDefined=a[i];
        }
        if( parent.Classes.existsClass(parent.getParent(a[i],"li"),parent.CLASS_NAME_SELECT) )
        {
          parent.toggle(a[i]);
        }
      }
      
      if( preDefined !== null )
      {
        parent.toggle( preDefined );
      }
      
      document.title = document.title.replace( new RegExp(location.hash,"g"), "" );
    });
  }
}
