Tree = {};
Tree._trees = {};
Tree.handleClass = '__treedraghandle';
Tree.create = function (el, callBack, options)
{
    var options = options || {};
    options.tree = true;
    options.dropOnEmpty = true;
    options.handle = Tree.handleClass;
    Tree.options = options;
    Tree._trees[el.id] = {element:el};
    if ( options.sortable ) {
        Tree.modifyHTML(el);
        Sortable.create(el, options);
        Event.observe(el, 'mouseup', Tree.beforeDrag, true);
        Tree._trees[el.id].callBack = callBack;
        Tree._trees[el.id].status = Sortable.serialize(el);
    }
    if ( options.collapsable ) {
        Event.observe(el, 'click', Tree.toggleElement, true);
    }
    /* <!-- jeroen */
    if ( options.allCollapsed ) {
        var lis = el.getElementsByTagName('li');
        for (var i = 0; i < lis.length; i++) {
            if(lis[i].id != 'treesiteroot_') {
                var ul = lis[i].getElementsByTagName('UL')[0];
                
                if ( ul && Element.visible(ul) ) {
                    Element.addClassName(lis[i], 'collapsed');
                    Element.toggle(ul);
                }
            }
        }
    }
    if (Tree.getCookieValue(el.id)) {
        cookie = Tree.getCookieValue(el.id);
        cookie.split(',').each(Tree.expandCat);
    }
    /* --> */
};
Tree.destroy = function (el)
{
    Sortable.destroy(el);
};
Tree.beforeDrag = function (e)
{
    var element = Event.findElement(e, 'li');
    var root = Tree.getRootId(element);
    if ( Tree._trees[root].status != Sortable.serialize(Tree._trees[root].element) ) {
        Tree._trees[root].status = Sortable.serialize(Tree._trees[root].element);
        Event.findElement(e, 'a').onclick=function(){this.onclick=null; return false;};    // prevent following link
        Tree.updateEmptyElements(Tree._trees[root].element);
        if ( Tree._trees[Tree.getRootId(element)].callBack ) {
            Tree._trees[Tree.getRootId(element)].callBack(element);
        }
    }
};
/** called once to make sure each li.node has a ul and to add a hidden li to each ul, to keep the empty uls dropable
 *  adds class Tree.handleClass to each <a> in the tree
 */
Tree.modifyHTML = function (el)
{
    var as = el.getElementsByTagName('A');
    for ( var i = 0; i<as.length; i++ ) {
        Element.addClassName(as[i], Tree.handleClass);
    }
    // insert empty <ul> in all <li class="node"> with no child <ul>'s
    var lis = el.getElementsByTagName('LI');
    for ( var i = 0; i<lis.length; i++ ) {
        if ( Element.hasClassName(lis[i], 'node') && !lis[i].getElementsByTagName('UL').length ) {
            var ul = document.createElement('ul');
            lis[i].appendChild(ul);
        }
    }
    // add an empty <li> to all <ul>'s to make empty <ul>'s dropzones
    var uls = el.getElementsByTagName('UL');
    for ( var i = 0; i<uls.length; i++ ) {
        var li = document.createElement('LI');
        Element.addClassName(li, 'hideme');
        uls[i].appendChild(li);
    }
};
Tree.updateEmptyElements = function (el)  // called with each change of the tree to update classes .empty
{
    var lis = el.getElementsByTagName('LI');
    for ( var i = 0; i<lis.length; i++ ) {
        Element.removeClassName(lis[i], 'empty');
    }
    var uls = el.getElementsByTagName('UL');
    for ( var i = 0; i<uls.length; i++ ) {
        Element.removeClassName(uls[i], 'empty');
    }
    for ( var i = 0; i<uls.length; i++ ) {
        if ( Element.empty(uls[i]) ) {
            Element.addClassName(uls[i], 'empty');
            Element.addClassName(uls[i].parentNode, 'empty');
        }
    }
};
Tree.toggleElement = function(e){
    var li = Event.findElement(e, 'LI');
    var a = Event.findElement(e, 'A');
    if ( a && Element.childOf(a, li) ) {
        var tmpli = a.parentNode;
        if ( tmpli.className && Element.hasClassName(tmpli, 'node') && !Element.hasClassName(tmpli, 'empty') ) {
            var ul = tmpli.getElementsByTagName('UL')[0];
            if ( Element.visible(ul) ) {
                Element.addClassName(tmpli, 'collapsed');
                //-jeroen
                Tree.removeFromCookie(tmpli);
            } else {
                Element.removeClassName(tmpli, 'collapsed');
                //-jeroen
                Tree.addToCookie(tmpli);
            }
            if ( Tree.options.animateCollapse ) {
                Effect.toggle(ul, 'appear');
            } else {
                Element.toggle(ul);
            }
            //Event.stop(e);
        }
        
        
        return true;
    }
    
    
    
    
    
    //alert('test');
    
    if ( li.className && Element.hasClassName(li, 'node') && !Element.hasClassName(li, 'empty') ) {
        var ul = li.getElementsByTagName('UL')[0];
        if ( Element.visible(ul) ) {
            Element.addClassName(li, 'collapsed');
            //-jeroen
            Tree.removeFromCookie(li);
        } else {
            Element.removeClassName(li, 'collapsed');
            //-jeroen
            Tree.addToCookie(li);
        }
        if ( Tree.options.animateCollapse ) {
            Effect.toggle(ul, 'appear');
        } else {
            Element.toggle(ul);
        }
        Event.stop(e);
    }
};



