// IFNDEF
if (!_SPIRE_AJAX_JS) {
	var _SPIRE_AJAX_JS = 1;





var req;
var lastUrl;
var _ref;
var _debug = 0;


if (typeof(console) == 'undefined') console = false;

function reqPoolObj() {
	var maxThreads = 2;

	var reqs = new Array(maxThreads);
	var pool = new Array();
	var working = new Array(maxThreads);

	for (var i=0; i<reqs.length; i++) {
		if (window.XMLHttpRequest) {
			reqs[i] = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			reqs[i] = new ActiveXObject("Microsoft.XMLHTTP");
		}
		working[i] = null;
	}

	this.add = add;
	this.next = next;
	this.processReqChange = processReqChange;
	this.proceedResponseCalls = proceedResponseCalls;

	function add(url) {
		pool.push(url);
		this.next();
	}

	function next() {
		url = pool[0];
		_ref = this;
		if (url) {
			for (var i=0; i<reqs.length; i++) {
				if (!working[i]) {
					pool.shift();
					try {
						reqs[i].abort();
						reqs[i].onreadystatechange = function () {_ref.processReqChange(i);};
						working[i] = url;
						reqs[i].open("GET", url, true);
						reqs[i].send('');

					} catch(e) {
						working[i] = null;
						reqs[i].abort();
						//break;
					}
					return true;
				}
			}
			/* No free slots */
			this.timer = setTimeout('_ref.next()', 1000);
			return true;
		} else {
			/*this.timer = setTimeout(_ref.next, 1000);
			return true;*/
		}
	}

	function proceedResponseCalls(response) {

		if (typeof response == "string") {
			// code for IE
			if (window.ActiveXObject) {
				var doc=new ActiveXObject("Microsoft.XMLDOM");
				doc.async="false";
				doc.loadXML(response);
			} else {
				try {
					var parser=new DOMParser();
					var doc=parser.parseFromString(response,"text/xml");
				} catch (e) {
					if (_debug) {
						if (console) {
							console.error(e);
						} else {
							alert('DEBUG:  '+ e.name + ' ' + e.message + '\n' + e.description + '\n\n' + e.lineNumber + ':' + e.fileName);
						}
					}
					return;
				}
			}
			response = doc;
		}

		if (response) {
			var calls = response.getElementsByTagName('call');

			if (calls) {
				if (calls.length) {
					if (_debug) {
						if (console) console.group('Ajax Response Calls');
					}
					for (var i=0; i<calls.length; i++) {
						var call = calls[i];
						 var method    =
						call.getElementsByTagName('method')[0].firstChild.data;

						var type    =
						call.getElementsByTagName('type')[0].firstChild.data;

						var result    =
						call.getElementsByTagName('data').item(0);

						if (_debug) {
							if (console) {
								console.log('%s (%s)', method, type);
								console.dirxml(result);
							} else {
								if (call.xml) alert(call.xml);
							}
						}
						if (false && type!='javascript' && !window[method]) {
							// Function not exists
						} else {
							try {
								switch (type) {
									case 'javascript':
										var res = document.all ? result.firstChild.data : result.textContent;
										eval(res);
										break;
									case 'void':
										eval(method + '()');
										break;
									case 'string':
										var res = document.all ? result.firstChild.data : result.textContent;
										eval(method + '(res)');
										break;
									case 'json':
										var res = document.all ? result.firstChild.data : result.textContent;
										result = eval("("+res+")");
										eval(method + '(result)');
										break;
									case 'params':
										result = result.firstChild.data;
										params = result.split(',');
										pStr = '';
										for (var p=0; p<params.length; p++) {
											eval('p'+p+'='+params[p]+';');
											pStr += (pStr.length>0?',':'') + 'p' + p;
										}
										eval(method + '(' + pStr + ')');
										break;
									case 'xmlparams':
										var params = result.getElementsByTagName('param');
										var pStr = '';
										for (var p=0; p<params.length; p++) {

											if (params[p].firstChild.data) {
												var val = params[p].firstChild.data;
											} else {
												var val = serializeNode(params[p].firstChild);
											}
											if (params[p].getAttribute("doEvalute") =="yes") {
												val = eval(val);
											}
											var estr = 'var p'+p+'= val;';
											eval(estr);
											pStr += (pStr.length>0?',':'') + 'p' + p;
										}
										eval(method + '(' + pStr + ')');
										break;
									case 'xml':
										//eval(method + '(result)');
										var ccall = method.split('.'), rcall = window;
										while (ccall.length) {
											rcall = rcall[ccall.shift()];
										}
										rcall(result);
										break;
								}
							} catch(e) {
								if (_debug) {
									if (console) {
										console.error(e);
									} else {
										alert('Evaluting '+method+' error:  '+ e.name + ' ' + e.message + '\n' + e.description + '\n\n' + e.lineNumber + ':' + e.fileName);
									}
								}
							}
						}
					}
				}
				if (_debug) {
					if (console) console.groupEnd();
				}
			}
		}

	}

	function processReqChange(j) {
		// only if req shows "complete"
		if (reqs[j].readyState == 4) {

			// only if "OK"
			if (reqs[j].status == 200) {
				// ...processing statements go here...
				try {
					var response  = reqs[j].responseXML.documentElement;
					this.proceedResponseCalls(response);
				} catch (e) {
					if (_debug) {
						if (console) {
							console.error(e);
						} else {
							alert(e.name + ' ' + e.message + '\n' + e.description + '\n\n' + e.lineNumber + ':' + e.fileName);
						}
					}
				}
			} else if (reqs[j].status == 501) {
				// Not logged in ? or unknown function
				//@todo: separate headers responces for unsigned users
				//alert("There was a problem retrieving the XML data:\n" + reqs[j].statusText);
			} else {
				alert("There was a problem retrieving the XML data:\n" + reqs[j].statusText);
			}
			if (debug = document.getElementById('divDebugAjax')) {
				debug.innerHTML = serializeNode(result);
			}
			reqs[j].abort();
			working[j] = null;
		}
	}
}

var reqPool = new reqPoolObj();

function loadXMLDoc(url) {
	reqPool.add(url);
}

function serializeNode(node, childsOnly) {
	var xml = '';
	if (node) {
		try {
			if (childsOnly && node.childNodes) {
				for (var i=0; i<node.childNodes.length; i++) {
					if (node.childNodes[i].xml != undefined) {
						xml += node.childNodes[i].xml;
					} else if (node.childNodes[i]) {
						var objXMLSerializer = new XMLSerializer;
						var x = objXMLSerializer.serializeToString(node.childNodes[i]);
						if (x)
							if (x != undefined) xml += x;
					}
				}
			} else {
				if (node.xml) {
					xml = node.xml;
				} else {
					if (document.all && !window.opera) {
						xml = node.outerHTML;
					} else {
						var objXMLSerializer = new XMLSerializer;
						xml = objXMLSerializer.serializeToString(node);
					}
				}
			}
		} catch(e) {
			if (_debug) {
				if (console) {
					console.error(e);
				} else {
					alert('Error serializing:  '+ e.name + ' ' + e.message + '\n' + e.description + '\n\n' + e.lineNumber + ':' + e.fileName + "\n\n" + node);
				}
			}
		}
	}
	return xml;
}

function closeW(id) {
	if (WinControl) WinControl.Close(id);
}

function fitW(id) {
	if (WinControl) WinControl.FitWindow(id);
}

function alarm(node) {
	if (!WinControl) return;

	if (node.getElementsByTagName('window').item(0)) {
		var id = node.getElementsByTagName('window').item(0).firstChild.data;
	}

	if (node.getElementsByTagName('params').item(0)) {
		var params = node.getElementsByTagName('params').item(0).firstChild.data;
		var paramsArr = params.split(',');
		if (paramsArr) {
			if (paramsArr.length) {
				params = new Array();
				for (var i=0; i<paramsArr.length; i++) {
					var parsed = paramsArr[i].split('=');
					params[parsed[0]] = parsed[1] ? parsed[1] : parsed[0];
				}
			}
		}
	}

	var w = WinControl.newWindow(id);
	w.Create();
	var xml = node.getElementsByTagName('title').item(0).firstChild.data;

	w.setCaption(xml);
	var xml = serializeNode(node.getElementsByTagName('text').item(0), true);
/*
	if (node.getElementsByTagName('text').item(0).xml) {
		var xml =  node.getElementsByTagName('text').item(0).xml;
	} else {
		var objXMLSerializer = new XMLSerializer;

		//get the XML string
		var xml = objXMLSerializer.serializeToString(node.getElementsByTagName('text').item(0));
	}
*/
	w.setContent(xml);
	w.FitSizeOnce();
	w.Show();

	if (params) {
		if (params.fitsize) {
			w.FitSize(1);
		}

		if (params.dontsavesettings) {
			w.dontSaveState = 1;
		}
		if (params.savesettings) {
			WinControl.saveWindowSettings(w.wId);
		}
		if (params.height) {
			w.ResizeTo(w.settings.width, params.height);
			w.Refresh();
		}
		if (params.width) {
			w.ResizeTo(params.width, w.settings.params);
			w.Refresh();
		}
		if (params.centered) {
			w.toCenter(1);
			w.Refresh();
		}
	}
	return w;
}

function urgent(node) {
	if (!WinControl) return;
	var w = alarm(node);

	if (w.settings.f) {
		w.onFix();
		w.toCenter();
		w.Refresh();
	}
	WinControl.FadeIn();
	return w;
}

function ahtung(node) {
	var w = urgent(node);
	if (w) {
		if (window['SoundManager'] && window['AjaxToolkit']) {
			window['soundManager'].play('ahtung_mp3', '/scripts/ajax.toolkit/sound/audio/oops.mp3');
		}
	}
}

function nop() {  }


} // END OF DEF