/*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*/
/*10/02/09: Aggiunto 'strDefLanguage' */
function ComboSet(Levels, FormName, ComboName, bAjaxEnabled, strAjaxDataSetID, strAjaxURL, iKeyID, bLastComboIsNested, strLanguage, strDefLanguage)
{
	this.Levels = Levels
	this.FormName = FormName
	this.ComboName = ComboName
	//Hack:
	if (bAjaxEnabled.toLowerCase()=="vero" || bAjaxEnabled.toLowerCase()=="true")
		this.AjaxEnabled = true
	else
		this.AjaxEnabled = false
	//this.AjaxEnabled = bAjaxEnabled
	if (bLastComboIsNested.toLowerCase()=="vero" || bLastComboIsNested.toLowerCase()=="true")
		this.LastComboIsNested = true
	else
		this.LastComboIsNested = false	
	this.AjaxDataSetID = strAjaxDataSetID
	this.AjaxURL = strAjaxURL
	this.KeyID = iKeyID

	this.FillCombo = FillCombo;
	this.ComboOnChange = ComboOnChange;
	this.SetID = SetID;
	this.SetHidden = SetHidden;
	this.SetHiddenIndex = SetHiddenIndex;
	this.SetMaximumNestLevel  = SetMaximumNestLevel;
	//this.GetSelectedIndex = GetSelectedIndex;
	this.GetSelectedItem = GetSelectedItem;
	this.GetSelectArray = GetSelectArray;
	this.BuildRComboDataSetURI = BuildRComboDataSetURI;
	this.GetComboItemsCallback = GetComboItemsCallback;
	this.LoadComboItems = LoadComboItems;
	//this.GetComboLevel = GetComboLevel;
	//this.AjaxAlreadyReturned = new Array(false,false,false,false);
	this.Language = strLanguage;
	if (strDefLanguage) {
		this.DefLanguage = strDefLanguage;
	} else {
		this.DefLanguage = '';
	}
	
	//Fill the entire set with defaults	
	var i = 0; var bSelectedItems = false;
	//Do we have a previuous selection?
	if (eval(ComboName + '_SelectedItems.length') > 0)
		bSelectedItems = true;
		
	//Fill the combos
	var iParentItem = "";
	for(i = 1; i <= Levels; ++i)
	{
		var cmbObj = document.forms[this.FormName].elements[this.ComboName + i];
		var iSelectedItem = this.GetSelectedItem(i-1)
		//Fill the combo with it's startup items
		var ArrayReturned =	new Array();
		ArrayReturned = this.GetSelectArray(i-1, iParentItem, iSelectedItem);
		EmptySelect(cmbObj);
		if (bSelectedItems) 
		{
			FillCombo (ArrayReturned, iParentItem, cmbObj, iSelectedItem, false, false);
		}
		else
		{
			FillCombo (ArrayReturned, iParentItem, cmbObj, '', false, false);
		}
		if (cmbObj.options[0])
		{
			iParentItem = this.GetSelectedItem(i-1)
			if (cmbObj.selectedIndex!=0) this.SetHidden(iParentItem, i)
		}		
	}
	//Set the maximum nest level with the running combination
	this.SetMaximumNestLevel();
}


function GetSelectArray(iCombo, strParent, strSelectedItem)
{
	var iComboArray = iCombo + 1;
  //DebugWrite(document, "GetSelectArray");
  if(iCombo == 0 || !this.AjaxEnabled || strParent=="")
    return eval(this.ComboName + iComboArray);
  //Build the dataset URI
  var strURI = this.BuildRComboDataSetURI(strParent, iComboArray);
  //per evitare il caching
  var d = new Date();
  var time = d.getTime();
  strURI = strURI + "&time=" + time;
  //Get the data
  var objComboArray = eval(this.ComboName + iComboArray);
  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, SD_CARICAMENTOINCORSO));
  //return new Array(new ComboItem("", strParent, ""));
}



