﻿// From quirksmode.org
function sendRequest(url,callback,postData) {
	var req = createXMLHTTPObject();
	if (!req) return;
	var method = (postData) ? "POST" : "GET";
	req.open(method,url,true);
	req.setRequestHeader('User-Agent','XMLHTTP/1.0');
	if (postData)
		req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
	req.onreadystatechange = function () {
		if (req.readyState == 4) {
		if (req.status != 200 && req.status != 304) {
			alert("Process could not be completed.  Error status: " + req.status);
			return;
		}
		// setStatus("Request Successful");
		callback(req);
		}
	}
	if (req.readyState == 4) return;
	req.send(postData);
}

// From quirksmode.org
var XMLHttpFactories = [
	function () {return new XMLHttpRequest()},
	function () {return new ActiveXObject("Msxml2.XMLHTTP")},
	function () {return new ActiveXObject("Msxml3.XMLHTTP")},
	function () {return new ActiveXObject("Microsoft.XMLHTTP")}
];

// From quirksmode.org
function createXMLHTTPObject() {
	var xmlhttp = false;
	for (var i=0;i<XMLHttpFactories.length;i++) {
		try {
			xmlhttp = XMLHttpFactories[i]();
		}
		catch (e) {
			continue;
		}
		break;
	}
	return xmlhttp;
}




// Create the view/add comments link and insert it aftet the cmturi input (if found)
function cmt_init() {
	var input = document.getElementById('cmturi');
	if(input == null)
		return;
	
	var div = document.createElement('p');
	div.id = 'viewcomments';
	
	var view = div.appendChild(document.createElement('a'));
	view.setAttribute('href', 'cmt://' + escape(input.value));
	view.setAttribute('title', 'View Comments');
	view.onclick = cmt_view_click;
	view.appendChild(document.createTextNode('View/Add Comments'));
	
	if(input.nextSibling == null)
		input.parentNode.appendChild(div);
	else
		input.parentNode.insertBefore(div, input.nextSibling);
		
}

function cmt_view_click() {
	var parent = this.parentNode;
	
	var uri = document.getElementById('cmturi').value;
	var geturi = '/actions/cmt.php?u=' + escape(uri);
	
	var div = document.createElement('div');
	div.id = 'comments';
	
	var p = div.appendChild(document.createElement('p'));
	p.appendChild(document.createTextNode('Loading...'));
	p.className = 'loading';
	
	if(parent.nextSibling == null)
		parent.parentNode.appendChild(div);
	else
		parent.parentNode.insertBefore(div, parent.nextSibling);
	
	parent.parentNode.removeChild(parent);

	sendRequest(geturi, cm_cmt_loaded);
	
	return false;
}

