// * Elementi in gioco:
// *  $sid => id del selettore
// *  $nid => id del nodo che scatena l'evento
// *  $pid => id del nodo padre di un dato nodo
// *  $key,$value,$nome => i valori associati al nodo: 
// *    con $res = record selezionato dal db, abbiamo
// *    $key = $res[$key]  (non deve essere numerico, controllato in php)
// *    $value = $res[$value]
// *    $nome = FormatValue::format( $format_output, $res );


// * Tutti gli hash qua sotto sono multidimensionali, e la prima dimensione è 
// * sempre "k$sid". Le altre sono indicate

var msv_selected = new Array();  // * $key => $value

var msv_savelast = new Array(); // * true

var msv_hr_hash_by_name = new Array(); // * $nome => $right_div_idx
var msv_hr_hash_by_id = new Array(); // * $right_div_idx => $nome
var msv_hr_cnt = 0;

var msv_hl_hash_by_key = new Array(); // * $key => array( tutti i $nid con quella $key)
var msv_hl_hash_by_pid = new Array(); // * $pid => array( tutti i $nid con quel $pid)

var msv_parent_last_expanded = new Array(); // * $nid

var msv_callback = new Array(); // * func
var msv_callback_single = new Array(); // * func

var msv_actual_sid = null;

var msv_excluded_id = new Array(); // * array di id da escludere dal selettore

// * **********************************************************
// * Funzioni per l'inizializzazione

function msel_create_new(sid) {
	var k = "k"+sid;
	msv_selected[k] = new Array();
	msv_hr_hash_by_name[k] = new Array();
	msv_hr_hash_by_id[k] = new Array();
	msv_hl_hash_by_key[k] = new Array();
	msv_hl_hash_by_pid[k] = new Array();
	msv_parent_last_expanded[k] = null;
	msv_excluded_id[sid] = new Array();
}

function msel_set_savelast(sid) {
	var k = "k"+sid;
	msv_savelast[k] = true;
}

function msel_reset_hr(sid) {
	var k = "k"+sid;
	msv_hl_hash_by_key[k] = new Array();
	msv_hl_hash_by_pid[k] = new Array();
	msv_parent_last_expanded[k] = null;
}

function msel_register_node(sid,nid,pid) {
	var k = "k"+sid;
	var key = msel_get_key(sid,nid);

	if( typeof msv_hl_hash_by_key[k][key] == 'undefined' )
		msv_hl_hash_by_key[k][key] = new Array();

	msv_hl_hash_by_key[k][key].push(nid);

	if( typeof pid != 'undefined' ) {
		var key = "k"+pid;
		if( typeof msv_hl_hash_by_pid[k][key] == 'undefined' )
			msv_hl_hash_by_pid[k][key] = new Array();

		msv_hl_hash_by_pid[k][key].push(nid);
	}
}

// * **********************************************************
// * Funzioni per l'espansione dei parent nodes

function msel_parent_toggle_expansion(sid, nid) {
	var k = "k"+sid;
	var last = msv_parent_last_expanded[k];

	if( !last) {
		msel_parent_expand(sid,nid);
	} else if( last == nid ) {
		msel_parent_collapse_last(sid);
	} else {
		msel_parent_collapse_last(sid);
		msel_parent_expand(sid,nid);
	}
}

function msel_parent_expand(sid,nid) {
	var k = "k"+sid;
	var last = msv_parent_last_expanded[k];

	// * se il last è aperto, lo chiudiamo
	if( last && last != nid )
		msel_parent_collapse_last(sid);
	
	var nome = 'ms_node_parent_'+sid+'_'+nid;
	$('#'+nome+' div').show();
	msv_parent_last_expanded[k] = nid;
}

function msel_parent_collapse(sid,nid) {
	var nome = 'ms_node_parent_'+sid+'_'+nid;
	$('#'+nome+' div').hide();
}

function msel_parent_collapse_last(sid) {
	var k = "k"+sid;
	msel_parent_collapse(sid,msv_parent_last_expanded[k]);
	msv_parent_last_expanded[k] = null;
}



// * **********************************************************
// * ENTRY POINT PER UN CLICK SUL NODO
// * **********************************************************

