//-----------------------------------------------------------------------------
// Global variable
//-----------------------------------------------------------------------------
var mainFormName = "ProductSearch";
//-----------------------------------------------------------------------------
// Browser test
//-----------------------------------------------------------------------------
var ns4 = false;
var ie4 = false;
if (document.layers)
	ns4 = true;
if (document.all)
	ie4 = true;
//-----------------------------------------------------------------------------
// Class definition
//-----------------------------------------------------------------------------
var itemList;
if (!itemList) itemList = new Array();

function ListItem(name, index, child, listName) {
	this.name = htmlToUnicode(name);
	this.index = index;
	this.child = child;
	this.parent = false;
	this.listName = listName;
	this.level = 0;
	this.show = true;
	itemList[itemList.length] = this;
}

function List(name) {
	this.name = name;
	this.items = new Array();
	this.depth = 0;
	this.parent = false;
	this.add = listAddItem;
	this.setDepth = listSetDepth;
}

function Couples(name)
{
	this.name = name;
	this.items = new Array();
	this.Add = couplesAddItem;
}

function CouplesItem(idnomen1, idnomen2)
{
	this.idnomen1 = idnomen1;
	this.idnomen2 = idnomen2;
}
//-----------------------------------------------------------------------------
// Class function
//-----------------------------------------------------------------------------
function listAddItem(name, index) {
	var m_item = new ListItem(name, index, false, this.name);
	m_item.parent = this;
	var parent = this.parent;
	while (parent)
	{
		m_item.level++;
		parent = parent.parent;
	}
	this.items[this.items.length] = m_item;
	var obj = window[this.name + "_" + index];
	if (obj) {
		m_item.child = true;
		obj.parent = this;
		this.setDepth(1);
	}
}

function listSetDepth(depth) {
	if (this.depth < depth) {
		this.depth = depth;
		if (this.parent)
		{
			depth++;
			this.parent.setDepth(depth);
		}
	}
	return depth;
}

function couplesAddItem(idnomen1) {
var argv = couplesAddItem.arguments;
  	var argc = argv.length;
	var i;

	for (i=1; i<argc; i++)
	{
		this.items[this.items.length] = new CouplesItem(idnomen1, arguments[i]);
	}
}

//-----------------------------------------------------------------------------
// Action handle
//-----------------------------------------------------------------------------
function coupleOnChange(listIndex, listRootName1, selName1, coupleName, listRootName2, selName2) {
	var form;
	var mainForm = getObjForm(mainFormName);
	
	// get form handle
	// one list per layer for ns 4 -> listName = 0
	if (ns4) {
		form = document.layers["column_"+selName1+"_"+listIndex].document.forms[0];
		listName = 0;
	} else {
		form = mainForm;
		listName = selName1+"_"+listIndex;
	}
	// get selected index
	var index = form[listName].selectedIndex;

	value = form[listName].options[index].value;
	
	// build new filter list
	var idnomenList = "";
	var nameList = "";
	
	var couples = eval(coupleName);
	for (i=0; i<couples.items.length; i++) {
		if (couples.items[i].idnomen1 > value) {
			break;
		} else if (couples.items[i].idnomen1 == value) {
			idnomenList += couples.items[i].idnomen2 + "#";
			nameList += "#";
		}
	}
	if (idnomenList	!= "") {
		idnomenList = idnomenList.slice(0, -1);
		nameList = nameList.slice(0, -1);
	}
	// apply change to list1
	listOnChange(listIndex, listRootName1, selName1);
	
	//get list2 selected item value and set to 0
	value = 0;
	var j=1;

	if (ns4) {
		while (document.layers["column_"+selName2+"_"+j]) {
			var obj = document.layers["column_"+selName2+"_"+j].document.forms[0][0];
			if (obj.selectedIndex < 1) {
				break;
			}
			value = obj[obj.selectedIndex].value;
			obj.selectedIndex = 0;
			j++;
		}
	} else {
		while (mainForm[selName2+"_"+j])
		{
			var obj = mainForm[selName2+"_"+j];
			if (obj.selectedIndex < 1) {
				break;
			}
			value = obj[obj.selectedIndex].value;
			obj.selectedIndex = 0;
			j++;
		}
	}
	// filter list2 and init value	
	newList(listRootName2,idnomenList,nameList,false,false);
	initLayer(selName2, listRootName2, value);
}