function cm_cmt_loaded(req) {
	var root = req.responseXML.documentElement;
	// var div = document.getElementById('comments');
	var div = document.createElement('div');
	
	/* while (div.hasChildNodes())
		div.removeChild(div.firstChild); */
	
	if (root.nodeName == "error") {
		var er = div.appendChild(document.createElement('p'));
		er.className = 'cmterror';
		er.appendChild(document.createTextNode(root.firstChild.nodeValue));
		
		var olddiv = document.getElementById('comments');
		olddiv.parentNode.insertBefore(div, olddiv);
		olddiv.parentNode.removeChild(olddiv);
		div.id = 'comments';
		
		return;
	}
	
	var cmtCount = 0;
	
	for(var x=0,m=root.childNodes.length; x < m; x++) {
		var comment = root.childNodes[x];
		if(comment.nodeType == 1 && comment.nodeName == 'cmt') {
			div.appendChild(cmt_create_cmtdiv(comment));
			cmtCount++;
		}
	}
	
	if(cmtCount == 0) {
		var cmtDiv = div.appendChild(document.createElement('p'));
		cmtDiv.className = 'nocomments';
		cmtDiv.appendChild(document.createTextNode('No comments yet!  Be bold.  Be the first.'));
	}
	
	
	var form = document.createElement('div');
	form.className = 'form';
	form.id = 'commentform';
	
	var h2 = form.appendChild(document.createElement('h2'));
	h2.appendChild(document.createTextNode('Add your comment'));
	
	var p = form.appendChild(document.createElement('p'));
	p.appendChild(document.createTextNode('Got something to say?  Say it!  All fields are required.  Sorry, no HTML or other markup is allowed.'));
	
	var row = form.appendChild(document.createElement('div'));
	row.className = 'text';
	var label = row.appendChild(document.createElement('label'));
	label.appendChild(document.createTextNode('Name:'));
	label.className = 'required';
	label.setAttribute('for', 'cmtname');
	var input = row.appendChild(document.createElement('input'));
	input.setAttribute('type', 'text');
	input.setAttribute('maxlength', '128');
	input.id = 'cmtname';
	input.name = 'cmtname';
	
	row = form.appendChild(document.createElement('div'));
	row.className = 'textarea';
	label = row.appendChild(document.createElement('label'));
	label.appendChild(document.createTextNode('Message:'));
	label.className = 'required';
	label.setAttribute('for', 'cmtmsg');
	input = row.appendChild(document.createElement('textarea'));
	input.setAttribute('rows', '7');
	input.setAttribute('cols', '50');
	input.id = 'cmtmsg';
	input.name = 'cmtmsg';
	
	row = form.appendChild(document.createElement('div'));
	row.className = 'submit';
	row.appendChild(form_create_submit());
	
	div.appendChild(form);
	
	var olddiv = document.getElementById('comments');
	olddiv.parentNode.insertBefore(div, olddiv);
	olddiv.parentNode.removeChild(olddiv);
	div.id = 'comments';
}

function form_create_submit() {
	var input = document.createElement('input');
	input.setAttribute('type', 'button');
	input.setAttribute('value', 'Submit Comment');
	input.onclick = cmt_submit_comment_click;
	return input;
}

function cmt_create_cmtdiv(comment) {
	var name = comment.getElementsByTagName('name')[0];
	var msg = comment.getElementsByTagName('msg')[0];
	
	var cmtdiv = document.createElement('div');
	if(comment.getAttribute('isbob') == 'true')
		cmtdiv.className = 'comment bob';
	else
		cmtdiv.className = 'comment';
	
	var namediv = cmtdiv.appendChild(document.createElement('h3'));
	namediv.appendChild(document.createTextNode(name.firstChild.nodeValue));
	
	var msgdiv = cmtdiv.appendChild(document.createElement('div'));
	msgdiv.innerHTML = msg.firstChild.nodeValue;
	
	return cmtdiv;
}

function cmt_submit_comment_click() {
	var form = this.parentNode.parentNode;
	
	var name = document.getElementById('cmtname');
	var nameval = name.value.replace(/^\s+|\s+$/g, '');
	var valid = true;
	
	if(nameval == '') {
		name.className = 'error';
		valid = false;
	} else {
		name.className = '';
	}

	var msg = document.getElementById('cmtmsg');
	var msgval = msg.value.replace(/^\s+|\s+$/g, '');
	if(msgval == '') {
		valid = false;
		msg.className = 'error';
	} else {
		msg.className = '';
	}
	
	if(!valid) {
		form_set_error('Did you forget something?  All fields are required.');
		return false;
	}
	
	if(nameval.length > 128) {
		name.className = 'error';
		form_set_error('Is your name seriously more than 128 characters?  Holy Franbublenamianaripockolinguinistumbergenhiemestrenopolis!');
		return false;
	}
	
	if(msgval.length > 2048) {
		msg.className = 'error';
		form_set_error('Seriously?  2048 characters are not enough for your message?  Let\'s cut back a bit, shall we?');
		return false;
	}
	
	form_erase_error();
	
	var data = 'name=' + escape(nameval) + 
		'&msg=' + escape(msgval);
	
	var span = document.createElement('p');
	span.className = 'fake';
	span.appendChild(document.createTextNode('Loading...'));
	
	this.parentNode.insertBefore(span, this);
	this.parentNode.removeChild(this);

	var uri = document.getElementById('cmturi').value;
	var data = 'u=' + escape(uri) + '&name=' + escape(nameval) + 
		'&msg=' + escape(msgval);
	
	sendRequest('/actions/cmt.php', form_cmt_posted, data);
	
	return false;
}