function msel_node_clicked(sid,nid,multi) {
	// * prendo la chiave del cliccato
	var key = msel_get_key(sid,nid);

	// * se siamo in un contesto multi-select ..
	if( multi ) {

		if( msel_get_checked(sid,nid) ) {
			// * deseleziono dal div di sinistra tutti gli elementi con questa chiave
			msel_htmlleft_unselect(sid,key);

			// * rimuovo il valore dal div di destra
			msel_htmlright_remove(sid,nid);

			// * rimuovo il valore dalla lista js
			msel_jslist_remove(sid,key);

		} else {
			// * seleziono sul div di sinistra tutti gli elementi con questa chiave
			msel_htmlleft_select(sid,key);

			// * aggiungo il valore dal div di destra
			msel_htmlright_add(sid,nid);

			// * aggiungo il valore alla lista in js
			msel_jslist_add(sid,nid);
		}

	} else {
		// * altrimenti giochi finiti
		msel_jslist_clear(sid);

		msel_jslist_add(sid,nid);

		msel_close_accept(sid);
	}
}


// * **********************************************************
// * Funzioni per gestire le checkbox


function msel_chk_clicked(sid,pid,chk) {
	var k = "k"+sid;
	var k2 = "k"+pid;

	if( typeof msv_hl_hash_by_pid[k][k2] == 'undefined' ) 
		return;


	for( var i = 0; i < msv_hl_hash_by_pid[k][k2].length; i++ ) {
		var nid = msv_hl_hash_by_pid[k][k2][i];
		if( msel_get_checked(sid,nid) != chk.checked ) {
			msel_node_clicked(sid,nid,true);
		}
	}

	msel_parent_expand(sid,pid);
}


// * **********************************************************
// * Funzioni per gestire la lista dei selezionati (in js)

function msel_jslist_clear(sid) {
	var k = "k"+sid;
	msv_selected[k] = new Array();
}

function msel_jslist_add(sid,nid) {
	var k = "k"+sid;
	var key = msel_get_key(sid,nid);
	if(!msel_jslist_exists(sid,key))
		msv_selected[k][key] = msel_get_value(sid,nid);
}

function msel_jslist_remove(sid,key) {
	var k = "k"+sid;
	delete msv_selected[k][key];
}

function msel_jslist_exists(sid,key) {
	var k = "k"+sid;
	return typeof msv_selected[k][key] != "undefined";
}


// * **********************************************************
// * Funzioni per gestire la selezionatura dei nodi (in html - left)

// * Agiamo su tutti i nodi con la stessa chiave
function msel_htmlleft_select(sid,key) {
	var k = "k"+sid;
	
	if( typeof msv_hl_hash_by_key[k][key] != 'undefined' ) {
		for( var i = 0; i < msv_hl_hash_by_key[k][key].length; i++ )
			msel_htmlleft_setActive(sid, msv_hl_hash_by_key[k][key][i], true );
	}
}

function msel_htmlleft_unselect(sid,key) {
	var k = "k"+sid;
	if( typeof msv_hl_hash_by_key[k][key] != 'undefined' ) {
		for( var i = 0; i < msv_hl_hash_by_key[k][key].length; i++ )
			msel_htmlleft_setActive(sid, msv_hl_hash_by_key[k][key][i], false );
	}
}

function msel_htmlleft_setActive(sid,nid,value) {
	msel_set_checked(sid,nid, value ? 1 : 0 );
	msel_set_bold(sid,nid,value);
}


// * **********************************************************
// * Funzioni per gestire la lista dei selezionati (in html - right)

function msel_htmlright_clicked(sid,key,id) { 
	// * Una volta cliccato sulla x rimuoviamo 
	// * il valore dalla lista di sinistra
	msel_htmlleft_unselect(sid,key);

	// * da quella di destra
	msel_htmlright_removeById(sid,id);

	// * e dalla lista js
	msel_jslist_remove(sid,key);

}

function msel_htmlright_add(sid,nid) {
	var k = "k"+sid;
	var nome = msel_get_nome(sid,nid);
	if( typeof msv_hr_hash_by_name[k][nome] == 'undefined' ) {
		var newid = "ms_div_hr_"+(++msv_hr_cnt);
		msv_hr_hash_by_name[k][nome] = msv_hr_cnt;
		msv_hr_hash_by_id[k]["k"+msv_hr_cnt] = nome;
		var key = msel_get_key(sid,nid);
		$('#ms_div_selected_'+sid).append( '<div id="'+newid+'" class="mt5"><img src="/imgs/icons/delete.gif" class="manina ml5 mr5" align="absmiddle" onclick="msel_htmlright_clicked('+sid+',\''+key+'\','+msv_hr_cnt+');">'+nome+'</div>' );
	}
}