function listOnChange(listIndex, listRootName, selName) {
	var form, listName, value, test = false, text;
	var mainForm = getObjForm(mainFormName);

	// get form handle
	// one list per layer for ns 4 -> listName = 0
	if (ns4) {
		form = document.layers["column_"+selName+"_"+listIndex].document.forms[0];
		listName = 0;
	} else {
		form = mainForm;
		listName = selName+"_"+listIndex;
	}
	if (form[listName].options.length < 2)
		return;
	
	// get selected index
	var index = form[listName].selectedIndex;

	if (index == 0) {
		index = 1;
		test = true;
	}
	var selectedIndex = index;

	value = form[listName].options[index].value;
	text  = form[listName].options[index].text;

	var ListItem, i = -1, j;
	do {
		i++;
		ListItem = itemList[i];
	}
	while ( !( (ListItem.index == value) && (ListItem.listName == listRootName) ) )
		
	if (ns4) {
		if (test)
			mainForm[selName+"_"+listIndex].value = "";
		else
			mainForm[selName+"_"+listIndex].value = ListItem.index;
	}

	var options;
	for (i=1; i<ListItem.parent.depth+1; i++) {
		if (ns4) {
			options = document.layers["column_"+selName+"_"+(listIndex+i)].document.forms[0][0];
			mainForm[selName+"_"+(listIndex+i)].value = "";
		}
		else
			options = form[selName+"_"+(listIndex+i)];
		if (options && options.options) {
			options = options.options;
			options[0].selected = true;
			hide_layer("column_"+selName+"_"+(listIndex + i));
		}
	}

	if (test)
	{
		listOnChangeEx(form[listName], selectedIndex);
		return;
	}

	if (text.indexOf(">> ") != -1) {
		listIndex++;
		if (ns4) {
			options = document.layers["column_"+selName+"_"+listIndex].document.forms[0][0];
			mainForm[selName+"_"+listIndex].value = "";
		}
		else
			options = form[selName+"_"+listIndex].options;
		options[0].selected = true;

		for (j=options.length-1; j>0; j--)
			options[j]= null;

		index = window[listRootName+"_"+ListItem.index];
		if (index.items.length > 0)
			show_layer("column_"+selName+"_"+listIndex);

		for (i=0; i<index.items.length; i++) {
			text = index.items[i].name; 
			if (index.items[i].child)
				text = text.replace(/^(\.*)/, "$1\>\> ");
			options[i+1] = new Option(text);
			options[i+1].value = index.items[i].index;
		}
	}
	
	listOnChangeEx(form[listName], selectedIndex);
}

function listOnChangeEx(obj, selectedIndex) {}

//-----------------------------------------------------------------------------
// Hide Show Layer
//-----------------------------------------------------------------------------
function show_layer(x)
{
	if (ns4)
	{
		if (document.layers[x])
			document.layers[x].visibility="show";
	}
	else {
		if (ie4)
			document.all[x].style.display="block";
		else {			
			//document.getElementById(x).style.display="block";
			document.getElementById(x).style.display="";
		}
	}
}

