//-------------------------------------------------
//
//	Thread.js
//
//	Funzioni per admin e view dei post
//
//-------------------------------------------------



function TogglePanel(vElementId, vAnimate){
	
	var objElement = $(vElementId);

	var duration = 0;

	if(vAnimate){
		duration  = 1.0;
	}

	
	Effect.toggle(objElement, 'slide', { duration: duration });
	
	return false;
}

function ToggleAdminPanel(vLinkElementId, vElementId){
	
	var objElement = $(vElementId);
	var objLinkElement = $(vLinkElementId);

	var duration = 1.0;

	if(!objElement.hasClassName("closedPanel")){
		objLinkElement.update('[open]');
		Effect.SlideUp(objElement, { duration: duration,
						afterFinish: function(e){
							objElement.addClassName("closedPanel");
						}
					}
				);
	}else{
		objLinkElement.update('[close]');
		Effect.SlideDown(objElement, { duration: duration,
						beforeStart: function(e){
							objElement.setStyle({display: 'none'});
							objElement.removeClassName("closedPanel");
						}
					}
				);
	}
	return false;
}


//-------------------------------------------------------------------
//
//	Visualizzazione dello pseudo-percorso a destra del titolo
//
//-------------------------------------------------------------------
function SetPathTitle(vThreadDetailsPathWrapper,vJsonData){
	var newHTML = "";

	if (vJsonData) {
		vJsonData = vJsonData.evalJSON();
		
		if (vJsonData.bRoot != "") {
			tmp = unescape(vJsonData.bRoot).evalJSON();
			newHTML += '<a href="' + tmp.url + '">' + tmp.label + '</a>';
		}
		if (vJsonData.bRoot != "" && vJsonData.b1lvl != "") {
			tmp = unescape(vJsonData.b1lvl).evalJSON();	
			newHTML += '&nbsp;&gt;&nbsp;<a href="' + tmp.url + '">' + tmp.label + '</a>';
		}
		if (vJsonData.bRoot != "" && vJsonData.b1lvl != "" && vJsonData.b2lvl != "") {
			tmp = unescape(vJsonData.b2lvl).evalJSON();	
			newHTML += '&nbsp;&gt;&nbsp;<a href="' + tmp.url + '">' + tmp.label + '</a>';
		}
	}

	$(vThreadDetailsPathWrapper).update(newHTML);
}



//-------------------------------------------------
//
//	Geatione del meta Categories
//
//	Visualizzazione ad albero delle categorie
//	utilizzate come menu
//
//	Visualizzazione flat delle categorie
//	escluse dal menu
//
//-------------------------------------------------

