// wallifize.js
// The Wall interface
// -- coded^H^H^H^H^Hhacked by Roman 'rofi' Fiser <roman.fiser@gmail.com>


// global variables
var key_char = /tlacitkat_([a-zA-Z]{1})/;
var keys = /^[a-zA-Z]+$/
var xhr_result_ok=/^OK:(.*)$/;
var xhr_result_error=/^ERROR:(.*)$/;
var KEYS_PREFIX='imgs/klavesnice';
var ABC_PREFIX=KEYS_PREFIX+'/abeceda';
var ABC_SPACER=ABC_PREFIX+'/_.png';
var BACKEND='backend/backend.php';
var RECORD_SEPARATOR=';' // separator between records
var FIELD_SEPARATOR=':' // separator between fields
var TEXT_PREVIEW_ELEMENT='wall_texts';
var MESSAGE_BOX_ELEMENT='msg-box';
var MESSAGE_DATE_CLASS='date-msg';
var MESSAGE_ID_PREFIX='msg_';
var SEND_ELEMENT='david';
var SPACER_KEY_ID='S';
var BACKSPACE_KEY_ID='B';
var message='' // current message, david sends this to server



// send message to server
function send_message_xhr() {
	var xhr = new XMLHttpRequest();
	xhr.open("GET", BACKEND+"?action=wall_store_message&message="+message, false);
	xhr.send(null);
	if (xhr.status == 200) {
		var response = xhr.responseText;
		var test_ok = xhr_result_ok.exec(response);
		if (test_ok) {
			message = '';
			window.location.reload();
			return true;
		} else {
			var test_error = xhr_result_error.exec(response);
			if (test_error) {
				alert('Error sending message: '+test_error[1]);
				return false;
			} else {
				alert('Error sending message: Unknown error');
				return false;
			}
		}
	} else {
		alert('Error sending message: server error');
		return false;
	}
}

// display messages
function display_messages(messages) {
	var _messages = messages.split(RECORD_SEPARATOR);
	// first message is blank so indexing from 0
	for (var i=1;i<_messages.length;i++) {
		var message = _messages[i];
		var _message = message.split(FIELD_SEPARATOR);
		var msg_date = _message[0];
		var msg_text = _message[1];
		var msg_box = document.getElementById(MESSAGE_BOX_ELEMENT);
		// FIXME: it would be nice to have following in some fancy template
		var msg_div = document.createElement("div");
		msg_div.id = MESSAGE_ID_PREFIX+i;
		var msg_span = document.createElement("span");
		// FIXME: this will not work for IE className instead of class
		msg_span.setAttribute("class", MESSAGE_DATE_CLASS);
		msg_span.innerHTML = msg_date;
		msg_div.appendChild(msg_span);
		msg_box.appendChild(msg_div);
		display_string(msg_div.id, msg_text);
	}

}

// get wall
function get_wall_stream() {
	var xhr = new XMLHttpRequest();
	xhr.open("GET", BACKEND+"?action=wall_get_messages", false);
	xhr.send(null);
	if (xhr.status == 200) {
		var response = xhr.responseText;
		var test_ok = xhr_result_ok.exec(response);
		if (test_ok) {
			return display_messages(test_ok[1]);
		} else {
			var test_error = xhr_result_error.exec(response);
			if (test_error) {
				alert('Error getting wall: '+test_error[1]);
				return false;
			} else {
				alert('Error getting wall: Unknown error');
				return false;
			}
		}
	} else {
		alert('Error getting wall: server error : status: ' + xhr.status );
		return false;
	}
}

// display character
function display_char(placeholder,value) {
	var element = document.getElementById(placeholder);
	if (keys.exec(value)) {
		var character = document.createElement('img');
		// FIXME: this will not work in IE, need className instead of class
		character.setAttribute("class", "pismenko");
		if (value==SPACER_KEY_ID) {
			character.src = ABC_SPACER;
		} else {
			character.src = ABC_PREFIX + "/" + value + ".png";
		}
		element.appendChild(character);
	} else {
		alert('display_character: invalid character!');
	}
}

// display string on the wall
function display_string(placeholder, value) {
	for(var i=0;i<value.length;i++)
		display_char(placeholder, value[i]);
}

// press "basic" key
function press_basic_key(event) {
	var curr_id = event.currentTarget.id;
	var curr_key = key_char.exec(curr_id)[1];
	if (curr_key == 'B') {
		backspace()
	} else {
		message += curr_key;
		display_char(TEXT_PREVIEW_ELEMENT, curr_key);
	}
}

function backspace() {
	var element = document.getElementById(TEXT_PREVIEW_ELEMENT);
	element.removeChild(element.lastChild);
	message = message.substring(0,message.length-1)
}

// Initializator
window.onload = function() {
	// find all keys
	var elements = document.getElementsByTagName('img');
	for (var i=0; i<elements.length; i++) {
		el = elements[i]
		el_id = el.id
		// is basic char
		if (key_char.test(el_id)) {
			// set on click method
			el.onclick = press_basic_key;
		}
	}
	var button = document.getElementById(SEND_ELEMENT);
	button.onclick = send_message_xhr;
	get_wall_stream();
}

