function newOpt(href, text, level, pos) {
  var newOpts = new Array();
  var found = false;
  for (var i = 0; !found && i < level.length; ++i) {
    if (level.options[i].value == href && level.options[i].text == text)
      found = true;
  }
  if (!found) {
	var opt = new Option(text, href, false, false);
	try {
		if (special[special.length - 1] && special[special.length - 1][href])
			opt.className = 'inactive';
	} catch (e) {}
	level.options[level.length] = opt;
  }
}
function opt(val, text, parentVal) {
  this.val = val;
  this.text = text;
  if (parentVal)
    this.parentVal = parentVal;
}
var snap = false;
var opts = new Array();
var drilldowns = new Array();
var extensions = new Array();
var emptyMsg = new Array();
var selectMsg = new Array();
var special = new Array();
var numDrilldowns = 0;
function initDrilldowns() {
  var ddArray = new Array();
  for (var i = 0; i < initDrilldowns.arguments.length; ++i)
    ddArray[ddArray.length] = initDrilldowns.arguments[i];
  drilldowns[numDrilldowns] = new Array();
  emptyMsg[numDrilldowns] = new Array();
  selectMsg[numDrilldowns] = new Array();
  for (var i = 0; i < ddArray.length; ++i) {
    drilldowns[numDrilldowns][i] = ddArray[i];
	if (i > 0) {
		emptyMsg[numDrilldowns][i] = ddArray[i].options[0].text;
		selectMsg[numDrilldowns][i] = ddArray[i].options[1].text;
	    ddArray[i].options.length = 1;
	}
  }
  for (var i = 1; i < ddArray[0].options.length; ++i)
    opts[numDrilldowns][opts[numDrilldowns].length] = new opt(ddArray[0].options[i].value, ddArray[0].options[i].text);
  numDrilldowns++;
  //if (ddArray[0].selectedIndex != 0)
    change(ddArray[0]);
}
function getOptByValue(selectBox, value) {
  var drilldownSet = getDrilldownSet(selectBox);
  for (var i = 0; i < opts[drilldownSet].length; ++i)
    if (opts[drilldownSet][i].val == value)
      return opts[drilldownSet][i];
  return -1;
}
function isRelated(selectBox, val1, val2) {
  if (val1 == val2)
    return true;
  var drilldownSet = getDrilldownSet(selectBox);
  var v1 = getOptByValue(selectBox, val1);
  var v2 = getOptByValue(selectBox, val2);
  while (v1.parentVal && v1.parentVal != val2)
    v1 = getOptByValue(selectBox, v1.parentVal);
  while (v2.parentVal && v2.parentVal != val1)
    v2 = getOptByValue(selectBox, v2.parentVal);
  if (v1.parentVal || v2.parentVal)
    return true;
  return false;
}
function getDrilldownSet(selectBox) {
  for (var i = 0; i < drilldowns.length; ++i)
    for (var j = 0; j < drilldowns[i].length; ++j)
      if (selectBox == drilldowns[i][j])
        return i;
  return -1;
}
function change(selectBox) {
  var drilldownSet = getDrilldownSet(selectBox);
  for (var i = 0; drilldowns[drilldownSet][i] != selectBox; ++i);
  if (drilldowns[drilldownSet].length == i + 1)
    return;
  var next = drilldowns[drilldownSet][i + 1];
  next.options.length = 0;
  newOpt('0',selectMsg[drilldownSet][i + 1],drilldowns[drilldownSet][i + 1]);
  for (var j = 0; j < opts[drilldownSet].length; ++j)
    if (opts[drilldownSet][j].parentVal == selectBox.options[selectBox.selectedIndex].value)
	  newOpt(opts[drilldownSet][j].val, opts[drilldownSet][j].text, drilldowns[drilldownSet][i + 1]);
  if (drilldowns[drilldownSet][i + 1].options.length == 1) {
    drilldowns[drilldownSet][i + 1].options.length = 0;
	newOpt('',emptyMsg[drilldownSet][i + 1],drilldowns[drilldownSet][i + 1]);
  }
  drilldowns[drilldownSet][i + 1].options.selectedIndex = 0; //i hate ns4
  if (snap) {
	  if (drilldowns[drilldownSet][i + 1].length == 2) { //if there's only one option, select it by default
	    drilldowns[drilldownSet][i + 1].options.selectedIndex = 1;
		change(drilldowns[drilldownSet][i + 1]);
	  }
  }
  if (drilldowns[drilldownSet][i+1].length == 1) {
  	next.style.display = 'none';
  } else {
  	next.style.display = 'block';
  }
  for (var k = i + 2; k < drilldowns[drilldownSet].length; ++k) {
  	drilldowns[drilldownSet][k].style.display = 'none';
    drilldowns[drilldownSet][k].options.length = 0;
	newOpt('',emptyMsg[drilldownSet][k],drilldowns[drilldownSet][k]);
  }
}
function add(val, text, parentVal, className) {
  opts[opts.length - 1][opts[opts.length - 1].length] = new opt(val, text, parentVal);
  if (className) {
    special[special.length - 1][val] = 'x';
  }
}
function addSpecial(val) {
	special[special.length - 1][val] = 'x';
}
function newDrilldown() {
  opts[opts.length] = new Array();
  special[special.length] = new Array();
}
function setValue(selectBox, val) {
  var pos = new Array();
  var newPos = new Array();
  drilldownSet = getDrilldownSet(selectBox);
  for (var i = 0; val != null; ++i) {
    for (var j = 0; opts[drilldownSet][j].val != val; ++j);
    pos[i] = opts[drilldownSet][j].val;
    val = opts[drilldownSet][j].parentVal;
  }
  for (var i = 0; i < pos.length; ++i) newPos[pos.length - 1 - i] = pos[i];
  for (var i = 0; i < newPos.length; ++i)
    for (var j = 0; j < drilldowns[drilldownSet][i].length; ++j)
      if (drilldowns[drilldownSet][i].options[j].value == newPos[i]) {
        drilldowns[drilldownSet][i].selectedIndex = j;
        if (i < drilldowns[drilldownSet].length - 1)
          change(drilldowns[drilldownSet][i]);
      }
}
function getValue(drilldownSet, showFullPath) {
	var str = "";
	for (var i = 0; i < drilldowns[drilldownSet].length; ++i) {
		if (drilldowns[drilldownSet][i].selectedIndex != 0) {
			if (showFullPath || i + 1 == drilldowns[drilldownSet].length || drilldowns[drilldownSet][i+1].selectedIndex == 0) {
				str += drilldowns[drilldownSet][i].options[drilldowns[drilldownSet][i].selectedIndex].text + '>';
			}
		} else
			break;
	}
	return new Option(str.substring(0, str.length - 1), drilldowns[drilldownSet][i-1].options[drilldowns[drilldownSet][i-1].selectedIndex].value, false, false);
}
function getSiblings(selectBox) {
	var drilldownSet = getDrilldownSet(selectBox);
	var result = '';
	var i = 0;
	for (; i < drilldowns[drilldownSet].length; ++i) {
		if (drilldowns[drilldownSet][i].selectedIndex == 0) {
			break;
		}
	}
	return drilldowns[drilldownSet][i] ? drilldowns[drilldownSet][i].options : '';
}
function copyOptions(source, target, value) {
	var sibs = getSiblings(source);
	if(target.options) {
		target.options.length = 0;
		var containsValue = false;
		var drilldownSet = getDrilldownSet(source);
		var spec = special[drilldownSet];
		for (var i = 1; i < sibs.length; ++i) {
			isValue = value == sibs[i].value;
			if (isValue) {
				containsValue = true;
				target.options[i - 1] = new Option('>>CURRENT MENU', sibs[i].value, false, true);
			} else {
				target.options[i - 1] = new Option(sibs[i].text, sibs[i].value, false, false);
			}
			if (spec[sibs[i].value])
				target.options[i - 1].className = 'inactive';
		}
		if (!containsValue) {
			target.options[target.options.length] = new Option('>>CURRENT MENU', value, false, true);
		}
	}
}
function populateExtensions(key , value) {
	extensions[key] = value;
}
var extensionWindow = false;

