/***************************************************************************** * ScribeEngine - Open Source Blog Software * * ------------------------------------------------------------------------- * * Copyright (c) 2010 Raoul Snyman * * ------------------------------------------------------------------------- * * 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; version 2 of the License. * * * * 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, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * *****************************************************************************/ window["ScribeEngine"] = { Namespace: { /** * Create a Javascript namespace. * Based on: http://code.google.com/p/namespacedotjs/ * Idea behind this is to created nested namespaces that are not ugly. * Example: * Namespace(foo.bar); * foo.bar..myFunction = function () { } ; */ create: function (name, attributes) { var parts = name.split('.'), ns = window, i = 0; // find the deepest part of the namespace // that is already defined for(; i < parts.length && parts[i] in ns; i++) ns = ns[parts[i]]; // initialize any remaining parts of the namespace for(; i < parts.length; i++) ns = ns[parts[i]] = {}; // copy the attributes into the namespace for (var attr in attributes) ns[attr] = attributes[attr]; }, exists: function (namespace) { /** * Determine the namespace of a page */ page_namespace = $ScribeEngine.Namespace.get_page_namespace(); return (namespace == page_namespace); }, get_page_namespace: function () { return $("#content > h2").attr("id"); } } }; Array.prototype.append = function (elem) { this[this.length] = elem; } ScribeEngine.Namespace.create("ScribeEngine.Events", { // Local variables onload_functions: Array(), // Functions load: function (func) { this.onload_functions.append(func); }, click: function (selector, func) { $(selector).bind("click", func); }, change: function (selector, func) { $(selector).bind("change", func); }, submit: function (selector, func) { $(selector).bind("submit", func); }, blur: function (selector, func) { $(selector).bind("blur", func); }, paste: function (selector, func) { $(selector).bind("paste", func); }, keyup: function (selector, func) { $(selector).bind("keyup", func); }, keydown: function (selector, func) { $(selector).bind("keydown", func); }, keypress: function (selector, func) { $(selector).bind("keypress", func); }, get_element: function(event) { var targ; if (!event) { var event = window.event; } if (event.target) { targ = event.target; } else if (event.srcElement) { targ = event.srcElement; } if (targ.nodeType == 3) { // defeat Safari bug targ = targ.parentNode; } return $(targ); }, init: function () { for (idx in this.onload_functions) { func = this.onload_functions[idx]; func(); } } }); ScribeEngine.Namespace.create("ScribeEngine.Widgets", { /** * Adds a datepicker to an element. */ datepicker: function (selector) { $(selector).datepicker({showButtonPanel: true, dateFormat: "dd/mm/yy"}); } }); ScribeEngine.Namespace.create("ScribeEngine.General", { /** * Fades out a message */ fade_message: function () { $("#message").hide().fadeIn("slow", function() { setTimeout("$('#message').fadeOut('slow');", 1500); }); }, /** * Checks for a message and fades it in and out. */ show_message: function () { if ($("#message")) { setTimeout("$ScribeEngine.General.fade_message()", 500); } }, /** * Dynamically hide anything on the page that has a "jshidden" class. */ hide_elements: function () { $(".jshidden").hide(); }, /** * Do all the funny things required to toggle a fieldset */ perform_toggle: function (fieldset) { content = $('> div', fieldset); if (fieldset.is('.collapsed')) { fieldset.removeClass('collapsed'); content.slideDown('normal'); } else { content.slideUp('normal', function() { fieldset.addClass('collapsed'); } ); } }, /** * Find the fieldset to toggle, and then perform the toggle */ toggle_fieldset: function () { fieldset = $(this).parent().parent(); $ScribeEngine.General.perform_toggle(fieldset); return false; }, /** * Sets the active project */ set_project: function () { $('#project-selector > div.content').hide(); $('#project-throbber').show(); project_id = $("#CurrentProject").val(); $.get('/dashboard/ajax_project/' + project_id, function () { window.location.reload(); }); }, /** * Initialises collapsible fieldsets */ init_fieldsets: function () { $("fieldset.collapsible > legend").each(function() { legend = $(this); legend_text = legend.text(); legend.text(""); legend.append( $("").attr("href", "#").attr("title", "Expand/collapse details") .text(legend_text).click($ScribeEngine.General.toggle_fieldset)); }); $("fieldset.collapsed").each(function() { $("> div.content", this).slideUp("normal"); }); }, /** * Initialises elastic textareas */ init_textareas: function () { $("textarea").elastic(); } }); /** * Global onload * * This function below will be executed on all page views. */ ScribeEngine.Events.load(function () { // Hide hidden elements ScribeEngine.General.hide_elements(); // Initialise collapsible fieldsets ScribeEngine.General.init_fieldsets(); // Initialise elastic textareas ScribeEngine.General.init_textareas(); // Show any flash messages ScribeEngine.General.show_message(); });