//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
// Listbox functions
//

var check_clicked = false;
var listboxes_checked = new Object();
var listbox_info = new Object();
var level_changed = false;

function listSelectFullySelectedGroups(listName)
{
    var list = listbox_info[listName];
    var groups = new Array();
    var selectAll = null;
    var idx = 0;
    for (var item_i_key in list.items)
    {
        var item_i = list.items[item_i_key];
        if (item_i.isGroup)
        {
            if (item_i.isSelectAll)
                selectAll = item_i.groupId;
            else
                groups[idx++] = item_i.groupId;
        }
    }
    for (var i = 0; i < groups.length; i++)
    {
        
        var allSelected = true;
        var groupId = groups[i];
        
        for (var item_i_key in list.items)
        {
            var item_i = list.items[item_i_key];
            if (!(item_i.isGroup && !item_i.isGroupItem) && item_i.groupId == groupId && !item_i.checked)
            {                
                allSelected = false;
                break;
            }
        }
        if (allSelected)
            listSelect(listName, new Array(groupId), true, null, false);
    }

    if (selectAll != null)
    {        
        var allSelected = true;
        for (var item_i_key in list.items)
        {
            var item_i = list.items[item_i_key];
            if (!(item_i.isGroup && !item_i.isGroupItem)&& !item_i.checked)
            {
                allSelected = false;
                break;
            }
        }
        if (allSelected)
        {            
            listSelect(listName, new Array(selectAll), true, null, false);
        }
    }
}

