leo.form =  {

	/**
	 * Elements in read mode
	 * 
	 * @private
	 * @type {object}
	 */
	_elements:{},

	/**
	 * Create new object
	 * 
	 * @param {Object} link
	 * @param {funcionObject} onSuccessFunction
	 * @public
	 * @return {void}
	 */
	create: function(link, onSuccessFunction)
	{
		moduleController = this._getModuleController(link.getAttribute('id'));
		if ($(moduleController + '_')) {
			return;
		}

		ajax = new Ajax.Request(
			link.href, 
			{
				method: 'post',
				onSuccess: function(transport) {
					if (!$(moduleController + '_')) {
						$(moduleController).innerHTML = transport.responseText + 
	                    	                            $(moduleController).innerHTML;
					}
					if ((typeof(onSuccessFunction)) != "undefined") { 
						onSuccessFunction();
					}
				}
			}
		);
	},
	
	/**
	 * Edit existing object
	 * 
	 * @param {Object} link
	 * @param {funcionObject} onSuccessFunction
	 * @public
	 * @return {void}
	 */
	edit: function(link, onSuccessFunction)
	{
		recordId = this._getRecordId(link.getAttribute('id'));
		moduleController = this._getModuleController(link.getAttribute('id'));
		this._elements[moduleController + '_' + recordId] = $(moduleController + '_' + recordId).innerHTML;
        //alert('recordId: \'' +  recordId + '\' , moduleController: \'' + moduleController);
		ajax = new Ajax.Request(
			link.href, {
				method: 'get',
				onSuccess: function(transport,json) {
					$(moduleController + '_' + recordId).innerHTML = transport.responseText;
                    if(json)
                    {
                        if(true == json.withJavascript)
                            leo.form.innerHTML_js(transport.responseText,moduleController + '_' + recordId);
                    }
					if ((typeof(onSuccessFunction)) != "undefined") { onSuccessFunction(); }
				}
			}
		);
	},

	searchForm_submit: function(form, onSuccessFunction)
	{
		ajax = new Ajax.Request(
			form.action, {
				method: 'post',
				parameters: {content: Object.toJSON($(form.getAttributeNode('id').nodeValue).serialize(true))},
				onSuccess: function(transport, json) {
		    			$('result_box').innerHTML = transport.responseText;
                    			//alert(transport.getAllHeaders());
				}
			}
		);
	},
    // TODO (PETER): MERGE ALL SUBMIT FORMS FUNCTIONS
    easy_submit: function(form,el,onSuccessFunction)
	{
		ajax = new Ajax.Request(
			form.action, {
				method: 'post',
				parameters: {content: Object.toJSON($(form.getAttributeNode('id').nodeValue).serialize(true))},
				onSuccess: function(transport, json) {
                    //alert(transport.getAllHeaders());
                    if(true == json.valid) {
                        if(true == json.replace) {
                            // 26.08.2009 Peter changed innerHTML with replace
                            el.replace(transport.responseText);
                            //alert(transport.responseText);
                        }
                        if(true == json.replaceInnerHTML) {
                            // 26.08.2009 Peter changed innerHTML with replace
                            el.innerHTML = transport.responseText;
                        }
                        if(true == json.reload) {
                            window.location.href=window.location.href;
                        }
                        if(true == json.loadPage) {
                            window.location.href=json.loadPageURL;
                        }
                        if(typeof(json.replaceById) != "undefined")
                            json.replaceById.each(
                                function(item) {
                                    //alert('replace innerHTML of id :"' + item.id + '" to ' + item.content );
                                    $(item.id).replace(item.content);
                                }
                            );
                    }
                    if(true == json.messageLightWindow) {
                        leo.page.messageLightwindow(json.messageLightWindowText);
                    }
                    if(true == json.lightWindow) {
                        myLightWindow.activateWindow({href: json.lightWindowHref, width: lightWindowWidth4, height: lightWindowHeight, type: 'page', withJavascript: true});
                    }
                    if(true == json.showMessage) {
                        if(true == json.valid)
                            $(form.getAttributeNode('id').nodeValue + 'Error').removeClassName('error');
                        else 
                            $(form.getAttributeNode('id').nodeValue + 'Error').addClassName('error');
                            
                        $(form.getAttributeNode('id').nodeValue + 'Error').innerHTML = json.message;
                        
                    }
					if ((typeof(onSuccessFunction)) != "undefined") { onSuccessFunction(); }
				}
			}
		);
	},
    
	
	/**
	 * Submit form
	 * 
	 * @param {Object} form
	 * @param {funcionObject} onSuccessFunction
	 * @public
	 * @return {void}
	 */
	submit: function(form, onSuccessFunction)
	{
		recordId = this._getRecordId(form.getAttributeNode('id').nodeValue);
		moduleController = this._getModuleController(form.getAttributeNode('id').nodeValue);
		
		ajax = new Ajax.Request(
			form.action, {
				method: 'post',
				parameters: {content: Object.toJSON($(form.getAttributeNode('id').nodeValue).serialize(true))},
				onSuccess: function(transport, json) {
                    //alert(transport.getAllHeaders());
					if (true == json.valid) {
                        if (true == json.appendInsertation) {
                            recordId = json.record.id;
                            parentN = $(moduleController + '_').parentNode;
                            cloneN = $(moduleController + '_').cloneNode(false);           
                            $(moduleController + '_').setAttribute('id', moduleController + '_' + recordId);
                            parentN.insertBefore(cloneN,$(moduleController + '_' + recordId));                                            
                            $(moduleController + '_' + recordId).innerHTML = transport.responseText;
                        } else if (json.message) {
							if (json.record) {
								if (json.record.id) {
									recordId = json.record.id;
									$(moduleController + '_').setAttribute('id', moduleController + '_' + recordId);
								}
							}
                            if (json.reload) {
                                window.location.href=json.reload;
                                return;
                            }
							$(moduleController + '_' + recordId).innerHTML = transport.responseText;
                            
							//elMessage = $(moduleController + '_message_' + recordId);
							//elMessage.removeClassName('hide');
							//elMessage.innerHTML = json.message;
						}
                        
						if ((typeof(onSuccessFunction)) != "undefined") { /*alert("before OnSuccessFunction: " + onSuccessFunction);*/ onSuccessFunction(); }
					} else {
						elMessage = $(moduleController + '_message_' + recordId);
						elMessage.addClassName('error');
						elMessage.removeClassName('hide');
						elMessage.innerHTML = json.message;
						Object.keys(json.errors).each(
							function(key) {
                                //alert(moduleController + '_' + key + '_error_' + recordId);
								elError = $(moduleController + '_' + key + '_error_' + recordId);
                                elError.addClassName('error');
                                //alert(json.errors[key]);
								elError.innerHTML = json.errors[key];
								elError.removeClassName('hide');
							}
						);
					}
				}
			}
		);
	},

	/**
	 * SubmitSimple form
	 * 
	 * @param {Object} form
	 * @param {funcionObject} onSuccessFunction
	 * @public
	 * @return {void}
	 */
	replace: function(form, onSuccessFunction)
	{
		recordId = this._getRecordId(form.getAttributeNode('id').nodeValue);
		moduleController = this._getModuleController(form.getAttributeNode('id').nodeValue);
		
		ajax = new Ajax.Request(
			form.action, {
				method: 'post',
				parameters: {content: Object.toJSON($(form.getAttributeNode('id').nodeValue).serialize(true))},
				onSuccess: function(transport, json) {
					//alert(transport.responseText);
					if (true == json.valid) {
						if (json.message) {
							if (json.record) {
								if (json.record.id) {
									recordId = json.record.id;
									$(moduleController + '_').setAttribute('id', moduleController + '_' + recordId);
								}
							}
							$(moduleController + '_' + recordId).innerHTML = transport.responseText;
							
							elMessage = $(moduleController + '_message_' + recordId);
							elMessage.removeClassName('hide');
							elMessage.innerHTML = json.message;
						}
						if ((typeof(onSuccessFunction)) != "undefined") { onSuccessFunction(); }
					} else {
						elMessage = $(moduleController + '_message_' + recordId);
						elMessage.addClassName('error');
						elMessage.removeClassName('hide');
						elMessage.innerHTML = json.message;
						Object.keys(json.errors).each(
							function(key) {
								elError = $(moduleController + '_' + key + '_error_' + recordId);
								elError.innerHTML = json.errors[key];
								elError.removeClassName('hide');
							}
						);
					}
				}
			}
		);
	},

	/**
	 * Delete object
	 * 
	 * @param {Object} link
	 * @param {funcionObject} onSuccessFunction
	 * @public
	 * @return {void}
	 */
	remove: function(link, onSuccessFunction,sure)
	{
		recordId = this._getRecordId(link.getAttribute('id'));
		moduleController = this._getModuleController(link.getAttribute('id'));
        /*
		if (false == confirm(leo.translation.deleteConfirmationText)) {
			return;
		}*/
        if(sure != true)
        {
            leo.page.confirmLightwindow(leo.translation.deleteConfirmationText, function () { if(leo.page.confirmLightBoxReturnValue == true) leo.form.remove(link,onSuccessFunction,true);});
            return;
        }
		
		ajax = new Ajax.Request(
			link.href, 
			{
				method: 'post',
				onSuccess: function(transport, json) {
					if (true == json.valid) {
                        if (true == json.noRemove) {
                            if ((typeof(onSuccessFunction)) != "undefined") { onSuccessFunction(); }
                        } else {
                            el = $(moduleController + '_' + recordId);
                            el.parentNode.removeChild(el);
                            if ((typeof(onSuccessFunction)) != "undefined") { onSuccessFunction(); }
                        }
					} else {
                        leo.page.messageLightwindow(json.message);
						//alert (json.message);
					}
				}
			}
		);		
	},
	
	/**
	 * Cancel editing
	 * 
	 * @param {Object} form
	 * @public
	 * @return {void}
	 */
	reset: function(form)
	{
		recordId = this._getRecordId(form.getAttributeNode('id').nodeValue);
		moduleController = this._getModuleController(form.getAttributeNode('id').nodeValue);
		if ('' == recordId) {
			li = $(moduleController + '_');
			li.parentNode.removeChild(li);
		} else {
			$(moduleController + '_' + recordId).innerHTML = this._elements[moduleController + '_' + recordId];
		}
	},
	
	/**
	 * Upload file
	 * 
	 * @param {Object} form
	 * @param {String} progressUrl
	 * @public
	 * @return {void}
	 */
	upload: function(form, progressUrl)
	{
		//moduleController = this._getModuleController(form.getAttributeNode('id').nodeValue);
		elMessage = $('file_upload_message_');
		elMessage.addClassName('hide');		
		elMessage.innerHTML = '';
		ajax = new Ajax.PeriodicalUpdater('progress_win_hidden', progressUrl + '/id/' + $('progress_key').value, {
			method: 'get',
			frequency: 1,
			decay: 1.5,
			onSuccess: function(transport, json) {
				var percentage = 0;
				if (elMessage.innerHTML.length == 0) {
					if (typeof json.percentage != "undefined") {
						percentage = json.percentage
					}
					$('progress_win_balken').innerHTML = '<nobr>&nbsp;&nbsp;' + percentage + ' %</nobr>';
					$('progress_win_balken').style.width = eval(json.percentage + '* 2') + 'px';
					$('progress_win').style.display = 'block';
					if (1 == json.done) {
                        //alert("fertig2");
						ajax.stop();
					}
				}
			}
		});
        //alert("fertig");
		form.submit();
	},
    
    checkValueForLabelHidingKey: function(input,size)
	{
        if (typeof size == "undefined") {
            size = "";
        }
        var text = size + 'editFieldContentLabelError';
        $(input).removeClassName(text.toString());
        this.checkValueForLabelHiding(input,size);
	},
    checkValueForLabelHiding: function(input,size)
	{
        if (typeof size == "undefined") {
            size = "";
        }
        var text = '.' + size + 'editFieldContentLabel';
        //alert(text);
        if(input.value.length == 0) 
            $(input).previous(text.toString()).show(); 
        else 
            $(input).previous(text.toString()).hide();

	},
	
    checkValueForLabelHidingS: function(select)
	{
        
        var id = $(select)[$(select).selectedIndex].value;
        //alert($(select).selectedIndex + "  " + id);
        if(id.length == 0 || id == -1)
            $(select).previous('.comboBoxContentLabel').show(); 
        else
            $(select).previous('.comboBoxContentLabel').hide();
            
        if(id.length == 0 || id == -1)
            $(select).previous('.bigcomboBoxContentLabel').show(); 
        else
            $(select).previous('.bigcomboBoxContentLabel').hide();
	},
	
    setAutocompleteOptionParam: function(inputObject, optionName)
    {
        //zipcode_autocomplete.options.defaultParams = "country_id=" + input.value;
        //zipcode_autocomplete.options.defaultParams = optionName + "=" + inputObject.value;
        //state_autocomplete.options.defaultParams = optionName + "=" + inputObject.value;
        //city_autocomplete.options.defaultParams = optionName + "=" + inputObject.value;
    },
    
    
    askConfirmation: function(txt)
    {
        if(typeof txt == "undefined")
            txt = leo.translation.deleteConfirmationText;
        return confirm(txt);
    },
    
    
    innerHTML_js: function( pDynHTML,scriptID)
    {
        var reScript = /<script[^>]*>(.*)<\/script>/i;
        var js       = reScript.exec(pDynHTML);
        
        while(js != null) 
        {
        	var newScript = document.createElement("script");
            newScript.type = "text/javascript";
            //newScript.id   = scriptID;
            newScript.text = js[1];
            $(scriptID).appendChild(newScript);
            pDynHTML = pDynHTML.replace(reScript, '');
            js       = reScript.exec(pDynHTML);
        }
    },
    
    
    
	/**		
	 * Get module controller
	 * 
	 * @param {string} id
	 * @private	
	 * @return {string}
	 */
	_getModuleController: function(id)
	{
		idParts = id.split('_');
		module = idParts[0];
		controller = idParts[1];
		return module + '_' + controller;
	},
	
	/**
	 * Get record id
	 * 
	 * @param {string} id
	 * @private
	 * @return {string}
	 */
	_getRecordId: function(id)
	{
		return id.split('_').pop();
	}

}
