/*
 * jquery.live.tree 1.0.0 - jQuery plugin to hide and show branches of a tree
 *
 * http://wharsojo.wordpress.com/jquery-plugin-live-tree/
 * http://docs.jquery.com/Plugins/liveTree
 *
 * Copyright (c) 2009 
 *   Widi Harsojo (http://wharsojo.wordpress.com)
 *
 * Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html)
 * and MIT (http://www.opensource.org/licenses/mit-license.php) licenses.
 *
 * $Date: 2009-01-23 $
 * 
 * NOTE: css based on Jorn Zaefferer jquery.treeview.js
 */
jQuery.liveTree = function()
{
jQuery.liveTree.click = {};
$('ul.livetree').liveTree(true);
//helper for loading from ajax
function get_tree(url)
{
var ul = this.node.children('ul:eq(0)');
$.get(url,function(data){ul.html(data).liveTree();});
return true;
}
//css key use by togle_tree
var tl = ({none :['expandable' ,[' lastExpandable' ,''],[' lastExpandable-hitarea' ,'']]
,block:['collapsable',[' lastCollapsable',''],[' lastCollapsable-hitarea','']]});
//helper for basic togle_tree
function togle_tree()
{
var li = this.node;
var sb = li.next().length;
var ul = li.children('ul:eq(0)');
var hh = li.children('.hitarea:eq(0)');
var tg = ul.css('display')=='none'?'block':'none';
hh.removeClass('expandable-hitarea collapsable-hitarea lastExpandable-hitarea lastCollapsable-hitarea');
li.removeClass('expandable collapsable lastExpandable lastCollapsable');
hh.addClass('hitarea '+tl[tg][0]+'-hitarea'+tl[tg][2][sb]);
li.addClass(           tl[tg][0]+           tl[tg][1][sb]);
ul.css('display',tg);
}
//registering global event for togling tree
function reset_togle_tree()
{
$.liveTree.click['togleTree'] = togle_tree;
}
reset_togle_tree();
//event queue executor 
function do_events(li,clk)
{
var ok = true;
$.each(clk,function()
{
var lv= li.parent().attr('live')+':'+this;
if(ok && typeof $.liveTree.click[lv]=='function')
ok = ({event:$.liveTree.click[lv],node:li,resetTogleTree:reset_togle_tree,getTree:get_tree}).event();
});
return ok;
}
//event id generator
function clicked(ths,cls)
{
var li  = $(ths).parent();
var grp = ''+li.attr('grp');
var clk = ths.id=='' ? [cls,'tree'] : ['id:'+ths.id,cls,'tree'];
if( grp!='undefined') clk = clk.concat(grp.replace(/(\w+)/g,"grp:$1").trim().split(/\s+/));
do_events(li,clk.concat('tree'));
};
// registering liveTree node clicked
$('.livetree span.folder').live('click',function(){ clicked(this,'folder'); });
$('.livetree span.file'  ).live('click',function(){ clicked(this,'file');   });
//**************************************************
// registering liveTree mouse clicked on hitarea ***
$('.livetree .hitarea').live('click',function()
{
var li = $(this).parent();
var ul = li.children('ul:eq(0)');
var ht = do_events(li,['hit']);
var tg = ul.css('display')=='none'?'block':'none';
if (ht && tg=='block' && ul.children('li').length==0) ht = do_events(li,['hit:empty']); //event hit:empty folder
if (ht) //event hit:open/hit:close folder
ht = do_events(li,[({block:'hit:open',none:'hit:close'})[tg]]); 
if (ht) //global event for togling tree
({event:$.liveTree.click['togleTree'],node:li,getTree:get_tree}).event();
});
};
//****************************************************************
// liveTree Constructor for initial/loading from ajax get_tree ***
jQuery.fn.liveTree = function(init)
{
var tl = ({sp:['file','folder']
            ,ht:[' lastExpandable-hitarea','']
            ,li:[['',' last',''],['expandable',' lastExpandable','']] })
this.each(function()
{
var xx = $(this);
var lv = ''+xx.attr('live');
if(init!=undefined)xx.addClass('treeview');
xx.find('ul').css('display','none').attr('live',lv);
xx.find('li').each(function()
{
var li = $(this);
var sb = li.next().length;
var ch = li.children('ul').size();
if (ch!=0) li.prepend('<div class="hitarea expandable-hitarea'+tl.ht[sb]+'"/>');
li.addClass(tl.li[ch][0] + tl.li[ch][sb+1]).children('span:eq(0)').addClass(tl.sp[ch]);
});
});
};
//*****************************REGISTERING!!!***  
$(function(){ $.liveTree(); });