//var endpoint = "http://ondras.praha12.net/idos/";
var endpoint = "endpoint/";
//var endpoint = "endpoint/a.xml";
var tabs;
var timeout = 2000;

function build_table(stations,type) {
	var table = Dom.create("table");
	table.className = "table";
	var thead = Dom.create("thead");
	var tr = Dom.create("tr");
	var headings = {};
	if (type == 1) { headings.date = "Datum"; }
	headings.name="Stanice";
	headings.dep="Odjezd";
	headings.arr="Příjezd";
	headings.remark="Poznámka";
	if (type == 1) { headings.spoj = "Spoj"; }
	if (type == 2) { headings.km = "KM"; }
	for (var p in headings) {
		var td = Dom.create("td");
		td.innerHTML = headings[p];
		tr.appendChild(td);
	}

	thead.appendChild(tr);
	table.appendChild(thead);
	var tbody = Dom.create("tbody");
	
	var createLink = function(url) {
		return function() {
			/* what to do when user clicks link */
			var str = "a=d&"+url;
			var genRef = function() { return str; }
			var recieveRef = function(data) { response(data,str); }
			Ajax.command(Ajax.GET,endpoint,genRef,recieveRef,Ajax.TYPE_TEXT);
//			Ajax.command(Ajax.GET,"endpoint/b.xml",genRef,recieveRef,Ajax.TYPE_TEXT);
		}
	}
	
	for (var i=0;i<stations.length;i++) {
		var tr = Dom.create("tr");
		if (stations[i].important) { tr.className = "important"; }
		for (var p in headings) {
			var td = Dom.create("td");
			tr.appendChild(td);
			if (p == "spoj") {
				var link = Dom.create("span");
				link.innerHTML = stations[i].vehicle;
				link.title = stations[i].description;
				td.appendChild(link);
				if (stations[i].description) {
					link.className = "link";
					var linkRef = createLink(stations[i].link);
					Dom.attach(link,"click",linkRef);
				}
			} else {
				td.innerHTML = stations[i][p];
			}
		}
		tbody.appendChild(tr);
	}
	
	table.appendChild(tbody);
	return table;
}

function add_result(result) {
	var stations = [];
	var s = result.getElementsByTagName("station");
	for (var j=0;j<s.length;j++) {
		var obj = {};
		var station = s[j];
		obj.name = station.getAttribute("name");
		obj.arr = station.getAttribute("arr");
		obj.dep = station.getAttribute("dep");
		obj.remark = station.getAttribute("remark");
		obj.vehicle = station.getAttribute("vehicle");
		obj.description = station.getAttribute("description");
		obj.link = station.getAttribute("link");
		obj.date = station.getAttribute("date");
		stations.push(obj);
	}
	var main = Dom.create("div");
	main.state = 0;
	main.className = "result";
	var h = Dom.create("div");
	h.className = "result_header";
	var toggle = Dom.create("span");
	toggle.className = "toggle";
	toggle.innerHTML = "&rArr;";
	h.appendChild(toggle);
	h.appendChild(Dom.text(" "));
	h.appendChild(Dom.text(stations[0].dep));
	h.appendChild(Dom.text(" - "));
	h.appendChild(Dom.text(stations[stations.length-1].arr));
	var div = Dom.create("div",{display:"none"});
	
	var toggleRef = function() {
		main.state++;
		if (main.state>1) { main.state = 0;}
		if (main.state) {
			div.style.display = "block";
			toggle.innerHTML = "&dArr;";
		} else {
			div.style.display = "none";
			toggle.innerHTML = "&rArr;";
		}
	}
	Dom.attach(h,"click",toggleRef);
	
	/* full results table */
	var table = build_table(stations,1);
	div.appendChild(table);
	
	var remarks = result.getElementsByTagName("remark");
	var ul = Dom.create("ul");
	for (var j=0;j<remarks.length;j++) {
		var li =Dom.create("li");
		li.innerHTML = Xml.textValue(remarks[j]);
		ul.appendChild(li);
	}
	
	div.appendChild(ul);
	main.appendChild(h);
	main.appendChild(div);
	$("result").appendChild(main);
}