function showCustomAttributes(id, link, selectField) {
	if (document.getElementById('customFilter')) {
		numSelected = 0;
		for (i=0; i < selectField.length; i++) {
			if (selectField.options[i].selected) {
				numSelected ++;
				id = selectField.options[i].value;
			}
		}
		if (numSelected == 1 && extensions[id]) {
			extensionWindow = true;
			customFilterIFrame.location.replace(link + '&id='+id);
		} else {
			extensionWindow = false;
			document.getElementById('customFilter').style.display = 'none';
		}
	}
}
function customFormFieldsValue(selectBox, label, isSearch) {
	parentForm = parent.document.form1;
	selectField = document.form1.elements[0];
	lengthBefore = selectBox.length;
	if (extensionWindow) {
		len = window.frames["customFilterIFrame"].document.forms["form1"].elements.length;
		childForm = window.frames["customFilterIFrame"].document.forms["form1"];
		for (i = 0; i < len; i++) {
			if (isSearch)
				parent.addApprovedTextVal(document.form1, childForm.elements[i], '>', selectBox, label + '>' + selectField.name + '>' + selectField.options[selectField.selectedIndex].text,"|");
			else {
				parent.addApprovedTextVal(document.form1, childForm.elements[i], '>', selectBox, selectField.name +'>'+selectField.options[selectField.selectedIndex].text,"|");
			}
			selectBox.focus();
		}
	}
	lengthAfter = selectBox.length;
	if (lengthAfter == lengthBefore) {
		if (parent.document.form1.addRemove) {
			label = (parent.document.form1.addRemove[0].checked ? 'Add ' : 'Remove ') + label;
		}
		if (label) {
			parent.addApprovedVal(document.form1, document.form1.elements[0], '>', selectBox, null, label, true, isSearch);
		} else {
			parent.addApprovedVal(document.form1, document.form1.elements[0], '>', selectBox);
		}
	}
}
