/**
 * @author AfterBit s.r.l.
 * 
 * note: aggiungere all'elemento che si desidera rendere "draggabile" il seguente evento: onmousedown="init_layer(this, event)"
 * E' tutto! :-)
 */
			var gen_cont = 0; // questo contatore viene utilizzato per assegnare <ID> "di ufficio" a livelli non contrassegnati con un proprio <ID>
			var layers_id = new Array(); // contiene l'<ID> dei livelli trascinabili presenti nel documento...
			var layers_x_pos = new Array(); // contiene la coordinata <X> dei livelli trascinabili presenti nel documento...
			var layers_y_pos = new Array(); // contiene la coordinata <Y> dei livelli trascinabili presenti nel documento...
			var active_index = -1; // condiene l'indice (all'interno dell'array dei livelli) del livello correntemente attivo ( -1 => nessun livello attivo)
			var start_x_pos = -1; // coordinata x di partenza del mouse al momento dell'inizio trascinamento...
			var start_y_pos = -1; // coordinata y di partenza del mouse al momento dell'inizio trascinamento...
			
			function init_layer( layer_obj, event )
			{
				if (layer_obj.id == "")
				{
					// se non è stato assegnato un id al livello in oggetto ne assegna uno di default...
					layer_obj.id = "layer_" + gen_cont.toString();
					gen_cont ++;
				};
				// recupera l'id del corrente livello nell'array dei livelli. Se non lo trova assegna un nuovo record nell'arraqy e ne restituisce l'indice.
				var array_index = 0;
				var trovato = false;
				while (array_index<layers_id.length && !trovato)
				{
					if (layer_obj.id == layers_id[array_index])
					{
						trovato = true;
					}
					else
					{
						array_index++;
					}
				}
				// archivia la posizione del livello al momento dell'inizializzazione...
				layers_x_pos[array_index] = findLayPos(layer_obj)[0];
				layers_y_pos[array_index] = findLayPos(layer_obj)[1];
				// se il livello è nuovo ne archivia il nome nell'apposito array (la posizione del nuovo livello è comunque stata archiviata al passaggio precedente...)
				if (!trovato)
				{
					layers_id[array_index] = layer_obj.id;
					if (layer_obj.style["position"]=="")
					{
						// se la posizione del livello non è dichiarata come assoluta => deve provvedere a dichiarla tale...
						layer_obj.style["position"] = "absolute";
						layer_obj.style["left"] = parseInt(layers_x_pos[array_index]).toString() + "px";
						layer_obj.style["top"] = parseInt(layers_y_pos[array_index]).toString() + "px";
					};
					layer_obj.style["zIndex"] = array_index.toString();
					active_index = array_index;
					layer_obj.onmouseup = function()
					{
						// istanzia una funzione associata all'evento <ONMOUSEUP> per questo livello
						if (layer_obj == document.getElementById(layers_id[active_index]) )
						{
							// riabilita la possibilità di selezionare testo (temporaneamente disabilitata durante l'operazione di drag
							document.onselectstart = function() {return true;} // ie
							document.onmousedown = function() {return true;} // mozzilla...
							layers_x_pos[array_index]= parseInt(layer_obj.style["left"]); // archivia l'ultima posizione acquisita dal livello
							layers_y_pos[array_index]= parseInt(layer_obj.style["top"]);
							//layer_obj.style["zIndex"] = "0";
							start_x_pos = -1;
							start_y_pos = -1;
							active_index = -1
						}
					};
				};
				// rileva le coordinate del moujse al momento del click
				if (!event) var event = window.event;
				if (event.pageX || event.pageY) {
					start_x_pos = event.pageX;
					start_y_pos = event.pageY;
				} else if (event.clientX || event.clientY) 	{
					start_x_pos = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
					start_y_pos = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
				}
				// restituisce l'indice del livello attivo...
				active_index = array_index;
				// il livello cliccato deve avere uno z-index superiore rispetto agli altri...
				
				if (layer_obj.style["zIndex"] == (layers_id.length - 1))
				{
					// il livello prescelto è già al max. livello di z-index => ok
				}
				else
				{
					// riorganizzo lo z-index dei livelli archiviati.
					for (var i=0; i<layers_id.length; i++)
					{
						if ( parseInt( document.getElementById( layers_id[i] ).style["zIndex"] ) <= parseInt( layer_obj.style["zIndex"] ) )
						{
							// se un livello ha zIndex minore del livello prescelto => non viene toccato
						}
						else
						{
							// altrimenti il suo zIndex viene decrementato di uno
							document.getElementById( layers_id[i] ).style["zIndex"] = (parseInt(document.getElementById( layers_id[i] ).style["zIndex"])-1).toString();
						}
					}
					// alla fine al livello prescelto viene assegnato il massimo zIndex...
					layer_obj.style["zIndex"] = (layers_id.length - 1);
				}
			}
			
			function move_lay(posx, posy)
			{
				if (active_index != -1)
				{
					// per evitare effetti sgradevoli disabilita il select del testo durante l'oprazione di drag..
					document.onselectstart = function() {return false;} // ie
					document.onmousedown = function() {return false;} // mozzilla...
					// gestisce il movimento del layer attivo
					// rileva lo spostamento ( in orizzontale e in verticale )...
					var spostamento_x = parseInt(posx) - parseInt(start_x_pos);
					var spostamento_y = parseInt(posy) - parseInt(start_y_pos);
					// sposta il livello in funzione dello spostamento rilevato
					var nuova_x = layers_x_pos[active_index] + spostamento_x;
					var nuova_y = layers_y_pos[active_index] + spostamento_y;
					document.getElementById(layers_id[active_index]).style["left"] = nuova_x.toString() + "px";
					document.getElementById(layers_id[active_index]).style["top"] = nuova_y.toString() + "px";
				}
			}
			
			document.onmousemove = go_and_move;
			
			function go_and_move(e)
			{
				var pos = mouse_pos(e);
				move_lay( pos[0], pos[1] );
			}
			
			function mouse_pos(e) {
				// rileva le coordinate dell'evento passato a parametro
				var m_x = 0;
				var m_y = 0;
				if(!e){ var e = window.event }
				m_x = (e.pageX) ? e.pageX : window.event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
				m_y = (e.pageY) ? e.pageY : window.event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
 				var pos_arr = new Array();
				pos_arr[0] = m_x;
				pos_arr[1] = m_y;
				return pos_arr;
			}
			
			function findLayPos(obj) {
				// restituisce un vettore (x, y) con la posizione assoluta dell'oggetto passato a parametro
				var curleft = curtop = 0;
				if (obj.offsetParent) {
					curleft = obj.offsetLeft
					curtop = obj.offsetTop
					while (obj = obj.offsetParent) {
						curleft += obj.offsetLeft
						curtop += obj.offsetTop
					}
				}
				return [curleft,curtop];
			}