/**
 * dropdown.js
 * 
 * Copyright 2003 progos.hu All rights reserved. PROGOS
 * PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 
 * $Id: dropdown.js,v 1.5 2007-05-07 21:11:56 gyozo Exp $
 * $Revision: 1.5 $
 * $Date: 2007-05-07 21:11:56 $
 * $Author: gyozo $
 * $State: Exp $ 
 *
 **/
 
/**
 * class Dropdown
 *
 */ 
Dropdown.prototype.m_counter = 0;
Dropdown.prototype.m_selects = new Object(); 

Dropdown.prototype.m_filtercount = 0;
 
function Dropdown (field, source, uri, method_uri, form_uri) {
	this.m_id = "_select_" + Dropdown.prototype.m_counter++;
	Dropdown.prototype.m_selects[this.m_id] = this;
	
	this.m_field = field;
    this.m_field.m_dropdown = this;
    this.m_filters = new Array();
    this.m_source = source;
    this.m_uri = uri;
    this.m_methodUri = method_uri;
    this.form_uri = form_uri;
    this.m_field.m_focused = false;
    this.m_field.m_id = this.m_id;
    
	for (var i = 5; i < Dropdown.arguments.length; i++) {
		var filter = Dropdown.arguments[i];
		if (filter.selectedIndex != null || filter.value != null ) {
			this.registerFilter(filter);
		} else {
			alert( "Unknown filter type: " + typeof filter + " (" + filter.name + "; " + filter.value + "; " + filter.selectedIndex + ")");
		}
	}
}

Dropdown.prototype.registerFilter = function _ddn_registerFilter(field) {
	this.m_filters.push(field);
	var result;

	var msg = "" + field.name + "\t" + this.m_field.name + "\t";
	
	if (field.m_hasChange != true) {
		if (field.addEventListener) { 
	   		result = field.addEventListener("change", this.onFilterChange, true); 
			Dropdown.prototype.m_filtercount++;
		} else if (field.attachEvent) { 
			result = field.attachEvent( "on" + "change", this.onFilterChange); 
		} else { 
			throw "Cannot attach update event: " + field;
		} 
		field.m_hasChange = true;
		msg += "... OK";
	} else {
		msg += "... WARNING";
	}

	if (field.m_ddn_descendants == null) {
		field.m_ddn_descendants = new Object();
	}
	
	var f_focus = function(event) {
		var element = this.m_focused != null ? this : event.srcElement.m_focused != null ? event.srcElement : null;
		element.m_focused = true;
	}
	
	var f_blur = function(event) {
		var element = this.m_focused != null ? this : event.srcElement.m_focused != null ? event.srcElement : null;
		element.m_focused = false;
	}
	
	field.m_focused = false;
	field.log = this.log;
	field.m_id = field.value;
	
	if (field.addEventListener) { 
   		result = field.addEventListener("focus", f_focus, true); 
	} else if (field.attachEvent) { 
		result = field.attachEvent( "on" + "focus", f_focus); 
	} else { 
		throw "Cannot attach focus event: " + this.m_uri;
	} 
    
	if (field.addEventListener) { 
   		result = field.addEventListener("blur", f_blur, true); 
	} else if (field.attachEvent) { 
		result = field.attachEvent( "on" + "blur", f_blur); 
	} else { 
		throw "Cannot attach focus event: " + this.m_uri;
	} 
    
	field.m_ddn_descendants[this.m_id] = this;
	this.log(msg);
}

Dropdown.prototype.onFocus = function _ddn_onFocus(event) {
	var element = this.m_dropdown != null ? this : event.srcElement.m_dropdown != null ? event.srcElement : null;
	element.m_focused = true;
}

Dropdown.prototype.onBlur = function _ddn_onBlue(event) {
	var element = this.m_dropdown != null ? this : event.srcElement.m_dropdown != null ? event.srcElement : null;
	element.m_focused = false;
}

Dropdown.prototype.onFilterChange = function _ddn_onFilterChange(event) {
	var element = this.m_ddn_descendants != null ? this : event.srcElement.m_ddn_descendants != null ? event.srcElement : null;
	if (element != null) { 
		for (i in element.m_ddn_descendants) {
			if (element.m_ddn_descendants[i].update){
			  element.m_ddn_descendants[i].update(element.getAttribute("uri"));
		   }
		}
	}
}

Dropdown.prototype.update = function _ddn_update(filteruri) {
	var value_backup = null;
	if (this.m_field.options.length > 0) {
		value_backup = this.m_field.options[this.m_field.selectedIndex].value;
	}
	this.m_field.options.length = 0;
	this.m_field.options[this.m_field.options.length] = new Option("kérjük várjon", value_backup);
	
	var request = this.getReader();
	if (request) { 
		request.onreadystatechange = function() { 
			if (request.readyState == 4 && request.status == 200 && request.responseText != null) { 
				try {
					eval(request.responseText); 
				} catch (e) {
				}
			} 
		}; 
		
		request.open('GET', this.m_source + this.getQueryString(filteruri)); 
		request.send(null); 
	} else {
		throw "Cannot update dropdown: " + this.m_id;
	}
}

Dropdown.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 + "=" + this.URLEncode(this.m_field.options[this.m_field.selectedIndex].value) + "&reqtype=optionlist";
	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;
}

Dropdown.prototype.log = function _ddn_log(message) {
/*
	if (log != undefined) {
		log(this.m_id + " " + message);
	}
*/
}

Dropdown.prototype.URLEncode = function _ddl_URLEncode(text) {
    if (encodeURIComponent) {
        return encodeURIComponent(text);
    } else if (escape) {
        return escape(text);
    } else {
    	return text;
    }
}

Dropdown.prototype.getReader = function _ddl_getReader() {
    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();
    }
    
    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;
}
