doc = document; doc.gebi = doc.getElementById;
tr = function(msg) { //for debugging
	var p = doc.createElement("pre");
	var t = doc.createTextNode(msg);
	p.appendChild(t);
	doc.body.appendChild(p);
}

//////////////////////////////////////////////////////////////////////// GALLERY FUNCS
go = function(d) {
	location.href = doc.gebi(d==1 ? 'next':'prev').href;
}
showTip = function(tip) {
	doc.gebi("tip").innerText = tip;
}
hideTip = function() {
	doc.gebi("tip").innerHTML = "&nbsp;";
}
initEditing = function() {
	var comments = doc.getElementsByClass("comment","div");
	if (comments) for (var i in comments) comments[i].onfocus = startEditing;
}
var lastEdited; //global reference to last touched div
startEditing = function() { //called by comment onfocus
	if (!this.editing) {
		this.editing = true;
		if (lastEdited && lastEdited!=this) stopEditing(lastEdited);
		var t = lastEdited = this; 
		var d = doc.createElement("div");
		var i = doc.createElement("input");
		var c = doc.createElement("input");
		d.className = "editButton";
		i.type = "submit";
		i.value = " Save ";
		i.onclick = function() { saveEditing(t); };
		c.type = "submit";
		c.value = "Cancel";
		c.onclick = function() { stopEditing(t); };
		d.appendChild(i);
		d.appendChild(c);
		this.buttons = this.parentNode.insertBefore(d,this.nextSibling);
	}
}
saveEditing = function(obj) {
	if (obj!=null && obj.editing) {
		postComment(obj.innerText, obj.id.substr(1));
		stopEditing(obj);
		obj.txtTemp = obj.innerText;
		obj.innerHTML = "<i>Saving...</i>";
		obj.pTime = new Date().getTime();
	}
}
stopEditing = function(obj) {
	if (obj.editing) {
		obj.parentNode.removeChild(obj.buttons);
		obj.editing = false;
		//obj.blur();
	}
}
postComment = function(txt, file) {
	xmlRequest('_trpGallery/post.php','path='+escape(path)+'/'+escape(file)+'&comment='+escape(txt) );
}
saveSuccess = function(obj) {
	if (obj==undefined) obj = doc.gebi("_"+req.responseText.split('|')[1]);
	var delay = new Date().getTime() - obj.pTime;
	if (delay < 300) setTimeout( function() { saveSuccess(obj) }, 350-delay);
	else obj.innerText = obj.txtTemp;
}
showLinkForm = function() {
	var clink = doc.gebi("createlink");
	clink.tempHTML = clink.innerHTML;
	var form = "<form id=linkform action=javascript:createLink()>"
				+ "<input type=text name=name value=name"
				+ " onfocus=focusField(this,1) onblur=focusField(this,0)>"
				+ "<input type=text name=url style=width:280; value=url"
				+ " onfocus=focusField(this,1) onblur=focusField(this,0)>"
				+ "<input type=submit value=Create>"
				+ "<input type=button onclick=javascript:hideLinkForm() value=Cancel>";
	clink.innerHTML = form;
}
hideLinkForm = function() {
	var clink = doc.gebi("createlink");
	clink.innerHTML = clink.tempHTML;
}
createLink = function() {
	var n = escape(doc.gebi("linkform").name.value);
	var u = escape(doc.gebi("linkform").url.value);
	xmlRequest("_trpGallery/createlink.php","path="+path+"&name="+n+"&url="+u);
}
linkSuccess = function() {
	location.reload();
}
focusField = function(obj,bool) { ///// run this on field onfocus/onblur
	if (!bool && obj.value) obj.edited=true;
	if (!obj.edited) {
		if (bool) obj.tempVal = obj.value;
		obj.value = bool ? "":obj.tempVal;
	}
	//obj.className = bool ? "active":"";
}

//////////////////////////////////////////////////////////////////////// ONLOAD
window.onload = function() {
	initEditing();
}
window.onunload = function() {
	hideTip();
}

//////////////////////////////////////////////////////////////////////// KEYBOARD
doc.onkeydown = function(e) {
	var keycode;
	if (window.event) keycode = window.event.keyCode;
	else if (e) keycode = e.which;
	//tr(keycode);
	switch (keycode) {
		case 219: go(-1); break; //[
		case 221: go(1); break; //]
		case 13: saveEditing(lastEdited); break;//return
		case 27: stopEditing(lastEdited); break;//esc
		//case 192: toggleNavCookie(); break; //`
	}
}

//////////////////////////////////////////////////////////////////////// XML REQUEST
var req; //the xml request object
function xmlRequest(url,data) { //retrieve XML document, and send data;
	if (window.XMLHttpRequest) { //branch for native XMLHttpRequest object
		req = new XMLHttpRequest();
	} else if (window.ActiveXObject) { //branch for IE/Windows ActiveX version
		req = new ActiveXObject("Microsoft.XMLHTTP");
	}
	req.onreadystatechange = processReqChange;
	req.open("POST", url, true);
	req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	req.send(data);
}
function processReqChange() { //handle onreadystatechange event of req object
	if (req.readyState == 4) { //only if req shows "loaded"
		if (req.status == 200) { //only if "OK"
			//tr("--"+req.responseText+"--");
			if (req.responseText.charAt(0) == '1') saveSuccess();
			if (req.responseText.charAt(0) == '2') linkSuccess();
		} else {
			tr( "Oops, there was a problem... " + req.statusText );
		}
	}
}

//////////////////////////////////////////////////////////////////////// COOKIES
/*function createCookie(name,value,days) {
  if (days) {
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
  }
  else expires = "";
  document.cookie = name+"="+value+expires+"; path=/";
}
function readCookie(name) {
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for(var i=0;i < ca.length;i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1,c.length);
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  }
  return null;
}*/

//////////////////////////////////////////////////////////////////////// DOM TRICKERY
doc.getElementsByClass = function (needle, tag) {
	if (!tag) tag = '*';
	var tags = document.getElementsByTagName(tag);
	var objs = new Array(); var i, j;
	for (i=0, j=0; i<tags.length; i++) {
		var c = " " + tags[i].className + " ";
		if (c.indexOf(" " + needle + " ") != -1) objs[j++] = tags[i];
	}
	return objs;
}