function response(data,queryStr) {
	var xml = Xml.getTreeString(data);
	var root = xml.documentElement;
	if (root.tagName != "idos") { alert("Non-standard endpoint used!"); /* alert(data); */ return; }
	var status = root.getElementsByTagName("status")[0];
	switch (status.getAttribute("code")) {
		case "0": /* ok */
			var info = root.getElementsByTagName("info")[0];
			if (root.getElementsByTagName("results").length) {
				/* nalezena spojeni */
				Dom.clear("result");
				tabs.go(1);
				var h = Dom.create("div");
				h.className = "header";
				var pl = Dom.create("a",{cssFloat:"right",styleFloat:"right"});
				pl.innerHTML = "permalink/tisk";
				pl.setAttribute("href",endpoint+"?"+queryStr);
				pl.setAttribute("target","_blank");
				h.appendChild(pl);
				var dep = info.getElementsByTagName("from")[0];
				var arr = info.getElementsByTagName("to")[0];
				var lbl = Dom.create("div");
				lbl.innerHTML = Xml.textValue(dep)+" &rArr; "+Xml.textValue(arr);
				h.appendChild(lbl);
				$("result").appendChild(h);
				var results = root.getElementsByTagName("result");
				for (var i=0;i<results.length;i++) { add_result(results[i]); }
			} else {
				/* detail linky */
				/* novy tab... */
				var t = Dom.create("div");
				
				var h = Dom.create("div");
				h.className = "header";
				var name = info.getElementsByTagName("name")[0];
				var type = info.getElementsByTagName("type")[0];
				var detail = info.getElementsByTagName("detail")[0];
				var pl = Dom.create("a",{cssFloat:"right",styleFloat:"right"});
				pl.innerHTML = "permalink/tisk";
				pl.setAttribute("href",endpoint+"?"+queryStr);
				pl.setAttribute("target","_blank");
				h.appendChild(pl);
				var lbl = Dom.create("div");
				lbl.innerHTML = Xml.textValue(name)+" &rArr; "+Xml.textValue(type);
				if (Xml.textValue(detail)) { lbl.innerHTML += ", "+Xml.textValue(detail); }
				h.appendChild(lbl);

				var tab = Dom.create("div");
				tab.className = "tab";
				tab.innerHTML = Xml.textValue(name)+" ";
				var img = Dom.create("img",{cursor:"pointer"});
				img.setAttribute("src","images/close.gif");
				tab.appendChild(img);

				var removeRef = function() {
					tabs.remove(tab);
					Dom.unlink(tab);
					Dom.unlink(t);
					var last = tabs.keys[tabs.keys.length-1];
					SimpleFX.shadow(last,{imagePath:"images/"});
				}
				Dom.attach(img,"click",removeRef);
				
				SimpleFX.shadowRemove($("tabs").lastChild);
				$("tabs").appendChild(tab);
				SimpleFX.shadow(tab,{imagePath:"images/"});
				tabs.add(tab,t);
				
				t.appendChild(h);
				var stations = [];
				var s = root.getElementsByTagName("station");
				for (var j=0;j<s.length;j++) {
					var obj = {};
					var station = s[j];
					obj.name = station.getAttribute("name");
					obj.arr = station.getAttribute("arr");
					obj.dep = station.getAttribute("dep");
					obj.remark = station.getAttribute("remark");
					obj.km = station.getAttribute("km");
					obj.important = station.getAttribute("important");
					stations.push(obj);
				}
				var table = build_table(stations,2);
				t.appendChild(table);
				
				var remarks = root.getElementsByTagName("remark");
				var ul = Dom.create("ul");
				for (var j=0;j<remarks.length;j++) {
					var li =Dom.create("li");
					li.innerHTML = Xml.textValue(remarks[j]);
					ul.appendChild(li);
				}
				t.appendChild(ul);
			}
		break;
		
		case "1": /* error */
			alert("Error: "+Xml.textValue(status)+"\n\nsorry...");
		break;
		
		case "2": /* specify */
			var date = root.getElementsByTagName("date")[0]; /* date*/
			$("date").value = Xml.textValue(date);
			var time = root.getElementsByTagName("time")[0]; /* time */
			$("time").value = Xml.textValue(time);
			
			var dep = root.getElementsByTagName("dep")[0]; /* departure */
			var opts = dep.getElementsByTagName("option");
			if (opts.length > 1) {
				var from = Dom.create("select");
				for (var i=0;i<opts.length;i++) { 
					var name = Xml.textValue(opts[i]);
					var val = opts[i].getAttribute("value");
					Dom.option(name,val,from);
				}
				$("from").parentNode.replaceChild(from,$("from"));
				from.id="from";
			} else {
				var val = Xml.textValue(opts[0]);
				$("from").value = val;
				if (dep.getAttribute("notfound")) {
					var depRef = function() {
						$("from").style.color = "";
						$("from").style.backgroundColor = "";
					}
					$("from").style.color = "#fff";
					$("from").style.backgroundColor = "#f00";
					setTimeout(depRef,timeout);
				} /* if not found */
			} /* single option */
			
			var arr = root.getElementsByTagName("arr")[0]; /* arrival */
			var opts = arr.getElementsByTagName("option");
			if (opts.length > 1) {
				var to = Dom.create("select");
				for (var i=0;i<opts.length;i++) { 
					var name = Xml.textValue(opts[i]);
					var val = opts[i].getAttribute("value");
					Dom.option(name,val,to);
				}
				$("to").parentNode.replaceChild(to,$("to"));
				to.id="to";
			} else {
				var val = Xml.textValue(opts[0]);
				$("to").value = val;
				if (arr.getAttribute("notfound")) {
					var arrRef = function() {
						$("to").style.color = "";
						$("to").style.backgroundColor = "";
					}
					$("to").style.color = "#fff";
					$("to").style.backgroundColor = "#f00";
					setTimeout(arrRef,timeout);
				} /* if not found */
			} /* single option */

			break;
	}
}

