barley-0.3: seed/Source.js
$(document).ready(function () {
var marker = $('#run-source-js-once');
if (marker.length > 0) {
marker.text(marker.text() + " Bug! ");
return;
}
$('<div id="run-source-js-once" style="display: none;">Done.</div>').appendTo($('body'));
var bEnable = function(i) {
$(i).removeAttr('disabled').animate({opacity: 1.0}, 'fast');
};
var bDisable = function(i) {
$(i).attr('disabled', 'disabled').animate({opacity: 0.2}, 'fast');
}
var editable = false;
var mkEditable = function() {
if (!editable) {
bEnable('.btn-cancel');
bEnable('.btn-save');
$('#editor-box').removeClass('readonly').addClass('editable');
editable = true;
}
};
var mkReadOnly = function() {
bDisable('.btn-cancel');
bDisable('.btn-save');
$('#editor-box').removeClass('editable').addClass('readonly');
editable = false;
};
$('.btn-cancel').click(mkReadOnly);
mkReadOnly();
var buildColumnMarker = function () {
$('<div class="editor-column-marker"></div>')
.appendTo($('.CodeMirror-wrapping'));
};
var adjustColumnMarker = function () {
var m = $('.editor-column-marker');
var x = "0123456789";
x = x + x + x + x + x + x + x + x;
m.text(x);
var w = m.innerWidth() + $('.CodeMirror-line-numbers').outerWidth();
m.text('');
m.css('width', '10em');
var v = m.width();
m.css({ left: (w/v*10)+"em", width: '' });
}
var preview = $('#preview');
var editor = $('#editor');
var editImage = $('#rocker-edit-image');
var runImage = $('#rocker-run-image');
var toggle = function(iIn, iOut) {
iIn.fadeIn('fast');
iOut.fadeOut('fast');
}
var showHide = function(pShow, pHide, iIn, iOut) {
pShow.slideDown('fast');
pHide.slideUp('fast');
toggle(iIn, iOut);
}
var mkRun = function () { showHide(preview, editor, runImage, editImage); }
var mkEdit = function() { showHide(editor, preview, editImage, runImage);
setTimeout(adjustColumnMarker, 500); }
var run = function() {
toggle(runImage, editImage);
if (editable) $('#editor form').submit();
else mkRun();
}
var recompile = function() {
$('#editor form').submit();
return false;
}
$('#rocker-run').click(run);
$('#rocker-edit').click(mkEdit);
$('#recompile').click(recompile);
$('.panel h1').click(function () { $('.panel-content').slideToggle('fast'); });
var cmEditor = CodeMirror.fromTextArea("txt-src", {
basefiles: ["/static/codemirror_base_min.js"],
parserfile: ["/static/codemirror_parse_haskell.js"],
stylesheet: "/static/codemirror.css",
autoMatchParens: true,
textWrapping: false,
lineNumbers: true,
indentUnit: 4,
tabMode: "shift",
enterMode: "keep",
minHeight: 160,
height: "dynamic",
markParen: ["paren-match", "paren-error"],
onCursorActivity: function(node) {
var sel = cmEditor.selection();
if (!sel) { sel = node.innerText || node.textContent; }
var mat = sel.match(/\S(.*\S)?/);
if (mat) { $('.research-query').val(mat[0]); }
},
onChange: mkEditable,
saveFunction: run,
onLoad: function() { buildColumnMarker(); }
});
var previewUrl = $('#preview-url').text();
var setErrorDetailAdjust = function(ln, lnp) {
ln.hover(function () {
var w = ln.offset();
w.top += ln.height();
w.left += ln.width() * 1.3;
lnp.css(w);
lnp.show('fast');
},
function () {
lnp.hide('fast');
});
}
var compileResult = function(data, status, xhr) {
if (data == "OK") {
if ($('#preview').length > 0) {
$('#preview .panel-content').hide();
$('#preview iframe').attr('src', previewUrl);
setTimeout(function() {
$('#preview .panel-content').show('fast');
}, 500);
if ($('#preview-show').length > 0) mkRun();
else mkEdit();
}
}
else {
setTimeout(function () {
var lns = $('.CodeMirror-line-numbers div');
var ln, lnp, lnps = [];
var r = /\.hs:(\d+):(\d+):$/;
var dataLines = data.split("\n")
for (var i in dataLines) {
var e = dataLines[i].match(r);
if (e) {
var n = e[1];
if (lnps[n]) {
lnp = lnps[n]
}
else {
ln = lns.eq(n-1);
ln.addClass('error-line');
lnp = $('<pre class="error-details"></pre>')
lnp.appendTo($('body'));
setErrorDetailAdjust(ln, lnp);
lnps[n] = lnp;
}
}
else if (lnp) {
var l = dataLines[i];
if (l.slice(0,4) == ' ') { l = l.slice(4); }
lnp.text(lnp.text() + l + "\n");
}
}
}, 300);
$('#errors .panel-content').text(data);
$('#errors .panel-content').hide();
$('#errors').show('fast');
mkEdit();
}
}
if (previewUrl) {
$.ajax({
url: previewUrl + "?__compile_only=1",
success: compileResult,
dataType: "text"
});
}
else {
mkEdit();
}
})