function msel_htmlright_remove(sid,nid) {
	var nome = msel_get_nome(sid,nid);
	msel_htmlright_removeByName(sid,nome);
}

function msel_htmlright_removeByName(sid,nome) {
	var k = "k"+sid;
	if( typeof msv_hr_hash_by_name[k][nome] != 'undefined' ) {
		var idx = msv_hr_hash_by_name[k][nome];
		$('#ms_div_hr_'+idx).remove();
		delete msv_hr_hash_by_name[k][nome];
		delete msv_hr_hash_by_id[k]["k"+idx];
	}
}

function msel_htmlright_removeById(sid,idx) {
	var k = "k"+sid;
	if( typeof msv_hr_hash_by_id[k]["k"+idx] != 'undefined' ) {
		var nome = msv_hr_hash_by_id[k]["k"+idx];
		msel_htmlright_removeByName(sid,nome);
	}
}


// * **********************************************************
// * Funzioni per gestire le callback e chiusura

function msel_set_active(sid) {
	msv_actual_sid = sid;
}

function msel_close_accept(sid) {
	msv_actual_sid = sid;
	$.fn.colorbox.close()
}

function msel_close_abort() {
	msv_actual_sid = null;
	$.fn.colorbox.close()
}

function msel_register_callback(sid, callback, multi) {
	var k = "k"+sid;
	if( multi ) msv_callback[k] = callback;
	else msv_callback_single[k] = callback;
}

// * Ogni $.fn.colorbox.close() richiama in modo standard questa funzione (se esiste)
function msel_callback() {
	if( msv_actual_sid ) {
		var k = "k" + msv_actual_sid;
		if( typeof msv_callback[k] != 'undefined' ) {
			var f = msv_callback[k];
			var arg = msv_selected[k];
			eval(f+"(arg);");
		}
		if( typeof msv_callback_single[k] != 'undefined' ) {
			var f = msv_callback_single[k];

			// * ci dovrebbe essere un modo piu elegante di questo
			for( var key in msv_selected[k] ) {
				var value = msv_selected[k][key];
				break;
			}
			if(key)
				eval(f+"(key,value);");
		}

		if( msv_savelast[k] ) {
			var save = '';
			for( var key in msv_selected[k] )
				save += '&save[]='+key;
			if( save.length ) {				
				var page = $('#ms_search_ajaxpage_'+msv_actual_sid).val();
				var ssid = $('#ms_search_id_'+msv_actual_sid).val();
				$.get(page+'?ssid='+ssid+save);
			}
		}
	}
	msv_actual_sid = null;
}


// * **********************************************************
// * Funzioni per manipolare i dati dagli input a partire dal nodo


function msel_get_key(sid,nid) { return $('#ms_node_key_'+sid+'_'+nid).val(); }
function msel_get_value(sid,nid) { return $('#ms_node_value_'+sid+'_'+nid).val(); }
function msel_get_nome(sid,nid) { return $('#ms_node_nome_'+sid+'_'+nid).html(); }
function msel_get_checked(sid,nid) { return $('#ms_node_checked_'+sid+'_'+nid).val() == '1'; }
function msel_set_checked(sid,nid,value) { $('#ms_node_checked_'+sid+'_'+nid).val(value); }
function msel_selected_conversion(sid,nid) { return sid+'_'+nid; }
function msel_set_bold(sid,nid,value) { $('#ms_node_'+sid+'_'+nid).css({'font-weight': (value ? 'bold' : 'normal') }); }


// * **********************************************************
// * Funzioni per la ricerca

function msel_search(sid,multi) {
	var text = trim($('#ms_txt_search_'+sid).val());
	if( text == 'Cerca..' ) {
		$('#ms_txt_search_'+sid).focus();
		text = '';
	}
	if( text == '' ) return;
	if( text.length < 3 ) {
		alert("Usa un parametro di ricerca piu specifico");
		return;
	}
	var page = $('#ms_search_ajaxpage_'+sid).val();
	var searchid = $('#ms_search_id_'+sid).val();
	var params = $('#ms_search_ajaxpage_parameters_'+sid).val().split('@');
	var ajaxparams = '';
	for(var i in params)
	{
		var temp = params[i].split(':');
		ajaxparams += '&'+temp[0]+'='+temp[1];
	}
	var exclude = "";
	for(var i in msv_excluded_id[sid])
		exclude += "&excludedids[]="+msv_excluded_id[sid][i];
	$('#ms_div_tree_'+sid).html('<div class="ms_waiting"><img src="/imgs/icons/loadingAnimation.gif"></div>');
	$.get(page+"?ssid="+searchid+"&sid="+sid+"&multi="+(multi?1:0)+"&filter="+text+ajaxparams+exclude,{}, msel_search_result);
}

