var brokerUrl = "http://www.birma.cc/myserver.php";

Form.createParameters = function(aform) {
	var str = "";
	var elements = Form.getElements(aform);
	for(var i = 0; i < elements.length; i++) {
		var e = elements[i];
		if(e.name && !e.disabled) {
			if(i > 0)
				str += "&";
			str += Element.createSingleParameter(e);
		}
	}
	return str;
}


Element.createSingleParameter = function(e) {
	var str = "";
	if(e.type == 'radio') {
		if(e.checked == true) {
			str += e.name;
			str += "=";
			str += encodeURIComponent(e.value);
		}
	} else if(e.type == 'checkbox') {
		str += e.name;
		str += "=";
		if(e.checked)
			str += "1";
		else
			str += "0";
	} else if(e.type == "select-multiple") {
		opt = e.options;
		for(var j = 0; j < opt.length; j++) {
			if(j > 0) 
				str += "&";
			str += e.name;
			str += "[" + j + "]";
			str += "=";
			if(opt[j].selected) {
				str += encodeURIComponent(opt[j].value);
			}
		} 
	} else {
		str += e.name;
		str += "=";
		str += encodeURIComponent(e.value);
	}
	return str;
}

Element.getValue = function(e) {
	var str = "";
	if(e.type == 'radio') {
		if(e.checked == true) {
			str += encodeURIComponent(e.value);
		}
	} else if(e.type == 'checkbox') {
		if(e.checked)
			str += "1";
		else
			str += "0";
	} else {
		str += encodeURIComponent(e.value);
	}
	return str;
}

Form.toXML = function(f) {
	var str = "<data>";
	var elements = Form.getElements(f);
	for(var i = 0; i < elements.length; i++) {
		var e = elements[i];
		if(e.name && !e.disabled) {
			str += Element.createXMLParameter(e);
		}
	}
	str += "</data>";
	return str;
}


Element.createXMLParameter = function(e) {
	var str = "";
	if(e.type == 'radio') {
		if(e.checked == true) {
			str += "<" + e.name + ">" + encodeURIComponent(e.value) + "</" + e.name + ">";
		}
	} else if(e.type == 'checkbox') {
		str += "<" + e.name + ">" + (e.checked ? "1" : "0") + "</" + e.name + ">";
	} else if(e.type == "select-multiple") {
		opt = e.options;
		for(var j = 0; j < opt.length; j++) {
			if(opt[j].selected) {
				"<" + e.name + encodeURIComponent(opt[j].value) + "</" + e.name + ">";
			}
		} 
	} else {
		str += "<" + e.name + ">" + encodeURIComponent(e.value) + "</" + e.name + ">";
	}
	return str;
}


Form.param2XML = function(str) {
	var xml = "";
	if(str[0] == '?')
		str = str.substr(1);
	var ar = str.split("&");
	for(var i = 0; i < ar.length; i++) {
		as = ar[i].split("=");
		xml += "<" + as[0] + ">" + as[1] + "</" + as[0] + ">";
	}
	return xml;
}

Form.createXMLParam = function(aform) {
	return Form.param2XML(Form.createParameters(aform));	
}

Form.fillXML = function(aform, xml) {
	if(typeof(aform) == "string") 
		aform = document.forms[aform];
		
	var elem = Form.getElements(aform);
	var str = '';

	for(var i = 0; i < elem.length; i++) {
		try {
			var myname = elem[i].name;
			if(myname) {
				var e = elem[i];
				if(e) {
					var data = xml.getElementsByTagName(myname);
					for (var x = 0; x < data.length; x++) {
						var v = '';
						if(data[x].firstChild) {
							v = xml.getElementsByTagName(myname)[x].firstChild.data;
						} 
						if(e.type == 'select-one' || e.type == 'select' || e.type == 'select-multiple' || e.type == 'checkbox') {
							Element.writeElement(e, v, x);
						} else {
							if(!e.length) {
								Element.writeElement(e, v, x);
							} else {
								for(var j = 0; j < e.length; j++) {
									var ee = e[j];
									Element.writeElement(ee, v, x);
								}
							}
						}
					}
				}
			}
		} catch (e) {
			alert(e);
		}
	}
}

Form.toJSONArr = function(f, tag) {
	var arr = new Array();
	var elements = Form.getElements(f);
	for(var i = 0; i < elements.length; i++) {
		var e = elements[i];
		if(e.name == tag) {
			var myArr = new Object();
			arr.push(myArr);
		}
		if(myArr && e.name) {
			myArr[e.name] = Element.getValue(e);
		}
	}
	for(i = 0; i < arr.length; i++) {
		var o = arr[i];
		arr[i] = Object.toJSON(o);
	}
	var jso = arr.toJSON();
	return jso;
}

Form.toJSON = function(f) {
	var elements = Form.getElements(f);
	var arr = new Object();
	for(var i = 0; i < elements.length; i++) {
		var e = elements[i];
		if(e.name)
			arr[e.name] = e.value;
	}
	return(Object.toJSON(arr));
}

Element.writeElement = function(e, v, x) {
	if(e.tagName.toUpperCase() == "INPUT" || e.tagName.toUpperCase() == "SELECT" || e.tagName.toUpperCase() == "TEXTAREA") {
		switch(e.type) {
			case 'radio' : if(v && e.value == v) e.checked = 'checked'; break;
			case 'select' :
			case 'select-one' :
				var opt = e.options;
				for(var i = 0; i < opt.length; i++) {
					var o = opt[i];
					if(o.value == v) {
						o.selected = 'selected';
					} else {
						o.selected = '';
					}
				}
				break;
			case 'select-multiple' :
				var opt = e.options;
				for(var i = 0; i < opt.length; i++) {
					var o = opt[i];
					if(o.value == v) {
						o.selected = 'selected';
					} else {
						if(x == 0)
							o.selected = '';
					}
				}
				break;
			case 'checkbox':
				if(v != '' && v != 0)
					e.checked = 'checked';
				else 
					e.checked = '';
				break;
			default: e.value = v; break;
		}
	} else {
		e.innerHTML = v;
	}
}

