/**
 * validator.js
 * 
 * Copyright 2006 progos.hu All rights reserved. PROGOS
 * PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 
 * $Id: validation.js,v 1.3 2007-05-07 21:11:56 gyozo Exp $
 * $Revision: 1.3 $
 * $Date: 2007-05-07 21:11:56 $
 * $Author: gyozo $
 * $State: Exp $ 
 *
 **/
 
 /**
 * class ValidatedField
 *
 */ 
 var lastEvent = null;
ValidatedField.prototype.m_counter = 0;
ValidatedField.prototype.m_fields = new Object(); 
function ValidatedField (form_uri, uri, ajaxURL, elementId) {
	this.m_id = "_vf_" + ValidatedField.prototype.m_counter++;
	ValidatedField.prototype.m_fields[this.m_id] = this;
	this.form_uri = form_uri;
	this.uri = uri;
	this.ajaxURL = ajaxURL;
	this.element = $(elementId);
	this.element.m_validator = this;
	
	this.controlDiv = this.element.parentNode;
	this.controlsDiv = this.controlDiv.parentNode;
	this.fieldDiv = this.controlsDiv.parentNode;
	this.sectionDiv = this.fieldDiv.parentNode;	

	this.m_filters = new Array();

	for (var i = 4; i < ValidatedField.arguments.length; i++) {
		var filter = ValidatedField.arguments[i];
		try {
			if (filter != null) {
				this.m_filters.push(filter);
			} else {
				alert( "Unknown filter on element " + this.uri + " : " + typeof filter + " (" + id + "; " + filter.value + "; " + filter.selectedIndex + ")");
			}
		} catch (e) {
			alert(e.message + " " + e.prototype + '\n' + this.uri + "\n" + filter);
			continue;
		}
	}

	Event.observe(this.element, "keydown", this.onKeyDown.bindAsEventListener(this), true);
	Event.observe(this.element, "keyup", this.onKeyUp.bindAsEventListener(this), true);
	Event.observe(this.element, "focus", this.onFocus.bindAsEventListener(this), true);
	Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this), true);
}


ValidatedField.prototype.onKeyDown = function _vf_onKeyDown(event) {
	// do nothing
}

ValidatedField.prototype.onKeyUp = function _vf_onKeyUp(event) {
	this.validate("keyUp");
}

ValidatedField.prototype.onFocus = function _vf_onFocus(event) {
	this.showMessageDiv();
	var ic = this.getIconsDiv();
	while (ic.childNodes.length > 0) {
		ic.removeChild(ic.childNodes[0]);
	}
	this.updateHelp();	
	this.validate("focus");
}

ValidatedField.prototype.onBlur = function _vf_onBlur(event) {
	this.hideMessageDiv();
	this.validate("blur");
}

/**
 * Show and hide message div
 */
ValidatedField.prototype.showMessageDiv = function _vf_showMessageDiv() {
	var msgDiv = document.createElement("div");
	msgDiv.id = "form-messages";
	msgDiv.className = "form-messages";
	
	var iconsDiv = this.getIconsDiv();
	
	msgDiv.style.top = Position.cumulativeOffset(this.element)[1] + "px";
	msgDiv.style.left = Position.cumulativeOffset(iconsDiv)[0] + "px" ;

	document.body.appendChild(msgDiv);
}

ValidatedField.prototype.hideMessageDiv = function _vf_hideMessageDiv() {
	var msgDiv = $("form-messages");
	if (msgDiv != null) {
		document.body.removeChild(msgDiv);
	}
}

ValidatedField.prototype.updateHelp = function _vf_showHelp() {
	var params = {
						form: this.form_uri,
						_dyn_id: this.m_id,
						_dyn_field: this.uri,
						reqtype: "help"
					};

	var vf = this;

	if (this.helpRequest != null) {
		this.helpRequest.transport.abort();
	}
	this.helpRequest = new Ajax.Request( this.ajaxURL, {
									method: 'get', 
									parameters: $H(params).toQueryString(), 
									onComplete: function(request) {
										ValidatedField.prototype.showHelp(request, vf);
									},
									asynchronous: true
								}
	);
}

ValidatedField.prototype.getIconsDiv = function _vf_getIconsDiv() {
	var fieldNode = this.element.parentNode.parentNode.parentNode;
	return document.getElementsByClassName("icons", fieldNode)[0];
}