//-----------------------------------------------------------------------------
//
//	Legge la struttura <ul><li>... del menu dal div firstMenu.
//
//	Scorre ricorsivamente la struttura <ul><li>..., inserisce le relative
//	checkbox nel div (usedCategories).
//
//	Inserisce nel div (unusedCategories) le category non utilizzate nel menu.
//
//-----------------------------------------------------------------------------
function InitCategoriesTool(){
	var strCurrentMenuStructureHiddenDivName = 'firstMenu';
	var strCurrentMenuCheckboxListDivName = 'usedCategories';
	var strUnusedCategoriesCheckboxListDivName = 'unusedCategories';
	var strCurrentMenuStructureUrl = '/en/interface/menu-structure';
	
	var objCurrentMenu;
	var objCurrentMenuDiv;
	var objCurrentMenuCheckboxesDiv;
	var objUnusedCategoriesCheckboxesDiv;
	
	//questo array viene popolato al interno della funzione RecurseUl
	var arrUsedCategories = new Array();
			
	//div firstMenu, contenente il menu completo
	objCurrentMenuDiv = $(strCurrentMenuStructureHiddenDivName);
	
	//div che conterrà le checkbox relative al menu corrente
	objCurrentMenuCheckboxesDiv = $(strCurrentMenuCheckboxListDivName);
	
	//div che conterrà le checkbox non utilizzate come menu
	objUnusedCategoriesCheckboxesDiv = $(strUnusedCategoriesCheckboxListDivName);
	
	
	objCurrentMenu = objCurrentMenuDiv.firstDescendant();
	RecurseUl(objCurrentMenu, objCurrentMenuCheckboxesDiv, arrUsedCategories, 0);
	
	
	//rimpimento del availableCategoriesRoot
	var arrAvailableCategories;  //tutte le categorie disponibili
	var arrUnsusedCategories;  //tutte le categorie già utilizzate
        	
	//inizializzo array delle categorie disponibili con il risultato della
	//macro ^GetMetaPossibleValues
	arrAvailableCategories = [{id:"42",text:"Extras"},{id:"29",text:"Album"},{id:"13",text:"WeddingAlbum"},{id:"41",text:"Other ceremonies"},{id:"32",text:"User login"},{id:"21",text:"Baby"},{id:"56",text:"Baby & Teen"},{id:"40",text:"BestFriendsBook"},{id:"22",text:"Ceremonies"},{id:"26",text:"Classic"},{id:"23",text:"Collections"},{id:"49",text:"Compat Best Friends"},{id:"48",text:"Compat Friends"},{id:"14",text:"CompatBook"},{id:"34",text:"Contacts"},{id:"25",text:"Contemporary"},{id:"17",text:"Covers"},{id:"30",text:"Create your Album"},{id:"44",text:"Epoca Software"},{id:"45",text:"Ready to print"},{id:"43",text:"Full Design service"},{id:"27",text:"Downloads"},{id:"52",text:"Epoca Book Agenda"},{id:"53",text:"Epoca Book Calendario"},{id:"50",text:"Epoca Book Mini Friends"},{id:"51",text:"Epoca Book Viewer"},{id:"15",text:"EventBook"},{id:"38",text:"FamilyAlbum"},{id:"28",text:"Faq"},{id:"37",text:"Photographers"},{id:"39",text:"FriendsBook"},{id:"11",text:"Home"},{id:"16",text:"MiniBook"},{id:"31",text:"News & Events"},{id:"18",text:"Occasions"},{id:"36",text:"Photo gallery"},{id:"12",text:"Products"},{id:"24",text:"Retro"},{id:"47",text:"Site"},{id:"46",text:"Software"},{id:"33",text:"Support"},{id:"20",text:"Teen"},{id:"35",text:"Testimonials"},{id:"55",text:"Tradition"},{id:"54",text:"Video-Tutorials"},{id:"19",text:"Weddings"}];
        	
	//se non ci sono categorie già utilizzate nella struttura del menu,
	//unusedCategories = availableCategories
	
	if(arrUsedCategories.size() > 0){
		//ottengo le categorie non utilizzate rimuovendo le Used Categories
  		//dal array arrAvailableCategories
  		arrUnsusedCategories = ArrayWithout(arrAvailableCategories, arrUsedCategories);
  	}else{
  		arrUnsusedCategories = arrAvailableCategories.clone();
  	}

  	arrUnsusedCategories.each(function(item){
  		var strItemText;
  		var strItemId;
  		var strMetaId;
  		var objUnusedDiv = objUnusedCategoriesCheckboxesDiv;
  		
  		
  		strItemText = item.text;
  		strItemId = item.id;
  		strMetaId = 'metadata_X1j4cuskKimWBcMxPH66Jg';

  		AddCategoryItem(strItemId, strMetaId, strItemText, 0, objUnusedDiv, false);
  		
  	});
  	
  	objUnusedCategoriesCheckboxesDiv.appendChild(new Element('div', { 'class': 'clear'}));
  	
  	//checka le categorie selezionate
  	CheckSelectedCategories();
  	
  	//aggiorna la combo sub menu
	updateSubMenuCombo();	

	//Aggancia evento click di ogni checkbox category
	$$("div.CategoryItem input").each(function(cb){
		cb.observe("click",function(){
			updateSubMenuCombo();
		});
	});
  	
  	//seleziona valori correnti dei meta utilizzati in editing
  	$$('#cbSubMenu option[value="' + subMenuForCategory + '"]')[0].selected=true;  	
}


