function disablechk(id) {
	var e;
	if(e = document.getElementById(id)) {
		e.checked = false;
		e.disabled = true;
		return true;
	} else {
		return false;
	}
}

function enablechk(id) {
	var e;
	if(e = document.getElementById(id)) {
		e.checked = true;
		e.disabled = false;
		return true;
	} else {
		return false;
	}
}
function removeById(id) {
	var elem;
	if(elem = document.getElementById(id)) {
		elem.parentNode.removeChild(elem);
	}	
}

function setDropdown(id, newvalue, isdisabled) {
	var e;
	if(e = document.getElementById(id)) {
		e.value = newvalue;
		e.disabled = isdisabled;
	} else {
		return false;
	}
}

function anonsearch() {
	// strip all customisables, used if the response from the server is null, mal-formed or just plain wrong.
	var charrow, tagrow, e;
	removeById('charrow');
	removeById('tagrow');
	enablechk('chkstriptitle');
	enablechk('chkstripcaption');
	enablechk('chkstripmouseover');
	enablechk('chkstripdescription');
	enablechk('chkstripkeywords');
	document.getElementsByTagName("h2").item(0).innerHTML = "";
	setDropdown('animated', 'both', false);
	setDropdown('guest', 'both', false);
}

function dochk(chk, cstatus) {
	if(cstatus == "yes") {
		enablechk('chkstrip' + chk);
	} else {
		disablechk('chkstrip' + chk);
	}
}

function addText(obj, text) {
	var newNode = document.createTextNode(text);
	obj.appendChild(newNode);
}

function setupDropdown(inputvalue, dropdownbox) {
	switch(inputvalue) {
		case "both": setDropdown(dropdownbox, 'both', false); break;
		case "no": setDropdown(dropdownbox, 'no', true); break;
		case "only": setDropdown(dropdownbox, 'only', true); break;
		default: setDropdown(dropdownbox, 'both', false); break;
	}
}

var throbber = document.createElement("img");
throbber.src = "/images/throbber.gif";

if( !window.XMLHttpRequest ) XMLHttpRequest = function(){
 try{ return new ActiveXObject("MSXML3.XMLHTTP"); }catch(e){}
 try{ return new ActiveXObject("MSXML2.XMLHTTP.3.0"); }catch(e){}
 try{ return new ActiveXObject("Msxml2.XMLHTTP"); }catch(e){}
 try{ return new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){}
 throw new Error("Could not find an XMLHttpRequest alternative.");
};
function CreateRequestObject() { var objAjax = new XMLHttpRequest(); return objAjax; }

