/* * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ function log(object) { console.log(object); } function initAfterI18nMessagesLoaded(reload, templates, callbacks) { document.title = fr.njin.i18n.document.title; var ubwidget = $("#ubwidget"); var parameters = Object.create(Parameters,{ container: { value: ubwidget }, delegate: { value: window.sankore || Object.create(ParametersDelegate) } }); var app = Object.create(App, { container: { value: ubwidget }, parameters: { value: parameters }, reload: { value: reload } }); app.init(); app.onEdit = false; if(templates.toolbar) { $("#toolbar").html(Mustache.render(templates.toolbar, window)); } if(templates.parameters) { $("#parameters").html(Mustache.render(templates.parameters, window)); } if(callbacks.onTemplatesLoaded && typeof callbacks.onTemplatesLoaded === 'function') { callbacks.onTemplatesLoaded(app); } log("Update setting views with stored parameters"); $("#parameters (input|select)[role=parameter]").each(function(i, input) { (function(input){ var key = input.name; var type = input.type; var isRadioOrcheckbox = (type !== undefined && (type === "checkbox" || type === "radio")); var stored = parameters.value(key); if(isRadioOrcheckbox) $(input).attr("checked", (typeof stored === "string" ? stored === "true" : stored)); else $(input).val(stored); $(input).change(function(){ var val = (isRadioOrcheckbox ? $(this).is(":checked") : $(this).val()); parameters.value(key, val); }); })(input); }); log("Toobar Initialisation"); $("button[role=edit]").click(function(){ app.onEdit = true; $(document.body).addClass("onEdit"); if(callbacks.onEdit && typeof callbacks.onEdit === 'function') { callbacks.onEdit(app); } }); $("button[role=view]").click(function(){ app.onEdit = false; $(document.body).removeClass("onEdit"); if(callbacks.onView && typeof callbacks.onView === 'function') { callbacks.onView(app); } }); $("button[role=reload]").click(function(){ app.reload(); }); $("button[role=help]").click(function(){ $("body").toggleClass("showHelp"); }); $("select[name='themes']").change(function() { $("body").get(0).className = $("body")[0].className.replace(/\btheme-[^\s]*\b/gi, ''); $("body").addClass("theme-"+$(this).val()); }); $("body").addClass("theme-"+$("select[name='themes']").val()); } function init(reload, templates, callbacks){ var locale = window.sankore ? sankore.locale() : ""; $.i18n.properties({ name: 'Messages', path: 'i18n/', language: locale, callback: function(){ initAfterI18nMessagesLoaded(reload, templates, callbacks); } }); } var Parameters = (function(){ var self = Object.create({}, { container: { value: null }, delegate: { value: null }, value: { value: function(key, value) { if(value === undefined) { var val = this.delegate.preference(key); log("Retrieve parameter value ["+val+"] as type ["+(typeof val)+"] for key : ["+key+"]"); return (val !== undefined && (typeof val !== "string" || val)) ? val : $("#ubwidget").data(key); } else { log("Set parameter value ["+value+"] for key : ["+key+"]"); this.delegate.setPreference(key, value); this.container.trigger("preferenceChange", {key: key, value: value}); } } } }); return self; })(); var ParametersDelegate = (function(){ var self = Object.create({}, { preference: { value: function(key) { return this[key]; } }, setPreference: { value: function(key, value) { this[key] = value; } } }); return self; })(); var App = (function() { var self = Object.create({}, { container: { value: null }, parameters: { value: null }, init: { value: function() { var that = this; this.container.bind("preferenceChange", function(evt, parameter) { that.reload(parameter); }); this.reload(); } }, reload: { value: function(parameter) { if(parameter === undefined) log("Reload"); else log("Update"); } }, utils: { value: Object.create({}, { shuffle: { value: function(array) { var unpickedSize = array.length; while(unpickedSize > 0) { var n = Math.floor(Math.random()*unpickedSize); var temp = array[unpickedSize-1]; array[unpickedSize-1] = array[n]; array[n] = temp; unpickedSize--; } } }, guid: { value: function() { var S4 = function() { return (((1+Math.random())*0x10000)|0).toString(16).substring(1); }; return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4()); } }, droppable: { value: function($e, callback) { $e.bind("dragover", function(){ $(this).addClass("hover"); return false; }); $e.bind("dragleave", function(){ $(this).removeClass("hover"); return false; }); $e.bind("drop", function(e){ $(this).removeClass("hover"); e = e || window.event; e.preventDefault(); // jQuery wraps the originalEvent, so we try to detect that here... e = e.originalEvent || e; if(window.sankore) { function stringToXML(text){ if (window.ActiveXObject){ var doc=new ActiveXObject('Microsoft.XMLDOM'); doc.async='false'; doc.loadXML(text); } else { var parser=new DOMParser(); doc=parser.parseFromString(text,'text/xml'); } return doc; } var file = stringToXML(e.dataTransfer.getData("text/plain")); callback({ src: $(file).find("path:eq(0)").text() }); return false; } // Using e.files with fallback because e.dataTransfer is immutable and can't be overridden in Polyfills (http://sandbox.knarly.com/js/dropfiles/). var files = (e.files || e.dataTransfer.files); for (var i = 0; i < files.length; i++) { // Loop through our files with a closure so each of our FileReader's are isolated. (function (i) { if(typeof FileReader !== "undefined") { var reader = new FileReader(); reader.onload = function (event) { callback({ src: event.target.result, title: (files[i].name), alt: (files[i].name) }); }; reader.readAsDataURL(files[i]); } })(i); } return false; }); } } }) } }); return self; })();