/*Runtime lib:*/function TypeError() {} function $is(v, t, nn) { if (v==null) return !nn; if (t==Number) return typeof(v.valueOf())=="number"; if (t==String) return typeof(v.valueOf())=="string"; if (t==Boolean) return typeof(v.valueOf())=="boolean"; return v instanceof t; } function $cast(v, t, nn) { if (nn) $nn(v); else if(v==null) return null; if(!$is(v, t)) throw new TypeError("Cast error: " + v + " is not " + t); return v; } function $nn(v) { if (v==null) throw new TypeError("Value is null."); }

var js1EditorMinimized=false;
(function(){
var sourceMap;
function highlightLines(linenrs,txtEditorId,style){
    var lines=getLines(txtEditorId);
    var $lst0=linenrs;for(var $ix0=0; $ix0<$lst0.length; $ix0++){ if($lst0[$ix0]===undefined) continue; var linenr=$lst0[$ix0];; var lineix=linenr-1;
    lines[lineix]=highlightLine(lines[lineix],style);
     }
    setLines(txtEditorId,lines);
};
function highlightLine(line,style){
    return"<span class=hiliteline style='"+style+"'>"+line+"</span>";
};
function setHtml(id,html){
    var f=window.frames["frame_"+id];
    if(f){
        var srcElem=f.document.getElementById("content_highlight");
        srcElem.innerHTML=html;
    }
};
function getHtml(id){
    var f=window.frames["frame_"+id];
    if(f){
        var srcElem=f.document.getElementById("content_highlight");
        return srcElem.innerHTML;
    }
};
function getLines(id){
    var html=getHtml(id);
    return html.split("\n");
};
function setLines(id,lines){
    var html=lines.join("\n");
    setHtml(id,html);
};
function getCode(editorId){
    return editAreaLoader.getValue(editorId);
};
function setSourceCode(code){
    setCode('esx',code);
    hideTranslated();
};
window.setSourceCode=setSourceCode;
function setCode(editorId,code){
    editAreaLoader.setValue(editorId,code);
    var ea=window.frames["frame_"+editorId].editArea;
    ea.set_word_wrap(true);
    ea.set_word_wrap(false);
};
var ajaxErrorHandler;
$(document).ajaxError(function(event,request,settings){
    if(ajaxErrorHandler)ajaxErrorHandler(event,request,settings);
    ajaxErrorHandler=null;
}
);
function engine_translate(data,fun){
    var wait=$("#wait");
    wait.show();
    function errHandler(XMLHttpRequest,textStatus,errorThrown){
        wait.hide();
        window.alert("An error has occurred communicating with the server. Sorry.");
    };
    $.ajax({
        url:serviceUrl,data:data,dataType:"json",error:errHandler,success:fun,type:"POST"}
    );
};
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 translate(source,fun){
    var data={
        source:source,service:"translate",compiler_setting_semicolon_insertion:false};
    if($("#settings_semicolonInsertion").attr("checked"))data.compiler_setting_semicolon_insertion=true;
    engine_translate(data,fun);
};
function translateTxta(fromTxt,toTxt){
    var code=getCode(fromTxt);
    $("#msgArea").hide();
    $("#msgTxt").text("Compiling...");
    beginTranslation();
    translate(code,function(data,status){
        sourceMap=data.sourceMap;
        displayResult(toTxt,data,fromTxt);
        $("#wait").hide();
    }
    );
};
window.translateTxta=translateTxta;
function displayResult(toTxt,data,fromTxt){
    $("#msgArea").show();
    var msg;
    if(data.success){
        afterTranslated();
        setCode(toTxt,data.generatedCode);
        msg="Compilation successful. ";
        runCode(data.generatedCode);
    }
    else{
        setCode(toTxt,"// No code generated.");
        msg="Compilation failed. ";
        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>");
        var $lst1=data.messages;for(var $ix1=0; $ix1<$lst1.length; $ix1++){ if($lst1[$ix1]===undefined) continue; var msg=$lst1[$ix1];; tbl.append("<tr class="+msg.startLine+"><td class=line>"+msg.startLine+"</td><td>"+msg.description.replace("<","&lt;")+"</td></tr>");
        msgLines.push(msg.startLine);
         }
        highlightLines(msgLines,fromTxt,"background-color:yellow;background:url(/static/underline.gif) bottom repeat-x;");
        tbl.bind("click",function(ev){
            tblClick(ev,fromTxt);
        }
        );
    }
    else{
        msg+="No messages or warnings.";
        $("#msgTxt").text(msg);
        tbl.html("<tr><th></th></tr>");
    }
};
function tblClick(ev,fromTxt){
    if(ev.target.tagName=="TD"){
        var rw=ev.target.parentNode;
        var line=parseInt(rw.className);
        highlightLines([line],fromTxt,"background-color:yellow");
    }
};
function markRuntimeError(lineNo){
    highlightLines([lineNo],'js1',"background-color:red");
    var $lst2=sourceMap;for(var $ix2=0; $ix2<$lst2.length; $ix2++){ if($lst2[$ix2]===undefined) continue; var $tmp=$lst2[$ix2],genPos=$tmp[0],srcPos=$tmp[1];; var $tmp=genPos,genLine=$tmp[0],genChar=$tmp[1];
    if(genLine>=lineNo){
        var $tmp=srcPos,srcLine=$tmp[0],srcChar=$tmp[1],srcOffset=$tmp[2];
        highlightLines([srcLine],'esx',"background-color:red");
        break;
    }
     }
};
var c1={
    log:function(){
        var str="";
        for(var ix=0;
        ix<arguments.length;
        ix++){
            if(ix>0)str+=" ";
            str+=arguments[ix];
        }
        writeToOutput(str);
    }
};
function runIE(code,c1){
    try{
        var result=eval(code);
        return{
            success:true,value:result};
    }
    catch(e){
        return{
            success:false,errorMessage:e.message};
    }
};
var txta;
function run(editorId){
    var code=getCode(editorId);
    runCode(code);
};;
function runCode(code){
    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);
    };
    var result;
    if(document.all){
        result=runIE(code,c1);
    }
    else{
        result=runMoz(code,c1);
    }
    if(result.success){
        if(result.value!=null){
            writeToOutput(result.value.toString());
        }
        else{
            writeToOutput("(no return value)");
        }
    }
    else{
        writeToOutput("Error:");
        writeToOutput(result.errorMessage);
        if(result.errorLine){
            markRuntimeError($cast(result.errorLine, Number, true));
        }
    }
};
function writeToOutput(data){
    txta.text(txta.text()+data+"\n");
};
function dump(result){
    txta.text(result);
};

})();
