/* Copyright (c) 2008, Katharine Berry * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Katharine Berry nor the names of any contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * This software must not be used to control nuclear weapons. * * THIS SOFTWARE IS PROVIDED BY KATHARINE BERRY ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL KATHARINE BERRY BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ******************************************************************************/ // This is used to handle permission requests (ScriptPermissionRequest) // and script dialogs (ScriptDialog). There is actually little relation // between the two at a technical level, but it makes more sense like // this at the user level. I am a user, therefore it'll be like this. AjaxLife.ScriptDialogCount = 0; AjaxLife.ScriptDialogs = function() { // For permission requests generated by llRequestPermissions function permissionrequest(data) { var p = AjaxLife.Constants.MainAvatar.ScriptPermission; var permissions = ""; // Check the appropriate permissions and add to the list if needed. if(data.Permissions & p.Debit) permissions += _('Permissions.Debit',{})+'\n'; if(data.Permissions & p.TakeControls) permissions += _('Permissions.TakeControls',{})+'\n'; if(data.Permissions & p.TriggerAnimation) permissions += _('Permissions.Animate',{})+'\n'; if(data.Permissions & p.Attach) permissions += _('Permissions.Attach',{})+'\n'; if(data.Permissions & p.ChangeLinks) permissions += _('Permissions.ChangeLinks',{})+'\n'; if(data.Permissions & p.TrackCamera) permissions += _('Permissions.TrackCamera',{})+'\n'; if(data.Permissions & p.ControlCamera) permissions += _('Permissions.ControlCamera',{})+'\n'; // Ask the question. AjaxLife.Widgets.Modal.confirm( _('ScriptDialogs.PermissionRequestTitle',{}), _('ScriptDialogs.PermissionRequestBody',{ object: data.ObjectName, owner: data.ObjectOwner, permission: permissions }), function(btn) { // When we get a response, check what it was. If yes, grant the permissions. // If no, grant 0 permissions (i.e. none). var respperms = 0; if(btn == 'yes') { respperms = data.Permissions; } // Send the permission response to the server. AjaxLife.Network.Send('ScriptPermissionResponse', { ItemID: data.ItemID, TaskID: data.TaskID, Permissions: respperms }); } ); } function llDialog(data, buttons, handler){ ++AjaxLife.ScriptDialogCount; function btnhandler(index, name) { handler(index, name); dlg.hide(); } // Create a window with a unique ID. var dlg = new Ext.BasicDialog('dlg_lldialog_'+ AjaxLife.ScriptDialogCount, { width: '400px', height: '300px', modal: false, shadow: true, autoCreate: true, title: _("ScriptDialogs.DialogTitle"), proxyDrag: !AjaxLife.Fancy, closeClick : function(){ btnhandler(-1,"Ignore"); } }); // Build some content for it. var bodyEl = dlg.body.createChild({ html:'
' }); var msgEl = bodyEl.dom.firstChild; // Make the thing die when you destroy it. dlg.on("hide", function() { dlg.destroy(true); }); dlg.addKeyListener(27, function() { dlg.hide(); }); // Make a button table and style it appropriately. var table = $(document.createElement('table')); table.addClassName('llDialog'); var tr = false; var mkfunction = function(i, btn) { return function() { btnhandler(i, btn); } } // Loop through our buttons, adding them to the table. // Every third button we add a new table row, resulting in a grid // of buttons with rows of three. for(var i = 0; i < buttons.length; ++i) { var btn = buttons[i]; if(i % 3 == 0) { tr = document.createElement('tr'); table.appendChild(tr); } var td = document.createElement('td'); tr.appendChild(td); var f = mkfunction(i, btn); new Ext.Button(td, { text: btn, handler: f }); } // Place an "Ignore" button at the bottom right. dlg.addButton("Ignore",function() { btnhandler(-1,"Ignore"); }); dlg.body.setStyle({ background: '#CFE0F5', border: '0 none', fontSize: '13px' }); // Put the window together and show it. var text = _("ScriptDialogs.DialogMessage", { object: data.ObjectName, first: data.FirstName, last: data.LastName, message: data.Message }); msgEl.innerHTML = text || ' '; msgEl.appendChild(table); dlg.show(); return dlg; } function scriptdialog(data) { var buttonobj = {}; data.Buttons.each(function(item) { buttonobj[item] = item; }); llDialog(data,data.Buttons,function(index, btn) { // If the index isn't -1 (i.e. "Ignore") or the button blank, send back // the response. if(index == -1 || btn == '') return; AjaxLife.Network.Send('ScriptDialogReply', { ButtonIndex: index, ButtonLabel: btn, ChatChannel: data.ChatChannel, ObjectID: data.ObjectID }); }); } return { init: function() { // Register for the events that are triggered by llDialog and llRequestPermissions. AjaxLife.Network.MessageQueue.RegisterCallback('ScriptPermissionRequest',permissionrequest); AjaxLife.Network.MessageQueue.RegisterCallback('ScriptDialog',scriptdialog); } }; }();