function listItemClicked()
{
  if (this.readonly)
    return;

  if (!self.listboxes_checked)
    //avoid false error in firebug
    return;

  var id = this.iid;
  var listName = this.listName;
  var list = listbox_info[listName];
  var item = list.items[id];

  if (item.isGroup)
  {
      if (!item.isGroupItem)
      {
          var toSelect = new Array();
          var idx = 0;
          for (var item_i_key in list.items)
          {
              var item_i = list.items[item_i_key];
              if ((item.isSelectAll && !item_i.isSelectAll) || (!item_i.isGroup && item_i.groupName == item.groupName))
              {
                  toSelect[idx++] = item_i.id;
              }
          }
          listSelect(listName, toSelect, true, null, item.checked);
      }
      else
      {
          if (item.checked && !level_changed)
          {
              var toDeselect = new Array();
              var idx = 0;

              for (var item_i_key in list.items)
              {
                  var item_i = list.items[item_i_key];
                  if (!item_i.isGroup && item_i.groupName == item.groupName)
                  {
                      toDeselect[idx++] = item_i.id;
                  }
              }
              listSelect(listName, toDeselect, true, null, true);
          }
      }
  }

  else if (item.groupName != null)
  {
    if (item.checked)
    {
        if (item.hasGroupItem)
        {
        }
        else
            listSelect(listName, new Array(item.groupId), true, null, true);
    }
    else
    {
        if (item.hasGroupItem)
        {
            if (!list.items[item.groupId].checked)
            {
                listSelect(listName, new Array(item.groupId), false, null, false);
            }
        }

        else
        {
            var allSelected = true;
            for (var item_i_key in list.items)
            {
                var item_i = list.items[item_i_key];
                if (!item_i.isGroup && item_i.id != item.id && item.groupId == item_i.groupId)
                {
                    if (!item_i.checked)
                    {
                        allSelected = false;
                        break;
                    }
                }
            }
            if (allSelected)
                listSelect(listName, new Array(item.groupId), true, null, false);
        }
    }
  }

  if (list.hasSelectAll && !item.isSelectAll)
  {      
      if (!item.checked)
      {
        var allSelected = true;
        for (var item_i_key in list.items)
        {
            var item_i = list.items[item_i_key];
            if (!item_i.isSelectAll && item.id != item_i.id && !item_i.checked)
                {
                    allSelected = false;
                    //alert("not selected: " + item_i.name);
                    break;
                }            
        }
        if (allSelected)
            listSelect(listName, new Array("grp_select_all"), true, null, false);
      }
      else
        listSelect(listName, new Array("grp_select_all"), true, null, true);  
  }

  
  
  var checkbox = this.getElementsByTagName("input")[0];  

  if (!check_clicked && !level_changed) 
    checkbox.checked = !checkbox.checked;
  else
    check_clicked = false;

  level_changed = false;

  item.checked = checkbox.checked;

  
  
  if (!list.multiSelect)
    listDeselectAll(this.listName, id);

  if (item.checked)
    setCheckedColor(this);
  else
    setOverColor(this);

  if (item.checked)
  {
    listboxes_checked[list.id][id] = new Object();
    listboxes_checked[list.id][id].name = item.name;
    listboxes_checked[list.id][id].isGroup = item.isGroup;
    listboxes_checked[list.id][id].isGroupItem = item.isGroupItem;
    listboxes_checked[list.id][id].groupName = item.groupName;
    listboxes_checked[list.id][id].id = id;
    if (item.levelsDiv)
    {
        item.levelsDiv.style.display = "block";
        item.textTd.style.overflow = "hidden";
        if (list.multiLevels)
        {
            item.levelValues = new Array();
        }

        for (var i = 0; i < item.levels.length; i++)
        {
            if (item.levels[i].checked)
            {
                if (list.multiLevels)
                {                    
                    item.levelValues.push(i+1);
                }
                else
                {
                    item.levelValue = item.levels[i].value;
                    break;
                }
            }
        }
        if (list.multiLevels)
        {
            listboxes_checked[list.id][id].levelValues = item.levelValues;
        }
        else
        {
            listboxes_checked[list.id][id].levelValues = new Array(item.levelValue);
        }
    }
  }
  else
  {
    delete (listboxes_checked[list.id][id]);
    if (item.levels)
    {
        for (var i = 0; i < item.levels.length; i++)
            item.levels[i].checked = false;
        if (item.levelsDiv)
        {
            item.levelsDiv.style.display = "none";
            item.textTd.style.overflow = "visible";
            if (list.multiLevels)
                item.levelValues = null;
            else
                item.levelValue = 0;            
        }
    }
  }
	    
  var selectedItems = listboxes_checked[list.id];
  if (list.onchanged)
  {
    list.onchanged(selectedItems, item.checked, id);
  }

  __listUpdateHidden(list)
}


function __listUpdateHidden(list)
{
  var items = listboxes_checked[list.id];
  var a = new Array();
  for (var i in items)
  {
    var item = list.items[i];
    if (item.isGroup && !item.isGroupItem)
        continue;
    
    if (item.levelValues && item.levelValues.length > 0)
    {
        for (var j = 0; j < item.levelValues.length; j++)
            a.push(i + "=" + item.levelValues[j]);
    }
    else if (item.levelValue && item.levelValue > 0)
        a.push(i + "=" + item.levelValue);
    else
        a.push(i);
  }
  document.getElementById("lb_"+list.id+"_hidden").value = a.join(",");
}