function hide_layer(x)
{
	if (document.layers)
	{
		if (document.layers[x])
			document.layers[x].visibility="hide";
	} else {
		if (document.all)
			document.all[x].style.display="none";
		else
			document.getElementById(x).style.display="none";
	}
}
//-----------------------------------------------------------------------------
// Init the layer
//-----------------------------------------------------------------------------
function initLayer(selName1, listRootName1, initIndex, coupleName, selName2, listRootName2) {
	var i, m_layer;
	
	//for NS4 place the layer
	if (document.layers) {
		i = 1;
		var selectName = selName1+"_"+i;
		while (document.layers["layer_"+selectName]) {
			m_layer = document.layers["layer_"+selectName];
			document.layers["column_"+selectName].moveTo(m_layer.pageX, m_layer.pageY);
			i = i + 1
			selectName = selName1+"_"+i;
		}
	}

	//init the lists
	listDefaultArray = new Array();
	var index = window[listRootName1];
	if (!index)
		return;
	if (initIndex && initIndex != 0) {
		InitListDefaultArray(listDefaultArray, index, initIndex);
		listDefaultArray.reverse();
	}
	var listIndex = initColumn(selName1, listRootName1, 1, false, listDefaultArray);
	if (coupleName)
		coupleOnChange(listIndex, listRootName1, selName1, coupleName, listRootName2, selName2);
}
function InitListDefaultArray(listDefaultArray, index, initIndex) {
	var i = 0
	while (initIndex>0 && i<index.items.length) {
		if (index.items[i].index == initIndex) {
			listDefaultArray[listDefaultArray.length] = i;
			return true;
		} else if (index.items[i].child) {
			var newIndex = window[index.items[i].listName+"_"+index.items[i].index];
			if (InitListDefaultArray(listDefaultArray, newIndex, initIndex)) {
				listDefaultArray[listDefaultArray.length] = i;
				return true;
			}
		}
		i++;
	}
	return false;
}
//-----------------------------------------------------------------------------
// Init the list
//-----------------------------------------------------------------------------
function initColumn(selName, listRootName, listIndex, listName, listDefaultArray) {
	var selectName = selName + "_" + listIndex;
	var mainForm = getObjForm(mainFormName);

	var options;
	if (ns4)
	{
		if (document.layers["column_"+selectName])
			options = document.layers["column_"+selectName].document.forms[0][0];
		else
			return listIndex;
	}
	else
	{
		if (mainForm[selectName])
			options = mainForm[selectName].options;
		else
			return listIndex;
	}
	
	// get previously selected item
	var selectedIndex = 0;
	if (options.selectedIndex > 0)
		selectedIndex = options.selectedIndex;

	// empty the list
	for (j=options.length-1; j>0; j--)
		options[j]= null;

	var index;
	if (listName)
		index = window[listRootName + "_" +listName];
	else
		index = window[listRootName];
	if (index.items.length > 0)
		show_layer("column_"+selectName);

	// fill the list
	var text;
	for (i=0; i<index.items.length; i++) {
		text = index.items[i].name;
		if (index.items[i].child)
			text = text.replace(/^(\.*)/, "$1\>\> ");
		options[i+1] = new Option(text);
		options[i+1].value = index.items[i].index;
		
		if (listDefaultArray) {
			if (listDefaultArray[listIndex-1] == i) {
				selectedIndex = i + 1;
			}
		}
	}

	// set the selectedIndex
	if (selectedIndex < 0)
		selectedIndex = 0;
	options.selectedIndex = selectedIndex;
	text = options[selectedIndex].value;
	
	if (ns4)
		if (mainForm[selectName])
		mainForm[selectName].value = text;

	if (selectedIndex > 0)
		if (options[selectedIndex].text.indexOf(">> ") != -1)
			return initColumn(selName, listRootName, listIndex+1, text, listDefaultArray);
	return listIndex;
}
function checkInit(obj) {
	if (obj.options.length < 2 || obj.options[1].value == "") {
		initComboLayers();
	}
}
//-----------------------------------------------------------------------------
// Filter the list
//-----------------------------------------------------------------------------
//newList('a', '5#232', '#/New \'name\'', false)
//newList('p', '38#', true)
//newList('p', '38#232','#', false, '/232/')

function newList(listName, newRoot, newRootName, hideParent, hideSubLevel, filterList) {
	var idList = newRoot.split("#");
	var nameList = newRootName.split("#");

	var tempList = new Array();
	var idStr = " " + idList.join(" ") + " "

	var found = false;
	for (var i=0; i<itemList.length; i++) {
		if (itemList[i].listName != listName) {
			if (found)
				break;
		} else if (itemList[i].show) {
			found = true;
			// if newRoot = "" then add all item
			if (newRoot == "") {
				if (itemList[i].level == 0)
				{
					var j = tempList.length;
					tempList[j] = itemList[i];
					if (hideSubLevel && hideSubLevel.indexOf("/"+tempList[j].index+"/") == 0)
						tempList[j].child = false;
				}
			} else if (idStr.indexOf(" " + itemList[i].index + " ") != -1) {
				var j = 0
				while (idList[j] != itemList[i].index)
					j++;
				if (nameList[j] != "")
					itemList[i].name = nameList[j];
				if (hideParent == true) {
					var obj = eval(listName + "_" +itemList[i].index).items;
					for (var j=0; j<obj.length; j++)
						obj[j].child = false;
					tempList = tempList.concat(obj);
				}
				else {
					j = tempList.length;
					tempList[j] = itemList[i];
					if (hideSubLevel && hideSubLevel.indexOf("/"+tempList[j].index+"/") == 0)
						tempList[j].child = false;
				}
				itemList[i].level = 0;
			} else if (filterList) {
				itemList[i].show = false;
			}
		}
	}
	eval(listName).items = tempList;
}