/**
 * DynamicField.js
 * 
 * Copyright 2006 progos.hu All rights reserved. PROGOS
 * PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 
 * $Id$
 * $Revision$
 * $Date$
 * $Author$
 * $State$ 
 *
 **/
 
 /**
 * class FormElement
 *
 */ 
 
FormElement.prototype.m_counter = 0;
FormElement.prototype.m_fields = new Object(); 

function FormElement (form_uri, uri, ajaxURL, elementId) {
	this.m_id = "_field_" + FormElement.prototype.m_counter++;
	FormElement.prototype.m_fields[this.m_id] = this;
	this.form_uri = form_uri;
	this.uri = uri;
	this.ajaxURL = ajaxURL;
	this.element = document.getElementById(elementId);

	this.m_filters = new Array();
	
	for (var i = 4; i < FormElement.arguments.length; i++) {
		var filter = FormElement.arguments[i];
		try {
			if (filter != null) {
				this.registerFilter(filter);
			} else {
				alert( "Unknown filter on element " + this.uri + " : " + typeof filter + " (" + id + "; " + filter.value + "; " + filter.selectedIndex + ")");
			}
		} catch (e) {
			alert(e + '\n' + this.uri + "\n" + filter);
			continue;
		}
	}
}

FormElement.prototype.registerFilter = function _fe_registerFilter(field) {
	this.m_filters.push(field);
	var result;
	if (field.m_hasChange != true) {
		if (field.addEventListener) { 
	   		result = field.addEventListener("change", FormElement.prototype.onFilterChange, true); 
		} else if (field.attachEvent) { 
			result = field.attachEvent( "on" + "change", FormElement.prototype.onFilterChange); 
		} else { 
			throw "Cannot attach update event: " + field;
		} 
		field.m_hasChange = true;
	}	
	if (field.m_fe_descendants == null) {
		field.m_fe_descendants = new Object();
	}

	field.m_fe_descendants[this.m_id] = this;
}

FormElement.prototype.onFilterChange = function _fe_onFilterChange(event) {
	var element = this.m_fe_descendants != null ? this : event.srcElement.m_fe_descendants != null ? event.srcElement : null;
	if (element != null && element.m_fe_descendants != null) {
		for (i in element.m_fe_descendants) {
			var descendant = element.m_fe_descendants[i];
			if (descendant.update) {
				descendant.update(element.getAttribute("uri"));
			}
		}
	}
}

FormElement.prototype.update = function _fe_update(filter) {
	var request = this.getReader();
	var element = this.element;
	if (request) { 
		request.onreadystatechange = function() { 
			if (request.readyState == 4 && request.status == 200 && request.responseText != null) { 
				try {
					var xml = $dn(request);
					var updateNode = xml.getElementsByTagName("update")[0];
					var elementNode = updateNode.getElementsByTagName("element")[0];
					var state = elementNode.getAttribute("state");
					element.style.display = (state == "HIDDEN" ? "none" : "");
				} catch (e) {
					alert(e);
				}
			} 
		}; 
		
		request.open('GET', this.ajaxURL + this.getQueryString(filter)); 
		request.send(null); 
	} else {
		throw "Cannot update DynamicField: " + this.m_id;
	}
}

FormElement.prototype.getReader = function _fe_getReader() {
	if (this.reader) {
		this.reader.abort();
	}
	
    var reader = null;

    try {
        if (navigator && navigator.userAgent.toLowerCase().indexOf("msie") != -1) {
            reader = new ActiveXObject("Msxml2.XMLHTTP");
        }
    } catch (exception) {
        try {
            reader = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (oc) {
            reader = null;
        }
    }
    
    if (!reader && typeof XMLHttpRequest != "undefined") {
        reader = new XMLHttpRequest();
    }
    
    this.reader = reader;
    return reader;
}

FormElement.prototype.getQueryString = function _fe_getQueryString(filteruri) {
	var query = "?form=" + this.URLEncode(this.form_uri) + "&filter=" + this.URLEncode(filteruri) + "&_dyn_id=" + this.m_id + "&_dyn_field=" + this.URLEncode(this.uri) + "&reqtype=state";
	for (i in this.m_filters) {
		var field = this.m_filters[i];
		var name = field.name;
		var value;
		if (field.value != null) {
			if (field.type == "radio") {
				value = field.checked;
			} else if (field.type == "checkbox") {
				value = field.checked;				
			} else {
				value = field.value;
			}
		} else if (field.selectedIndex != null) {
			value = field.options[field.selectedIndex].value;
		}
		
		query += "&" + name + "=" + this.URLEncode(value);
	}


	return query;
}

FormElement.prototype.URLEncode = function _fe_URLEncode(text) {
    if (encodeURIComponent) {
        return encodeURIComponent(text);
    } else if (escape) {
        return escape(text);
    } else {
    	return text;
    }
}

var COUNTER_BUGFIX_IE_RESPONSEXML = 0;

function $dn(request) {
	if (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);
}