function listSelect(long_name, ids, noEvent, onLoadFunction, deselect)
{
  var list = listbox_info[long_name];
  var d;
  if (ids.length == 0)
      return;

          

  for (var i = 0; i < ids.length; i++)
  {
    var currentHtmlId = ids[i];
    var currentLevel = 0;
    if (list.numLevels)
    {
        var csplit = currentHtmlId.split('=');
        currentHtmlId = csplit[0];
        if (csplit.length == 2)
            currentLevel = csplit[1];
    }
    var id = "lb_"+list.id+"_I_"+currentHtmlId;    
    d = document.getElementById(id);
    if (!d)
    {
        id = "lb_"+list.id+"_I_"+currentHtmlId + "_grp";
        d = document.getElementById(id);
    }
    if (!d)
    {
        continue;
    }
    
    if (deselect)
      setNormalColor(d);
    else
      setCheckedColor(d);

    var item = list.items[d.iid];

    if (deselect)
    {
      delete(listboxes_checked[list.id][item.id]);
      if (list.numLevels && list.numLevels > 0)
      {
        if (item.levelValues)
            item.levelValues = null;
        if (item.levelValue)
            item.levelValue = 0;
      }        
    }
    else
    {
      listboxes_checked[list.id][item.id] = new Object();
      listboxes_checked[list.id][item.id].name = item.name;
      listboxes_checked[list.id][item.id].id = item.id;
      listboxes_checked[list.id][item.id].isGroup = item.isGroup;
      listboxes_checked[list.id][item.id].isGroupItem = item.isGroupItem;
      listboxes_checked[list.id][item.id].groupName = item.groupName;
      if (item.levels && !deselect && currentLevel > 0)
      {
        if (list.multiLevels)
        {
            if (!item.levelValues)
                item.levelValues = new Array();
            item.levelValues.push(currentLevel);
            listboxes_checked[list.id][item.id].levelValues = item.levelValues;
        }
        else
        {
            item.levelValue = currentLevel;
            listboxes_checked[list.id][item.id].levelValues = new Array(item.levelValue);
        }
        var itemRadio = item.levels[currentLevel - 1];
        if (itemRadio)
            itemRadio.checked = true;
      }
    }
    
    item.checked = !deselect;
    var checkbox = d.getElementsByTagName("input")[0];
    checkbox.checked = item.checked;
    if (item.levelsDiv)
    {
        item.levelsDiv.style.display = item.checked ? "block" : "none";
        item.textTd.style.overflow = item.checked ? "hidden" : "visible";
    }
  }

  var selectedItems = listboxes_checked[list.id];

  if (list.onchanged && !noEvent)
    list.onchanged(selectedItems, !deselect, ids && ids.length == 1 && !deselect ? ids[0] : null);


  if (onLoadFunction)
    onLoadFunction(selectedItems, name);

  __listUpdateHidden(list)
}



function listDeselectAll(long_name, excepted)
{
  var list = listbox_info[long_name];
  var divs = document.getElementById("lb_"+list.id).getElementsByTagName("tr");
  var lastId;
  var lb_checked = listboxes_checked[list.id];
  for(var i = 0; i < divs.length; i++)
  {
    var div = divs[i];
    if (div.iid != excepted)
    {
      setNormalColor(div);
      var checkBox = div.getElementsByTagName("input")[0];
      checkBox.checked = false;
      delete lb_checked[div.iid];
      list.items[div.iid].checked = false;
    }
  }

  __listUpdateHidden(list);
}





function listDisable(long_name)
{
  //listDeselectAll(long_name);
  
  var list = listbox_info[long_name];
  
  /*if (list.onchanged)
    list.onchanged(new Array(), true);    */
  
  var lb = document.getElementById("lb_"+list.id);
  var divs = lb.getElementsByTagName("tr");  
  
  
  
  for(var i = 0; i < divs.length; i++)
  {
      var div = divs[i];
      
      div.readonly = true;
      var checkBox = div.getElementsByTagName("input")[0];
      
      if (checkBox.checked)
          div.style.backgroundColor="#B0B0C0";
          
      checkBox.disabled = true;
  }
}


function listEnable(long_name)
{
  var list = listbox_info[long_name];
  var lb = document.getElementById("lb_"+list.id);
  var divs = lb.getElementsByTagName("tr");
  
  for(var i = 0; i < divs.length; i++)
  {
      var div = divs[i];
      div.readonly = false;
      var checkBox = div.getElementsByTagName("input")[0];
      checkBox.disabled = false;
      if (checkBox.checked)
          div.style.backgroundColor="#707090";      
  }
}




