// Clipboard

var Clipboard = function() {
	var CLIPBOARD_URI = "/clipboard"
	var request  = null; // XMLHttpRequest
	var io       = null; // Input/Output for clipboard content
	var s        = null; // Status message output

	var constructor = function(textarea, state) {
		request = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

		if (textarea) io = textarea;
		if (state) s = state;

		this.up  = up;
		this.down = down;
		this.clear = clear;
	}

	function up() {
		updateStatus("Uploading...");
		request.onreadystatechange = updateIO;
		request.open("POST", CLIPBOARD_URI, true);
		request.setRequestHeader("Content-Type", "text/plain");
		request.send(io.value);
	}

	function down() {
		updateStatus("Downloading...");
		request.onreadystatechange = updateIO;
		request.open("GET", CLIPBOARD_URI, true);
		request.send(null);
	}

	function clear() {
		updateStatus("Clearing Clipboard...");
		request.onreadystatechange = updateIO;
		request.open("DELETE", CLIPBOARD_URI, true);
		request.send(null);
	}

	function updateIO() {
		if (request.readyState == 4) {
			switch (request.status) {
			case 200:
			case 201:
				io.value = request.responseText;
			}
			updateStatus(request.statusText);
		}
	}

	function updateStatus(statusText) {
		if (s) {
			s.innerHTML = statusText;
		}
	}

	return constructor;
}();

// Validator

var Validator = function() {
	var VALIDATOR_URI = "/validate"
	var request  = null; // XMLHttpRequest
	var cb       = null; // Input/Output for clipboard content

	var constructor = function(callback) {
		request = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

		if (callback) cb = callback;

		this.validate  = validate;
	}

	function validate(data, contentType) {
		request.onreadystatechange = update;
		request.open("POST", VALIDATOR_URI, true);
		request.setRequestHeader("Content-Type", contentType);
		request.send(data);
	}

	function update() {
		if (request.readyState == 4) {
			cb(request.status, request.statusText, request.responseText);
		}
	}

	return constructor;
}();

// General Functions

var escapeHTML = function () {
	var ent = {'&': '&amp;', '<': '&lt;', '>': '&gt;'}
	function encodeChar(ch) {
		return ent[ch]
	}

	return function(str) {
		return str.replace(/[&<>]/gm, encodeChar)
	}
}();


