/**
 * DynamicField.js
 * 
 * Copyright 2003 progos.hu All rights reserved. PROGOS
 * PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 
 * $Id$
 * $Revision$
 * $Date$
 * $Author$
 * $State$ 
 *
 **/
 
 
/**
 * class DynamicField
 *
 */ 
DynamicField.prototype.m_counter = 0;
DynamicField.prototype.m_fields = new Object(); 
 
function DynamicField (field, source, uri, method_uri, form_uri) {
	this.m_id = "_field_" + DynamicField.prototype.m_counter++;
	DynamicField.prototype.m_fields[this.m_id] = this;
	
	this.m_field = field;
    this.m_field.m_DynamicField = this;
    this.m_filters = new Array();
    this.m_source = source;
    this.m_uri = uri;
    this.reader = null;
    this.m_methodUri = method_uri;
    this.form_uri = form_uri
    
	for (var i = 5; i < DynamicField.arguments.length; i++) {
		var filter = DynamicField.arguments[i];
		try {
			if (filter.selectedIndex != null || filter.value != null ) {
				this.registerFilter(filter);
			} else {
				if (console) console.warn( "Unknown filter type: " + typeof filter + " (" + filter.name + "; " + filter.value + "; " + filter.selectedIndex + ")");
			}
		} catch (e) {
			if (console) console.warn(e + '\n' + filter);
			continue;
		}
	}
}

DynamicField.prototype.getFieldByUri = function _ddn_getFieldByUri(uri) {
	for (i in DynamicField.prototype.m_fields) {
		if (i.m_uri == uri) {
			return i;
		}
	}
	
	return null;
}

DynamicField.prototype.setValue = function _ddn_setValue(value){
	var t = this.m_id + '\n' + this.value + '\n' + this.innerHTML + '\n';
	var field = this.m_field;
	if (field.type == "checkbox") {
	    field.value='on';
	    if (value=='checked'){
	       field.checked = true;
	    } else{
	       field.checked = false;
	    }
	     
	} else{
	    field.value = value;
	}
}

DynamicField.prototype.registerFilter = function _ddn_registerFilter(field) {
	this.m_filters.push(field);
	var result;
	if (field.m_hasDfChange != true) {
		if (field.addEventListener) { 
	   		result = field.addEventListener("change", this.onFilterChange, true); 
		} else if (field.attachEvent) { 
			result = field.attachEvent( "on" + "change", this.onFilterChange); 
		} else { 
			throw "Cannot attach update event: " + field;
		} 
		field.m_hasDfChange = true;
	}	
	if (field.m_fe_descendants == null) {
		field.m_fe_descendants = new Object();
	}
	
	field.m_fe_descendants[this.m_id] = this;
}

DynamicField.prototype.onFilterChange = function _ddn_onFilterChange(event) {
	var element = this.m_fe_descendants != null ? this : event.srcElement.m_fe_descendants != null ? event.srcElement : null;
	if (element != null) {
		for (i  in element.m_fe_descendants) {
			element.m_fe_descendants[i].update(element.getAttribute("uri"));
		}
	}
}

DynamicField.prototype.update = function _ddn_update(filteruri) {
	var request = this.getReader();
	this.m_field.value = "kérjük várjon";
	if (request) { 
		request.onreadystatechange = function() { 
			if (request.readyState == 4 && request.status == 200 && request.responseText != null) { 
				try {
					eval(request.responseText); 
				} catch (e) {
					if (console) console.warn(e);
				}
			} 
		}; 
		
		request.open('GET', this.m_source + this.getQueryString(filteruri)); 
		request.send(null); 
	} else {
		throw "Cannot update DynamicField: " + this.m_id;
	}
}

DynamicField.prototype.getQueryString = function _ddl_getQueryString(filteruri) {
	var query = "?form=" + this.URLEncode(this.form_uri) + "&filter=" + this.URLEncode(filteruri) + "&method_uri=" + this.URLEncode(this.m_methodUri) + "&_dyn_id=" + this.m_id + "&_dyn_field=" + this.URLEncode(this.m_uri) + "&" + this.m_field.name + "=" + "&reqtype=dynfield";
	for (var i = 0; i < this.m_filters.length; i++) {
		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;
}

DynamicField.prototype.log = function _cmb_log(message) {
/*
	if (log != undefined) {
		setTimeout("log(\"" + this.m_id + " " + message + "\");", 10);
	}
*/
}


DynamicField.prototype.URLEncode = function _ddl_URLEncode(text) {
    if (encodeURIComponent) {
        return encodeURIComponent(text);
    } else if (escape) {
        return escape(text);
    } else {
    	return text;
    }
}

DynamicField.prototype.getReader = function _ddl_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;
}

function detail(o, prefix) {
	if (prefix == null) {
		prefix = "";
	}

	if (prefix && prefix.length && prefix.length > 5) {
		return "";
	}

	var desc = "";
	
	for (i in o) {
		var p = o[i];
		desc += prefix + i + ": " + p + "; ";
		if (p && p instanceof Object) {
			desc += "{" + detail(p, prefix + "\t" ) + "}";
		}
	}
	
	return desc;
}