/*Handle the on change event */
function ComboOnChange(nLevel)//, curComboSet)
{
	//Set the selected index 
	var objChangedCombo = document.forms[this.FormName].elements[this.ComboName + nLevel];
	//this.SetHidden(objChangedCombo.options[objChangedCombo.selectedIndex].value, nLevel)
	if (objChangedCombo.options[objChangedCombo.selectedIndex].value != '')
		this.SetHidden(objChangedCombo.options[objChangedCombo.selectedIndex].value, nLevel)
	else
	{
		if (nLevel == 1)
			this.SetHidden(objChangedCombo.options[objChangedCombo.selectedIndex].value, nLevel)
		else
			{
				//Set to the parent combo
				var objParentCombo = objCmbPar = document.forms[this.FormName].elements[this.ComboName + (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.Levels; ++i)
	{
		var objCmbPar = document.forms[this.FormName].elements[this.ComboName + (i-1)]
		var objCmbFig = document.forms[this.FormName].elements[this.ComboName + i]
		EmptySelect(objCmbFig);
	
		if (objCmbPar.selectedIndex >= 0)
		{
			var ArrayReturned =	new Array();
			ArrayReturned = this.GetSelectArray(i-1, objCmbPar.options[objCmbPar.selectedIndex].value, '');
			FillCombo(ArrayReturned, 
								objCmbPar.options[objCmbPar.selectedIndex].value,
								objCmbFig, 
								'', false, false)			
			/*
			FillCombo(eval(this.ComboName + (i)), 
								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);
	}
	//Set the maximum nest level with the running combination
	this.SetMaximumNestLevel();
}

function SetID(i)
{
	var objCmb = document.forms[this.FormName].elements[this.ComboName + i]
	if (objCmb.selectedIndex> -1 && objCmb.options[objCmb.selectedIndex].value != '')
		this.SetHiddenIndex(objCmb.options[objCmb.selectedIndex].value, i);
}


//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.replace(/&nbsp;/g, '\xa0'), cmbArray[i].ID, false);
			    
			} 
			else 
			{
					var newElem 	= document.createElement("OPTION");
					newElem.value = cmbArray[i].ID;
					newElem.text = cmbArray[i].Value.replace(/&nbsp;/g, '\xa0');
					
					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;
	}
}

//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 SetHiddenIndex(strValue, lNestLevel){	document.forms[this.FormName].elements[this.ComboName].value = strValue;
	document.forms[this.FormName].elements[this.ComboName + '_NestLevel'].value = lNestLevel;}function SetHidden(strValue, lNestLevel)
{
	//var objHidden  = GetElement(this.id);
	var objHidden = document.forms[this.FormName].elements[this.ComboName];
	objHidden.value = strValue;
	document.forms[this.FormName].elements[this.ComboName + '_NestLevel'].value = lNestLevel;
}function SetMaximumNestLevel(){	//Figure out the maximum attainable nest level	var lMaximumLevel=0;	for(var i=1; i <= this.Levels; ++i)	{		//Does it have any items at all?		if (document.forms[this.FormName].elements[this.ComboName + i].options.length > 0)		{			//If it doesn't have a single empty element then count it in			if (!(document.forms[this.FormName].elements[this.ComboName + i].options.length == 1 && 					document.forms[this.FormName].elements[this.ComboName + i].options[0].value=='') )						lMaximumLevel = i;		}	}	document.forms[this.FormName].elements[this.ComboName + '_MaximumNestLevel'].value = lMaximumLevel;}function GetSelectedItem(i){	var arSel = eval(this.ComboName + '_SelectedItems');	if (arSel.length==0) return '';	if (i>(arSel.length-1)) return '';	return arSel[i];}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;
}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);
  PushComboItem(objXMLNodes.childNodes, objComboItems, objComboItemLoader.Parent, 0);
  /*
	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]);
	var iCombo = (objComboItemLoader.ID + 1);
	var objCmbFig = document.forms[objComboItemLoader.ComboSet.FormName].elements[objComboItemLoader.ComboSet.ComboName + iCombo];
	EmptySelect(objCmbFig);
	objComboItemLoader.ComboSet.FillCombo(objComboItems, 
								objComboItemLoader.Parent,
								objCmbFig, 
								objComboItemLoader.SelectedItem,false,objComboItemLoader.AjaxAlreadyReturned);
	
	if (objCmbFig.options[objCmbFig.selectedIndex].value!='')
		objComboItemLoader.ComboSet.SetHidden(objCmbFig.options[objCmbFig.selectedIndex].value, iCombo);
		
	//Ajax: Imposta l'hidden _MaximumNestLevel per la validazione
	objComboItemLoader.ComboSet.SetMaximumNestLevel();		
}

function PushComboItem(childNodes, objComboItems, iParentID, iNest)
{
	if (childNodes.length==0) return;
	for(var i = 0; i < childNodes.length; ++i)
	{
	  var objXMLNode = childNodes[i];
	  //var strText = GetNodeText(objXMLNode.childNodes[0]);
	  var strText = objXMLNode.attributes[1].nodeValue;
	  for(var j = 0; j < iNest; ++j)
			strText = "  " + strText;
	  var iValueID = objXMLNode.attributes[0].nodeValue;
	  objComboItems.push(new ComboItem(iValueID, iParentID, strText));  
	  //Chiamatata ricursiva
	  PushComboItem(objXMLNode.childNodes, objComboItems, iParentID, (iNest+1));
	}
}

function BuildRComboDataSetURI(strParentNodeID, iCurrentCombo) {
	var bShowAllLevels = "false";
	if (this.LastComboIsNested)
		if (iCurrentCombo==this.Levels)
			bShowAllLevels = "true";
		var strURI = this.AjaxURL + "?TableID=" + this.AjaxDataSetID + "&ParentID=" + strParentNodeID + "&KeyID=" + this.KeyID + "&ShowAllLevels=" + bShowAllLevels + "&Lang=" + this.Language + "&DefLang=" + this.DefLanguage;
  return strURI;
}