function go() {
	var str = "a=s";
	str += "&t="+encodeURIComponent($v("type"));
	str += "&1="+encodeURIComponent($v("from"));
	str += "&2="+encodeURIComponent($v("to"));
	str += "&d="+encodeURIComponent($v("date"));
	str += "&c="+encodeURIComponent($v("time"));
	if ($v("type") == "m") {
		str += "&m="+encodeURIComponent($v("mhd"));
	}
	var build = function() { return str; }
	var recieve = function(data) { response(data,str); }
	Dom.hide(Calendar.div);
	Ajax.command(Ajax.GET,endpoint,build,recieve,Ajax.TYPE_TEXT);
}

function clear() {
	$("date").value = "";
	$("time").value = "";
	var from = Dom.create("input");
	from.setAttribute("type","text");
	$("from").parentNode.replaceChild(from,$("from"));
	from.id = "from";
	from.value = "";
	var to = Dom.create("input");
	to.setAttribute("type","text");
	$("to").parentNode.replaceChild(to,$("to"));
	to.id = "to";
	to.value = "";
	var today = new Date();
	$("date").value = today.getDate()+"."+(today.getMonth()+1)+"."+today.getFullYear();
	var min = today.getMinutes().toString();
	$("time").value = today.getHours()+":"+(min.length == 1 ? "0"+min : min);
}

function call_for_mhd() {
	var sendRef = function() {
		return "a=m";
	}
	var receiveRef = function(xmlText) {
		var xml = Xml.getTreeString(xmlText);
		var pairs = xml.getElementsByTagName("mhd");
		for (var i=0;i<pairs.length;i++) {
			var mesto = pairs[i].getAttribute("mesto");
			var code = pairs[i].getAttribute("code");
			Dom.option(mesto,code,"mhd");
		}
	}
	Ajax.command(Ajax.GET,endpoint,sendRef,receiveRef,Ajax.TYPE_TEXT);
}

function init() {
	call_for_mhd();
	Dom.hide("mhd");
	Dom.attach("type","change",function() {
		var v = $v("type");
		if (v == "m") {
			Dom.show("mhd");
		} else {
			Dom.hide("mhd");
		}
	});
	Dom.attach("go","click",go);
	Dom.attach("clear","click",clear);
	Ajax.setStart(function(){Dom.show("alert");});
	Ajax.setEnd(function(){Dom.hide("alert");});
	Dom.hide("alert");
	SimpleFX.shadow("content",{imagePath:"images/"});
	
	tabs = new Tab("tab_content");
	tabs.add("tab_form","form"); 
	tabs.add("tab_result","result"); 
	tabs.go(0);
	SimpleFX.shadow("tab_result",{imagePath:"images/"});
	$("tab_form").style.borderLeftWidth = "2px";
	
	var calShow = function(event) {
		var callback = function(date) {
			$("date").value = date[2]+"."+date[1]+"."+date[0];
		}
		var coords = Dom.eventPos(event);
		var d = $v("date").split(".");
		Calendar.show(coords[0],coords[1],callback,d.reverse());
	}
	Calendar.dayNames=["Po","Út","St","Čt","Pá","So","Ne"];
	Calendar.monthNames=["Leden","Únor","Březen","Duben","Květen","Červen","Červenec","Srpen","Září","Říjen","Listopad","Prosinec"];
	Calendar.init();
	Dom.attach("calendar","click",calShow);
	Dom.attach("form","keyup",function(event){if (event.keyCode == 13) { go();}});
	clear();
}