function listDisableItems(long_name, ids, fakeSelect)
{
  var list = listbox_info[long_name];

  
  listSelect(long_name, ids, true, null, true);
  
  if (ids.length == 0)
      return;

  for (var i = 0; i < ids.length; i++)
  {
      var currentHtmlId = ids[i];
      var id = "lb_"+list.id+"_I_"+currentHtmlId;
      div = document.getElementById(id);
        if (!div)
        {
            id = "lb_"+list.id+"_I_"+currentHtmlId + "_grp";
            div = document.getElementById(id);
        }
      div.readonly = true;
      var checkBox = div.getElementsByTagName("input")[0];

      //if (checkBox.checked)
          //div.style.backgroundColor="#B0B0C0";

      if (fakeSelect)
          checkBox.checked = true;

      checkBox.disabled = true;
      
      div.style.color = "#B5A08E";
  }
}

function listEnableItems(long_name, ids)
{
  var list = listbox_info[long_name];

  if (ids.length == 0)
      return;

  for (var i = 0; i < ids.length; i++)
  {
      var currentHtmlId = ids[i];
      var id = "lb_"+list.id+"_I_"+currentHtmlId;
      div = document.getElementById(id);
        if (!div)
        {
            id = "lb_"+list.id+"_I_"+currentHtmlId + "_grp";
            div = document.getElementById(id);
        }

      div.readonly = false;
      var checkBox = div.getElementsByTagName("input")[0];

      checkBox.disabled = false;
      checkBox.checked = false;
      div.style.color = "";
  }
}





var checked_fg = "#FFFFFF";
var checked_bg = "#707090";
var over_fg = "";
var over_bg = "#F3E8DF";
var normal_fg = "";
var normal_bg = "";


function setOverColor(obj)
{
  try
  {
    obj.style.color = self.over_fg;    
    obj.style.backgroundColor = self.over_bg;
    
    var childnodes = obj.childNodes;
    var idx1 = 1;
    var idx2 = 2;
    /*
    if (obj.groupName && !obj.isGroupItem)
    {
        idx1 = 2;
        idx2 = 3;
    }*/
    childnodes[idx1].style.color = self.over_fg;
    if (childnodes.length > 2)
    {
        childnodes[idx1].style.overflow = "hidden";
        childnodes[idx2].childNodes[0].style.display = "block";
    }
  }
  catch (E) { }
}
function setCheckedColor(obj)
{
  try
  { 
    obj.style.backgroundColor = self.checked_bg;
    obj.style.color = self.checked_fg;
    obj.childNodes[1].style.color = self.checked_fg;    
    
  }
  catch (E) { }
}
function setNormalColor(obj)
{
  try
  {
    obj.style.color = self.normal_fg;
    obj.style.backgroundColor = self.normal_bg;
    var childnodes = obj.childNodes;
    var idx1 = 1;
    var idx2 = 2;
    /*if (obj.groupName && !obj.isGroupItem)
    {
        idx1 = 2;
        idx2 = 3;
    }*/
    childnodes[idx1].style.color = self.normal_fg;
    if (childnodes.length > 2)
    {
        childnodes[idx1].style.overflow = "visible";
        childnodes[idx2].childNodes[0].style.display = "none";
    }
  }
  catch (E) { }
}

function listItemOver()
{
  if (this.readonly)
    return;
  var lb_checked = listboxes_checked[this.listId];
  if (lb_checked[this.iid])
    setCheckedColor(this);
  else
    setOverColor(this);
}


function listItemOut()
{
  if (this.readonly)
    return;
  var lb_checked = listboxes_checked[this.listId];
  if (lb_checked[this.iid])
    setCheckedColor(this);
  else
    setNormalColor(this);
}

function levelClicked(cb, parentCheckBox)
{
    if (parentCheckBox)
        parentCheckBox.checked = true;
    else
        cb.parentNode.parentNode.parentNode.childNodes[idx].childNodes[0].checked = true;
    return true;
}

