var GatewayCache = {};

function fillSelectList(sid, values) {
	var select = document.getElementById(sid);
	var selected = Array();
	var options = select.getElementsByTagName('input');
	for (var i = 0; i < options.length; ++i) {
		if (options[i].checked)
			selected[options[i].value] = true;
	}
	while (select.firstChild)
		select.removeChild(select.firstChild);
	for (var i = 0; i < values.values.length; ++i) {
		selectListAdd(sid, values.idToIndex[i], values.values[i], selected[values.idToIndex[i]]);
	}
}

function fillSelect(id, argv) {
	var select = document.getElementById(id);
	var req = (select.getAttribute('ptracRequire') == 'yes');
	var cur = null;
	if (select.options.length > 0) {
		var cur = select.options[select.selectedIndex].value;
		select.selectedIndex = 0;
	}
	for (var i = select.options.length - 1; i >= (req?1:0); --i)
		select.options[i] = null;
	for (var i = 0; i < argv.values.length; ++i) {
		var opt = new Option(argv.values[i], argv.idToIndex[i] ? argv.idToIndex[i] : i);
		select.options[i+(req?1:0)] = opt;
		if (cur > 0 && opt.value == cur)
			select.selectedIndex = i+(req?1:0);
	}
	if (select.options.length > 0) {
		if (req && select.selectedIndex > 0)
			select.options[0].disabled = true;
		else
			select.options[0].disabled = false;
	}
}

function fillListSelect(id, argv) {
	var select = document.getElementById(id);
	var req = (select.getAttribute('ptracRequire') == 'yes');
	var cur = null;
	if (select.options.length > 0) {
		var cur = select.options[select.selectedIndex].value;
		select.selectedIndex = 0;
	}
	for (var i = select.options.length - 1; i >= (req?1:0); --i)
		select.options[i] = null;
	for (var i = 0; i < argv.values.length; ++i) {
		var opt = new Option(argv.values[i], argv.idToIndex[i] ? argv.idToIndex[i] : i);
		select.options[i+(req?1:0)] = opt;
		if (cur > 0 && opt.value == cur)
			select.selectedIndex = i+(req?1:0);
	}
	if (select.options.length > 0) {
		if (req && select.selectedIndex > 0)
			select.options[0].disabled = true;
		else
			select.options[0].disabled = false;
	}
}

function GatewayClearCache() {
	GatewayCache = {};
}

var _one_at_a_time = false;
function Request(action) {
	this.action = action;
	this.args = '';
	this.set = function(name, value) {
		var str = escape(name) + '=' + escape(value);
		if (this.args.length > 0)
			this.args += '&' + str;
		else
			this.args = str;
	};
	this.setMany = function(name, values) {
		for (var i = 0; i < values.length; ++i) {
			this.set(name, values[i]);
		}
	};

	this.send = function(cb) {
		if (_one_at_a_time) {
			var req = this;
			setTimeout(function(){
				req.send(cb);
			}, 50);
			return;
		}

		var cacheId = this.action + '&' + this.args;
		var cache = GatewayCache[cacheId];
		if (cache) {
			if (cb)
				cb(cache);
			else
				this.onResult(cache);
			return;
		}

		_one_at_a_time = true;
		var xr = new XMLHttpRequest();
		xr.open("POST", ptrac.url+"/gateway.php?action=" + escape(this.action), true);
		var request = this;
		xr.onreadystatechange = function() {
			if (xr.readyState == 4) {
				_one_at_a_time = false;

				if (xr.status != 200) {
					request.onError(xr.status, xr.statusText);
					return;
				}

				if (!xr.responseXML) {
					request.onError(xr.status, xr.responseText.substr(0, 128));
					return;
				}

				var status = xr.responseXML.getElementsByTagName('Status')[0].firstChild.nodeValue;
				if (status != 'OK') {
					request.onError(xr.status, status);
					return;
				}

				var values = xr.responseXML.getElementsByTagName('Value');
				var argv = {values: new Array(), map: new Array(), idToIndex: new Array() };
				for (var i = 0; i < values.length; ++i) {
					var ch = values[i].firstChild;
					if (ch)
						ch = ch.nodeValue;
					argv.values[i] = ch;
					var id = values[i].getAttribute('name');
					if (id) {
						argv.map[id] = ch;
						argv.idToIndex[i] = id;
					}
				}

				GatewayCache[cacheId] = argv;
				if (cb)
					cb(argv);
				else
					request.onResult(argv);
			}
		}
		xr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		xr.send(this.args);
	};
	this.onResult = function(data) {};
	this.onError = function(scode, err) {
		alert(scode + ': ' + err);
	};
}
