Event.observe(window, 'load', function() { CanvasManage.watchManagementFields() }, false); Event.observe(window, 'load', function() { CanvasManage.watchTitles() }, false); Event.observe(window, 'load', function() { CanvasManage.initializeButtons() }, false); Event.observe(window, 'unload', Event.unloadCache, false); var CanvasManage = { dbmanage: function(element) { if(window.confirm('Are you sure you want to '+element+' Canvas?')) { var pars = 'action='+element; var target = 'message' var url = JS_CANVASURI + 'ajax/canvas-rescan.php'; var myAjax = new Ajax.Updater({success: target}, url, {method: 'get', parameters: pars, onComplete: function() { CanvasManage.updateAfterDBChange() } }); } }, deleteBlock: function(element) { if(window.confirm('Are you sure you want to delete this block?')) { var item = 'block_'+element; var pars = 'delete='+element; var url = JS_CANVASURI + 'ajax/canvas-management_ajax.php'; var myAjax = new Ajax.Request(url, {method: 'get', parameters: pars, onComplete: function() { CanvasManage.removeBlock(item) } }); } }, duplicateBlock: function(element) { var target = 'block_'+element; var pars = 'duplicate='+element; var url = JS_CANVASURI + 'ajax/canvas-management_ajax.php'; var myAjax = new Ajax.Updater({success: target}, url, {method: 'get', insertion: Insertion.After, parameters: pars, onComplete: function() { CanvasManage.updateButtons() } }); }, editTitle: function(item) { new CanvasAjax.CanvasInPlaceEditor(item, JS_CANVASURI + 'ajax/canvas-management_ajax.php', { callback: function(form, value){ return 'rename=true&id='+item.id+'&value='+escape(value); }, savingClassName: 'manageSaving' }); }, initializeButtons: function() { document.getElementsByClassName('block_info').each(function(item){ Event.observe(item, 'click', function(){ CanvasManage.toggleBlockInfo(item.id); }, false); if($('block_'+item.id).style.display == 'none') new Effect.Appear('block_'+item.id); }); document.getElementsByClassName('delete_block').each(function(item){ Event.observe(item, 'click', function(){ CanvasManage.deleteBlock(item.id); }, false); }); document.getElementsByClassName('duplicate_block').each(function(item){ Event.observe(item, 'click', function(){ CanvasManage.duplicateBlock(item.id); }, false); }); }, removeBlock: function(element) { new Effect.Fade(element,{ duration: 0.6, afterFinish: function(){ Element.remove(element); CanvasManage.updateCount('-1') } }); }, resetCount: function() { var count = $$('ul.manage li').length; count = parseInt(count); $('count').firstChild.nodeValue = count; }, sortGroups: function(group) { if(group == 'all') { $$('ul.manage li').each(function(item){ $(item).style.display = 'block'; }); } else { $$('ul.manage li').each(function(item){ $(item).style.display = 'none'; }); $$('ul.manage li.'+group).each(function(item){ $(item).style.display = 'block'; }); } }, toggleBlockInfo: function(element) { item = 'info_'+element; if($(item).style.display == 'none') { new Effect.BlindDown(item,{ duration: 0.4 }); } else { new Effect.BlindUp(item,{ duration: 0.4 }); } }, updateAfterDBChange: function() { var target = 'manage'; var pars = 'update=all'; var url = JS_CANVASURI + 'ajax/canvas-management_ajax.php'; var myAjax = new Ajax.Updater({success: target}, url, {method: 'get', parameters: pars, onComplete: function() { CanvasManage.initializeButtons(); CanvasManage.resetCount(); } }); }, updateButtons: function() { document.getElementsByClassName('delete_block').each(function(item){ if($('block_'+item.id).style.display == 'none') { Event.observe(item, 'click', function(){ CanvasManage.deleteBlock(item.id); }, false); } }); document.getElementsByClassName('duplicate_block').each(function(item){ if($('block_'+item.id).style.display == 'none') { Event.observe(item, 'click', function(){ CanvasManage.duplicateBlock(item.id); }, false); } }); document.getElementsByClassName('block_info').each(function(item){ if($('block_'+item.id).style.display == 'none') { Event.observe(item, 'click', function(){ CanvasManage.toggleBlockInfo(item.id); }, false); new Effect.Appear('block_'+item.id); } }); document.getElementsByClassName('title').each(function(item){ if(item.parentNode.parentNode.style.display == 'none') { CanvasManage.editTitle(item); } }); updateCount('+1'); }, updateCount: function(operation) { var count = parseInt($('count').firstChild.nodeValue); count = eval(count+operation); $('count').firstChild.nodeValue = count; }, watchManagementFields: function() { document.getElementsByClassName('dbmanage').each(function(item){ Event.observe(item, 'click', function(){ CanvasManage.dbmanage(item.id); }, false); }); }, watchTitles: function() { document.getElementsByClassName('title').each(function(item){ CanvasManage.editTitle(item); }); } }; // Because Script.aculo.us does some dumb things with backgroundColor // in the Ajax.InPlaceEditor, we've hacked our own... CanvasAjax.CanvasInPlaceEditor = Class.create(); CanvasAjax.CanvasInPlaceEditor.prototype = { initialize: function(element, url, options) { this.url = url; this.element = $(element); this.options = Object.extend({ okButton: true, okText: "ok", cancelLink: true, cancelText: "cancel", savingText: "Saving...", clickToEditText: "Click to edit", okText: "ok", rows: 1, onFailure: function(transport) { alert("Error communicating with the server: " + transport.responseText.stripTags()); }, callback: function(form) { return Form.serialize(form); }, handleLineBreaks: true, loadingText: 'Loading...', savingClassName: 'inplaceeditor-saving', loadingClassName: 'inplaceeditor-loading', formClassName: 'inplaceeditor-form', externalControl: null, submitOnBlur: false, ajaxOptions: {}, evalScripts: false }, options || {}); if(!this.options.formId && this.element.id) { this.options.formId = this.element.id + "-inplaceeditor"; if ($(this.options.formId)) { // there's already a form with that name, don't specify an id this.options.formId = null; } } if (this.options.externalControl) { this.options.externalControl = $(this.options.externalControl); } this.element.title = this.options.clickToEditText; this.onclickListener = this.enterEditMode.bindAsEventListener(this); this.mouseoverListener = this.enterHover.bindAsEventListener(this); this.mouseoutListener = this.leaveHover.bindAsEventListener(this); Event.observe(this.element, 'click', this.onclickListener); Event.observe(this.element, 'mouseover', this.mouseoverListener); Event.observe(this.element, 'mouseout', this.mouseoutListener); if (this.options.externalControl) { Event.observe(this.options.externalControl, 'click', this.onclickListener); Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener); Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener); } }, enterEditMode: function(evt) { if (this.saving) return; if (this.editing) return; this.editing = true; this.onEnterEditMode(); if (this.options.externalControl) { Element.hide(this.options.externalControl); } Element.hide(this.element); this.createForm(); this.element.parentNode.insertBefore(this.form, this.element); Field.scrollFreeActivate(this.editField); // stop the event to avoid a page refresh in Safari if (evt) { Event.stop(evt); } return false; }, createForm: function() { this.form = document.createElement("form"); this.form.id = this.options.formId; Element.addClassName(this.form, this.options.formClassName) this.form.onsubmit = this.onSubmit.bind(this); this.createEditField(); if (this.options.textarea) { var br = document.createElement("br"); this.form.appendChild(br); } if (this.options.okButton) { okButton = document.createElement("input"); okButton.type = "submit"; okButton.value = this.options.okText; okButton.className = 'editor_ok_button'; this.form.appendChild(okButton); } if (this.options.cancelLink) { cancelLink = document.createElement("a"); cancelLink.href = "#"; cancelLink.appendChild(document.createTextNode(this.options.cancelText)); cancelLink.onclick = this.onclickCancel.bind(this); cancelLink.className = 'editor_cancel'; this.form.appendChild(cancelLink); } }, hasHTMLLineBreaks: function(string) { if (!this.options.handleLineBreaks) return false; return string.match(/
/i); }, convertHTMLLineBreaks: function(string) { return string.replace(/
/gi, "\n").replace(//gi, "\n").replace(/<\/p>/gi, "\n").replace(/

/gi, ""); }, createEditField: function() { var text; if(this.options.loadTextURL) { text = this.options.loadingText; } else { text = this.getText(); } var obj = this; if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) { this.options.textarea = false; var textField = document.createElement("input"); textField.obj = this; textField.type = "text"; textField.name = "value"; textField.value = text; textField.className = 'editor_field'; var size = this.options.size || this.options.cols || 0; if (size != 0) textField.size = size; if (this.options.submitOnBlur) textField.onblur = this.onSubmit.bind(this); this.editField = textField; } else { this.options.textarea = true; var textArea = document.createElement("textarea"); textArea.obj = this; textArea.name = "value"; textArea.value = this.convertHTMLLineBreaks(text); textArea.rows = this.options.rows; textArea.cols = this.options.cols || 40; textArea.className = 'editor_field'; if (this.options.submitOnBlur) textArea.onblur = this.onSubmit.bind(this); this.editField = textArea; } if(this.options.loadTextURL) { this.loadExternalText(); } this.form.appendChild(this.editField); }, getText: function() { return this.element.innerHTML; }, loadExternalText: function() { Element.addClassName(this.form, this.options.loadingClassName); this.editField.disabled = true; new Ajax.Request( this.options.loadTextURL, Object.extend({ asynchronous: true, onComplete: this.onLoadedExternalText.bind(this) }, this.options.ajaxOptions) ); }, onLoadedExternalText: function(transport) { Element.removeClassName(this.form, this.options.loadingClassName); this.editField.disabled = false; this.editField.value = transport.responseText.stripTags(); }, onclickCancel: function() { this.onComplete(); this.leaveEditMode(); return false; }, onFailure: function(transport) { this.options.onFailure(transport); if (this.oldInnerHTML) { this.element.innerHTML = this.oldInnerHTML; this.oldInnerHTML = null; } return false; }, onSubmit: function() { var form = this.form; var value = this.editField.value; this.onLoading(); if (this.options.evalScripts) { new Ajax.Request( this.url, Object.extend({ parameters: this.options.callback(form, value), onComplete: this.onComplete.bind(this), onFailure: this.onFailure.bind(this), asynchronous:true, evalScripts:true }, this.options.ajaxOptions)); } else { new Ajax.Updater( { success: this.element, failure: null }, this.url, Object.extend({ parameters: this.options.callback(form, value), onComplete: this.onComplete.bind(this), onFailure: this.onFailure.bind(this) }, this.options.ajaxOptions)); } if (arguments.length > 1) { Event.stop(arguments[0]); } return false; }, onLoading: function() { this.saving = true; this.removeForm(); this.leaveHover(); this.showSaving(); }, showSaving: function() { this.oldInnerHTML = this.element.innerHTML; this.element.innerHTML = this.options.savingText; Element.addClassName(this.element, this.options.savingClassName); Element.show(this.element); }, removeForm: function() { if(this.form) { if (this.form.parentNode) Element.remove(this.form); this.form = null; } }, enterHover: function() { if (this.saving) return; if (this.effect) { this.effect.cancel(); } Element.addClassName(this.element, this.options.hoverClassName) }, leaveHover: function() { Element.removeClassName(this.element, this.options.hoverClassName) if (this.saving) return; }, leaveEditMode: function() { Element.removeClassName(this.element, this.options.savingClassName); this.removeForm(); this.leaveHover(); Element.show(this.element); if (this.options.externalControl) { Element.show(this.options.externalControl); } this.editing = false; this.saving = false; this.oldInnerHTML = null; this.onLeaveEditMode(); }, onComplete: function(transport) { this.leaveEditMode(); if(this.options.onComplete) this.options.onComplete.bind(this)(transport, this.element); }, onEnterEditMode: function() {}, onLeaveEditMode: function() {}, dispose: function() { if (this.oldInnerHTML) { this.element.innerHTML = this.oldInnerHTML; } this.leaveEditMode(); Event.stopObserving(this.element, 'click', this.onclickListener); Event.stopObserving(this.element, 'mouseover', this.mouseoverListener); Event.stopObserving(this.element, 'mouseout', this.mouseoutListener); if (this.options.externalControl) { Event.stopObserving(this.options.externalControl, 'click', this.onclickListener); Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener); Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener); } } };