

var showCompilerSettings = false;
$(document).ready(function(){
	$("#compilerSettingsToggle").bind("click", toggleCompilerSettings)	
});
function toggleCompilerSettings() {
	showCompilerSettings = !showCompilerSettings;
	if (showCompilerSettings) {
		$("#compilerSettings").css("display", "block");
		$("#compilerSettingsToggle").text("Hide compiler settings")
	}
	else {
		 $("#compilerSettings").css("display", "none");
		 $("#compilerSettingsToggle").text("Show compiler settings");
	}
}
	
function hightlightLines(linenrs, txtEditor, color) {
	// just to clear prev. hightlight:
	txtEditor.editor.syntaxHighlight();
	var lines = txtEditor.editor.getLines();
	for (var ix in linenrs) {
		var linenr = linenrs[ix] - 1; //lines counts from 1 arr from 0
		lines[linenr] = highlightLine(lines[linenr], color);
	}
	txtEditor.editor.setLines(lines);
	//alert(es4.editor.getEditor().innerHTML);	
}
function highlightLine(line, color) {
	return "<span class=hiliteline style='background-color:" + color + ";'>" + line + "</span>";
}

var ajaxErrorHandler;
$(document).ajaxError(function(event, request, settings){
   if (ajaxErrorHandler) ajaxErrorHandler(event, request, settings);
   ajaxErrorHandler = null;
});


function translate(source, fun){
	var data = {"source":source};	
	// note: false will be interpreted as true on the server (bc. this is not JSON)
	if ($("#settings_semicolonInsertion").attr("checked")) data["compiler_setting_semicolon_insertion"] = true;
	var wait = $("#wait"); 
	wait.css("display", "block");
	function errHandler(XMLHttpRequest, textStatus, errorThrown) {
		wait.css("display", "none");						 
		alert("An error has occurred communicating with the server. Sorry."); 					
	} 
	$.ajax({url:serviceUrl,data:data,dataType:"json",error:errHandler,success:fun,type:"POST"});
}

function translateTxta(fromTxt, toTxt) {	
	var code = fromTxt.getCode();
	$("#msgArea").css("display", "none");
	beginTranslation();
	translate(code, function(data, status){	
		$("#wait").css("display", "none");		
        	displayResult(toTxt, data, fromTxt);
			sourceMap = data.sourceMap;
        });
}


function displayResult(toTxt, data, fromTxt) {	
	$("#msgArea").css("display", "block");
	if (data.success) {
		toTxt.setCode(data.generatedCode);
		toTxt.editor.syntaxHighlight();
		msg = "Compilation successful. "
		afterTranslated();
	} else {
		toTxt.setCode("// No code generated.");
		msg = "Compilation failed. "
	}
	// hide output area (until next run)
	hideOutput();
	
	var tbl = $("#msgTbl");	
	if (data.messages.length>0) {
		msg += data.messages.length + " messages:";
		$("#msgTxt").text(msg);
		var msgLines = [];
		tbl.html("<tr><th>Line</th><th>Message</th></tr>"); // reset
		for (var ix in data.messages) {
			var msg = data.messages[ix];
			tbl.append("<tr class=" + msg.startLine +"><td class=line>" + msg.startLine + "</td><td>" + msg.description.replace("<", "&lt;") + "</td></tr>");
			msgLines.push(msg.startLine);
		}	
		hightlightLines(msgLines, fromTxt, "yellow");
		tbl.bind("click", function(ev) {tblClick(ev, fromTxt);});
	} else {
		msg += "No messages or warnings.";
		$("#msgTxt").text(msg);	
		tbl.html("<tr><th></th></tr>");
		// to clear previous highlighted lines
		es4.editor.syntaxHighlight();
	}
}

function tblClick(ev, fromTxt) {
	if (ev.target.tagName=="TD") {
		var rw = ev.target.parentNode;
		var line = parseInt(rw.className);
		hightlightLines([line], fromTxt, "yellow");
	}
}

function markRuntimeError(lineNo) {
	hightlightLines([lineNo], js1, "red");
	for (var ix in sourceMap) {
		var item = sourceMap[ix]
		var genLine = item[0][0];
		if (genLine>=lineNo) {
			var srcLine = item[1][0];
			hightlightLines([srcLine], es4, "red");
			break;
		}
	}
}

function runIE(code, output) {
	try { 
		var result = eval(code);
		writeToOutput(result, output);
	} catch (e) {
		dump("Error:\n" + e.message, output);
	}
}

function runMoz(code, output) {
	//var result = eval(code); return;
	var errLinRef;
	// synch line numbers	
	try{var x=y;}catch(e){errLineRef=e.lineNumber;} try { var result = eval(code); // dont break this line
		writeToOutput(result, output);
	} catch (e) {
		if (e.lineNumber) {
			var codeLineNo = e.lineNumber-errLineRef + 1;
			markRuntimeError(codeLineNo)
		}
		dump("Error:\n" + e, output);
	}
}



function run(txtEditor) {
	var code = txtEditor.getCode();
	// show output area	
	var txta = $("#runOutputTxt");
	txta.text("");
	showOutputArea();
	
	window.print = function(msg) {
		var str = "";
		for (var ix=0;ix<arguments.length; ix++) {
			if (ix>0) str += " ";
			str += arguments[ix];
		}
		writeToOutput(str, txta);
	}
		
	if (document.all) {
		runIE(code, txta);
	} else {
		runMoz(code, txta);
	}
}
function writeToOutput(data, txta) {
	txta.text(txta.text() + data + "\n");
}

function dump(result, txta) {
	txta.text(result);
}