function RecurseUl(vUlNode, vCkbNode, vArrNodeList, vLevel){
	var arrLiNodes;
 	var strMetaId = 'metadata_X1j4cuskKimWBcMxPH66Jg';
 	var intIndentStep = 20;


  	//li figli del vUlNode corrente
  	arrLiNodes = vUlNode.childElements();

  	//controllo che vUlNode abbia almeno un figlio (li)
  	if(arrLiNodes.length > 0){

    		//variabili per inizializzazione dei nodi Tree
    		var strText;
		var strId;
		
	  	var objSubMenu;  //eventuali sottonodo ul del li corrente
	  	
	  	//prototype elements per il popolamento del elenco delle categories
		var objInput;
		var objLabel;
		var objDivContainer;
	
	
		var i;
	
	  	//ciclo tutti gli li figli di vUlNode
	  	arrLiNodes.each(function(objMenuItem, index){
			if (objMenuItem.classNames() != "qmclear") {
                                //if (objMenuItem.firstDescendant() == null)
                                //   return;

	        		strText = objMenuItem.firstDescendant().firstChild.nodeValue;
	        		strId = objMenuItem.id.replace('metaCategory_', '');
	
	        		AddCategoryItem(strId, strMetaId, strText, vLevel, vCkbNode, true);
	                		
	        		//inserisco il text di ogni nodo nel array vArrNodeList, i suo elementi
	        		//verranno eliminati dal elenco dei nodi disponibili prima del
	        		//popolamento del treePanel availableCategories
	        		vArrNodeList[vArrNodeList.size()] = {id:strId,text:strText};
	        		
	        		//ogni li ha almeno un sottonodo a con il link se ha più di un sottonodo
			        //.length > 1 significa che il secondo è un ul
			        if(vLevel < 2 && objMenuItem.childElements().length > 1){
			        	//ricorsione sul UL
			          	objSubMenu = objMenuItem.childElements()[1];
			
			          	RecurseUl(objSubMenu, vCkbNode, vArrNodeList, vLevel + 1);
			        } 	
			}     		        		
    		});
	}
	
}

function AddCategoryItem(v_strItemId, v_strMetaId, v_strItemText, v_intLevel, vContainer, vLevelizeItemClass){

	var intLevelIndent = 1;
	var strId = v_strItemId;
	var strMetaId = v_strMetaId;
	var strText = v_strItemText;
	var strItemStyleClass = 'CategoryItem';
	var strHtmlTagId = 'metaCategory_' + strId;
	var intIndentStep = 20;
	

	
	var objDivContainer;
	var objInput;
	var objLabel;
	
	
	intLevelIndent += v_intLevel;
	
	
	if(vLevelizeItemClass == true){
		strItemStyleClass += ' CategoryItemLevel' + intLevelIndent;
	}
	
	
	//inizializzo il div contenitore della coppia checkbox/label per la voce di menu corrente
	objDivContainer = new Element('div',
		{ 'class': strItemStyleClass,
		'style': 'padding-left:' + (intLevelIndent * intIndentStep)  + 'px'});
                	
                	
	//checkbox
        objInput = new Element('input',
		{ 'type': 'checkbox',
		'value': strId,
		'id': strHtmlTagId,
		'name': strMetaId });
                	
	//label della checkbox	
	objLabel = new Element('label',
		{ 'for': strHtmlTagId }).update(strText);
		
	//inserisco elemento (div contenitore) dentro il div predisposto (vCkbNode)
	objDivContainer.appendChild(objInput);
	objDivContainer.appendChild(objLabel);
	vContainer.appendChild(objDivContainer);
	
	
}

//-------------------------------------------------------
//
//	restituisce vArray - vWithout
//
//-------------------------------------------------------
function ArrayWithout(vArray, vWithout){
	var arrResult = new Array;
    	var blnFound;


	//tutte le categorie disponibili
	vArray.each(function(item){
		blnFound = false;
	
		//categorie già utilizzate
		vWithout.each(function(toRemove){
		
		    	//alert(toRemove.id);
			if(item.id == toRemove.id){
				blnFound = true;
			}
		
		});
	
		//dategorie disponibili non ancora utilizzate
		if(!blnFound){
		    arrResult[arrResult.size()] = item;
		}
	});
	
	return arrResult;
}

//-------------------------------------------------------
//
//	Aggiorna la combo con la categorie selezionate
//
//-------------------------------------------------------
/*function updateFrontPageCombo(){
	//old value
	var oldValue=$F('cbFrontPage');
	$$('#cbFrontPage option').each(function(opt){opt.remove()});
	var opt = new Element('option',{value: '', style: 'font-style:italic; color: #555555'});
	opt.insert('&lt;&lt;None&gt;&gt;');
	$('cbFrontPage').options.add(opt);
	$$("div.CategoryItem input").each(function(cb){
		if (cb.checked){
			var opt = new Element('option',{value: cb.readAttribute("value")});
			opt.insert(cb.parentNode.childElements()[1].innerHTML);
			if (oldValue==cb.getValue()) opt.selected=true;
			$('cbFrontPage').options.add(opt);
		}
	});	
}
*/

