var FormOGM =
{
	form: null, 
	path: null, 
	Autocomplete:
	{
		position: -1, 
		elements: new Hash(), 
		timeout: null, 
		findCoords: function(obj) 
		{
			var curleft = obj.offsetLeft || 0;
			var curtop 	= obj.offsetTop || 0;
			
			while (obj = obj.offsetParent) {
				curleft += obj.offsetLeft;
				curtop 	+= obj.offsetTop;
			}
			
			return {x:curleft,y:curtop};
		},
		hideControl: function(controlid)
		{
			if (FormOGM.Autocomplete.timeout) {
				clearTimeout(FormOGM.Autocomplete.timeout);
			}
			
			FormOGM.Autocomplete.timeout = setTimeout('FormOGM.Autocomplete.hideControlNow(\'' + controlid + '\')', 250);
		}, 
		hideControlNow: function(controlid)
		{
			if (FormOGM.Autocomplete.timeout) {
				clearTimeout(FormOGM.Autocomplete.timeout);
			}
			
			if ($('#' + controlid + '_autocomplete').is(':visible')) {
				$('#' + controlid + '_autocomplete').hide();
			}
		}, 
		highlightElement: function(previousPos, newPos)
		{
		    var prevItemResult 	= FormOGM.Autocomplete.elements.get(previousPos);
		    var newItemResult 	= FormOGM.Autocomplete.elements.get(newPos);
		    
		    if (prevItemResult != null) {
		    	$(prevItemResult).css('background-color', '#fff').removeClass('formogm_autocomplete_result_hover');
		    }
		    
		    if (newItemResult != null) {
		    	$(newItemResult).css('background-color', '#ffffaf').addClass('formogm_autocomplete_result_hover');
		    	return $(newItemResult).attr('title');
		    }
		}, 
		inlineSearch: function(event, field, table, limit, scopes)
		{
		    var control 	= Event.element(event);
		    var keyCode 	= event.keyCode ? event.keyCode : event.which;  
		    var letter 		= keyCode != Event.KEY_DOWN && keyCode != Event.KEY_UP && keyCode != Event.KEY_RETURN && keyCode != Event.KEY_ESC;       
		    var $control	= $('#' + control.id);
		    var $target 	= $('#' + control.id + '_autocomplete');
		    var $title		= $('#' + control.id + '_autocomplete .formogm_autocomplete_title');
		    var $results	= $('#' + control.id + '_autocomplete .formogm_autocomplete_results');
		    
		    if (letter && control.value.length > 0)
		    {    	
		        new Ajax.Request(FormOGM.path + 'autocomplete.formogm.php', {
		            method: 'get',
		            parameters: { 
		            	'nameFragment'	: control.value, 
		            	'field'			: field, 
		            	'table'			: table, 
		            	'limit'			: limit,
		            	'scopes'		: scopes
		            },
		            onSuccess:  function(transport) {
		                var results = eval('(' + transport.responseText + ')');
		                var coords 	= FormOGM.Autocomplete.findCoords(control);
		                
		                if (results.SearchCharacters == control.value)
		                {
		                    FormOGM.Autocomplete.elements = new Hash();
		                    FormOGM.Autocomplete.position = -1;
		                    
		                    var matches = results.ResultsCount + (parseInt(results.ResultsCount) == 1 ? ' corrispondenza' : ' corrispondenze'); 
		                    
		                    $title.html(matches);	// Aggiorna il titolo con il numero delle corrispondenze trovate
		                    $results.html('');		// Svuota la lista di risultati per ricominciarne la popolazione
		                    $target.css({
	                    		width: 'auto', 
			        			top: (coords.y + control.offsetHeight) + 'px',
			        			left: coords.x + 'px', 
		                		boxShadow: 'rgba(0,0,0,0.35) 0px 8px 24px', 
		                		MozBoxShadow: 'rgba(0,0,0,0.35) 0px 8px 24px', 
		                		khtmlBoxShadow: 'rgba(0,0,0,0.35) 0px 8px 24px', 
		                		webkitBoxShadow: 'rgba(0,0,0,0.35) 0px 8px 24px'
			        		});
		                    
		                    if (results.Results.length > 0) {
		                    	$target.show();
		                    }
		                    else {
		                    	$target.hide();
		                    }
		                    
		                    // Lista risultati
		                    for (var i = 0; i < results.Results.length; i++)
		                    {
		                        var info 		= results.Results[i];
		                        var resultText	= UrlText.decode(info.Value);
		                        var resultLink 	= $('<a></a>').append(resultText).attr({
		                        	href: 'javascript: void(0);', 
		                        	style: 'display: block; width: auto; margin: 0px; padding: 2px 3px; background-color: #fff; color: #000; font-size: 1em; text-decoration: none; white-space: nowrap; cursor: default;',
		                        	title: resultText,
		                        	index: i	// Attributo personalizzato per ricavare l'indice numerico di ciascun link al passaggio del mouse
		                        }).mouseover(function() {
		                        	FormOGM.Autocomplete.highlightElement(FormOGM.Autocomplete.position, $(this).attr('index'));
		                        	FormOGM.Autocomplete.position = $(this).attr('index');
		                        }).addClass('formogm_autocomplete_result');
		                        
		                        $(resultLink).click(function(event) {
		                        	event.preventDefault(); 
		                        	event.stopPropagation();
		                        	control.value = Event.element(event).title;
//		                        	FormOGM.Autocomplete.hideControl(control.id);
		                        	$control.change();
		                        	$control.focus();
		                        });
		                        $results.append(resultLink);
		                        
		                        FormOGM.Autocomplete.elements.set(i, resultLink);
		                    }
		                    
		                    // Adatta il contenitore alla larghezza del campo di testo se ad essa inferiore (se maggiore mantiene la larghezza del contenuto)
		                    if ($target.width() < control.offsetWidth) {
		                    	$target.css({
				        			width: control.offsetWidth + 'px'
		                    	});
		                    }
		                    
		                    $control.blur(function(event) {
		                    	FormOGM.Autocomplete.hideControl(Event.element(event).id);
		                    });            
		                }
		            }        
		        });
		    }
		    else if (letter && control.value.length == 0) {
		    	FormOGM.Autocomplete.hideControl(control.id);
		    }
		}, 
		observe: function(controlid, field, table, limit, scopes) 
		{
			$('#' + controlid).keyup(function (event) {
				FormOGM.Autocomplete.inlineSearch(event, field, table, limit, scopes);
			});
			$('#' + controlid).keydown(function (event) {
				FormOGM.Autocomplete.updateSearch(event);
			});
		}, 
		updateSearch: function(event)
		{
		    var control = Event.element(event);
		    var keyCode = event.keyCode ? event.keyCode : event.which;
		    
		    if (keyCode == Event.KEY_DOWN)
		    {
		        if (FormOGM.Autocomplete.position < FormOGM.Autocomplete.elements.keys().length - 1)
		        {
		            control.value = FormOGM.Autocomplete.highlightElement(
		            	FormOGM.Autocomplete.position, 
		            	++FormOGM.Autocomplete.position
		            );
		            
//		            $('#' + control.id).text();
		        }            
		    }
		    else if (keyCode == Event.KEY_UP)
		    {
		        if (FormOGM.Autocomplete.position > 0)
		        {
		            control.value = FormOGM.Autocomplete.highlightElement(
		            	FormOGM.Autocomplete.position, 
		            	--FormOGM.Autocomplete.position
		            );
		        }
		        
		        Event.stop(event);
		    }
		    else if (keyCode == Event.KEY_RETURN)
		    {
		        if ($('#' + control.id + '_autocomplete').is(':visible'))
		        {
		            var itemResult = FormOGM.Autocomplete.elements.get(FormOGM.Autocomplete.position);
		            
		            if (itemResult != null)
		            {
		                control.value = $(itemResult).attr('title');
		                FormOGM.Autocomplete.hideControlNow(control.id);
		                $('#' + control.id).get(0).blur();	// Se eliminato, su Firefox effettua il submit!
		                event.preventDefault();
		            }
		        }
		    }
		    else if (keyCode == Event.KEY_ESC)
		    {
		    	FormOGM.Autocomplete.hideControl(control.id);
		    }
		}
	}, 
	Dynamic: 
	{
		targets: new Object(), 
		target:	function(appendexception, appendoption, enumeration, standardoptions, startoption)
		{
			this.appendexception	= appendexception;
			this.appendoption		= appendoption;
			this.enumeration		= enumeration;
			this.standardoptions	= new Array();
			this.startoption		= startoption;
			this.standardoption		= function(value, text)
			{
				this.value	= value;
				this.text	= text;
			};
			
			if (! is_array(this.appendexception)) {
				this.appendexception = [this.appendexception];
			}
			
			for (var i = 0; i < standardoptions.length; i++)
			{
				if (is_array(standardoptions[i])) {
					this.standardoptions.push(new this.standardoption(standardoptions[i][0], standardoptions[i][1]));
				}
			}
		}, 
		loadDataList: function(targetid, relatedid, source, params, value, text, fetch, enumerator, offset, append, defaults, selected, query)
		{
			this.loadDataList = function(targetid, relatedid, source, params, value, text, fetch, enumerator, offset, append, defaults, selected, query)
			{
				var url = query ? FormOGM.path + 'datalist.formogm.php?' + query : FormOGM.path + 'datalist.formogm.php';
				new Ajax.Request(url, {
			        method: 'get',
			        parameters: { 
						'source'	: source, 
						'params[]'	: params, 
						'value'		: value, 
						'text'		: text, 
						'fetch'		: fetch
			        },
			        onSuccess: function(transport) {
			            var results = eval('(' + transport.responseText + ')');
			            FormOGM.Dynamic.setDataList(results.Results, targetid, relatedid, enumerator, offset, append, defaults, selected);
			        }
				});
			};
			
			this.setDataList = function(results, targetid, relatedid, enumerator, offset, append, defaults, selected)
			{
				this.targetid	= targetid;		// Id select di destinazione
				this.relatedid	= relatedid;	// Id campo sorgente dati che ha innescato la modifica delle opzioni della select
				this.enumerator	= enumerator ? enumerator.replace(/&nbsp;/g, ' ') : '';	// Stringa di formattazione per la numerazione dei risultati
				this.offset		= offset;		// Numero di elementi iniziali fissi, da mantenere al cambiamento delle opzioni
				this.append		= append;		// Opzione fissa finale facoltativa
				this.defaults	= defaults;		// Valori di partenza di tutti i campi relazionati mediante evento onchange alla select di destinazione
				this.selected	= selected;		// Valore di partenza della select di destinazione
				this.current	= new Array();	// Valore della select di sestinazione prima dell'evento
				
				this.addElement = function(obj, value, text, selected, id, disabled)
				{ 
					var option = $('<option></option>').attr({
                    	'value': value
                    }).text(text);
					
					if (id) {
						option.attr('id', id);
					}
					
					if (selected) {
						option.attr('selected', selected);
					}
					
					if (disabled) {
						option.attr('disabled', 'disabled');
					}
					
                    try {
                    	obj.append(option);
                    } 
                    catch(e) {
                    }
				};
				
				this.addGroup = function(obj, label, value)
				{
                    var optgroup = $('<optgroup></optgroup>').attr({
                    	'label': label
                    });
                    this.addResults(optgroup, value);
                    
                    try {
                    	obj.append(optgroup);
                    } 
                    catch(e) {
                    }
				};
				
				this.addResults = function(obj, results)
				{
					var regexp 		= /%s/i;	// Segnaposto per sostituzione stile sprintf
					var value 		= null;
					var text 		= null;
					var selected 	= null;
					var selection	= false;
					
					for (var i = 0; i < results.length; i++)
					{
						var result = results[i];
						
						value 	= UrlText.decode(result.Value);
						text 	= UrlText.decode(result.Text);
						
						if (is_array(result.Value))
						{
							this.addGroup(obj, text, result.Value);
						}
						else
						{
							text 		= this.enumerator && this.enumerator.match(regexp) ? sprintf(this.enumerator, text) : this.enumerator + '' + text;
							text 		= this.enumerator ? (i + this.offset + 1) + '' + text : text;
							selected	= in_array(value, this.selected) && this.isDefault(this.relatedid) ? true : false;
							selected	= in_array(value, this.current) && ! this.enumerator && ! result.Disabled ? true : selected;
							selection	= selected ? true : selection;
							
							this.addElement(obj, value, text, selected, result.Id, result.Disabled);
						}
					} 
					
					return selection;
				};
				
				this.isDefault = function(field)
				{
					var response = true;
					
					if (field)
					{
						var _default = this.defaults[field];
						
						switch ($('#' + field).attr('type'))
						{
							case 'hidden':
							case 'text':
								
								if (! in_array($('#' + field).val(), _default)) {
									response = false;
								}
								
								break;
								
							default:
								
								$('#' + field + ' option:selected').each(function() {
									if (! in_array($(this).attr('value'), _default)) {
										response = false;
									}
								});
						}
					}
					else
					{
						for (field in this.defaults) 
						{
							if (this.isDefault(field) == false) {
								response = false;
								break;
							}
						}
					}
					
					return response;
				};
				
				this.parseResults = function(results)
				{
					var $target	= $('#' + this.targetid);
					var target 	= document.getElementById(this.targetid);
					var current	= new Array();
					
					// Abbandona se non trova la select di destinazione
					if (! target || target.nodeName != 'SELECT') {
						return;
					}
					
					// Memorizza il valore o i valori selezionati prima della modifica
					$('#' + this.targetid + ' option:selected').each(function() {
						current.push($(this).attr('value'));
					});
					this.current = current;
					
					// Rimuove dalla select tutti i risultati oltre l'intervallo di elementi fissi stabilito
					this.removeElements(target, this.offset);
					
					// Accoda alla select tutti gli elementi trovati
					var selection = this.addResults($target, results);
					
					// Accoda l'opzione aggiuntiva a meno che i campi associati non abbiano tutti i valori predefiniti iniziali 
					if (this.append && this.isDefault() == false)
					{
						var value 		= value ? parseInt(value) : 0;
						value 			= this.enumerator ? value + 1 : this.append;
						var text 		= this.enumerator ? (results.length + this.offset + 1) + '' + this.append : this.append;
						var selected	= selection ? false : true;
						
						this.addElement($target, value, text, selected, null, null);
					}
					
					// Forza l'evento onchange sul campo modificato, altrimenti non innescato automaticamente
					$target.change();
				};
				
				this.removeElements = function(obj, offset)
				{ 
					while (obj.options.length > offset) { 
						obj.remove(offset); 
					}
					
					$('#' + this.targetid).children('optgroup').each(function() {
						$(this).remove(); 
					});
				};
				
				this.parseResults(results);
			};
			
			this.loadDataList(targetid, relatedid, source, params, value, text, fetch, enumerator, offset, append, defaults, selected, query);
		}
	},
	CKFinder:
	{
		InputField: null,
		SwitchField: null,
		BrowseServer: function(subfolder, inputfield, switchfield)
		{
			FormOGM.CKFinder.InputField = inputfield;
			FormOGM.CKFinder.SwitchField = switchfield;
			
			var finder = new CKFinder();
			finder.basePath = '../../';
			finder.startupPath = subfolder;
			finder.selectActionFunction = FormOGM.CKFinder.SetFileField;
			finder.popup();
		}, 
		SetFileField: function(fileurl)
		{
			if (FormOGM.CKFinder.SwitchField) {
				$('#' + FormOGM.CKFinder.SwitchField).hide();
				$('#' + FormOGM.CKFinder.InputField).show();
			}
			
			$('#' + FormOGM.CKFinder.InputField).val(fileurl);
		}
	},
	List:
	{
		AddItem: function(button, index)
		{
			var $list 		= $(button).parent().parent();
			var list_row	= $(button).parent().attr('id').match(/formogm_list([0-9]+)_row/)[0];
			var html 		= $list.children('.formogm_list_row').last().html();
			var items 		= $list.children('.formogm_list_row').length;
			var regexp1		= eval('/name=([^ >]+)'+ (items - 1) +'\\]("| |>)/gi');
			var regexp2		= eval('/id=([^ >]+)'+ (items - 1) +'("| |>)/gi');
			var regexp3		= eval('/onclick=([^>]+), '+ (items - 1) +'\\); return false/gi');
			
			html = html.replace(regexp1, 'name=$1'+ items +']$2');
			html = html.replace(regexp2, 'id=$1'+ items +'$2');
			html = html.replace(regexp3, 'onclick=$1, '+ items +'); return false');
			
			var row = $('<div></div>').attr({
            	'id'	: list_row + items, 
            	'class'	: 'formogm_list_row', 
            	'style'	: 'padding-left: 0px'
            }).html(html);
			
			// Accoda nell'HTML il nuovo elemento, quindi slitta i valori dei campi a partire dalla riga relativa al bottone premuto
			$list.append(row);
			FormOGM.List.ShiftItemsDown($list, index, items);
			
			// Riapplica l'effetto per i campi con testo di suggerimento dopo l'aggiunta del nuovo campo, che non l'avrebbe altrimenti
			$('.formogm_hints').blur(function() {
				if ($(this).val() == '') {
					$(this).addClass('formogm_hint');
					$(this).val($(this).attr('title'));
				}
			});
			$('.formogm_hints').focus(function() {
				if ($(this).val() == $(this).attr('title')) {
					$(this).removeClass('formogm_hint');
					$(this).val('');
				}
			});
		}, 
		DeleteItem: function(button, index)
		{
			var $list 		= $(button).parent().parent();
			var item		= $(button).parent().attr('id');
			var items 		= $list.children('.formogm_list_row').length;
			var fieldname	= FormOGM.List.GetIndentFieldName(item, false);
			var prev_item	= item.replace(/_row([0-9]+)$/, '_row'+ (index - 1));
			
			// Riduce l'indentazione dell'elemento da cancellare, in modo che eventuali elementi sottostanti vengano rientrati
			if (index == 0 && items > 1 || FormOGM.List.GetIndent(item) > FormOGM.List.GetIndent(prev_item)) {
				FormOGM.List.UnindentItem(button, fieldname, index, false);
			}
			
			// Slitta i dati indietro di un elemento, svuotando semplicemente i campi nel caso dell'ultimo
			FormOGM.List.ShiftItemsUp($list, index, items);
			
			// Elimina l'ultimo elemento, a meno che non sia il solo rimasto
			if (items > 1) {
				FormOGM.List.UnsetIndent(item.replace(/_row([0-9]+)$/, '_row'+ (items - 1)));
				$list.children('.formogm_list_row:last-child').remove();
			}
			
			return;
			
			$(button).parent().children('input').each(function() {
				var type = $(this).attr('type');
				
				switch (type)
				{
					case 'checkbox':
					case 'radio':
						
						$(this).attr('checked', false);
						break;
						
					case 'password':
					case 'text':
						
						if ($(this).hasClass('formogm_hints')) {
							$(this).addClass('formogm_hint');
							$(this).val($(this).attr('title'));
						}
						else {
							$(this).val('');
						}
						
						break;
				}
			});
			$(button).parent().children('select').each(function() {
				$(this).attr('selectedIndex', -1);
			});
			$(button).parent().children('textarea').each(function() {
				if ($(this).hasClass('formogm_hints')) {
					$(this).addClass('formogm_hint');
					$(this).val($(this).attr('title'));
				}
				else {
					$(this).val('');
				}
			});
			$(button).parent().children('div, span').each(function() {
				FormOGM.List.DeleteItem($(this).children().first());
			});
		}, 
		GetIndent: function(item)
		{
			var field = FormOGM.List.GetIndentField(item);
			return $('#'+ field).val();
		}, 
		GetIndentField: function(item) 
		{
			var fieldname = FormOGM.List.GetIndentFieldName(item);
			return $('input[name="'+ fieldname +'"]').first().attr('id');
		}, 
		GetIndentFieldName: function(item, indexed) 
		{
			var onclick 	 = $('#'+ item).children('.formogm_list_indent').attr('onclick') +'';	// Stringa vuota per convertire da funzione in stringa
			var fieldname 	 = onclick.split('\'')[1];												// Nome dell'array di campi che conserva i valori di indentazione
			fieldname		 = fieldname == undefined ? onclick.split('"')[1] : fieldname;			// In firefox le virgolette sono viste come doppie
			
			if (indexed !== false) {
				var index	 = item.match(/([0-9]+)$/)[0];
				fieldname	+= '['+ index +']';
			}
			
			return fieldname;
		}, 
		IndentItem: function(button, fieldname, index, recursive)
		{
			var indented	= 0;
			var prev_index 	= index - 1;
			var next_index 	= index + 1;
			
			// Indenta l'elemento se il precedente ha indentazione uguale o maggiore (ovvero non se sia gia' indentato in esso)
			$('input[name="'+ fieldname +'['+ prev_index +']"]').each(function() {
				var prev_indent = $(this).val();
				
				$('input[name="'+ fieldname +'['+ index +']"]').each(function() {
					var indent = $(this).val();
					
					if (indent <= prev_indent) {
						FormOGM.List.SetIndent($(button).parent().attr('id'), parseInt(indent) + 1);
						indented++;
						
						// Itera su tutti gli elementi sottostanti fino al primo elemento indentato esternamente
						while (next_index)
						{
							var subindented = 0;
							
							// Indenta anche gli elementi successivi se indentati in quello corrente
							$('input[name="'+ fieldname +'['+ next_index +']"]').each(function() {
								var next_indent = $(this).val();
								var next_button = $(button).attr('id').replace(/_([0-9]+)$/, '_'+ next_index);
								
								if (indent < next_indent || indent == next_indent && recursive === true) {
									subindented = FormOGM.List.IndentItem($('#'+ next_button), fieldname, next_index, true);
								}
							});
							
							if (subindented > 0) {
								indented 	+= subindented;
								next_index 	+= subindented;
							} else {
								next_index 	 = false;	// Interrompe l'iterazione sugli elementi successivi
							}
						}
					}
				});
			});
			
			return indented;
		}, 
		SetIndent: function(item, indent)
		{
			var field 		= FormOGM.List.GetIndentField(item);
			var indented 	= indent > 0 ? 'inline' : 'none';
			
			// In assenza di id del campo nascosto contenente il valore di indentazione, viene aggiunto al form il relativo input ancora inesistente
			if (! field && FormOGM.List.GetIndentField(item.replace(/_row([0-9]+)$/, '_row0'))) 
			{
				var fieldname	= FormOGM.List.GetIndentFieldName(item);
				var $form 		= $('#'+ item).parent();
				
				while ($form && ! $form.is('form')) {
					$form = $form.parent();
				}
				
				field		= fieldname.replace(/(\[|\])/g, '_').replace(/([_]{2,})/, '_').replace(/(_)$/, '');
				var input 	= $('<input></input>').attr({
					'type'	: 'hidden', 
					'name'	: fieldname, 
	            	'id'	: field, 
	            	'value'	: indent
	            });
				$form.append(input);
			}
			else if (! field) 
			{
				// Abbandona se oltre a non aver trovato l'id non esiste alcun campo nascosto per l'indentazione ad indice 0, ovvero se la lista non risulta indentabile
				return;
			}
			
			$('#'+ field).val(indent);
			$('#'+ item).css('padding-left', (Math.max(0, indent - 1) * 19) + 'px');
			$('#'+ item).children('span.indenter').each(function() {
				$(this).css('display', indented);
			});
			
			/*
			var fn = FormOGM.List.GetIndentFieldName(item, false);
			var indents = 'SET INDENT\n----------';
			
			$('input[name^='+fn+']').each(function() {
				indents += '\n'  + $(this).attr('name') +' = '+ $(this).val();
			});
			
			alert(indents);
			*/
		},
		ShiftItemsDown: function($list, index, items)
		{
			var item = items - 1;
			
			try {
				// Itera a ritroso gli elementi della lista, copiando nei campi i valori degli elementi precedenti
				$($list.children('.formogm_list_row').get().reverse()).each(function() {
					var id 			= $(this).attr('id');
					var targetid 	= id.replace(/([0-9]+)$/i, item);
					
					FormOGM.List.SetIndent(id, FormOGM.List.GetIndent(targetid));
					$(this).children('input').each(function() {
						var type 		= $(this).attr('type');
						var id 			= $(this).attr('id');
						var targetid 	= id.replace(/([0-9]+)$/i, item);
						var $target		= $('#'+ targetid);
						
						switch (type)
						{
							case 'checkbox':
							case 'radio':
								
								if (item == index) {
									$(this).attr('checked', false);
								}
								else {
									$(this).attr('checked', $target.attr('checked'));
									$(this).attr('class', $target.attr('class'));
								}
								
								break;
								
							case 'password':
							case 'text':
								
								if (item == index && $(this).hasClass('formogm_hints')) {
									$(this).addClass('formogm_hint');
									$(this).val($(this).attr('title'));
								}
								else if (item == index) {
									$(this).val('');
								}
								else {
									$(this).val($target.val());
									$(this).attr('class', $target.attr('class'));
								}
								
								break;
						}
					});
					$(this).children('select').each(function() {
						var id 			= $(this).attr('id');
						var targetid 	= id.replace(/([0-9]+)$/i, item);
						var $target		= $('#'+ targetid);
						
						if (item == index) {
							$(this).attr('selectedIndex', -1);
						}
						else {
							$(this).attr('selectedIndex', $target.attr('selectedIndex'));
							$(this).attr('class', $target.attr('class'));
						}
					});
					$(this).children('textarea').each(function() {
						var id 			= $(this).attr('id');
						var targetid 	= id.replace(/([0-9]+)$/i, item);
						var $target		= $('#'+ targetid);
						
						if (item == index && $(this).hasClass('formogm_hints')) {
							$(this).addClass('formogm_hint');
							$(this).val($(this).attr('title'));
						}
						else if (item == index) {
							$(this).val('');
						}
						else {
							$(this).val($target.val());
							$(this).attr('class', $target.attr('class'));
						}
					});
					
					// Interrompe una volta raggiunto l'elemento indicato
					if (item-- == index) {
						return false;
					}
				});
			}
			catch(e) {
			}
			return;
			
			$(button).parent().children('div, span').each(function() {
				FormOGM.List.ShiftItemsDown($(this).children().first(), index, lastrow);
			});
		}, 
		ShiftItemsUp: function($list, index, items)
		{
			try {
				// Itera gli elementi della lista, copiando nei campi i valori degli elementi successivi
				$list.children('.formogm_list_row').slice(index, items).each(function() {
					var id 			= $(this).attr('id');
					var item		= id.match(/([0-9]+)$/i)[0];
					var targetid 	= id.replace(/([0-9]+)$/i, parseInt(item) + 1);
					
					if (parseInt(item) + 1 < items) {
						FormOGM.List.SetIndent(id, FormOGM.List.GetIndent(targetid));
					}
					
					$(this).children('input').each(function() {
						var type 		= $(this).attr('type');
						var id 			= $(this).attr('id');
						var item		= id.match(/([0-9]+)$/i)[0];
						var targetid 	= id.replace(/([0-9]+)$/i, parseInt(item) + 1);
						var $target		= $('#'+ targetid);
						
						switch (type)
						{
							case 'checkbox':
							case 'radio':
								
								if (item == items) {
									$(this).attr('checked', false);
								}
								else {
									$(this).attr('checked', $target.attr('checked'));
									$(this).attr('class', $target.attr('class'));
								}
								
								break;
								
							case 'password':
							case 'text':
								
								if (item == items) {
									$(this).val('');
								}
								else {
									$(this).val($target.val());
									$(this).attr('class', $target.attr('class'));
								}
								
								break;
						}
					});
					$(this).children('select').each(function() {
						var id 			= $(this).attr('id');
						var item		= id.match(/([0-9]+)$/i)[0];
						var targetid 	= id.replace(/([0-9]+)$/i, parseInt(item) + 1);
						var $target		= $('#'+ targetid);
						
						if (item == items) {
							$(this).attr('selectedIndex', -1);
						}
						else {
							$(this).attr('selectedIndex', $target.attr('selectedIndex'));
							$(this).attr('class', $target.attr('class'));
						}
					});
					$(this).children('textarea').each(function() {
						var id 			= $(this).attr('id');
						var item		= id.match(/([0-9]+)$/i)[0];
						var targetid 	= id.replace(/([0-9]+)$/i, parseInt(item) + 1);
						var $target		= $('#'+ targetid);
						
						if (item == items) {
							$(this).val('');
						}
						else {
							$(this).val($target.val());
							$(this).attr('class', $target.attr('class'));
						}
					});
				});
			}
			catch(e) {
			}
		}, 
		UnindentItem: function(button, fieldname, index, recursive)
		{
			var unindented = 0;
			var next_index = index + 1;
			
			$('input[name="'+ fieldname +'['+ index +']"]').each(function() {
				var indent = $(this).val();
				
				// Nessuna indentazione inferiore a 0, a meno che il metodo non sia stato attivato da altro metodo (recursive undefined da pulsante)
				if (indent > 0 || recursive === false) {
					FormOGM.List.SetIndent($(button).parent().attr('id'), parseInt(indent) - 1);
					unindented++;
					
					// Itera su tutti gli elementi sottostanti fino al primo elemento indentato esternamente
					while (next_index)
					{
						var subunindented = 0;
						
						// Riduce l'indentazione anche degli elementi successivi se indentati in quello corrente
						$('input[name="'+ fieldname +'['+ next_index +']"]').each(function() {
							var next_indent = $(this).val();
							var next_button = $(button).attr('id').replace(/_([0-9]+)$/, '_'+ next_index);
							
							if (indent < next_indent || indent == next_indent && recursive === true) {
								subunindented = FormOGM.List.UnindentItem($('#'+ next_button), fieldname, next_index, true);
							}
						});
						
						if (subunindented > 0) {
							unindented 	+= subunindented;
							next_index 	+= subunindented;
						} else {
							next_index 	 = false;	// Interrompe l'iterazione sugli elementi successivi
						}
					}
				}
			});
			
			return unindented;
		}, 
		UnsetIndent: function(item)
		{
			var field = FormOGM.List.GetIndentField(item);
			
			if (field) {
				$('#'+ field).remove();
			}
			
			/*
			var fn = FormOGM.List.GetIndentFieldName(item, false);
			var indents = 'UNSET INDENT\n------------';
			
			$('input[name^='+fn+']').each(function() {
				indents += '\n'  + $(this).attr('name') +' = '+ $(this).val();
			});
			
			alert(indents);
			*/
		}
	},
	Panel:
	{
		HtmlTab: new Hash(), 
		Panels: 0, 
		SubPanels: 0, 
		Tabs: new Hash(), 
		AddTab: function(tabselector) {
//			$(tabselector +' .addtab').unbind('click');
	        $(tabselector +' .addtab').click(function() {
	        	var tabid	= $(tabselector +' div[id^=panel]').length 
	        				? 'panel-' + (++FormOGM.Panel.Panels) 
	        				: 'subpanel-' + (++FormOGM.Panel.SubPanels);
	            var length 	= $(tabselector).children('ul').children().length;
	            var index 	= FormOGM.Panel.Tabs.get(tabselector);
	            var title 	= $(this).attr('title') + index;
	            var html	= FormOGM.Panel.HtmlTab.get(tabselector);
	            var regexp1	= eval('/name=([^ >]+)\\[1000\\](\\[|"| |>)/gi');
    			var regexp2	= eval('/id=([^ >]+)_1000(_|"| |>)/gi');
    			
    			html = html.replace(regexp1, 'name=$1['+ (index - 1) +']$2');
    			html = html.replace(regexp2, 'id=$1_'+ (index - 1) +'$2');
    			
    			$(tabselector).append('<div id="'+ tabid +'" class="formogm_block">'+ html +'</div>');
 //   			$(tabselector).tabs('add', '#'+ tabid, title +' &nbsp;<span class="removetab" style="cursor: pointer">X</span>', length - 1);
    			$(tabselector).tabs('add', '#'+ tabid, title +'</span></a><a href="javascript:" class="removetab"><span>X', length - 1);
    			$(tabselector).tabs().tabs('select', length - 1);
    			
    			FormOGM.Panel.Tabs.set(tabselector, index + 1);
    			FormOGM.Panel.RemoveTab(tabselector);
    			
	            return false;
	        });
	    }, 
		CloneTab: function(tabselector) 
		{
        	var index = $(tabselector).tabs('length') - 1;
        	var $tabs = $(tabselector +' ul').children();
        	
        	if (index && $tabs.last('li').children('a').attr('class') == 'addtab') {
        		var href 	= $tabs.last('li').prev().children('a').attr('href');
        		var html	= $(href).html();
        		var regexp1	= eval('/name=([^ >]+)\\['+ (index - 1) +'\\](\\[|"| |>)/gi');
    			var regexp2	= eval('/id=([^ >]+)_'+ (index - 1) +'(_|"| |>)/gi');
    			
    			html = html.replace(regexp1, 'name=$1[1000]$2');
    			html = html.replace(regexp2, 'id=$1_1000$2');
    			
    			// Archivia il modello Html per i nuovi tab e conta i pannelli nella pagina e nell'elemento per operazioni successive
    			FormOGM.Panel.HtmlTab.set(tabselector, html);
    			FormOGM.Panel.Panels = $('div[id^=panel]').length;
    			FormOGM.Panel.SubPanels = $('div[id^=subpanel]').length;
    			FormOGM.Panel.Tabs.set(tabselector, index + 1);
        	}
        },
	    RemoveTab: function(tabselector) {
        	$(tabselector +' .removetab').unbind('click');
            $(tabselector +' .removetab').click(function() {
 //           	var index = $(this).parent().parent().parent().index();
            	var index = $(this).parent().index();
            	// Mantiene almeno due elementi: un tab normale e quello per l'aggiunta di nuovi tab
            	if ($(tabselector).tabs('length') > 2 && index >= 0) {
            		$(tabselector).tabs('remove', index);
            	}
            });
        },
        SetPanel: function(tabselector, panel) {
        	panel = panel ? panel : parseInt(window.location.hash.split('#panel')[1]) - 1;
        			
			if (panel) {
				$(tabselector).tabs({
					add: function(event, ui) {
						
					},
					show: function(event, ui) {
						if (ui.index == $(this).tabs('length') - 1 && FormOGM.Panel.Tabs.get(tabselector)) {
							$(this).tabs('select', ui.index - 1);
						}
					}
				}).tabs('select', panel);
			} else {
				$(tabselector).tabs({
					add: function(event, ui) {
						
					},
					show: function(event, ui) {
						if (ui.index == $(this).tabs('length') - 1 && FormOGM.Panel.Tabs.get(tabselector)) {
							$(this).tabs('select', ui.index - 1);
						}
					}, 
					remove: function(event, ui) {
						$(this).tabs('select', ui.index - 1);
					}
		        });
			}
        			
        	FormOGM.Panel.AddTab(tabselector);
        	FormOGM.Panel.RemoveTab(tabselector);
        	FormOGM.Panel.CloneTab(tabselector);
        }
	},
	TableText:
	{
		AddRow: function(button, row)
		{
			var $tr		= row ? $(button).parent().parent() : $(button).parent().parent().parent().next().children('tr:first-child');
			var $tbody	= $tr.parent();
			var html 	= $tr.html();
			var rows 	= $tbody.children('tr').length;
			var regexp1	= eval('/>'+ Math.max(1, row) +'&nbsp;&nbsp;<\\/th>/gi');
			var regexp2	= eval('/name=([^ >]+)'+ Math.max(1, row) +'\\]("| |>)/gi');
			var regexp3	= eval('/id=([^ >]+)'+ Math.max(1, row) +'("| |>)/gi');
			var regexp4	= eval('/\\(this, '+ Math.max(1, row) +'\\); return false/gi');
			
			html = html.replace(regexp1, '>'+ (rows + 1) +'&nbsp;&nbsp;</th>');
			html = html.replace(regexp2, 'name=$1'+ (rows + 1) +']$2');
			html = html.replace(regexp3, 'id=$1'+ (rows + 1) +'$2');
			html = html.replace(regexp4, '(this, '+ (rows + 1) +'); return false');
			html = $('<tr></tr>').html(html);
			
			// Accoda nell'HTML il nuovo elemento, quindi slitta i valori dei campi a partire dalla riga relativa al bottone premuto
			$tbody.append(html);
			FormOGM.TableText.ShiftRowsDown($tr, row, rows);
			
			// Riapplica l'effetto per i campi con testo di suggerimento dopo l'aggiunta del nuovo campo, che non l'avrebbe altrimenti
			$('.formogm_hints').blur(function() {
				if ($(this).val() == '') {
					$(this).addClass('formogm_hint');
					$(this).val($(this).attr('title'));
				}
			});
			$('.formogm_hints').focus(function() {
				if ($(this).val() == $(this).attr('title')) {
					$(this).removeClass('formogm_hint');
					$(this).val('');
				}
			});
		}, 
		DeleteRow: function(button, row)
		{
			var $tr		= $(button).parent().parent();
			var $tbody 	= $tr.parent();
			var rows 	= $tbody.children('tr').length;
			
			// Slitta i dati indietro di una riga, svuotando semplicemente i campi nel caso dell'ultima
			FormOGM.TableText.ShiftRowsUp($tr, row, rows);
			
			// Elimina l'ultima riga, a meno che non sia la sola rimasta
			if (rows > 1) {
				$tbody.children('tr:last-child').remove();
			}
		}, 
		ShiftRowsDown: function($tr, row, rows)
		{
			var $tbody = $tr.parent();
			
			try {
				// Itera a ritroso le righe della tabella, copiando i valori nei campi input contenuti dai corrispondenti della riga precedente
				$($tbody.children('tr').get().reverse()).each(function() {
					$(this).children('td').each(function() {
						$(this).children('input[type="text"]').each(function() {
							var id 			= $(this).attr('id');
							var targetid 	= id.replace(/([0-9]+)$/i, rows);
							var $target		= $('#'+ targetid);
							
							if (rows == row && $(this).hasClass('formogm_hints')) {
								$(this).addClass('formogm_hint');
								$(this).val($(this).attr('title'));
							}
							else if (rows == row) {
								$(this).val('');
							}
							else {
								$(this).val($target.val());
								$(this).attr('class', $target.attr('class'));
							}
						});
					});
					
					// Interrompe una volta raggiunta la riga indicata
					if (rows-- == row) {
						return false;
					}
				});
			}
			catch(e) {
			}
		}, 
		ShiftRowsUp: function($tr, row, rows)
		{
			var $tbody	= $tr.parent();
			
			try {
				// Itera le righe della tabella, copiando i valori nei campi input contenuti dai corrispondenti della riga successiva
				$tbody.children('tr').slice(row - 1, rows).each(function() {
					$(this).children('td').each(function() {
						$(this).children('input[type="text"]').each(function() {
							var id 			= $(this).attr('id');
							var row			= id.match(/([0-9]+)$/i)[0];
							var targetid 	= id.replace(/([0-9]+)$/i, parseInt(row) + 1);
							var $target		= $('#'+ targetid);
							
							if (row == rows) {
								$(this).val('');
							}
							else {
								$(this).val($target.val());
								$(this).attr('class', $target.attr('class'));
							}
						});
					});
				});
			}
			catch(e) {
			}
		}
	}
};

