var NetManagerPluginForm = NetManagerBase.extend({
	
	data: null,
	
	options: {
		onValid:null,
		setUrlFormatter: false,
		setImageSelectors: false,
		currentForm: null
	},
	
	initialize: function(options) {
		
		// Implement given options
    	this.setOptions(options);
    	this.errorContainers = [];
    	if ($type(options.onValid) === 'function') {
			this.onValid = options.onValid.bind(this);
    	}
    	
    	if ($defined(this.options.formElm)) {
			this.currentForm = this.options.formElm;
			if (this.options.setUrlFormatter) {
				this.setUrlFormatter();
    		}
    		if (this.options.setImageSelectors) {
				this.setImageSelectors();
    		}
    	}
    	
	},
	
	addErrorMsg: function(elm, msg) {
		
		$(elm).getParent().addClass('error');
		var elmName = $(elm).getProperty('name');
		if ($defined(this.errorContainers.elmName)) {
			this.errorContainers.elmName.empty();
		} else {
			this.errorContainers.elmName = new Element('ul').addClass('errors').inject($(elm).getParent());
		}
		var errorMsg = new Element('li').setText(msg).inject(this.errorContainers.elmName);
		
	},
	
	processForm: function(iFormId) {
		
		// Define the processed form
		
		this.processedForm = $(this.currentForm);

		// Bind the function which has to be fired after completion
		var validateForm = this.validateForm.bind(this);
		
		var ed, sText;
		this.processedForm.getElements('.advancedTiny textarea').each(function ( el ){
			var sId = el.getProperty('id');
			ed = tinyMCE.get(sId);
			sText = ed.getContent();
			sText = replaceImagesByMedia(sText);
			tinyMCE.execCommand('mceRemoveControl', false, sId);
			$(sId).value = sText;
		});
		
		var ed, sText;
		this.processedForm.getElements('.simpleTiny textarea').each(function ( el ){
			var sId = el.getProperty('id');
			ed = tinyMCE.get(sId);
			sText = ed.getContent();
			sText = replaceImagesByMedia(sText);
			tinyMCE.execCommand('mceRemoveControl', false, sId);
			$(sId).value = sText;
		});
		
		// Send AJAX request
		this.processedForm.send({ onComplete: validateForm });
		
		
	},
	
	validateForm: function(sResponse) {
		// Evaluate server response
		var oResponse = Json.evaluate(sResponse);
		
		this.formSent = false;
		
		// Function to execute if server response is valid
		if(oResponse.valid) {
			
			// Remove error classes
			this.processedForm.getElements('input').each(function(el) {
				
				el.removeClass('iError');
				
			});
		
			// Remove previous error messages
			this.processedForm.getElements('.errormsg').each(function(el) {
				
				el.remove();
				
			});
			this.data = oResponse.data;
			if ($type(this.options.onValid) == 'function') {
				this.options.onValid(oResponse);
			}
			if ($type(this.options.onValid) == 'string') {
				switch(this.options.onValid) {
					default:
						document.location.href = oResponse.redirect;		
					break;
				}
				
			}
			
			
			// Redirect to the defined tab
			//document.location.href = oResponse.redirect;
			
			
		
		} else {
			
		
			// Remove error classes
			this.processedForm.getElements('input').each(function(el) {
				
				el.removeClass('iError');
				
			});
		
			// Remove previous error messages
			this.processedForm.getElements('.errormsg').each(function(el) {
				
				el.remove();
				
			});
			
			// For each error do
			
			$each(oResponse.errors, function(errorMessage, fieldName) {
				var formElement = null;					 
				var formElement = this.processedForm.getElement('input[name^=' + fieldName + ']');
				if (formElement === null) {
					formElement = this.processedForm.getElement('select[name^=' + fieldName + ']');
				}
				if (formElement === null) {
					formElement = this.processedForm.getElement('textarea[name^=' + fieldName + ']');
				}
				if (fieldName == 'teaser' || fieldName == 'text') {
					
					$each(errorMessage, function(msg, key){
						// Place the error message in the dataholder
						var oError = new Element('p').addClass('errormsg').setHTML(msg).inject($(fieldName).getParent());
					});
					
				} else {
					
				
					if($(formElement).getProperty('type') == 'text') {
					
						$(formElement).addClass('iError');
						
						$(formElement).value = '';
						
					} else {
						
						$(formElement).checked = false;
					
					}
					
					// Find the dataholder (dd) of the form element
					var dataHolder = $(formElement).getParent();
					if ($type(dataHolder) == 'element' ) {
						if ($type(errorMessage) == 'object') {
							$each(errorMessage, function(msg, key){
								// Place the error message in the dataholder
								var oError = new Element('p').addClass('errormsg').setHTML(msg).inject(dataHolder);
							});
						} else {
						
							// Place the error message in the dataholder
							var oError = new Element('p').addClass('errormsg').setHTML(errorMessage).inject(dataHolder);
						}
					} 
					
				}
			}, this);
			
			// hide the loading animation
			this.hideOverlay();
			
			if(oResponse.db_error) {
				
				this.showError('Systeemfout!', oResponse.db_error);
				this.processedForm.getParent().empty();
			}
		}
		
	}, 
	
	getFormData: function() {
		return this.data;
	},
	
	setElmValue: function(elmName, elmValue) {
		$(this.currentForm).getElement('input[name^=' + elmName + ']').setProperty('value', elmValue);
	},
	
	getElmValue: function(elmName) {controll
		return $(this.currentForm).getElement('#' + elmName).getProperty('value');
	},
	
	setElmEvent: function(elmName, eventType, fn) {
		$(this.currentForm).getElement('#' + elmName).addEvent(eventType, fn);
	},
	
	setUrlFormatter: function() {
		if ($defined(this.options.formatterSourceElm) && $defined(this.options.formatterTargetElm)) {
			$(this.currentForm).getElement('#' + this.options.formatterSourceElm).addEvent('blur', this.formatUrl.bindWithEvent(this));
		}
	},
	
	setImageSelectors: function() {
	
		var t = this;
		$each($(this.currentForm).getElements('td.imagebox'), function (elm) {
			options = {};
			options.selectId = elm.getElement('input').getProperty('id');
			options.key = elm.getElement('input').getProperty('id');
			oImageSelector = t.getImageSelector(options);
			
		});
	}
});