//-------------------------------------------------------
//
//	Inizializza la combo a seleziona multipla utilizzata
//	per la gestione della FrontPageCategory.
//
//	
//
//-------------------------------------------------------
function InitFrontPageMultiSelect(v_strWhereToRender, v_strInitValuesId, v_strPossibleValuesPath, v_strMetaName){
	//
	//namespace dedicato alla gestione della FrontPageCategory
	//dove inserisco gli oggetti globali utilizzati da diverse funzioni
	//
	Ext.namespace('Ext.frontpage');
	
	//variabili globali
	Ext.frontpage.WhereToRender = v_strWhereToRender;	//id del div dentro il quale renderizzare il controllo multiselect
	Ext.frontpage.PossibleValuesPath = v_strPossibleValuesPath;	//percorso degli elementi da ciclare per popolare la combo
	Ext.frontpage.InitValues = v_strInitValuesId;	//id del campo da cui leggere i valori selezionati nella combo multiselect (diverso per B2C e B2B)
	Ext.frontpage.MetaName = v_strMetaName;	//nome del campo con cui postare i valori selezionati per il salvataggio (diverso per B2C e B2B)
	Ext.frontpage.FrontPageRecordType = null;
	Ext.frontpage.DataStore = null;	//store con i possible values della combo multiselect
      	
      	//creo lo store che conterrà elenco delle categorie disponibili
      	Ext.frontpage.DataStore = new Ext.data.SimpleStore({
        	fields: ['id', 'name']
      	});
      	Ext.frontpage.FrontPageRecordType = Ext.data.Record.create(Ext.frontpage.DataStore.recordType);
      	
      	//Riempio lo store leggendo le categorie selezionate
	getFrontPageStoreData();
	
	//
	//creo il componente Multiselect
      	//
      	
      	//costruttore
      	Ext.frontpage.StateMultiSelect = function(config) {
      		//custom configs
      		//	none
      		
      		//richiamo il costruttore della classe base
        	Ext.frontpage.StateMultiSelect.superclass.constructor.call(this, config);
      	};
      	
      	//definizione della nuova classe multiselect
      	Ext.extend(Ext.frontpage.StateMultiSelect, Ext.form.MultiSelectField, {
      		store: Ext.frontpage.DataStore,
      		valueField:'id',
      		displayField:'name',
      		mode: 'local'
      	});
      	
      	//renderizzo il componente multiselect nel div indicato
      	var FrontPageMultiSelect=null;
	Ext.onReady(function(){
		Ext.frontpage.FrontPageMultiSelect = new Ext.frontpage.StateMultiSelect({
	          	renderTo: Ext.frontpage.WhereToRender,
	          	containerHeight: 200,
	          	containerWidth: 400
	        });
	
	
		if($F(Ext.frontpage.InitValues)){
		        //
		        //leggo i valori salvati su db letti da template e setto i valori selezionati nel controllo multiselect
		        //
		        //	NON passare al componente una stringa separata da virgole perchè si incasina, fai lo split
		        //
		        Ext.frontpage.FrontPageMultiSelect.setValues($F(Ext.frontpage.InitValues).split(','));
		}
	});
	
	
	//Aggancia evento click di ogni checkbox category
	$$(Ext.frontpage.PossibleValuesPath).each(function(cb){
		cb.observe("click",function(){
			updateFrontPageMultiSelect(this);
		});
	});
}



//-------------------------------------------------------
//
//	svuota lo store dei valori
//	e lo riempie con quelli selezionati dal elenco dei
//	valori possibili
//
//-------------------------------------------------------
function getFrontPageStoreData(){
	
	Ext.frontpage.DataStore.removeAll();
	
	FrontPageRecordType = Ext.frontpage.FrontPageRecordType;
	

	$$(Ext.frontpage.PossibleValuesPath).each(function(cb){
		if (cb.checked){
			
			objRecAux = new FrontPageRecordType ({"id":cb.readAttribute("value"), "name":Ext.util.Format.htmlDecode(cb.parentNode.childElements()[1].innerHTML)});		
			Ext.frontpage.DataStore.add(objRecAux);
		}
	});	
	
	
}

