/* */ /* # (C) Copyright 2003 Nuxeo SARL # Author: Tarek Ziadé # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as published # by the Free Software Foundation. # # 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. # # $Id:$ CPSDocument javascript layer XXX need to find a way to upload file, it is very restrictive as it does'nt allow to send simple types like Document, flexible, etc... */ var CPSDocumentEditor = Class.create(); CPSDocumentEditor.prototype = { initialize: function(form_id, form_action, rendered_id, buttons, reloadbuttons, title_id, translations, last_error, blockers) { // if any blocker is found, we don't ajaxify if (blockers) { for (var i = 0; i < blockers.length; i += 1) { var blocker = blockers[i]; if ($(blocker)) { this.enabled = false; return; } } } this.form_id = form_id; this.blockers = blockers; this.effects = Effect; this.rendered_id = rendered_id; this.title_id = title_id; this.last_error = last_error; this.sender = null; this.translations = translations; var edit_form = $(form_id); var rendered_node = $(rendered_id); if (!edit_form || !rendered_node) { this.enabled = false; } else { // getting the action value this.edit_form = edit_form; if (!this.canSendForm()) { this.enabled = false; } else { this.rendered_node = rendered_node; this.buttons = buttons; this.reloadbuttons = reloadbuttons; this.form_action = form_action; // linking action to buttons var count = 0; if (buttons) { for (var i = 0; i < buttons.length; i += 1) { var button = buttons[i]; var button_node = $(button); if (button_node) { button_node.onclick = this.sendForm.bindAsEventListener(this); count += 1; } } } if (reloadbuttons) { for (var i = 0; i < reloadbuttons.length; i += 1) { var button = reloadbuttons[i]; var button_node = $(button); if (button_node) { button_node.onclick = this.sendFormReload.bindAsEventListener(this); count += 1; } } } if (count>0) { this.enabled = true; edit_form.action = ''; // disabling direct sending } else { this.enabled = false; } } } }, onCreate: function() { if ($('ajax_psm')) { var elt = $('ajax_psm'); elt.innerHTML = this.translations.working; Effect.Appear('ajax_psm', {duration:1, queue:'end'}); } }, onComplete: function() { if ($('ajax_psm')) { Effect.Fade('ajax_psm', {duration:1.5, queue:'end'}); } }, sendForm: function(evt) { if (this.enabled) { this.onCreate(); // let's serialize the content of the form // and send it to the server params = Form.serialize(this.edit_form); if (params!='') { params += '&ajax_edit=1'; } var sendFormCompletedFn = this.sendFormCompleted.bind(this); var options = {parameters: params, onComplete: sendFormCompletedFn}; if (!this.sender) { this.sender = new Ajax.Request(this.form_action, options); } else { this.sender.setOptions(options); this.sender.request(this.form_action); } } }, sendFormReload: function(evt) { if (this.enabled) { this.onCreate(); // let's serialize the content of the form // and send it to the server params = Form.serialize(this.edit_form); if (params!='') { params += '&cpsdocument_edit_and_view_button=1'; params += '&ajax_edit=1'; } var sendFormCompletedFn = this.sendFormCompleted.bind(this); var options = {parameters: params, onComplete: sendFormCompletedFn}; if (!this.sender) { this.sender = new Ajax.Request(this.form_action, options); } else { this.sender.setOptions(options); this.sender.request(this.form_action); } } }, sendFormCompleted: function(originalRequest) { var result = originalRequest.responseXML; // result comes in three node, under ajax-response result = result.childNodes[0]; var action = ''; var layout = ''; var form_result = false; for (var i = 0; i < result.childNodes.length; i++) { var node = result.childNodes[i]; if (node.nodeName=='result') { if (node.childNodes[0].nodeValue=='True') form_result = true; } if (node.nodeName=='layout') { layout = node.childNodes[0].nodeValue; } if (node.nodeName=='action') { if (node.childNodes.length>0) { action = node.childNodes[0].nodeValue; } } } if (form_result) { psm = this.translations.content_changed; if (this.last_error) this.rendered_node.innerHTML = layout; } else { psm = this.translations.content_error; // need to reload form here this.rendered_node.innerHTML = layout; // we also want to scroll to the first error this.scrollTo('error'); } // feedback, in any case feedback = $('ajax_psm'); if (feedback) { feedback.innerHTML = psm; } // reload elements if (!action) { this.initialize(this.form_id, this.form_action, this.rendered_id, this.buttons, this.reloadbuttons, this.title_id, this.translations, !form_result, this.blockers); if (form_result) this.reloadTitleFromForm(); } else { this.gotoUrl(action); } this.onComplete(); }, gotoUrl: function(dest) { self.location.href = dest; }, canSendForm: function() { // trying to see if there are files in the form var inputs = this.edit_form.getElementsByTagName('input'); for (var i = 0; i < inputs.length; i++) { var input = inputs[i]; // if (input.type == 'file' && input.value != '') { if (input.type == 'file') { return false; } } return true; }, reloadTitleFromForm: function() { if ($('widget__Title')) { this.reloadTitle($('widget__Title').value); } }, reloadTitle: function(new_title) { // reloading title title_node = $(this.title_id); if (title_node) title_node.innerHTML = new_title; document.title = new_title; }, scrollTo: function(classname) { elements = document.getElementsByClassName(classname, document); if (elements.length>0) { var element = elements[0]; var x = element.x ? element.x : element.offsetLeft, y = element.y ? element.y : element.offsetTop; window.scrollTo(x, y); } } } /*--------------------------------------------------------------------------*/ if (!window.CPSFlexibleEdit) { var CPSFlexibleEdit = new Object(); } Object.extend(CPSFlexibleEdit, { buttonClick: function(button, message) { /* this function will simulate a click on a submit button, by setting a hidden field with the name/value of the clicked button and then submitting the form */ if (message) { if (window.confirm(message)) flag = true; } else flag = true; if (flag) { buttonName = button.name; buttonValue = button.value; myform = button.form; placeholder = document.getElementById('button_placeholder'); if (document.all) { // what follows should work // with Opera/IE but doesn't in Firefox placeholder.name = buttonName; placeholder.value = buttonValue; } else if (document.getElementById) { // so here is the // Firefox workaround placeholder.setAttribute('name', buttonName); placeholder.setAttribute('value', buttonValue); } myform.submit(); } } });