ValidatedField.prototype.showHelp = function _vf_showHelp(request, vf) {
	vf.helpRequest = null;
	var msgDiv = $("form-messages");
	var responseXML = $dn(request);
	
	var updateNode = $dn(request).getElementsByTagName("update")[0];
	var elementNode = updateNode.getElementsByTagName("element")[0];
	var helpNode = elementNode.getElementsByTagName("help")[0];
	var fieldHelpNode = elementNode.getElementsByTagName("fieldHelp")[0];
	
	var helpDiv = document.createElement("div");
	helpDiv.className = "help";

	if (fieldHelpNode != null) {	
		var p2 = document.createElement("p");
		p2.appendChild(document.createTextNode(fieldHelpNode.childNodes[0].nodeValue));
		helpDiv.appendChild(p2);
	}
	
	if (helpNode != null) {	
		var p1 = document.createElement("p");
		p1.appendChild(document.createTextNode(helpNode.childNodes[0].nodeValue));
		helpDiv.appendChild(p1);
	}

	if (helpNode != null || fieldHelpNode != null) {
		msgDiv.appendChild(helpDiv);
	} 
}


ValidatedField.prototype.validate = function _vf_validate(eventName) {
	var params = {
						form: this.form_uri,
						_dyn_id: this.m_id,
						_dyn_field: this.uri,
						reqtype: "validate"
					};

	for (var i = 0; i < this.m_filters.length; i++) {
		var field = this.m_filters[i];
		params[field.name] = Form.Element.getValue(field);
	}
	
	var element = this.element;
	params.event=eventName;
	var vf = this;

	if (this.validationRequest != null) {
		this.validationRequest.transport.abort();
	}

	this.validationRequest = new Ajax.Request( this.ajaxURL, {
									method: 'get', 
									parameters: $H(params).toQueryString(), 
									onComplete: function(request) {
										ValidatedField.prototype.updateMessage(request, vf, eventName);
									},
									asynchronous: true
								}
	);
}

var lf;

ValidatedField.prototype.updateMessage = function _vf_updateMessage(request, vf, eventName) {
	vf.validationRequest = null;
	var responseXML = $dn(request);
	
	var updateNode = $dn(request).getElementsByTagName("update")[0];
	if (updateNode != null) {
		var elementNode = updateNode.getElementsByTagName("element")[0];
		var messageNode = elementNode.getElementsByTagName("message")[0];
		
		if (eventName != "blur") {
		
			var msgDiv = $("form-messages");
		
			var messages = document.getElementsByClassName("error", msgDiv);
			if (messages.length > 0) {
				msgDiv.removeChild(messages[0]);
			}		
			if (messageNode !=null)	{
				var messageDiv = document.createElement("div");
				messageDiv.className = "error";
				var p = document.createElement("p");
				p.appendChild(document.createTextNode(messageNode.childNodes[0].nodeValue));
				messageDiv.appendChild(p);
				if (msgDiv.childNodes.length > 0) {
					msgDiv.insertBefore(messageDiv, msgDiv.childNodes[0]);		
				} else {
					msgDiv.appendChild(messageDiv);		
				}
			}
		} else {
			var iconsDiv = vf.getIconsDiv();
			if (messageNode !=null)	{
				var messageDiv = document.createElement("div");
				messageDiv.className = "error";				
				var p = document.createElement("p");
				p.appendChild(document.createTextNode(messageNode.childNodes[0].nodeValue));
				messageDiv.appendChild(document.createTextNode(messageNode.childNodes[0].nodeValue));
				
				iconsDiv.appendChild(messageDiv);
			} else {
				var messageDiv = document.createElement("div");
				messageDiv.className = "ok";
				
				iconsDiv.appendChild(messageDiv);			
			}
		}
	}
}

var COUNTER_BUGFIX_IE_RESPONSEXML = 0;

var $dn = function(request) {
	if (request.responseXML != null && request.responseXML.childNodes.length > 0) {
		return request.responseXML;
	}

	var id = "DOM_TREE_" + COUNTER_BUGFIX_IE_RESPONSEXML++ ;
	var dom = document.createElement('xml');
	dom.setAttribute('innerHTML', request.responseText);
	dom.setAttribute('id', id);      
	document.body.appendChild(dom);
	document.getElementById(id).innerHTML = request.responseText;
	return document.getElementById(id);
}