function msel_search_reset(sid,multi) {
	msv_actual_sid = sid;
	var page = $('#ms_search_ajaxpage_'+sid).val();
	var searchid = $('#ms_search_id_'+sid).val();
	$('#ms_div_tree_'+sid).html('<div class="ms_waiting"><img src="/imgs/icons/loadingAnimation.gif"></div>');
	$.get(page+"?ssid="+searchid+"&sid="+sid+"&multi="+(multi?1:0)+"&reset=1",{}, msel_search_result_reset);
}

function msel_search_result(res) {
	var sid = msv_actual_sid;

	msel_reset_hr(sid);
	msel_search_switchheader(sid,true);
	$('#ms_div_tree_'+sid).html(res);
}

function msel_search_result_reset(res) {
	var sid = msv_actual_sid;
	msel_reset_hr(sid);
	msel_search_switchheader(sid,false);
	$('#ms_div_tree_'+sid).html(res);
}

// * mostra il bottone di reset se chiamato con searching = true
function msel_search_switchheader(sid,searching) {
	$('#ms_btn_search_'+sid).val( searching ? 'Cerca altro' : 'Cerca' );
	if( searching ) $('#ms_btn_search_reset_'+sid).show();
	else $('#ms_btn_search_reset_'+sid).hide();
}


// * Questa funzione, eseguita dopo una search(), 
// * fa una select nel div di destra degli elementi
// * gia selezionati
function msel_load_already_selected(sid) {
	var k = "k"+sid;
	for( var key in msv_selected[k] ) {
		msel_htmlleft_select(sid,key);
	}
}


// * **************************************************************
// * Funzioni per gestire il caricamento differito del tree in ajax

function msel_ajax_load(sid,multi) {
	var page = $('#ms_search_ajaxpage_'+sid).val();
	var searchid = $('#ms_search_id_'+sid).val();
	$('#ms_div_tree_'+sid).html('<div class="ms_waiting"><img src="/imgs/icons/loadingAnimation.gif"></div>');
	$.get(page+"?ssid="+searchid+"&sid="+sid+"&multi="+(multi?1:0)+"&reset=1",{}, msel_ajax_load_result);
}

function msel_ajax_load_result(res) {
	res = res.split('|');
	$('#ms_div_tree_'+res[0]).html(res[1]);
}

// * **********************************************************
// * Funzioni per gestire le esclusioni (bisogna passargli l'id del selettore obbiettivo)

function msel_exclude_add_single(id_sel, id)
{
	found = -1;
	for(	var i in msv_excluded_id	)
		if(	msv_excluded_id[id_sel][i] == id	)
			found = i;
	if(	found	==	-1	)
		msv_excluded_id[id_sel].push(id);
}

function msel_exclude_add_array(id_sel,arr)
{
	for(var i in arr)
		msel_exclude_add_single(id_sel, arr[i]);
}

function msel_exclude_remove_single(id_sel,id)
{
	found = -1;
	for(	var i in msv_excluded_id	)
		if(	msv_excluded_id[id_sel][i] == id	)
			found = i;
	if(	found	>	0	)
		msv_excluded_id[id_sel].splice(i,1);
}

function msel_exclude_remove_array(id_sel,arr)
{
	for(var i in arr)
		msel_exclude_remove_single(id_sel, arr[i]);
}

// * **********************************************************
// * Funzioni per sostituire il contenuto di un selettore

function msel_change_content(sid) {	
	var page = $('#ms_search_ajaxpage_'+sid).val();
	var searchid = $('#ms_search_id_'+sid).val();
	var params = $('#ms_search_ajaxpage_parameters_'+sid).val().split('@');
	var ajaxparams = '';
	for(var i in params)
	{
		var temp = params[i].split(':');
		ajaxparams += '&'+temp[0]+'='+temp[1];
	}
	var exclude = "";
	for(var i in msv_excluded_id[sid])
		exclude += "&excludedids[]="+msv_excluded_id[sid][i];	
	$('#ms_div_tree_'+sid).load(page+"?ssid="+searchid+"&sid="+sid+"&multi="+0+"&filter="+ajaxparams+exclude);
}