function form_set_error(message) {
	var form = document.getElementById('commentform');
	var errdiv = form.lastChild;
	if(errdiv.className != 'errnote') {
		errdiv = form.appendChild(document.createElement('p'));
		errdiv.className = 'errnote';
		errdiv.appendChild(document.createTextNode(message));
	} else {
		while(errdiv.hasChildNodes())
			errdiv.removeChild(errdiv.firstChild);
		errdiv.appendChild(document.createTextNode(message));
	}
}

function form_erase_error() {
	var form = document.getElementById('commentform');
	var errdiv = form.lastChild;
	if(errdiv.className == 'errnote' || errdiv.className == 'infonote')
		form.removeChild(errdiv);
}

function form_set_error(message) { form_set_message(message, 'errnote'); }
function form_set_info(message) { form_set_message(message, 'infonote'); }

function form_set_message(message, css) {
	var form = document.getElementById('commentform');
	var errdiv = form.lastChild;
	if(errdiv.className != 'errnote' && errdiv.className != 'infonote') {
		errdiv = form.appendChild(document.createElement('p'));
		errdiv.className = css;
		errdiv.appendChild(document.createTextNode(message));
	} else {
		while(errdiv.hasChildNodes())
			errdiv.removeChild(errdiv.firstChild);
		errdiv.className = css;
		errdiv.appendChild(document.createTextNode(message));
	}
}

function form_erase_error() {
	var form = document.getElementById('commentform');
	var errdiv = form.lastChild;
	if(errdiv.className == 'errnote')
		form.removeChild(errdiv);
}

function form_cmt_posted(req) {
	var root = req.responseXML.documentElement;
	var form = document.getElementById('commentform');
	var worked = false;
	
	if(root.nodeName == 'error') {
		form_set_error('Server returned an error: ' + root.firstChild.nodeValue);
	} else {
		var node = root.firstChild;
		while(node != null && node.nodeType != 1)
			node = node.nextSibling;
		if(node != null) {
			var newcmtnode = cmt_create_cmtdiv(node);
			newcmtnode.className += ' new';
			form.parentNode.insertBefore(newcmtnode, form);
		}
		
		var commentsdiv = document.getElementById('comments');
		var nocomments = find_by_css_class(commentsdiv, 'nocomments', 'p');
		if(nocomments != null)
			nocomments.parentNode.removeChild(nocomments);
		worked = true;
	}
	
	if(worked) {
		form.getElementsByTagName('input')[0].value = '';
		form.getElementsByTagName('textarea')[0].value = '';
		
		var fakebtn = find_by_css_class(form, 'fake', 'p');
		fakebtn.removeChild(fakebtn.firstChild);
		fakebtn.appendChild(document.createTextNode('Wait for it...'));
		
		form_set_info('Your comment has been successfully added.  You can post again in 5 seconds.');
		setTimeout(form_reset_button, 5000);
	} else {
		var fakebtn = find_by_css_class(form, 'fake', 'p');
		var realbtn = form_create_submit();
		fakebtn.parentNode.insertBefore(realbtn, fakebtn);
		fakebtn.parentNode.removeChild(fakebtn);
	}
}

function form_reset_button() {
	var form = document.getElementById('commentform');
	var fakebtn = find_by_css_class(form, 'fake', 'p');
	var realbtn = form_create_submit();
	fakebtn.parentNode.insertBefore(realbtn, fakebtn);
	fakebtn.parentNode.removeChild(fakebtn);
	form_set_info('Your comment has been successfully added.');
}

function find_by_css_class(root, classname, tagname) {
	var f = -1;
	var ps = root.getElementsByTagName(tagname);
	for(var x=ps.length - 1; x>=0; x--) {
		if(ps[x].className == classname) {
			f = x;
			x = -1;
		}
	}
	
	if(f >= 0)
		return ps[f];
	else
		return null;
}

cmt_init();