function initListBox(lid, longName, onchanged, checkboxes, noMultiselect, disabled, numLevels, multiLevels)
{
  var o = new Object();
  o.name = longName;
  o.id = lid;
  o.multiSelect = !noMultiselect;
  if (onchanged)
      o.onchanged = onchanged;
  o.items = new Object();

  var currentGroup = null;
  var currentGroupId = null;

  var inputs = document.getElementById('lb_'+lid).getElementsByTagName('input');
  for (var i = 0; i < inputs.length; i++) 
  { 
    inputs[i].onclick = function(){check_clicked=true};
  }

  var divs = document.getElementById('lb_'+lid).getElementsByTagName('tr');
  if (disabled) 
    checked_bg = "#B0B0C0";

  var hasGroupItem = false;
  for (var i = 0; i < divs.length; i++)
  {
    var div = divs[i];
    if (div.id)
    {
      var oi = new Object();
      div.listName = longName;
      div.listId = lid;
      var isGroupItem = false;
      var idSubstr = div.id.substr(div.id.indexOf("_I_")+3);
      if (idSubstr.indexOf("_grp_") == -1 && idSubstr.indexOf("_grp") > 0)
      {
          isGroupItem = true;
          idSubstr = idSubstr.substr(0,  idSubstr.indexOf("_grp"));
          hasGroupItem = true;
      }
      div.iid = idSubstr;
      div.onclick = listItemClicked;
      div.onmouseover = listItemOver;
      div.onmouseout = listItemOut;
      div.className = 'listItem';
      div.readonly = disabled;
      if (!div.style)
	div.style = "";
      var checkbox = div.getElementsByTagName('input')[0];
      checkbox.checked = false;
      oi.checked = false;
      var tds = div.getElementsByTagName('td');
      var textTd = tds[1];
      oi.textTd = textTd;

      var textTdSpan = textTd.getElementsByTagName('span')[0];

      if (isGroupItem || div.id.indexOf("lb_" + lid + "_I_grp_") == 0)
          {
              currentGroup = textTdSpan.innerHTML;
              currentGroupId = div.iid;
              oi.isGroup = true;
              oi.groupName = currentGroup;
              oi.groupId = currentGroupId;

              oi.isSelectAll = (currentGroupId == "grp_select_all");
              oi.isGroupItem = isGroupItem;

              if (oi.isSelectAll)
                o.hasSelectAll = true;
          }
      if (currentGroup != null)
      {
          oi.groupName = currentGroup;
          oi.groupId = currentGroupId;
          oi.hasGroupItem = hasGroupItem;

          div.groupName = oi.groupName;
          div.isGroupItem = oi.isGroupItem;
      }

      oi.name = textTdSpan.innerHTML;

      oi.id = div.iid;
      o.items[div.iid] = oi;
      if (isIE6)
      {
	textTd.className = "it it_ie6";
      }
      else if (isOpera)
      {
	checkbox.className = "opera";
      }
      if (numLevels > 0)
      {        
        o.numLevels = numLevels;
        o.multiLevels = multiLevels;
        var checksTd = tds[2];
        if (checksTd)
        {
            oi.levels = checksTd.getElementsByTagName('input');     
            oi.levelsDiv = checksTd.getElementsByTagName('div')[0];
            if (!oi.levelsDiv.style)
                oi.levelsDiv.style = "";
            
            for (var j = 0; j < oi.levels.length; j++)
            {
                oi.levels[j].parentCheckBox = checkbox;
                oi.levels[j].onclick = function() {level_changed=true; return levelClicked(this, this.parentCheckBox);};
            }
        }
      }
    }
    else if (div.getElementsByTagName('td')[0].className == "separator")
    {
        currentGroup = null;
        hasGroupItem = false;
    }
  }

  listbox_info[longName] = o;
  listboxes_checked[o.id] = new Object();
}
