+ gMainCanvas.addEventListener("mouseup", imgEvHandler, false);
+ gMainCanvas.addEventListener("mousedown", imgEvHandler, false);
+ gMainCanvas.addEventListener("mousemove", imgEvHandler, false);
+ gMainCanvas.addEventListener("touchstart", imgEvHandler, false);
+ gMainCanvas.addEventListener("touchend", imgEvHandler, false);
+ gMainCanvas.addEventListener("touchcancel", imgEvHandler, false);
+ gMainCanvas.addEventListener("touchleave", imgEvHandler, false);
+ gMainCanvas.addEventListener("touchmove", imgEvHandler, false);
+
+ var initTile = new Image();
+ initTile.src = "style/initial-overview.png";
+ initTile.onload = function() { gMainContext.drawImage(initTile, 0, 0); };
+}
+
+function initDB() {
+ // Open DB.
+ var request = window.indexedDB.open("MainDB-mandelbrot", 1);
+ request.onerror = function(event) {
+ // Errors can be handled here. Error codes explain in:
+ // https://developer.mozilla.org/en/IndexedDB/IDBDatabaseException#Constants
+ if (gDebug)
+ console.log("error opening mainDB: " + event.target.errorCode);
+ };
+ request.onsuccess = function(event) {
+ //document.getElementById("debug").textContent = "mainDB opened.";
+ mainDB = request.result;
+ var throwEv = new CustomEvent("dbinit-done");
+ gAction.dispatchEvent(throwEv);
+ };
+ request.onupgradeneeded = function(event) {
+ mainDB = request.result;
+ var ver = mainDB.version || 0; // version is empty string for a new DB
+ if (gDebug)
+ console.log("mainDB has version " + ver + ", upgrade needed.");
+ if (!mainDB.objectStoreNames.contains("prefs")) {
+ // Create a "prefs" objectStore.
+ var prefsStore = mainDB.createObjectStore("prefs");
+ }
+ if (!mainDB.objectStoreNames.contains("bookmarks")) {
+ // Create a "bookmarks" objectStore.
+ var prefsStore = mainDB.createObjectStore("bookmarks");
+ }
+ mainDB.onversionchange = function(event) {
+ mainDB.close();
+ mainDB = undefined;
+ initDB();
+ };
+ };
+}
+
+function initPrefs() {
+ if (gDebug)
+ console.log("initializing prefs...");
+ gSyncPrefs.init(function () {
+ // Update the various settings fields to values from prefs.
+ if (gSyncPrefs.get("image.width"))
+ document.getElementById("image_width").value = gSyncPrefs.get("image.width");
+ if (gSyncPrefs.get("image.height"))
+ document.getElementById("image_height").value = gSyncPrefs.get("image.height");
+ if (gSyncPrefs.get("Cr_min"))
+ document.getElementById("Cr_min").value = gSyncPrefs.get("Cr_min");
+ if (gSyncPrefs.get("Cr_max"))
+ document.getElementById("Cr_max").value = gSyncPrefs.get("Cr_max");
+ if (gSyncPrefs.get("Ci_min"))
+ document.getElementById("Ci_min").value = gSyncPrefs.get("Ci_min");
+ if (gSyncPrefs.get("Ci_max"))
+ document.getElementById("Ci_max").value = gSyncPrefs.get("Ci_max");
+ if (gSyncPrefs.get("iteration_max"))
+ document.getElementById("iterMax").value = gSyncPrefs.get("iteration_max");
+ if (gSyncPrefs.get("color_palette"))
+ document.getElementById("palette").value = gSyncPrefs.get("color_palette");
+ if (gSyncPrefs.get("syncProportions") === true || gSyncPrefs.get("syncProportions") === false)
+ document.getElementById("proportional").checked = gSyncPrefs.get("syncProportions");
+ if (gSyncPrefs.get("use_algorithm"))
+ document.getElementById("algorithm").value = gSyncPrefs.get("use_algorithm");
+ if (gDebug)
+ console.log("prefs loaded.");
+ });
+}
+
+function getAdjustVal(aName) {
+ var value;
+ switch (aName) {
+ case "image.width":
+ case "image.height":
+ value = 0;
+ try {
+ value = document.getElementById(aName.replace(".", "_")).value;
+ }
+ catch (e) { }
+ if (!value || (value < 10) || (value > 5000)) {
+ value = 300;
+ gSyncPrefs.set(aName, value);
+ document.getElementById(aName.replace(".", "_")).value = value;
+ }
+ return value;
+ case "last_image.Cr_*":
+ var Cr_min = -2.0;
+ var Cr_max = 1.0;
+ try {
+ Cr_min = parseFloat(document.getElementById("Cr_min").value);
+ Cr_max = parseFloat(document.getElementById("Cr_max").value);
+ }
+ catch (e) { }
+ if ((Cr_min < -3) || (Cr_min > 2) ||
+ (Cr_max < -3) || (Cr_max > 2) || (Cr_min >= Cr_max)) {
+ Cr_min = -2.0; Cr_max = 1.0;
+ }
+ gSyncPrefs.set("Cr_min", Cr_min);
+ gSyncPrefs.set("Cr_max", Cr_max);
+ document.getElementById("Cr_min").value = Cr_min;
+ document.getElementById("Cr_max").value = Cr_max;
+ document.getElementById("Cr_scale").value = Cr_max - Cr_min;
+ return {Cr_min: Cr_min, Cr_max: Cr_max};
+ case "last_image.Ci_*":
+ var Ci_min = -1.5;
+ var Ci_max = 1.5;
+ try {
+ Ci_min = parseFloat(document.getElementById("Ci_min").value);
+ Ci_max = parseFloat(document.getElementById("Ci_max").value);
+ }
+ catch (e) { }
+ if ((Ci_min < -2.5) || (Ci_min > 2.5) ||
+ (Ci_max < -2.5) || (Ci_max > 2.5) || (Ci_min >= Ci_max)) {
+ Ci_min = -1.5; Ci_max = 1.5;
+ }
+ gSyncPrefs.set("Ci_min", Ci_min);
+ gSyncPrefs.set("Ci_max", Ci_max);
+ document.getElementById("Ci_min").value = Ci_min;
+ document.getElementById("Ci_max").value = Ci_max;
+ document.getElementById("Ci_scale").value = Ci_max - Ci_min;
+ return {Ci_min: Ci_min, Ci_max: Ci_max};
+ case "iteration_max":
+ value = 500;
+ try {
+ value = document.getElementById("iterMax").value;
+ }
+ catch (e) {
+ setIter(value);
+ }
+ if (value < 10 || value > 10000) {
+ value = 500;
+ setIter(value);
+ }
+ return value;
+ case "use_algorithm":
+ value = "numeric";
+ try {
+ value = document.getElementById("algorithm").value;
+ }
+ catch (e) {
+ setAlgorithm(value);
+ }
+ return value;
+ case "color_palette":
+ value = "kairo";
+ try {
+ value = document.getElementById("palette").value;
+ }
+ catch(e) {
+ setPalette(value);
+ }
+ return value;
+ case "syncProportions":
+ value = true;
+ try {
+ value = document.getElementById("proportional").value;
+ }
+ catch(e) {
+ gSyncPrefs.set(prefname, value);
+ document.getElementById("proportional").value = value;
+ }
+ return value;
+ default:
+ return false;
+ }
+}
+
+function setVal(aName, aValue) {
+ switch (aName) {
+ case "image.width":
+ case "image.height":
+ gSyncPrefs.set(aName, aValue);
+ document.getElementById(aName.replace(".", "_")).value = aValue;
+ break;
+ case "last_image.Cr_*":
+ gSyncPrefs.set("Cr_min", aValue.Cr_min);
+ gSyncPrefs.set("Cr_max", aValue.Cr_max);
+ document.getElementById("Cr_min").value = aValue.Cr_min;
+ document.getElementById("Cr_max").value = aValue.Cr_max;
+ break;
+ case "last_image.Ci_*":
+ gSyncPrefs.set("Ci_min", aValue.Ci_min);
+ gSyncPrefs.set("Ci_max", aValue.Ci_max);
+ document.getElementById("Ci_min").value = aValue.Ci_min;
+ document.getElementById("Ci_max").value = aValue.Ci_max;
+ break;
+ case "iteration_max":
+ setIter(aValue);
+ break;
+ case "use_algorithm":
+ setAlgorithm(aValue);
+ break;
+ case "color_palette":
+ setPalette(aValue);
+ break;
+ case "syncProportions":
+ gSyncPrefs.set(aName, aValue);
+ document.getElementById("proportional").value = aValue;
+ break;
+ }
+}