/**
*
*	Klasse zum Initialisierwen einer 
*	"unaufdringlichen" AJAX/PHP 
*	Validierung
*
*	Autor: René Klatt
*
*/

// Klasse erstellen
var AjaxValidator = Class.create();

// Initialisierung der Validierung
/**
*	@serverAddress | variable die Server 
*				     Adresse speichert
*	
*/

AjaxValidator.prototype = {
	initialize: function(formId){
		this.showErrors 	= true;
		this.cache 			= [];
		this.formId 		= formId;
		this.form 			= $(this.formId);
		this.serverAddress 	= this.getServerAddress();
		this.initValidation();
	},
	
	getServerAddress: function(){
		if($(this.formId) !== null){
			var serverAddress = $(this.formId).getAttribute('action');
			return serverAddress;
		}
	},
	
	validate: function(inputValue, fieldName){
		
		inputValue 		= encodeURIComponent(inputValue);
		fieldName 		= encodeURIComponent(fieldName);
		this.cache.push(fieldName + "=" + inputValue);
		var cacheEntry = this.cache.shift();
		//alert(cacheEntry);
		new Ajax.Request(
			this.serverAddress,
			{
				method:"post",
				parameters:cacheEntry,
				onSuccess:function(x){
					var jsondata = eval( '(' + x.responseText + ')' );
					if(jsondata)
					{
						for (var key in jsondata) {
							// if errorMessage exist
							if(jsondata[key] != ''){
								// errorMessage exist
								// remove previos errorMessages
								var node = $(key).parentNode.lastChild.nodeName;
								if(node === 'DIV' || node === 'UL'){
									$(key).parentNode.removeChild($(key).parentNode.lastChild);
								}
								/**
								*  no previos errorMessage exist
								*  create errorDiv and appendChild 
								*  with the json response inside
								*/
								// create a div element
								var div = document.createElement('div');
								
								// set css-class for errorMessage style 
								div.setAttribute('class', '_error');
								
								// put response into div
								div.innerHTML = jsondata[key];
								
								if($(key).getAttribute('type') != 'password'){
									// appendChild to errorElement
									$(key).parentNode.appendChild(div);
								}
							}else{
								/**
								*  if previos errorMessage exist
								*  get errorDiv and destroy 
								*/
								var node = $(key).parentNode.lastChild.nodeName;
								if(node === 'DIV' || node === 'UL'){
									$(key).parentNode.removeChild($(key).parentNode.lastChild);
								}
							}
						}
					}
				},
				onError:function(xhr){
					alert(xhr.responseText);	
				},
				onFailure:function(xhr){
					alert(xhr.responseText);	
				}
			}
		);
	},
	
	initValidation: function(){
		
		if($(this.formId) === null){
			throw new Error('"' + this.formId + ' doesnt exist.')
		}
		
		// Jedem Element des Formulars Eventlistener anfgen
		for(i = 0; i < $(this.formId).elements.length; i++){
			var elemID = $(this.formId).elements[i].id; 
			var elemName = $(this.formId).elements[i].name;
			if(elemID && elemName != 'submit' && elemID != 'password_repeat'){
				// bei focus hintergrundfarbe setzen
				Event.observe($(elemID), 'focus', this.focField.bindAsEventListener(this));
				if(elemID === 'text'){
					Event.observe($(elemID), 'blur', this.blurAndValidTextarea.bindAsEventListener(this));		
				}
				Event.observe($(elemID), 'blur', this.blurAndValidField.bindAsEventListener(this));
			}
		}
	},
	
	focus:function(elemId){
		if($(elemId) === null){
			throw new Error('"' + elemId + ' doesnt exist.');
		}
		$(elemId).focus();
	},
	
	focField: function(event){
		var elem = Event.element(event);
		//elem.style.border = '1px dotted';	
	},
	
	blurAndValidField: function(event){
		var elem = Event.element(event);
		//elem.style.border = '1px solid #ccc';
		this.validate(elem.value, elem.name);
	},
	
	// Fehlermeldung in Textarea aktivieren
	blurAndValidTextarea: function(event){
		var elem = Event.element(event);
		//elem.style.border = '1px solid #ccc';
		this.validate(elem.innerHTML, elem.name);
	},
	
	
	blurField: function(event){
		var elem = Event.element(event);
		//elem.style.backgroundColor = '#fff';
	}
	
}

Event.observe(window, 'load', function()
{
	var formId = document.forms[0].getAttribute('id');
	var validator = new AjaxValidator(formId);
});