Tree.getRootId = function (el)
{
    var ids = $A();
    for ( i in Tree._trees ) {
        ids.push(i);
    }
    var p = el;
    while ( ids.indexOf(p.id) == -1 ) {
        if ( p.tagName=='BODY' ) {
            return false;
        }
        p = p.parentNode;
    }
    return p.id;
};
// <!-- jeroen

Tree.removeFromCookie = function(el) 
{
    var id = el.getAttribute('id');
    //alert(id);
    var delicacy = Tree.getCookieValue(Tree.getRootId(el));
    var ids = delicacy.split(',');   
    ids = ids.reject(function(c_id){return c_id==id;});
    var cookieval = ids.join(',');
    var nextyear = new Date();
    nextyear.setFullYear(nextyear.getFullYear() + 1);
    cookieval = Tree.cleanCookieVal(cookieval);
//    alert(cookieval);
    document.cookie=Tree.getRootId(el)+"="+cookieval+";expires="+nextyear.toGMTString();
};
Tree.addToCookie = function(el) 
{
    var id = el.getAttribute('id');
    //alert(id);
    var nextyear = new Date();
    nextyear.setFullYear(nextyear.getFullYear() + 1);
    var delicacy = Tree.getCookieValue(Tree.getRootId(el));
    if (delicacy) {
        delicacy = delicacy+',';
    }
    cookieval = Tree.cleanCookieVal(delicacy+id);
    if (delicacy.indexOf(id) == -1) {
        document.cookie=Tree.getRootId(el)+"="+cookieval+";expires="+nextyear.toGMTString();
    }
  
};
Tree.cleanCookieVal = function(str) 
{
    if (str.indexOf(',') == 0) {
        str = str.substring(1,str.length);
    }
    if (str.indexOf(',') == str.length-1) {
        str = str.substring(0,str.length-1);
    }
    str = str.replace(',,', ',');
    
    return escape(str);
}
Tree.getCookieValue = function(delicacy) 
{
    var cookies = document.cookie.split(';'), crumble;
    for ( var i=0; i<cookies.length; i++ ) {
        crumble = cookies[i].split('=');
        if ( crumble[0].replace(/\s/g, '') == delicacy.replace(/\s/g, '') ) {
            return unescape(crumble[1]);
        }
    }
    return '';
};
Tree.expandCat = function(id)
{
    var el;
    if ( el = document.getElementById(id) ) {
        var uls = el.getElementsByTagName('ul');
        if ( Element.visible(el) ) {
            Element.removeClassName(el, 'collapsed');
            Element.addClassName(el, 'expanded');
            Element.toggle(uls[0]);
            
            /*Bata*/
            //Element.show();
            //alert('expanding');
            //alert('alo2');
        } else {
            //alert('alo');
        }
    }
};
