function treeview_refresh_tree(top) {
  treeview_refresh_elem(top);
  treeview_refresh_elem(top.find('li'));
}

function treeview_refresh_elem(el) {
  if (el.is('ul')) el=el.parent('li');
  if (el.length) _treeview_refresh_elements(el);
}

function _treeview_refresh_elements(els) {
  return;
  els
     .filter('li:has(ul:visible)').addClass('collapsable').end()
     .filter('li:has(ul:hidden)').addClass('expandable').end()
  ;
}

function _is_click_here(obj, X, Y) {
  var _off=obj.offset();
  return ((_off.left<=X) && (_off.top<=Y) && ((_off.left+obj.width())>X) && ((_off.top+obj.height())>Y));
}

function _treeview_toggle(li) {
  li.toggleClass('expandable collapsable');
}

function _treeview_item_click(li, X, Y) {
  if ((li.offset().left+16)>X) _treeview_toggle(li.filter('li:has(ul)'));
  return false;
}

function _treeview_li_click(li, X, Y, cb) {
  var _ul=li.children('ul')
  if (_ul.length && (_ul.is(':visible')) && (_is_click_here(_ul, X, Y))) _treeview_ul_click(_ul, X, Y, cb)
  else cb(li, X, Y);
}

function _treeview_ul_click(ul, X, Y, cb) {
  ul.children('li').each(function() {
    if (_is_click_here($(this), X, Y)) _treeview_li_click($(this), X, Y, cb);
  })
}

function treeview_init(sel, rightclick_cb) {
    treeview_refresh_tree($(sel).addClass('treeview').click(function (ev) {_treeview_ul_click($(this), ev.pageX, ev.pageY, _treeview_item_click)}));
    if (rightclick_cb) $(sel).rightClick                   (function (ev) {_treeview_ul_click($(this), ev.pageX, ev.pageY, rightclick_cb)});
}