Element.setOptions = function(e, xml, id, name, sel) {
	e.options.length = 0;
	var ids = xml.getElementsByTagName(id);
	var names = xml.getElementsByTagName(name);
	var issel = false;
	for(var i = 0; i < ids.length; i++) {
		if(sel) {
			issel = (ids[i].firstChild.nodeValue == sel) ? true : false;
		}
		if(names[i].firstChild)
			e.options[i] = new Option(names[i].firstChild.nodeValue, ids[i].firstChild.nodeValue, false, issel);
	}  
} 



Object.serializeNode = function(node) {
	/* 
		from: http://www.faqts.com/knowledge_base/view.phtml/aid/34646
	*/
	try {
		if (typeof XMLSerializer != 'undefined' ) {
			return new XMLSerializer().serializeToString(node);
		} else if (typeof node.xml != 'undefined') {
			return node.xml;
		} else if (typeof printNode != 'undefined') {
			return printNode(node);
		} else if (typeof Packages != 'undefined') {
			try {
				var stringWriter = new java.io.StringWriter();
				Packages.org.apache.batik.dom.util.DOMUtilities.writeNode(node, stringWriter);
				return stringWriter.toString();
			} catch (e) {
				alert("Object.serializeNode() caught Exception: " + e);
				// might want to handle problem here
				return '';
			}
		} else {
			alert("Object cannot handle serializeNode()");
			// might want to handle problem here
			return '';
		}
	} catch(e) {
		alert(e);
	}
}


Broker = Class.create(Ajax.Request, {
	initialize: function($super, options) {
		$super(brokerUrl, options);
	}
});

function $B(options) {
	new Broker(options);
}


UpdateBroker = Class.create(Ajax.Updater, {
	initialize: function($super, container, options) {
		$super(container, brokerUrl, options);
	}
});

BrokerOptions = Class.create( {
	initialize: function($super, phpclass, phpmethod, params) {
		parameters: parms + "&_pc=" + phpclass + "&_pm=" + phpmethod;	
	}
});


var Menu = {
	activate: function(f, e, d) {
		Form.getElements(f).each(function(inp) {{ inp.className="";}});
		e.className="menu_selected";
		var elem = null;
		switch(typeof(d)) {
			case "function" : d(); break;
			case "string" : elem = $(d); break;
			case "object" : elem = d;
		}
		if(elem != null) {
			$("data_contents").select(".data_content").each(function(e) {e.hide()});
			elem.show();
		}
			
		return false;
	}
	
};



var XRequest = {
	
	send: function(str, tgt) {
		this.target = tgt;
		_this = this;
		
		var b = new Ajax.Request(brokerUrl, {
			parameters: str,
			onSuccess: function(resp) {
				_this.success(resp); 
			},
			onFailure: function(resp) {
				alert("Ajax.Request failure");
			}
		});
	},

	success: function(resp) {
		if(!resp.responseXML || !resp.responseXML.length) {
			if(_this.target) {
				if(typeof(_this.target) == "function") {
					_this.target(resp.responseText, resp.responseXML);
				} else {
					$(_this.target).innerHTML = resp.responseText;
				}
			}
		} else {
			var xml = resp.responseXML;
//			if(xml.firstChild.nodeName == "xml") {
				if(xml.firstChild.hasChildNodes()) {
					for(var i = 0; i < xml.firstChild.childNodes.length; i++) {
						var nod = xml.firstChild.childNodes[i];
						if(nod.nodeName == "html") {
							if(nod.getAttribute("target")) {
								target = nod.getAttribute("target");
							} else {
								target = _this.target;
							}
							var str = "";
							for(var j = 0; j < nod.childNodes.length; j++) {
								var d = this.serializeNode(nod.childNodes[j]);
								str += d;
							}
							if(target) {
								if(typeof(target) == "function") {
									target(resp.responseText, resp.responseXML);
								} else {
									$(target).innerHTML = str;
								}
							}
						} else if(nod.nodeName == "form") {
							if(nod.getAttribute("target")) {
								target = nod.getAttribute("target");
							} else {
								target = _this.target;
							}
							Form.fillXML(target, nod);
						} else if(nod.nodeName == "script") {
							this.serializeNode(nod).evalScripts();
						} else if(nod.nodeName == "element") {
							var n = nod.getElementsByTagName("id")[0];
							if(n) {
								var nn = n.firstChild.nodeValue;
								var d = document.getElementById(nn);
								if(d) {
									for(var j = 0; j < nod.childNodes.length; j++) {
										var e = nod.childNodes[j];
										if(e.nodeName != "id") {
											d.setAttribute(e.nodeName, e.firstChild.nodeValue);
										}
									}
								}
							}	
						} else {
							alert(i + ": " + nod.nodeName + " = " + nod.nodeType + " ===> " + this.serializeNode(nod));
						}
					}
				} else {
					alert("No child nodes");
				}
//			}
	//		var success = xml.getElementsByTagName("success")[0].firstChild.nodeValue;
		}
	},
	
	serializeNode: function(node) {
		return Object.serializeNode(node);

	}
}


var XReq = {
	send:  function(pc, pm, str, tgt) {
		str = "_pc=" + pc + "&_pm=" + pm + "&" + str;
		XRequest.send(str, tgt);
	}
}

function setBrokerUrl(u) {
	brokerUrl = u;
}
