/*
	flamestarter
	2008 CAFxX
	
	flamestarter.js
*/

function flamestarterInit() {
	//flamestarterCreateGraphBox({title:"test"});
	flamestarterLoadLibrary("");
	flamestarterStatus("flamestarter initialized");
}

function flamestarterShowTab(id) {
	$(".tab").css("display","none");
	$("#"+id).css("display","block");
}

function flamestarterStatus(msg) {
	var now = new Date();
	$("#statusbar")[0].innerHTML = ">> " + now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds() + " " + msg;
	flamestarterLog(msg);
}

function flamestarterLog(msg) {
	var now = new Date();
	$("#console")[0].innerHTML += now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds() + " " +  msg + "<br>";
}

function flamestarterCreateGraphBox(filter) {
	var graph = $("#graph")[0];
	var box = document.createElement("div");
	box.className = "box";
	box.flamestarter = {filter:filter};
	box.onmousedown = flamestarterStartDrag;
	box.onmouseup = flamestarterStopDrag;
	box.onmousemove = flamestarterDoDrag;
	var connectors_in = document.createElement("div");
	connectors_in.className = "connectors-in";
	for (i=0; i<filter.in; i++) {
		var connector = document.createElement("div");
		connector.className = "connector";
		connector.flamestarter = { type:"in", id:i };
		connector.appendChild(document.createTextNode(i));
		connectors_in.appendChild(connector);
	}
	var connectors_out = document.createElement("div");
	connectors_out.className = "connectors-out";
	for (i=0; i<filter.out; i++) {
		var connector = document.createElement("div");
		connector.className = "connector";
		connector.flamestarter = { type:"out", id:i };
		connector.appendChild(document.createTextNode(i));
		connectors_out.appendChild(connector);
	}
	box.appendChild(connectors_in);
	box.appendChild(document.createTextNode(filter.title));
	box.appendChild(connectors_out);
	graph.appendChild(box);
	flamestarterStatus("filter " + filter.title + " instantiated");
	return box;
}

function flamestarterStartDrag(event) {
	this.flamestarter.dragging = true;
	this.flamestarter.prevClientX = event.clientX;
	this.flamestarter.prevClientY = event.clientY;
}

function flamestarterStopDrag(event) {
	this.flamestarter.dragging = false;
}

function flamestarterDoDrag(event) {
	if (this.flamestarter.dragging) {
		this.style.top = this.offsetTop + event.screenY - this.flamestarter.prevScreenY + "px";
		this.style.left = this.offsetLeft + event.screenX - this.flamestarter.prevScreenX + "px";
	}
	this.flamestarter.prevScreenX = event.screenX;
	this.flamestarter.prevScreenY = event.screenY;
}

function flamestarterFetch(type, id, success, failure) {
	var req = new XMLHttpRequest();
	req.flamestarter = { type:type, id:id, success:success, failure:failure };
	req.onreadystatechange = function() {
		if (req.readyState == 4) {
			if (req.status == 200 || req.status == 0) {
				flamestarterLog("Fetch(\""+req.flamestarter.type+"\",\""+req.flamestarter.id+"\") OK");
				if (req.flamestarter.success) req.flamestarter.success(req.responseText);
			} else {
				flamestarterLog("Fetch(\""+req.flamestarter.type+"\",\""+req.flamestarter.id+"\") failed");
				if (req.flamestarter.failure) req.flamestarter.failure();
			}
		}
	}
	flamestarterLog("Fetch(\""+req.flamestarter.type+"\",\""+req.flamestarter.id+"\")");
	req.open("GET", "flamestarter.php?type="+type+"&id="+id);
	req.send();
}

function flamestarterFilterParse(data) {
	eval(data);
	if (typeof(flamestarter_filter_descriptor) == "undefined") {
		flamestarterLog("Missing filter descriptor");
		return false;
	} else if ((flamestarter_filter_descriptor.min_version &&
			flamestarter_filter_descriptor.min_version > document.flamestarter.version) ||
			(flamestarter_filter_descriptor.max_version &&
			flamestarter_filter_descriptor.max_version < document.flamestarter.version)) {
		flamestarterLog("Filter " + flamestarter_filter_descriptor.title + 
			"is incompatible with this version of flamestarter");
		return false;
	}
	return flamestarter_filter_descriptor;
}

function flamestarterLoadLibrary(dir) {
	flamestarterFetch("library", dir, 
		function(response) {
			eval(response);
			if (!items) return;
			var finder = $("#finder")[0];
			finder.innerHTML = ""; 
			if (dir != "") {
				var item = document.createElement("div");
				item.appendChild(document.createTextNode("(up)"));
				item.className = "item";
				item.onclick = function() { flamestarterLoadLibrary(dir.substring(0, dir.lastIndexOf('.')-1)); }
				finder.appendChild(item);
			}
			for (i=0; i<items.length; i++) {
				var item = document.createElement("div");
				item.appendChild(document.createTextNode(items[i]));
				item.className = "item";
				item.flamestarter = { title:items[i] };
				item.onclick = flamestarterLoadItem;
				finder.appendChild(item);
			}
			flamestarterStatus("directory \""+dir+"\" loaded");
		}
	);
}

function flamestarterLoadItem() {
	flamestarterFetch('item', this.flamestarter.title,
		function(r) {
			eval(r);
			$("#code")[0].value = data;
			flamestarterCreateGraphBox(flamestarterFilterParse(data));
			flamestarterStatus("filter \""+this.id+"\" loaded");
		},
		function() {
			flamestarterLoadLibrary(this.id);
		}
	);
}