//-------------------------------------------------------
//
//	aggiorna la combo multiselect sia nei
//	possibleValues che nei selectedValues
//
//	viene chiamata ad ogni click sulle checkbox della
//	categorie
//
//-------------------------------------------------------
function updateFrontPageMultiSelect(obj){
	//
	//	aggiorno i possibleValues selezionabili nella combo multiselect
	//
	getFrontPageStoreData();	//aggiorno lo store
	Ext.frontpage.FrontPageMultiSelect.buildMenu();	//refresh della combo
	
	//
	//	se è appena stato dececcata una checkbox che compariva tra i
	//	valori selezionati nella multiselect, dobbiamo aggiornare il
	//	suo campo values ed eliminare quello appena cliccato
	//
	
	// id e value della checkbox appena cliccata
	var objValue = obj.readAttribute("value");
	var objLabel = obj.parentNode.childElements()[1].innerHTML;
	
	//valori selezionati nella combo multiselect
	var oldSelectedValues = Ext.frontpage.FrontPageMultiSelect.getValue();
	
	var arrOldSelectedValues = new Array();
	
	if(oldSelectedValues){
		arrOldSelectedValues = oldSelectedValues.split(',');
		
		//ciclo array dei valori selezionati e quando incontro
		//il valore appena cliccato lo rimuovo
		var i = 0;
		arrOldSelectedValues.each(function(item){
				
			if(item == objValue){
				arrOldSelectedValues.splice(i,1);
			}
			
			i++;
		});
				
		//setto i valori selezionati della combo multiselect con elenco appena aggiornato
		Ext.frontpage.FrontPageMultiSelect.setValues(arrOldSelectedValues);
	}
}

function FrontPageSelectedValues(){
	return Ext.frontpage.FrontPageMultiSelect.getValue();
}

function setFrontPageField(){
	var strFrontPage = FrontPageSelectedValues();
	var strMetaName = Ext.frontpage.MetaName;
	var hidd;
	
	strFrontPage.split(',').each(function(item){
		hidd = new Element('input',{type: 'hidden', name: strMetaName, value: item});
		$(Ext.frontpage.WhereToRender).insert(hidd);
	});
}

//-------------------------------------------------------
//
//	Aggiorna la combo con le categorie di primo livello
//
//-------------------------------------------------------
function updateRelatedMenu(){

	var opt = new Element('option',{value: '', style: 'font-style:italic; color: #555555'});
	opt.insert('&lt;&lt;None&gt;&gt;');
	
	$('cbRelatedMenu').options.add(opt);
	
	$$("div.CategoryItemLevel1 input").each(function(cb){
		var opt = new Element('option',{value: cb.readAttribute("value")});
		opt.insert(cb.parentNode.childElements()[1].innerHTML);
		$('cbRelatedMenu').options.add(opt);
		
	});	

}
//---------------------------------------------------------------------------------------------
//
//	Combo sub-menu
//
//---------------------------------------------------------------------------------------------
function updateSubMenuCombo(){
	//old value
	var oldValue=$F('cbSubMenu');
	$$('#cbSubMenu option').each(function(opt){opt.remove()});
	var opt = new Element('option',{value: '', style: 'font-style:italic; color: #555555'});
	opt.insert('&lt;&lt;None&gt;&gt;');
	$('cbSubMenu').options.add(opt);
	$$("div.CategoryItemLevel3 input").each(function(cb){
		if (cb.checked){
			var opt = new Element('option',{value: cb.readAttribute("value")});
			opt.insert(cb.parentNode.childElements()[1].innerHTML);
			if (oldValue==cb.getValue()) opt.selected=true;
			$('cbSubMenu').options.add(opt);
		}
	});	
}


//-----------------------------------------------------
//
//	containerId:	id del div che contiene i due link (lock e unlock) e il loader
//	obj:	riferimento al link cliccato
//	Lock:	boolean, true=voglio loccare il thread
//
//-----------------------------------------------------
function ToggleLock(containerId, obj, Lock){
	var container;
	var objLoader;
	var objLock;
	var objUnlock;
	
	container = $(containerId);
	
	
	objLoader = container.select('.loader')[0];
	objLockDescription = container.select('.lock-description')[0];
	objUnlockDescription = container.select('.unlock-description')[0];
	objLock = container.select('.lock')[0];
	objUnlock = container.select('.unlock')[0];
	
	objLock.hide();
	objUnlock.hide();
	objLoader.show();
	
	new Ajax.Request(obj.href, {
		method: 'get',
	  	onSuccess: function(transport) {
	  		objLoader.hide();
	  		if(Lock){
	  			objLockDescription.hide();
	  			objUnlockDescription.show();
	  			objUnlock.show();
	  		}else{
	  			objUnlockDescription.hide();
	  			objLockDescription.show();
	  			objLock.show();
	  		}	
		}
	});
	
	
	
	return false;
}