function comicchange() {
	// insert the throbber
	var cid = document.getElementById("comicid");
	document.getElementById('submitcomicid').value = cid.value;
	if(cid.value == "") {
		// no comic selected, so no need to send request
		anonsearch();
	} else {
		cid.parentNode.insertBefore(throbber, cid.nextSibling);
		var http = new CreateRequestObject();
		http.open("get", "advlookup.php?comicid=" + cid.value);
		http.onreadystatechange = function() {
			if(http.readyState == 4) {
				if(http.status == 200) {
					if(http.responseText == "<?xml version=\"1.0\" encoding=\"UTF-8\"?><nocomic />") {
						anonsearch();
						cid.parentNode.removeChild(throbber);
					} else {
						removeById('charrow');
						removeById('tagrow');
						var xml = http.responseXML;
						var comic, e, controw, controw_e, charrow_e, tagrow, tagrow_e, numranges, numchars, numstrips;
						if(comic = xml.getElementsByTagName('comic').item(0)) {
							numstrips = 0;
							if(comic.getAttribute("strips")) {
								numstrips = parseInt(comic.getAttribute("strips"), 10);
								//alert(numstrips);
							}
							e = xml.getElementsByTagName('name').item(0);
							var h2 = document.getElementsByTagName("h2").item(0);
							while (h2.hasChildNodes()) { h2.removeChild(h2.lastChild); }
							
							if(e.childNodes[0].data > " ") {
								var h2text = document.createTextNode("Searching '" + e.childNodes[0].data + "' archived strips");
								h2.appendChild(h2text);
							}
							
							dochk("mouseover", comic.getAttribute("mouseover"));
							dochk("caption", comic.getAttribute("caption"));
							dochk("title", comic.getAttribute("title"));
							dochk("description", comic.getAttribute("description"));
							dochk("keywords", comic.getAttribute("keywords"));
							
							setupDropdown(comic.getAttribute("animated"), 'animated');
							setupDropdown(comic.getAttribute("gueststrip"), 'guest');
							
							e = xml.getElementsByTagName('chrs');
							if(e.item(0)) {
								numchars = parseInt(e.item(0).getAttribute("count"), 10);
								if(e = xml.getElementsByTagName('chr')) {
									if(e.length == numchars) {
										// make up the containers in charrow
										var th,td,sel,opt1;
										charrow = document.createElement("tr");
										charrow.id = "charrow";
										th = document.createElement("th");
										td = document.createElement("td");
										sel = document.createElement("select");
										opt1 = document.createElement("option");
										addText(th, "A specific character?");
										opt1.value = "";
										addText(opt1, "Any character");
										sel.name = "chr";
										sel.appendChild(opt1);
										td.appendChild(sel);
										charrow.appendChild(th);
										charrow.appendChild(td);
										var optg1 = document.createElement("optgroup");
										var optg2 = document.createElement("optgroup");
										var optg3 = document.createElement("optgroup");
										var optg4 = document.createElement("optgroup");
										optg1.setAttribute("label", "Regular characters");
										optg1.id = "chr_reg";
										optg2.setAttribute("label", "Occasional characters");
										optg2.id = "chr_occ";
										optg3.setAttribute("label", "Incidental characters");
										optg3.id = "chr_inc";
										optg4.setAttribute("label", "One-off characters");
										optg4.id = "chr_one";
										sel.appendChild(optg1);
										sel.appendChild(optg2);
										sel.appendChild(optg3);
										sel.appendChild(optg4);
										for(var i = 0; i < e.length; i++) {
											charrow_e = document.createElement("option");
											if(e[i].getAttribute('a')) {
												charrow_e.setAttribute("value", e[i].getAttribute('a'));
											} else {
												charrow_e.setAttribute("value", e[i].childNodes[0].data);
											}
											var str = "(" + e[i].getAttribute('l') + " line";
											if(e[i].getAttribute('l') != 1) { str += "s"; }
											str += " in " + e[i].getAttribute('s') + " strip";
											if(e[i].getAttribute('s') != 1) { str += "s"; }
											str = e[i].childNodes[0].data + " " + str + ")";
											
											addText(charrow_e, str);
											// append to whichever group depending frequency of strips
											switch(e[i].getAttribute('r')) {
												case "r": optg1.appendChild(charrow_e); break;
												case "o": optg2.appendChild(charrow_e); break;
												case "i": optg3.appendChild(charrow_e); break;
												case "1": optg4.appendChild(charrow_e); break;
												default: sel.appendChild(charrow_e); break;
											}
										}
										var table = document.getElementById("incltick");
										table.parentNode.insertBefore(charrow, table);
									} else {
										removeById('charrow'); // xml not right, fail it and remove charrow
									}
								} else {
									removeById('charrow'); // no ranges defined - remove charrow if it exists
								}
							} else {
								removeById('charrow'); // no ranges defined - remove charrow if it exists
							}
							
												
							e = xml.getElementsByTagName('tags');
							if(e.item(0)) {
								numtags = parseInt(e.item(0).getAttribute("count"), 10);
								e = xml.getElementsByTagName('tag');
								if(e.item(0)) {
									if(e.length == numtags) {
										// make up the containers in tagrow
										var th, td, sel, opt1, captiontext;
										tagrow = document.createElement("tr");
										tagrow.id = "tagrow";
										th = document.createElement("th");
										td = document.createElement("td");
										sel = document.createElement("select");
										opt1 = document.createElement("option");
										addText(th, "Is strip part of a group?");
										opt1.value = "";
										addText(opt1, "Any strips");
										sel.name = "tag";
										sel.appendChild(opt1);
										td.appendChild(sel);
										tagrow.appendChild(th);
										tagrow.appendChild(td);
										for(var i = 0; i < e.length; i++) {
											tagrow_e = document.createElement("option");
											tagrow_e.setAttribute("value", e[i].getAttribute('id'));
											captiontext = e[i].childNodes[0].data + " (";
											if(parseInt(e[i].getAttribute('s'), 10) == 1) {
												captiontext += "1 strip";
											} else {
												captiontext += e[i].getAttribute('s') + " strips";
											}
											addText(tagrow_e, captiontext + ")");
											sel.appendChild(tagrow_e);
										}
										var table = document.getElementById("incltick");
										table.parentNode.insertBefore(tagrow, table);										
									} else {
										removeById('tagrow'); // xml not right, fail it and remove tagrow
									}
								} else {
									removeById('tagrow'); // no tags defined - remove tagrow if it exists
								}
							} else {
								removeById('tagrow'); // no tags defined - remove tagrow if it exists
							}
						} else {
							anonsearch();
						}
						cid.parentNode.removeChild(throbber);
					}
				}
			}
		}
		http.send(null);
	}
}