+function setPalette(aPaletteID) {
+ gPref.setCharPref("mandelbrot.color_palette", aPaletteID);
+ gColorPalette = getColorPalette(aPaletteID);
+}
+
+function imgSettings() {
+ if (document.getElementById("mandelbrotWindow").nodeName == "page")
+ document.getElementById("imgSettingsPanel").showPopup(null, "before_start");
+ else
+ window.openDialog("chrome://mandelbrot/content/image-settings.xul");
+}
+
+function updateDebugMenu() {
+ let scope = (document.getElementById("mandelbrotWindow").nodeName == "page") ? "content" : "chrome";
+ for each (let type in ["tracejit", "methodjit"]) {
+ let jitMenuItem = document.getElementById(type + "Enabled");
+ jitMenuItem.setAttribute("checked", gPref.getBoolPref("javascript.options." + type + "." + scope));
+ }
+}
+
+function toggleJITState(jitMenuItem, jittype) {
+ let scope = (document.getElementById("mandelbrotWindow").nodeName == "page") ? "content" : "chrome";
+ let jitpref = "javascript.options." + jittype + "jit." + scope;
+ let jitEnabled = !gPref.getBoolPref(jitpref);
+ gPref.setBoolPref(jitpref, jitEnabled)
+ jitMenuItem.setAttribute("checked", jitEnabled ? "true" : "false");
+}
+
+function updateAlgoMenu() {
+ let currentAlgo = '';
+ try {
+ currentAlgo = gPref.getCharPref("mandelbrot.use_algorithm");
+ }
+ catch(e) { }
+ if (!currentAlgo.length) {
+ currentAlgo = 'numeric';
+ setAlgorithm(currentAlgo);
+ }
+
+ let popup = document.getElementById("menu_algoPopup");
+ let item = popup.firstChild;
+ while (item) {
+ if (item.getAttribute("name") == "algorithm") {
+ if (item.getAttribute("value") == currentAlgo)
+ item.setAttribute("checked", "true");
+ else
+ item.removeAttribute("checked");
+ }
+ item = item.nextSibling;
+ }
+}
+
+function setAlgorithm(algoID) {
+ gPref.setCharPref("mandelbrot.use_algorithm", algoID);
+}
+
+function addonsManager(aPane) {
+ let theEM = Components.classes["@mozilla.org/appshell/window-mediator;1"]
+ .getService(Components.interfaces.nsIWindowMediator)
+ .getMostRecentWindow("Extension:Manager");
+ if (theEM) {
+ theEM.focus();
+ if (aPane)
+ theEM.showView(aPane);
+ return;
+ }
+
+ const EMURL = "chrome://mozapps/content/extensions/extensions.xul";
+ const EMFEATURES = "all,dialog=no";
+ if (aPane)
+ window.openDialog(EMURL, "", EMFEATURES, aPane);
+ else
+ window.openDialog(EMURL, "", EMFEATURES);
+}
+
+function errorConsole() {
+ toOpenWindowByType("global:console", "chrome://global/content/console.xul");
+}
+
+function initImgSettings() {
+ // Get values from prefs.
+ for each (let coord in ["Cr_min", "Cr_max", "Ci_min", "Ci_max"]) {
+ document.getElementById("is_" + coord).value =
+ roundCoord(parseFloat(gPref.getCharPref("mandelbrot.last_image." + coord)));
+ }
+ for each (let dim in ["width", "height"]) {
+ document.getElementById("is_img_" + dim).value =
+ gPref.getIntPref("mandelbrot.image." + dim);
+ }
+ document.getElementById("is_syncProp").checked =
+ gPref.getBoolPref("mandelbrot.syncProportions");
+
+ // Calculate scales.
+ recalcCoord("Cr", "scale");
+ recalcCoord("Ci", "scale");
+
+ // Clear the preview.
+ let canvas = document.getElementById("is_mbrotPreview");
+ let context = canvas.getContext("2d");
+ context.fillStyle = "rgba(255, 255, 255, 127)";
+ context.fillRect(0, 0, canvas.width, canvas.height);
+}
+
+function closeImgSettings() {
+ // Hide popup, which will automatically make a call to save values.
+ document.getElementById("imgSettingsPanel").hidePopup();
+}
+
+function saveImgSettings() {
+ // Get values to prefs.
+ for each (let coord in ["Cr_min", "Cr_max", "Ci_min", "Ci_max"]) {
+ gPref.setCharPref("mandelbrot.last_image." + coord,
+ document.getElementById("is_" + coord).value);
+ }
+ for each (let dim in ["width", "height"]) {
+ gPref.setIntPref("mandelbrot.image." + dim,
+ document.getElementById("is_img_" + dim).value);
+ }
+ gPref.setBoolPref("mandelbrot.syncProportions",
+ document.getElementById("is_syncProp").checked);
+}
+
+function checkISValue(textbox, type) {
+ if (type == "coord") {
+ textbox.value = roundCoord(parseFloat(textbox.value));
+ }
+ else if (type == "dim") {
+ textbox.value = parseInt(textbox.value);
+ }
+}
+
+function drawPreview() {
+ let canvas = document.getElementById("is_mbrotPreview");
+ let context = canvas.getContext("2d");
+
+ if (document.getElementById("is_img_width").value /
+ document.getElementById("is_img_height").value
+ < 80 / 50) {
+ canvas.height = 50;
+ canvas.width = canvas.height *
+ document.getElementById("is_img_width").value /
+ document.getElementById("is_img_height").value;
+ }
+ else {
+ canvas.width = 80;
+ canvas.height = canvas.width *
+ document.getElementById("is_imgHeight").value /
+ document.getElementById("is_imgWidth").value;
+ }
+
+ let Cr_min = parseFloat(document.getElementById("is_Cr_min").value);
+ let Cr_max = parseFloat(document.getElementById("is_Cr_max").value);
+ if ((Cr_min < -2) || (Cr_min > 2) ||
+ (Cr_max < -2) || (Cr_max > 2) || (Cr_min >= Cr_max)) {
+ Cr_min = -2.0; Cr_max = 1.0;
+ }
+
+ let Ci_min = parseFloat(document.getElementById("is_Ci_min").value);
+ let Ci_max = parseFloat(document.getElementById("is_Ci_max").value);
+ if ((Ci_min < -2) || (Ci_min > 2) ||
+ (Ci_max < -2) || (Ci_max > 2) || (Ci_min >= Ci_max)) {
+ Ci_min = -2.0; Ci_max = 1.0;
+ }
+
+ let iterMax = gPref.getIntPref("mandelbrot.iteration_max");
+ let algorithm = gPref.getCharPref("mandelbrot.use_algorithm");
+
+ context.fillStyle = "rgba(255, 255, 255, 127)";
+ context.fillRect(0, 0, canvas.width, canvas.height);
+
+ try {
+ var currentPalette = gPref.getCharPref("mandelbrot.color_palette");
+ }
+ catch(e) {
+ var currentPalette = "";
+ }
+ if (!currentPalette.length) {
+ currentPalette = "kairo";
+ }
+ gColorPalette = getColorPalette(currentPalette);
+
+ drawLine(0, [Cr_min, Cr_max, Ci_min, Ci_max],
+ canvas, context, iterMax, algorithm);
+}
+
+function recalcCoord(coord, target) {
+ let othercoord = (coord == "Ci") ? "Cr" : "Ci";
+ let owndim = (coord == "Ci") ? "height" : "width";
+ let otherdim = (coord == "Ci") ? "width" : "height";
+ if (target == "scale") {
+ var myscale =
+ parseFloat(document.getElementById("is_" + coord + "_max").value) -
+ parseFloat(document.getElementById("is_" + coord + "_min").value);
+ document.getElementById("is_" + coord + "_scale").value = roundCoord(myscale);
+ }
+ else if (target == 'max') {
+ let mymax =
+ parseFloat(document.getElementById("is_" + coord + "_min").value) +
+ parseFloat(document.getElementById("is_" + coord + "_scale").value);
+ document.getElementById("is_" + coord + "_max").value = roundCoord(mymax);
+ var myscale = document.getElementById("is_" + coord + "_scale").value;
+ }
+ if (document.getElementById("is_syncProp").checked) {
+ let otherscale = myscale *
+ document.getElementById("is_img_" + otherdim).value /
+ document.getElementById("is_img_" + owndim).value;
+ document.getElementById("is_" + othercoord + "_scale").value = roundCoord(otherscale);
+ let othermax =
+ parseFloat(document.getElementById("is_" + othercoord + "_min").value) +
+ parseFloat(document.getElementById("is_" + othercoord + "_scale").value);
+ document.getElementById("is_" + othercoord + "_max").value = roundCoord(othermax);
+ }
+}
+
+function checkProportions() {
+ if (!document.getElementById("is_syncProp").checked) {
+ recalcCoord("Cr", "scale");
+ }
+}
+
+function roundCoord(floatval) {
+ // We should round to 10 decimals here or so
+ return parseFloat(floatval.toFixed(10));
+}
+
+/***** helper functions from external sources *****/
+
+// function below is based on http://developer.mozilla.org/en/docs/Code_snippets:Canvas
+// custom modifications:
+// - use "a"-prefix on function arguments
+// - take an nsILocalFile as aDestFile argument
+// - always do silent download
+function saveCanvas(aCanvas, aDestFile) {