(function($){

   var jlTree = function(element,options)
   {
       var elem = $(element);
       var obj = this;

       
       // init
       elem.find('ul').parent().addClass('haschildren'); 
       
       
      elem.find('span').click(function(){
        if($(this).parent().hasClass('open'))
          obj.closeNode($(this).parent());
        else
          obj.openNode($(this).parent());
       
      }); 
      
      // end init
           
      
       this.openNode = function( nodeId , triggerOpen)
       {
          triggerOpen = typeof(triggerOpen) != 'undefined' ? triggerOpen : true;
       
          var node = getNodeRef( nodeId );
        
          obj.closeAllNodes();
          
          node.parents('ul').show(); 
          node.children('ul').show();
          node.addClass('open');
          node.parents('li').addClass('open');
          
          if(triggerOpen)
            node.triggerHandler('open');

       };
       
       this.closeAllNodes = function(){
          obj.closeNode(elem);
       }
       
       this.closeNode = function( nodeId ){
          var node = getNodeRef( nodeId );
          node.find('ul').hide();
          node.find('.open').removeClass('open');
          node.removeClass('open');
       }
       
       var getNodeRef = function( nodeId ){
          if(typeof nodeId == 'object')
            return nodeId;
          else
            return elem.find('#'+nodeId); 
       }
   };
   

   $.fn.jltree = function()
   {
       return this.each(function()
       {
           var element = $(this);
           if (element.data('jltree')) return;
           var myplugin = new jlTree(this);
           element.data('jltree', myplugin);
       });
   };
   
})(jQuery);