try {
	$(document).ready(function() {
		var toggle = function() { /* div +/- */
			var legend		= $(this.parentNode).children('legend').text().replace(/ /gi, '_').replace(/&(.)[^;]*;/gi, 'ASD');
			var sign 		= $(this).html();
			var collapsed	= sign == '+' ? true : false;
			var margin 		= collapsed ? '2px' : '0px';
			var background 	= collapsed ? '#fff' : '#f1f1f1';
			var points		= collapsed ? 'none' : 'block';
			sign 			= collapsed ? '–' : '+';
			
			$(this.parentNode).children('.formogm_inputs').toggle(50);
			$(this.parentNode).children('.formogm_points').css('display', points);
			$(this.parentNode).css('background-color', background);
			$(this).css('margin-right', margin);
			$(this).html(sign);
			
			try {
				$('#collapse_' + legend).val(collapsed ? 0 : 1);
				$.cookie('formogm-collapse-' + legend, collapsed ? 0 : 1);
			}
			catch (e) {
			}
			
			return false;
		};
		var collapse = function() {	/* legend */
			var legend		= $(this).text().replace(/ /gi, '_');
			var sign 		= $(this.parentNode).children('div.formogm_toggle').html();
			var collapsed	= sign == '+' ? true : false;
			var margin 		= collapsed ? '2px' : '0px';
			var background 	= collapsed ? '#fff' : '#f1f1f1';
			var points		= collapsed ? 'none' : 'block';
			sign 			= collapsed ? '–' : '+';
			
			$(this.parentNode).children('.formogm_inputs').toggle(50);
			$(this.parentNode).children('.formogm_points').css('display', points);
			$(this.parentNode).css('background-color', background);
			$(this.parentNode).children('div.formogm_toggle').css('margin-right', margin);
			$(this.parentNode).children('div.formogm_toggle').html(sign);
			
			try {
				$('#collapse_' + legend).val(collapsed ? 0 : 1);
				$.cookie('formogm-collapse-' + legend, collapsed ? 0 : 1);
			}
			catch (e) {
			}
			
			return false;
		};
		$('.formogm_collapse').css('padding-top', '0px');
		$('.formogm_collapse div.formogm_toggle').css('visibility', 'visible');
		$('.formogm_collapse div.formogm_toggle').css('cursor', 'pointer');
		$('.formogm_collapse div.formogm_toggle').css('margin-right', '2px');
		$('.formogm_collapse div.formogm_toggle').click(toggle);
		$('.formogm_collapse legend').css('cursor', 'pointer');
		$('.formogm_collapse legend').click(collapse);
		$('.formogm_collapsed').css('padding-top', '0px');
		$('.formogm_collapsed').css('background-color', '#f1f1f1');
		$('.formogm_collapsed div.formogm_points').css('display', 'block');
		$('.formogm_collapsed div.formogm_toggle').css('visibility', 'visible');
		$('.formogm_collapsed div.formogm_toggle').css('cursor', 'pointer');
		$('.formogm_collapsed div.formogm_toggle').html('+');
		$('.formogm_collapsed div.formogm_toggle').click(toggle);
		$('.formogm_collapsed legend').css('cursor', 'pointer');
		$('.formogm_collapsed legend').click(collapse);
		$('.formogm_collapsed .formogm_inputs').hide();
		
		$('.formogm_hints').blur(function() {
			if ($(this).val() == '') {
				$(this).addClass('formogm_hint');
				$(this).val($(this).attr('title'));
			}
		});
		$('.formogm_hints').focus(function() {
			if ($(this).val() == $(this).attr('title')) {
				$(this).removeClass('formogm_hint');
				$(this).val('');
			}
		});
	});
} 
catch (e) {
}

/**
 * Esempio di costruzione URL via jquery
 *
var parameters = { 
	'lang'	: lang,
	'xml'	: FormOGM.form, 
	'edit'	: [itemid], 
	'fields': [fields]
};
var args = $.param(parameters, true);
$('#' + linkid).attr('href', FormOGM.path + 'quick.formogm.php?' + decodeURIComponent(args));
alert($('#' + linkid).attr('href'));
*/
