//Version: 1.00, 04/04/2005
//Version: 1.01, 05/06/2005 Corrected bug: No setting of the Collector is done with the final combo
//Version: 1.10, 08/06/2005 New version for NestedCombos without full path in ParentID
//Version: 1.11, 13/06/2005 Added support for validation
//Version: 1.12, 26/03/2007 Added support for Ajax

var Altamira_Web_UI_DropDownList_ScriptVersion=112;

/*ComboItem for individual item settings*/
function ComboItem(ID, ParentID, Value) 
{
	this.ID = ID
	this.Value = Value
	this.ParentID = ParentID
	
}

/*ComboSet Object for each com set settings*/
function ComboSet(objSelectArray, objSelectedValues, strID, bAjaxEnabled, strAjaxDataSetID, strAjaxURL)
{
	this.SelectArray = objSelectArray;
	this.id = strID;
	this.SelectedValues = objSelectedValues;
	this.AjaxEnabled = bAjaxEnabled;
	this.AjaxDataSetID = strAjaxDataSetID;
	this.AjaxURL = strAjaxURL;
    
	this.ComboOnChange = ComboOnChange;
	this.SetHidden = SetHidden;
	this.FillCombo = FillCombo;
	this.GetComboLevel = GetComboLevel;
	this.GetSelectArray = GetSelectArray;
	this.BuildRComboDataSetURI = BuildRComboDataSetURI;
	this.GetComboItemsCallback = GetComboItemsCallback;
	this.LoadComboItems = LoadComboItems;
    this.AjaxAlreadyReturned = new Array(false,false,false,false);
	//Fill the entire set with defaults	
	var i = 0; 
	//Fill the combos
	var iParentItem = "";
	for(i = 0; i <= this.SelectArray.length - 1; ++i)
	{
		var cmbObj = GetElement(this.SelectArray[i]);
		//EmptySelect(cmbObj);
			//Fill the combo with it's startup items
		var ArrayReturned =	new Array();
		ArrayReturned = this.GetSelectArray(i, iParentItem, this.SelectedValues[i]);
		EmptySelect(cmbObj);
		this.FillCombo (ArrayReturned, iParentItem, cmbObj, this.SelectedValues[i],false,false);
		if (cmbObj.options[0])
		{
			/*iParentItem = cmbObj.options[cmbObj.selectedIndex].value;
			this.SetHidden(cmbObj.options[cmbObj.selectedIndex].value, i)*/
			iParentItem = this.SelectedValues[i];
			this.SetHidden(iParentItem, i)
			
		}
	}
  DebugWrite(document, "ComboSet");
}

/*Handle the on change event */
function ComboOnChange(strComboID)
{
	//Work out the combo "level"
	var nLevel = this.GetComboLevel(strComboID);
	
	//Set the selected index to the current combo or the parent combo if this has an 
	//empty selected value
	var objChangedCombo = GetElement(strComboID);
	if (objChangedCombo.options[objChangedCombo.selectedIndex].value != '')
		this.SetHidden(objChangedCombo.options[objChangedCombo.selectedIndex].value, nLevel)
	else
	{
		if (nLevel == 0)
			this.SetHidden(objChangedCombo.options[objChangedCombo.selectedIndex].value, nLevel)
		else
			{
				//Set to the parent combo
				var objParentCombo = GetElement(this.SelectArray[nLevel-1]);
				this.SetHidden(objParentCombo.options[objParentCombo.selectedIndex].value, nLevel)
			}
	}
	//Empty the selects below this one and fill with defaults
	for(var i=nLevel + 1; i <= this.SelectArray.length - 1; ++i)
	{
		var objCmbPar = GetElement(this.SelectArray[i - 1])
		var objCmbFig = GetElement(this.SelectArray[i])
		EmptySelect(objCmbFig);
	
	
		if (objCmbPar.selectedIndex >= 0)
			this.FillCombo(this.GetSelectArray(i, objCmbPar.options[objCmbPar.selectedIndex].value, ''), 
								objCmbPar.options[objCmbPar.selectedIndex].value,
								objCmbFig, 
								'',false,false)
		//Set the selected index if not empty
		if (objCmbFig.selectedIndex> -1 && objCmbFig.options[objCmbFig.selectedIndex].value != '')
			this.SetHidden(objCmbFig.options[objCmbFig.selectedIndex].value, i);
	}
}

function GetSelectArray(iCombo, strParent, strSelectedItem)
{
  DebugWrite(document, "GetSelectArray");
  if(iCombo == 0 || !this.AjaxEnabled || strParent=="")
    return eval(this.SelectArray[iCombo]);
  //Build the dataset URI
  var strURI = this.BuildRComboDataSetURI(strParent);
  //per evitare il caching
  var d = new Date();
  var time = d.getTime();
  strURI = strURI + "&time=" + time;
  //Get the data
  var objComboArray = eval(this.SelectArray[iCombo]);
  var objNullComboItem = (objComboArray[0]!=null ? (objComboArray[0].ID == "" ? objComboArray[0] : null) : null);
  var objComboItemLoader = new ComboItemLoader(this, iCombo, strParent, objNullComboItem, strSelectedItem);
  this.m_Ajax  = new Ajax(strURI, this.GetComboItemsCallback, "text/xml", "GET", objComboItemLoader);
  this.m_Ajax.Get();  
  return new Array(new ComboItem("", strParent, "Caricamento in corso"));
  //return new Array(new ComboItem("", strParent, ""));
}

