(function() {

function initFeedback() {
	if ($A.getCurrentMedia() != "screen")
		return;

	var fdb  = $A("feedback"),
		link = $A("togglefeedbacklink");
	var pageName = link.href.match(/^[^?]*\?(?:[^&]*&)*for=([^&]+)/)[1];

	var req = null, list = null, isOpen = false,
		message = null;
	var attachEvents = function() {
		list.read.onclick = function() {
			clearMessage();
			fdb.className = "open";
			return false;
		};
		list.leave.onclick = function() {
			clearMessage();
			fdb.className = "open post";
			return false;
		};
		list.form.onsubmit = function() {
			if (req) return;
			sendFeedback(list.form);
			return false;
		};
	};
	var sendFeedback = function(form) {
		var data = {};
		var len = form.fields.length;
		for (var i = 0; i < len; i++) {
			var f = form.fields[i];
			data[f.n] = f.e.value;
			f.e.disabled = true;
		}
		req = $A.ajax({
			method: "post",
			url: "/feedback.php",
			data: data,
			oncomplete: function(r) {
				req = null;
				var success = r.status == 200, object;
				if (success)
					try {
						object = JSON.parse(r.responseText);
						success = !("error" in object);
					} catch(e) { success = false; }

				var len = form.fields.length;
				for (var i = 0; i < len; i++) {
					var e = form.fields[i].e;
					e.disabled = false;
					if ((success || e.name == "captcha") && !e.keepValue)
						e.value = "";
				}
				list.captcha.refresh(); // new captcha
				if (!success && !object)
					showMessage(ST.fdbsendfail, true);
				else if (!success)
					showMessage(ST.error+ST.fdberrors[object.error_code], true);
				else
					showMessage(ST.fdbthanks[0], false, ST.fdbthanks[1]);
			}
		});
	};
	var loadFeedback = function() {
		if (req) req.abort();

		var li = $A.create("li", {className: "bignote"});
		li.innerHTML = '<img src="/img/gallery_loading.gif" alt="Loading"/>';
		list.ul.appendChild(li);
		req = $A.ajax({
			method: "get",
			url: "/feedback.php?p="+pageName,
			oncomplete: function(r) {
				req = null;
				var success = r.status == 200, response;
				if (success) {
					try { response = JSON.parse(r.responseText); }
					catch(e) { success = false; }
				}
				if (success) {
					list.comments = response;
					if (response.comments == null)
						li.innerHTML = ST.fdbdisabled;
					else {
						if (response.comments.length == 0)
							li.innerHTML = ST.nofeedbackyet;
						else {
							list.ul.removeChild(li);
							for (var i = 0; i < response.comments.length; i++)
								list.ul.appendChild(makeFeedbackListItem(response.comments[i]));
						}
						list.div.appendChild(list.form);
						list.div.appendChild(list.linksP);
					}
				} else {
					li.innerHTML = ST.fdbloaderror;
					list.comments = true; // to prevent additional load attempts
				}
			}
		});
	};
	var showMessage = function(msg, returnToForm, smallMsg) {
		var ul = $A.create("ul");
		var li = $A.create("li", {className: "bignote"});
		li.innerHTML = msg;
		ul.appendChild(li);

		if (smallMsg) {
			li = $A.create("li");
			li.innerHTML = smallMsg;
			ul.appendChild(li);
		}

		li = $A.create("li", {className: "bignote"}); // backlink
		link = $A.create("a", {
			href: "#",
			onclick: returnToForm ? list.leave.onclick : list.read.onclick
		});
		link.appendChild($A.text(ST.backlink));
		li.appendChild(link);
		ul.appendChild(li);

		list.div.insertBefore(ul, list.linksP);

		ul.style.display = "block"; // forced
		list.ul.style.display = list.form.style.display = "none";
		message = ul;
	};
	var clearMessage = function() {
		if (!message) return;
		list.div.removeChild(message);
		list.ul.style.display = list.form.style.display = "";
		message = null;
	};

	link.onclick = function() {
		if (isOpen) {
			fdb.className = "";
		} else {
			if (!list) {
				list = initFeedbackList(pageName);
				attachEvents();
				fdb.insertBefore(list.div, link);
			}
			if (!("comments" in list))
				loadFeedback();
			fdb.className = "open";
		}
		isOpen = !!fdb.className;
		return false;
	};
}

function initFeedbackList(pageName) {
	var wrapper = $A.create("div", {id: "feedbacklist"});

	//*** Header
	var h2 = $A.create("h2");
	h2.appendChild($A.text(ST.feedbackforthis));
	wrapper.appendChild(h2);

	//*** List
	var ul = $A.create("ul");
	wrapper.appendChild(ul);

	//*** Form
	var form = $A.create("form", {
		method: "post",
		action: "/feedback.php"
	});
	var hiddenDiv = $A.create("div");
	var formFields = [],
		fields = [{n:"p", v:pageName}, {n:"post_feedback", v:"post_feedback"}];
	for (var i = 0; i < fields.length; i++) {
		var f = fields[i];
		var input = $A.create("input", {
			type: "hidden",
			name: f.n,
			value: f.v
		});
		hiddenDiv.appendChild(input);
		f.e = input;
		input.keepValue = true;
		formFields.push(f);
	}
	form.appendChild(hiddenDiv);
	//** Form prenote
	var p = $A.create("p");
	p.innerHTML = ST.fdbprenote;
	form.appendChild(p);
	//** Form fields
	var dl = $A.create("dl"), captcha;
	fields = [
		{n:"poster_name"},
		{n:"poster_website"},
		{n:"poster_email"},
		{n:"comment", t:"textarea"},
		{n:"captcha", b:function(dd) {
			var img  = $A.create("img", {src: "/small_captcha.php?n=feedback", alt: "Captcha"});
			var capIndex = 0;
			img.refresh = function() { img.src = "/small_captcha.php?n=feedback&"+(capIndex++); };

			var link = $A.create("a", {
				href: "#",
				onclick: function() {
					img.refresh();
					return false;
				}
			});

			link.appendChild(img);
			dd.appendChild(link);
			dd.appendChild($A.create("br"));
			captcha = img;
		}}
	];
	for (var i = 0; i < fields.length; i++) {
		var f = fields[i];
		var dt = $A.create("dt", {},
			$A.create("label", {"for": "fdb_"+f.n}, ST.fdbfields[f.n]+":")
		);

		var elem = $A.create(f.t || "input", {name: f.n, id: "fdb_"+f.n});
		if (!f.t || f.t == "input") elem.setAttribute("type", "text");

		var dd = $A.create("dd");
		if (f.b) f.b(dd);
		dd.appendChild(elem);

		dl.appendChild(dt);
		dl.appendChild(dd);
		f.e = elem;
		formFields.push(f);
	}
	form.fields = formFields;
	var dd = $A.create("dd");
	var submit = $A.create("input", {type: "submit", value: ST.sendbtn});
	dd.appendChild(submit);
	dl.appendChild(dd);
	form.appendChild(dl);
	//** Form postnotes
	for (var i = 0, len = ST.fdbpostnotes.length; i < len; i++)
		form.appendChild($A.create("p")).innerHTML = ST.fdbpostnotes[i];

	//** Bottom links
	p = $A.create("p");
	var readLink = $A.create("a", {href: "#"}, ST.readfeedback),
		leaveLink = $A.create("a", {href: "#"}, ST.leavefeedback);
	p.appendChild(readLink);
	p.appendChild(leaveLink);

	return {div:wrapper, ul:ul, form:form, captcha:captcha, linksP:p, read:readLink, leave:leaveLink};
}

function makeFeedbackListItem(comment) {
	var li = $A.create("li");

	var content = $A.create("div", {className: "content"});
	content.innerHTML = comment.content;
	li.appendChild(content);

	var meta = $A.create("div", {className: "meta"});
	meta.appendChild($A.text("– "));
	if (comment.website) {
		var link = $A.create("a", {href: comment.website});
		link.appendChild($A.text(comment.name || ST.anonymous));
		meta.appendChild(link);
	} else
		meta.appendChild($A.text(comment.name || ST.anonymous));
	var d = comment.date.match(/^(\d{4})-(\d\d)-(\d\d)/);
	var date = ST.dateFormat;
	date = date.replace(/[ymMdD]/g, function(a) {
		switch (a) {
			case "y": return d[1];
			case "m": return d[2];
			case "M": return ST.months[d[2]-1];
			case "d": return d[3].replace(/^0+/, "");
			case "D": return d[3];
			default: return a;
		}
	});
	meta.appendChild($A.text(", "+date));
	li.appendChild(meta);

	if (comment.reply) {
		var reply = $A.create("div", {className: "reply"});
		reply.innerHTML = comment.reply;
		li.appendChild(reply);
	}

	return li;
}

$A.onload(initFeedback);

})();

if (!window.JSON)
	JSON = {parse: function(t) { return eval("("+t+")"); }};
