/*	Marco Bevilacqua - Script ECommerce -	20041227
		marco.bevilacqua@endurance.it
*/
function NodeListALivelli(Level,IDNode,Name,ParentNode) {
	this.Level = Level;					// Livello raggiunto nella struttura ad albero
	this.IDNode = IDNode;				// Identificativo - assieme al livello - del nodo corrente
	this.Name = Name;					// Nome associato al nodo corrente
	this.ParentNode = ParentNode;		// Nodo padre
	this.Child = new Array();			// Figli del nodo
}

// Aggiunge un nodo figlio
// children = oggrtto del tipo NodeListALivelli
function NodeList_addChild(children) {
	this.Child[this.Child.length] = children;
}

// Restituisce l'elenco dei figli nel formato IDNode, Name
function NodeList_toString() {
	var index;
	var aChild = new Array();
	for (index = 0; index < this.Child.length; index++) {
		aChild[index*2] = this.Child[index].IDNode;
		aChild[(index*2)+1] = this.Child[index].Name;
	}
	return aChild;
}

// Restituisce un nodo dato il suo identificatiore
// level => livello a cui appartiene il nodo
// IDNode => identificatore associato al nodo
function NodeList_getNode(Level,IDNode) {
	if ((this.Level == Level) && (this.IDNode == IDNode)) {
		return this;
	}
	else if (this.Child.length > 0) {
		var index;
		for (index = 0; index < this.Child.length; index++) {
			var appNode = null;
			appNode = this.Child[index].getNode(Level,IDNode);
			if (appNode != null ) {
				return appNode;
				break;				
			}
		}
	}
	else
		return null;
}

new NodeListALivelli(null,null,null,null);
NodeListALivelli.prototype.addChild = NodeList_addChild;
NodeListALivelli.prototype.toString = NodeList_toString;
NodeListALivelli.prototype.getNode = NodeList_getNode;

function BaseElement(IDElement,IDElementFocus,Label,Posizione,Obbligatorio,Lingua) {
   this.IDElement = IDElement || null;						// Campo principale associato all'elemento. Esempio: Testo1
   this.IDElementFocus = IDElementFocus || null;	// Campo a cui verrā dato il focus
   this.PopupUpload = false;											// Indica se il campo richiede la visualizzazione del popup di Upload
   // Informazioni per i messaggi di output
   this.Label = Label  || '-';										// Label associata al campo
   this.Posizione = Posizione || '-';							// Posizione dell'elemento nella object
	 this.Obbligatorio = Obbligatorio;							// Indica se occorre compilare il campo
	 this.Lingua = Lingua || null;									// Lingua associata al campo
}

function baseElement_focus() {
  if (this.IDElementFocus != null)
		this.IDElementFocus.focus();
}

// Indica se il campo č stato compilato
function baseElement_isCompiledElement() {
  if (this.IDElement == null) {
  	return false;
  }else  if (eval(this.IDElement.value != "")) {
		return true;
  }  
  return false;
}

// Indica se il campo č stato compilato correttamente
function baseElement_checkElement() {
  return true;
}

function baseElement_impostaElement() {
	return true;
}
 
 new BaseElement(null,null,null,null,false,null);
 BaseElement.prototype.isCompiledElement = baseElement_isCompiledElement;
 BaseElement.prototype.checkElement = baseElement_checkElement;
 BaseElement.prototype.impostaElement = baseElement_impostaElement;
 BaseElement.prototype.focus = baseElement_focus;
	
function ListaALivelliElement(AIDElement,NumeroLivelli,matrNode) {
	this.AIDElement = AIDElement;					//	Array contenete i riferimenti a vari elementi che compongono la lista a livelli
	this.livelloObbligatorio = 0;					//	Livello minimo che occorre compilare per poter considerare la tendina compilata
	this.NumeroLivelli = NumeroLivelli;		//	Numero di livelli associati alla tendina
	this.matrNode = matrNode;
	this.rootNode = null;									//	Radice della struttura ad albero
}

function ListaALivelliElement_init(aValori) {
	var mListaALivelli = this.matrNode;
	var Nodo;
	// Costruzione dell'albero contenente i nodi appartenenti alla tendina
	var Root = new NodeListALivelli(0,1,"Nodo padre",null);
	var aID = Array(Root,null,null,null);
	for (var riga = 0; riga < mListaALivelli.length; riga++) {
		for (var livello = 1; livello <= this.NumeroLivelli; livello++) {
			var colonnaID = (livello - 1) * 2;
			var colonnaName = colonnaID + 1
			if (mListaALivelli[riga][colonnaID] != null)
				if (aID[livello] == null) {
					Nodo = new NodeListALivelli(livello,mListaALivelli[riga][colonnaID],mListaALivelli[riga][colonnaName],aID[livello-1]);
					aID[livello-1].addChild(Nodo);
					aID[livello] = Nodo;					
				} else if (mListaALivelli[riga][colonnaID] != aID[livello].IDNode) {
					Nodo = new NodeListALivelli(livello,mListaALivelli[riga][colonnaID],mListaALivelli[riga][colonnaName],aID[livello-1]);
					aID[livello-1].addChild(Nodo);
					aID[livello] = Nodo;
					
					for (var indice = livello+1; indice < 4; indice++)
						aID[indice] = null;
				}
		}
	}
	
	this.rootNode = Root;

	// Eventuale impostazione dei valori			
	this.setValue(1,aValori);
}

// Inserisce i valori all'interno della tendina in funzione del valore impostato al livello superiore
// level => livello che occorre impostare
function ListaALivelliElement_setLevel(level) {
	// 1- Impostazione della tendina associata al livello
	var parentNode, tendina
	if (level == 1)
		parentNode = this.rootNode;
	else {
		tendina = this.AIDElement[level - 2];
		var idNode = tendina.options[tendina.options.selectedIndex].value				
		parentNode = this.rootNode.getNode(level-1,idNode);
	}
	tendina = this.AIDElement[level - 1];			
	if ((parentNode != null) && (tendina != null)) {
		tendina.disabled = true;
		var aChildNode = parentNode.toString();
		tendina.options.length = 1;
		var index;
		for (index = 0; index < aChildNode.length; index++) {
			tendina.options.length += 1;
			tendina.options[tendina.options.length-1].value = aChildNode[index];
			tendina.options[tendina.options.length-1].text = aChildNode[index+1];
			index++;				
		}
		if (tendina.length > 1) 
			tendina.disabled = false;
	} else if (tendina != null) {			
		tendina.options.length = 1;
		tendina.disabled = true;
	}
	
	// 2 - Pulizia delle tendine dei livelli successivi
	for (index = level ; index < this.AIDElement.length; index++) {
		tendina = this.AIDElement[index];
		tendina.options.length = 1;
		tendina.disabled = true;
	}
}

//	Imposta il livello della tendina al valore specificato
//	aIDNode => elenco degli ID da impostare ai diversi livelli
function ListaALivelliElement_setValue(level,aIDNode) {
	if (aIDNode[level-1] == null)
		this.setLevel(level);
	else {
		// Caricamento dei valori in tendina		
		this.setLevel(level)
		// Impostazione del valore		
		var tendina = this.AIDElement[level-1];		
		tendina.value = aIDNode[level-1];
		
		// Ricorsione
		if (level <= this.NumeroLivelli)
			this.setValue(level+1,aIDNode)
	}
}

new ListaALivelliElement(null,null,null);
ListaALivelliElement.prototype.init = ListaALivelliElement_init;
ListaALivelliElement.prototype.setLevel = ListaALivelliElement_setLevel;
ListaALivelliElement.prototype.setValue = 	ListaALivelliElement_setValue;