function GetComboItemsCallback(objReq, objComboItemLoader)
{
  //Set the waiting class on the tree view
  if(objReq.readyState == 4)
	{
		if(objReq.status == 200)
		{
			// process a XML document here
			objComboItemLoader.AjaxAlreadyReturned = true;
			LoadComboItems(objReq, objComboItemLoader);
			
		}	
		else	
		{
			window.status="Error: returned status code " + objReq.status + " " + objReq.statusText;
		}	
	} 
}
function LoadComboItems(objReq, objComboItemLoader)
{
  var objDocument = objReq.responseXML;
  var objXMLNodes = objDocument.getElementsByTagName('Nodes').item(0);
  var objComboItems = new Array();
  //Add the null element if necessary
  if(objComboItemLoader.NullComboItem!=null)
    objComboItems.push(objComboItemLoader.NullComboItem);
	for(var i = 0; i < objXMLNodes.childNodes.length; ++i)
	{
	  var objXMLNode = objXMLNodes.childNodes[i];
	  var strText = GetNodeText(objXMLNode);
	  objComboItems.push(new ComboItem(objXMLNode.attributes[0].nodeValue, objComboItemLoader.Parent, strText));
	  
	}
	//Call the fill combo
	var objCmbFig = GetElement(objComboItemLoader.ComboSet.SelectArray[objComboItemLoader.ID]);
	EmptySelect(objCmbFig);
	objComboItemLoader.ComboSet.FillCombo(objComboItems, 
								objComboItemLoader.Parent,
								objCmbFig, 
								objComboItemLoader.SelectedItem,false,objComboItemLoader.AjaxAlreadyReturned);
}

function BuildRComboDataSetURI(strParentNodeID)
{
  //var strParentNodeID = GetAttribute(objParentNode, "ID");
  var strURI = this.AjaxURL + "?DataSetID=" + this.AjaxDataSetID + "&ParentID=" + strParentNodeID
  return strURI;
}

//Fill the child combo
function FillCombo (cmbArray, lParent, cmbObj, selectedValue, bShowAllLevels,AjaxReturned) 
{
	var lOffset = 0;
	if((cmbArray[0].Value == "Caricamento in corso" && ! AjaxReturned) || cmbArray[0].Value != "Caricamento in corso" )
	for (var i = 0; i < cmbArray.length; i++) {
		//Do we have the right parent?
		//if ( (bShowAllLevels ? (cmbArray[i].ParentID.indexOf(lParent) >= 0 && lParent != "") : cmbArray[i].ParentID == lParent)
		
		if ( cmbArray[i].ParentID == lParent || cmbArray[i].ID == '' )
		{
			if (navigator.appName == "Netscape") 
			{
				cmbObj.options[i - lOffset] = new Option(cmbArray[i].Value, cmbArray[i].ID,false);
			} 
			else 
			{
					var newElem 	= document.createElement("OPTION");
					newElem.value = cmbArray[i].ID;
					newElem.text 	= cmbArray[i].Value;
					if (navigator.platform != "MacPPC") 
						{newElem.style.backgroundColor = "#ffffff";}

				try{
				        cmbObj.options.add(newElem);
                    }
                    catch(Exception)
                    {
                        newElem = new Option("option");
                        newElem.value = cmbArray[i].ID;
					    newElem.text 	= cmbArray[i].Value;
					    if (navigator.platform != "MacPPC") 
						    {newElem.style.backgroundColor = "#ffffff";}
                            cmbObj.options.add(newElem);
                    }
			}
			//Selezioniamo l'elemento?
			if (selectedValue == cmbArray[i].ID)
				cmbObj.selectedIndex = i - lOffset;
		}
		else
			lOffset = lOffset + 1;
	}
}

//Get a combo's level
function GetComboLevel(strComboID)
{
	//var nLevel = 0;
	for(var i=0; i <= this.SelectArray.length - 1; ++i)
	{
		if (strComboID == this.SelectArray[i])
			{
				return i;
				break;
			}
	}
}

//Empty a specific combo
function EmptySelect(cmbObj)
{
	var lengthCmb = cmbObj.options.length;
	if (navigator.appName != "Netscape") 
	{
		for (var count = 0; count < lengthCmb; count++) 
		{
			cmbObj.options.remove(0);
 		}	
 	} 
 	else 
 	{
 		cmbObj.options.length = 0;
 	}
}

function SetHidden(strValue, lNestLevel)
{
	var objHidden  = GetElement(this.id);
	objHidden.value = strValue;
}

function ComboItemLoader(objComboSet, strID, strParent, objNullComboItem, strSelectedItem)
{
  this.ComboSet = objComboSet;
  this.ID = strID;
  this.Parent = strParent;
  this.NullComboItem = objNullComboItem;
  this.SelectedItem = strSelectedItem;
  this.AjaxAlreadyReturned = false;
}
