/************************************************/ /* IPB3 Javascript */ /* -------------------------------------------- */ /* acp.templates.js - Template editor functions */ /* (c) IPS, Inc 2008 */ /* -------------------------------------------- */ /* Author: Rikki Tissier */ /************************************************/ var _temp = window.IPBACP; _temp.prototype.template_editor = { templateGroups: $H(), currentTemplateGroup: '', currentSetData: $A(), animDur: 0.4, templateSyntax: 'html', cssSyntax: 'css', toolbarDisabled: true, currentlyOpen: $H(), events: $H(), popups: $H(), // OK, listen up, this is complex. // If we edit an inherited template bit, then we would need to update the ID we use throughout, // because it would have changed from when the file was opened. Instead of closing and reopening // the editor though, I'm going to create a map here of old ID => new ID. We can check this to // make sure the correct ID is sent for relevant requests. Got it? modifyMap: { 'css': $H(), 'template': $H() }, /* ------------------------------ */ /** * Gets things going, sets events etc. */ initialize: function() { acp.template_editor.buildGroups(); acp.template_editor.loadGroupBits( '', acp.template_editor.currentTemplateGroup, 1 ); acp.template_editor.buildCSS(); // Set up tab handling $( 'e_templates' ).observe('click', acp.template_editor.toggleList.bindAsEventListener( this, 'templates' ) ); $( 'e_css' ).observe('click', acp.template_editor.toggleList.bindAsEventListener( this, 'css' ) ); // Add events for the add bit/add group/add css links $( 't_add_bit' ).observe('click', acp.template_editor.launchAddBit); $( 'css_add_css' ).observe('click', acp.template_editor.launchAddCSS); // Add a body event handler to detect unsaved files // Event.observe( window, 'beforeunload', acp.template_editor.checkUnsavedFiles ); // Doesn't work in Safari, but appears to be Event.observe related, rather than the event itself. // @link http://scoop.simplyexcited.co.uk/2007/12/14/prototype-script-onbeforeunload-when-leaving-a-page/ (read comments) window.onbeforeunload = function() { var files = $H( acp.tabbedEditor.getAllFiles() ); var changes = false; if( !Object.isUndefined( files ) && files.size() ) { files.each( function( file ){ if( file.value['edited'] ){ changes = true; } }); } if( changes ) { return ipb.lang['templates_navigate']; } }; }, /* ------------------------------ */ /** * Shows the popup for adding a css file */ launchAddCSS: function(e) { Event.stop(e); // Have we already made the popup before? if( !Object.isUndefined( acp.template_editor.popups['add_css'] ) ) { acp.template_editor.popups['add_css'].show(); return; } // Pre-make popup acp.template_editor.popups['add_css'] = new ipb.Popup('add_css_popup', { type: 'pane', modal: false, hideAtStart: true, w: '600px', initial: ipb.templates['form_add_css'] } ); var popup = acp.template_editor.popups['add_css']; $('add_css_submit').observe('click', acp.template_editor.doAddCSS); popup.show(); }, /* ------------------------------ */ /** * Processes adding a new CSS file */ doAddCSS: function(e) { var cssid = 0; var url = ipb.vars['base_url'] + "app=core&module=ajax&section=css&do=saveCSS&setID=" + acp.template_editor.currentSetData['set_id'] + '&css_id=' + cssid + '&type=add&secure_key=' + ipb.vars['md5_hash']; /* Set up params */ var params = { 'css_content' : '', 'css_position' : 0, 'css_set_id' : acp.template_editor.currentSetData['set_id'], '_css_group' : $F('add_css_name').encodeParam(), // this is actually the file name 'type' : 'add' }; if( $F('add_css_name').blank() ) { alert( ipb.lang['templates_blankcss'] ); return; } acp.template_editor.setLoadingMsg( ipb.lang['templates_adding'] ); new Ajax.Request( url.replace( /&/g, '&' ), { method: 'post', parameters: params, evalJSON: 'force', onSuccess: function(t) { if( Object.isUndefined( t.responseJSON ) ) { alert( ipb.lang['templates_error_add'] ); return; } else if( t.responseJSON['error'] ) { alert( ipb.lang['templates_error_add2'] + t.responseJSON['error'] ); return; } var cssid = t.responseJSON['cssData']['css_id']; var cssname = t.responseJSON['cssData']['css_group']; // Add file to list acp.template_editor._buildCSS( true ); // Create object to pass to editor acp.tabbedEditor.openTab('css_file_' + cssid, cssname + ".css", '' ); if( Object.isUndefined( acp.template_editor.currentlyOpen.get( 'css_' + cssid ) ) ){ acp.template_editor.currentlyOpen.set( 'css_' + cssid, t.responseJSON['cssData'] ); } // Does the toolbar need enabling? if( acp.template_editor.toolbarDisabled ){ acp.template_editor.enableToolbar('css', cssid ); } // And finally... $('add_css_name').value = ''; acp.template_editor.popups['add_css'].hide(); }, onException: function( f,e ){ alert( "Exception: " + e ); }, onFailure: function( t ){ alert( "Failure: " + t.responseText ); }, onComplete: function(t){ acp.template_editor.setLoadingMsg(''); } }); }, /* ------------------------------ */ /** * Shows the popup for adding a bit */ launchAddBit: function(e) { Event.stop(e); // Have we already made the popup before? if( !Object.isUndefined( acp.template_editor.popups['add_bit'] ) ) { $( 'add_bit_group' ).update(''); var popup = acp.template_editor.popups['add_bit']; } else { // Pre-make popup acp.template_editor.popups['add_bit'] = new ipb.Popup('add_bit_popup', { type: 'pane', modal: false, hideAtStart: true, w: '600px', initial: ipb.templates['form_add_bit'] } ); var popup = acp.template_editor.popups['add_bit']; // Build the list of groups if( Object.isUndefined( acp.template_editor.templateGroups['groups'] ) ){ alert( ipb.lang['templates_error_group'] ); return; } } $H( acp.template_editor.templateGroups['groups'] ).each( function(group){ var title = group.value['template_group']; var elem = new Element('option', { 'value': group.value['template_group'] }); elem.update( title ); $( 'add_bit_group' ).insert( elem ); }); $('add_bit_submit').observe('click', acp.template_editor.doAddBit); popup.show(); /*popup.positionPane(); popup.show();*/ }, /* ------------------------------ */ /** * Processes adding a bit * * @param {event} e The event */ doAddBit: function(e) { var fileid = 0; var url = ipb.vars['base_url'] + "app=core&module=ajax&section=templates&do=saveTemplateBit&setID=" + acp.template_editor.currentSetData['set_id'] + '&template_id=' + fileid + '&type=add&secure_key=' + ipb.vars['md5_hash']; var newGroup = $F('add_bit_new_group'); var currentGroup = newGroup ? 'skin_' + newGroup : $F('add_bit_group'); var params = { 'template_content' : '', 'template_set' : acp.template_editor.currentSetData['set_id'], 'template_group' : currentGroup.encodeParam(), 'template_data' : $F('add_bit_variables'), '_template_name' : $F('add_bit_name').encodeParam(), '_template_group' : currentGroup }; if( $F('add_bit_name').blank() ) { alert( ipb.lang['templates_noblank'] ); return; } /*if( !$('group_' + currentGroup ) ) { alert("Could not find the selected group"); return; }*/ acp.template_editor.setLoadingMsg( ipb.lang['templates_adding'] ); new Ajax.Request( url.replace( /&/g, '&' ), { method: 'post', parameters: params, evalJSON: 'force', onSuccess: function(t, e) { if( Object.isUndefined( t.responseJSON ) ) { alert( ipb.lang['templates_error_add'] ); return; } else if( t.responseJSON['error'] ) { alert( ipb.lang['templates_error_add2'] + t.responseJSON['error']); return; } var templateid = t.responseJSON['templateData']['template_id']; // Is this a new group? if( newGroup ) { var newGroupList = ipb.templates['template_group'].evaluate( { id: 'group_skin_' + newGroup, title: 'skin_' + newGroup } ); $('template_list').insert( { bottom: newGroupList } ); // Create the wrapper var wrap = new Element('ul', { id: 'group_skin_' + newGroup + '_bits' }).addClassName('bits_list'); $( 'group_skin_' + newGroup ).insert( wrap ); // Push it into the array acp.template_editor.templateGroups['groups'][ 'skin_' + newGroup ] = { template_group : 'skin_' + newGroup, template_set_id : 0, theorder: 3, template_id: 0 }; Debug.dir( acp.template_editor.templateGroups['groups']); } acp.tabbedEditor.openTab( 'template_' + templateid, t.responseJSON['templateData']['template_name'], '' ); if( Object.isUndefined( acp.template_editor.currentlyOpen.get( 'template_' + templateid ) ) ){ acp.template_editor.currentlyOpen.set( 'template_' + templateid, t.responseJSON['templateData'] ); } // Reload bits acp.template_editor.loadGroupBits(e, currentGroup, true); // Does the toolbar need enabling? if( acp.template_editor.toolbarDisabled ){ acp.template_editor.enableToolbar('template', templateid ); } // And finally... $('add_bit_name').value = ''; $('add_bit_variables').value = ''; acp.template_editor.popups['add_bit'].hide(); }, onException: function( f,e ){ alert( "Exception: " + e ); }, onFailure: function( t ){ alert( "Failure: " + t.responseText ); }, onComplete: function(t){ acp.template_editor.setLoadingMsg(''); } }); }, /* ------------------------------ */ /** * Shows the popup for adding a group */ launchAddGroup: function(e) { }, /* ------------------------------ */ /** * Event fired when navigating away from the page * Checks whether there's unsaved files * * @param {event} e The event */ checkUnsavedFiles: function() { var files = $H( acp.tabbedEditor.getAllFiles() ); var changes = false; if( !Object.isUndefined( files ) && files.size() ) { files.each( function( file ){ if( file.value['edited'] ){ changes = true; } }); } if( changes ) { if( !confirm( ipb.lang['templates_navigate'] ) ) { return false; } } return true; }, /* ------------------------------ */ /** * Toggles between showing templates & css * * @param {event} e The event * @param {string} tab The tab to show (temmplates or css) */ toggleList: function(e, tab) { if( tab == 'templates' && !$('e_templates').hasClassName('active') ) { // Make templates active $( 'css_list_wrap' ).hide(); $( 'template_list_wrap' ).show(); $( 'e_templates' ).addClassName('active'); $( 'e_css' ).removeClassName('active'); } else if( tab == 'css' && !$('e_css').hasClassName('active') ) { // Make css active $( 'template_list_wrap' ).hide(); $( 'css_list_wrap' ).show(); $( 'e_css' ).addClassName('active'); $( 'e_templates' ).removeClassName('active'); } }, /* ------------------------------ */ /** * Callback function from EditArea when loading * * @param {string} id The editor ID */ CALLBACK_editor_loaded: function(id) { }, /* ------------------------------ */ /** * Callback: when switching tab in editor * * @param {object} file File info from editarea */ CALLBACK_file_switch: function(file) { if( file['id'].startsWith('template_') ){ acp.template_editor.enableToolbar('template', file['id'].replace('template_', '') ); } else if (file['id'].startsWith('css_') ){ acp.template_editor.enableToolbar('css', file['id'].replace('css_file_', '' ) ); } }, /* ------------------------------ */ /** * Builds the list of CSS files. Used internally * so that the ajax is asynchronized * @param boolean TRUE means grab data from DB first */ _buildCSS: function( reload ) { if ( reload == true ) { acp.template_editor.setLoadingMsg( ipb.lang['templates_loading'] ); var url = ipb.vars['base_url'] + "app=core&module=ajax&section=css&do=getCSSGroups&setID=" + acp.template_editor.currentSetData['set_id'] + '&secure_key=' + ipb.vars['md5_hash']; new Ajax.Request( url.replace( /&/g, '&' ), { method: 'get', evalJSON: 'force', onSuccess: function(t) { if( Object.isUndefined( t.responseJSON ) ) { alert( ipb.lang['templates_servererror'] + t.responseText ); return; } else if( t.responseJSON['error'] ) { alert( ipb.lang['templates_servererror'] + t.responseJSON['error'] ); return; } var current = acp.tabbedEditor.getCurrentFile(); acp.template_editor.cssFiles['css'] = t.responseJSON['css']; acp.template_editor.buildCSS(); acp.template_editor.disableToolbar(); acp.template_editor.enableToolbar('css', current['id'].replace( 'css_file_', '' ) ); }, onFailure: function(t){ alert("There was an error executing this command"); Debug.error(t.responseText); return; }, onException: function(f,e){ alert("There was an exception executing this command"); Debug.error(e); return; }, onComplete: function(t){ acp.template_editor.setLoadingMsg(''); } }); } else { acp.template_editor.buildCSS(); } }, /* ------------------------------ */ /** * Builds the list of CSS files * @param boolean TRUE means grab data from DB first */ buildCSS: function() { $( 'css_list' ).update(); $H( acp.template_editor.cssFiles['css'] ).each( function(css){ var icon = 'default'; // Determine icon /* Root skin? */ if ( ! acp.template_editor.currentSetData['_parentTree'].length && acp.template_editor.currentSetData['_isMaster'] == 1 ) { icon = 'root'; } else if( css.value['css_added_to'] == acp.template_editor.currentSetData['set_id'] ) { icon = 'new'; } else if( css.value['css_set_id'] == acp.template_editor.currentSetData['set_id'] ) { icon = 'modified'; } else if( acp.template_editor.currentSetData['_parentTree'].indexOf( css.value['css_set_id'] ) != -1 ) { icon = 'inherit'; } var item = ipb.templates['css_file'].evaluate( { id: 'css_' + css.value['css_id'], name: css.value['css_group'] + '.css', icon: icon } ); $( 'css_list' ).insert( item ); if( icon == 'new' || icon == 'root' ) { $('delete_css_css_' + css.value['css_id']).show(); $('delete_css_css_' + css.value['css_id']).observe('click', acp.template_editor.removeFile.bindAsEventListener( this, css.value ) ); } $( 'css_' + css.value['css_id'] ).writeAttribute('state', icon); $( 'css_' + css.value['css_id'] ).observe('click', acp.template_editor.loadCSSfile.bindAsEventListener( this, css.value['css_id'], 0 ) ); }); }, /* ------------------------------ */ /** * Builds the list of template groups */ buildGroups: function() { $( 'template_list' ).update(); //if( !acp.template_editor.templateGroups['groups'] ){ return; } $H( acp.template_editor.templateGroups['groups'] ).each( function(group){ //Debug.dir( group ); var title = ( Object.isUndefined( ipb.lang['bit_' + group.value['template_group'] ] ) ) ? group.value['template_group'] : ipb.lang['bit_' + group.value['template_group'] ]; var item = ipb.templates['template_group'].evaluate( { id: 'group_' + group.key, title: title } ); $( 'template_list' ).insert( item ); $( 'group_' + group.key ).observe('click', acp.template_editor.loadGroupBits.bindAsEventListener( this, group.key, 0 )); }); }, /* ------------------------------ */ /** * Loads a CSS file from the server if it isn't open already * * @param {event} e The event * @param {int} cssid The CSS file ID */ loadCSSfile: function( e, cssid ) { // Is this file already open? if( !Object.isUndefined( acp.template_editor.currentlyOpen.get('css_' + acp.template_editor.reverseCheckMap( cssid, 'css' ) ) ) ) { acp.tabbedEditor.openTab( 'css_file_' + acp.template_editor.reverseCheckMap( cssid, 'css' ) ); return true; } acp.template_editor.setLoadingMsg( ipb.lang['templates_loading'] ); var url = ipb.vars['base_url'] + "app=core&module=ajax&section=css&do=getCSSForEdit&setID=" + acp.template_editor.currentSetData['set_id'] + '&css_id=' + acp.template_editor.checkMap( cssid, 'css' ) + '&secure_key=' + ipb.vars['md5_hash']; new Ajax.Request( url.replace( /&/g, '&' ), { method: 'get', evalJSON: 'force', onSuccess: function(t) { if( Object.isUndefined( t.responseJSON ) ) { alert( ipb.lang['templates_servererror'] + t.responseText ); return; } else if( t.responseJSON['error'] ) { alert( ipb.lang['templates_servererror'] + t.responseJSON['error'] ); return; } var cssfile = t.responseJSON['cssData']; //Debug.dir( cssfile ); acp.template_editor.openCSSfile( cssid, cssfile ); }, onFailure: function(t){ alert("There was an error executing this command"); Debug.error(t.responseText); return; }, onException: function(f,e){ alert("There was an exception executing this command"); Debug.error(e); return; }, onComplete: function(t){ acp.template_editor.setLoadingMsg(''); } }); }, /* ------------------------------ */ /** * Opens a CSS file in the editor * * @param {int} cssid The CSS file ID * @param {object} json The object returned from ajax */ openCSSfile: function( cssid, json ) { // Create object to pass to editor acp.tabbedEditor.openTab( 'css_file_' + cssid, json['css_group'] + '.css', json['css_content'] ); if( Object.isUndefined( acp.template_editor.currentlyOpen.get( 'css_' + cssid ) ) ) { acp.template_editor.currentlyOpen.set( 'css_' + cssid, json ); } // Does the toolbar need enabling? if( acp.template_editor.toolbarDisabled ) { acp.template_editor.enableToolbar('css', cssid); } }, /* ------------------------------ */ /* ! loadGroupBits */ /** * Loads the template bits within a group * * @param {event} e The event * @param {string} group The group to load * @param {boolean} force Force update even if group exists? */ loadGroupBits: function(e, group, force) { // Already exists? if( $( 'group_' + group + '_bits' ) && !force ) { acp.template_editor.toggleBitsList( e, group ); return true; } // Set to loading $('group_' + group).addClassName('loading'); /* Grab the JSON for the template bits for the current template group */ var url = ipb.vars['base_url'] + "app=core&module=ajax&section=templates&do=getTemplateBitList&setID=" + acp.template_editor.currentSetData['set_id'] + '&templateGroup=' + group + '&secure_key=' + ipb.vars['md5_hash']; new Ajax.Request( url.replace( /&/g, '&' ), { method: 'get', evalJSON: 'force', onSuccess: function (t) { if( Object.isUndefined( t.responseJSON ) ) { alert( ipb.lang['templates_servererror'] + t.responseText ); return; } else if( t.responseJSON['error'] ) { alert( ipb.lang['templates_servererror'] + t.responseJSON['error'] ); return; } acp.template_editor.buildTemplateList( group, t.responseJSON ); acp.template_editor.toggleBitsList( e, group ); var current = acp.tabbedEditor.getCurrentFile(); if( ! Object.isUndefined( current ) && ! Object.isUndefined( current['id'] ) && current['id'] ) { acp.template_editor.disableToolbar(); acp.template_editor.enableToolbar('template', current['id'].replace( 'template_', '' ) ); } }, onFailure: function(t){ alert("There was an error executing this command"); Debug.error(t.responseText); return; }, onException: function(f,e){ alert("There was an exception executing this command"); Debug.error(e); return; }, onComplete: function(t){ $('group_' + group).removeClassName('loading'); } }); }, /* ------------------------------ */ /** * Toggle a bits list thats already populated * * @param {event} e The event * @param {string} group The group to toggle */ toggleBitsList: function( e, group ) { if( e ) { var elem = $( Event.element(e) ).up('ul.bits_list'); if( !Object.isUndefined( elem ) && elem != document ) { // We dont want to toggle the menu for this Event.stop(e); return; } } if( !$( 'group_' + group + '_bits' ) ){ return false; } if( $('group_' + group + '_bits').visible() ) { new Effect.BlindUp( $('group_' + group + '_bits'), { duration: acp.template_editor.animDur } ); } else { new Effect.BlindDown( $('group_' + group + '_bits'), { duration: acp.template_editor.animDur } ); } }, /* ------------------------------ */ /** * Builds the list of template groups * * @param {string} group The group ID * @param {object} json The JSON passed into the page containing the groups */ buildTemplateList: function( group, json ) { // Remove old list if it exists if( $( 'group_' + group + '_bits' ) ){ $( 'group_' + group + '_bits' ).remove(); } // Create the wrapper var wrap = new Element('ul', { id: 'group_' + group + '_bits' }).hide().addClassName('bits_list'); $( 'group_' + group ).insert( wrap ); for( i = 0 ; i < json['templates'].length; i++ ) { var state = ''; var css = ''; /* Set defaults */ if ( acp.template_editor.currentSetData['_parentTree'].length ) { /* This is a default row */ state = 'default'; } else { /* Root skin? */ state = 'root'; } /* Figure out if this in an inherited row, a changed row, a new row or a default row */ if ( json['templates'][i]['template_added_to'] == acp.template_editor.currentSetData['set_id'] ) { if ( json['templates'][i]['template_user_added'] == 1 ) { /* This is a modified row */ state = 'new'; } else if ( json['templates'][i]['template_user_edited'] == 1 ) { /* This is a modified row */ state = 'modified'; } } else if ( acp.template_editor.currentSetData['_parentTree'].length && acp.template_editor.currentSetData['_parentTree'].indexOf( json['templates'][i]['template_set_id'] ) != -1 ) { if ( json['templates'][i]['template_set_id'] == acp.template_editor.currentSetData['set_id'] ) { state = 'modified'; } else { state = 'inherit'; } } else if ( json['templates'][i]['template_user_edited'] == 1 ) /*&& json['templates'][i]['template_user_added'] == 0*/ /* Bug 25788 */ { /* This is a modified row */ state = 'modified'; } var elem = ipb.templates['template_bit'].evaluate( { id: 'group_' + group + '_bit_' + json['templates'][i]['template_id'], title: json['templates'][i]['template_name'], icon: state } ); $('group_' + group + '_bits').insert( elem ); // Show delete? if( state == 'new' ) { $('delete_bit_group_' + group + '_bit_' + json['templates'][i]['template_id']).show(); $('delete_bit_group_' + group + '_bit_' + json['templates'][i]['template_id']).observe('click', acp.template_editor.removeFile.bindAsEventListener( this, json['templates'][i] ) ); } $( 'group_' + group + '_bit_' + json['templates'][i]['template_id'] ).writeAttribute('state', state); $( 'group_' + group + '_bit_' + json['templates'][i]['template_id'] ).observe('click', acp.template_editor.loadTemplateBit.bindAsEventListener( this, json['templates'][i]['template_id'] ) ); }; }, /* ------------------------------ */ /** * Removes a template bit from the list */ removeFile: function( e, file ) { Event.stop(e); if( file['template_id'] ) { // Template var fileid = file['template_id']; var filename = file['template_name']; var elemprefix = "group_" + file['template_group'] + "_bit_"; var url = "app=core&module=ajax§ion=templates&do=revertTemplateBit&setID=" + this.currentSetData['set_id'] + "&template_id=" + acp.template_editor.checkMap( fileid, 'template' ) + '&secure_key=' + ipb.vars['md5_hash']; var message = ipb.lang['delete_template_bit']; } else { //CSS var fileid = file['css_id']; var filename = file['css_group']; var elemprefix = "css_"; var url = "app=core&module=ajax§ion=css&do=revertCSS&fromDelete=1&setID=" + acp.template_editor.currentSetData['set_id'] + "&css_id=" + acp.template_editor.checkMap( fileid, 'css' ) + '&secure_key=' + ipb.vars['md5_hash']; var message = ipb.lang['delete_css_file']; } // Check they want to if( !confirm( message ) ) { return; } url = ipb.vars['base_url'] + url; acp.template_editor.setLoadingMsg('Removing...'); new Ajax.Request( url.replace(/&/g, '&' ), { method: 'GET', evalJSON: 'force', onSuccess: function( t ) { if( Object.isUndefined( t.responseJSON ) ) { alert( ipb.lang['templates_servererror'] + t.responseText ); return; } else if( t.responseJSON['errors'] ) { alert(ipb.lang['templates_servererror'] + t.responseJSON['errors'] ); return; } // Remove that bit from the list if( $(elemprefix + fileid) ) { new Effect.BlindUp( $(elemprefix + fileid ), { duration: 0.4, afterFinish: function() { $(elemprefix + fileid).remove(); } }); } // Is the file open? We need to close it if( file['template_id'] ) { if( !Object.isUndefined( acp.template_editor.currentlyOpen.get('template_' + fileid) ) ){ acp.tabbedEditor.closeTab( 'template_' + fileid ); return true; } else { var _oldId = acp.template_editor.reverseCheckMap( fileid, 'template' ); if( _oldId ) { if( !Object.isUndefined( acp.template_editor.currentlyOpen.get('template_' + _oldId) ) ){ acp.tabbedEditor.closeTab( 'template_' + _oldId ); return true; } } } } else { if( !Object.isUndefined( acp.template_editor.currentlyOpen.get('css_' + fileid) ) ){ acp.tabbedEditor.closeTab( 'css_file_' + fileid ); return true; } } }, onException: function( f,e ){ alert( "Exception: " + e ); }, onFailure: function( t ){ alert( "Failure: " + t.responseText ); }, onComplete: function(t){ acp.template_editor.setLoadingMsg(''); } }); }, /* ------------------------------ */ /** * Reverts the currently open file (template or css) */ revertCurrentFile: function(e) { Event.stop(e); // Get current file info var current = acp.tabbedEditor.getCurrentFile(); if( Object.isUndefined( current ) || Object.isUndefined( current['id'] ) ) { return false; } if( current['id'].startsWith('template_') ) { // Template var type = 'template_'; var fileid = current['id'].replace('template_', ''); var info = acp.template_editor.currentlyOpen.get('template_' + fileid); var url = "app=core&module=ajax§ion=templates&do=revertTemplateBit&setID=" + acp.template_editor.currentSetData['set_id'] + "&template_id=" + acp.template_editor.checkMap( fileid, 'template' ) + '&secure_key=' + ipb.vars['md5_hash']; var message = ipb.lang['revert_template_bit']; } else { var type = 'css_'; var fileid = current['id'].replace('css_file_', ''); var info = acp.template_editor.currentlyOpen.get('css_' + fileid ); var url = "app=core&module=ajax&section=css&do=revertCSS&setID=" + acp.template_editor.currentSetData['set_id'] + '&css_id=' + acp.template_editor.checkMap( fileid, 'css' ) + '&secure_key=' + ipb.vars['md5_hash']; var message = ipb.lang['revert_css_file']; } // Are they sure? if( !confirm( message ) ) { return; } acp.template_editor.setLoadingMsg( ipb.lang['revert_mesg'] ); url = ipb.vars['base_url'] + url; new Ajax.Request( url.replace(/&/g, '&' ), { method: 'GET', evalJSON: 'force', onSuccess: function( t, e ) { if( Object.isUndefined( t.responseJSON ) ) { alert( ipb.lang['templates_servererror'] + t.responseText ); return; } else if( t.responseJSON['error'] ) { alert(ipb.lang['templates_servererror'] + t.responseJSON['error'] ); return; } if( type == 'template_' ) { // Update text editor content acp.tabbedEditor.setContent( 'template_' + fileid, t.responseJSON['templateData']['_template_content'] ); // Set not edited acp.tabbedEditor.setFileEditedMode('template_' + fileid, false); Debug.write( "Current fileid is " + fileid ); Debug.write( "Returned fileid is " + t.responseJSON['templateData']['template_id'] ); if( acp.template_editor.checkMap( fileid, 'template' ) != t.responseJSON['templateData']['template_id'] ) { acp.template_editor.modifyMap['template'][ t.responseJSON['templateData']['template_id'] ] = undefined; // Remove old map acp.template_editor.modifyMap['template'][ fileid ] = t.responseJSON['templateData']['template_id']; Debug.write("Updated modify map!"); } // Update array acp.template_editor.currentlyOpen.set( 'template_' + fileid, t.responseJSON['templateData'] ); acp.template_editor.loadGroupBits(e, t.responseJSON['templateData']['template_group'], true); } else { // Update text editor content acp.tabbedEditor.setContent( 'css_file_' + fileid, t.responseJSON['cssData'][ info['css_group'] ]['css_content'] ); // Set not edited acp.tabbedEditor.setFileEditedMode('css_file_' + fileid, false); Debug.write( "Current cssid is " + fileid ); Debug.write( "Returned cssid is " + t.responseJSON['cssData'][ info['css_group'] ]['css_id'] ); if ( acp.template_editor.checkMap( fileid, 'css' ) != t.responseJSON['cssData'][ info['css_group'] ]['css_id'] ) { acp.template_editor.modifyMap['css'][ t.responseJSON['cssData'][ info['css_group'] ]['css_id'] ] = t.responseJSON['cssData'][ info['css_group'] ]['css_id']; // Remove old map acp.template_editor.modifyMap['css'][ fileid ] = t.responseJSON['cssData'][ info['css_group'] ]['css_id']; Debug.write("Updated modify map! fileid " + fileid + " is now " + acp.template_editor.modifyMap['css'][ fileid ] ); } /* Rebuild CSS groups */ acp.template_editor._buildCSS( true ); //Debug.dir( t.responseJSON ); } }, onException: function( f,e ){ alert( "Exception: " + e ); }, onFailure: function( t ){ alert( "Failure: " + t.responseText ); }, onComplete: function(t){ acp.template_editor.setLoadingMsg(''); } }); }, /* ------------------------------ */ /** * Loads a template bit * * @param {event} e The event * @param {int} templateid The template ID to load */ loadTemplateBit: function( e, templateid ) { // Is this bit already open? if( !Object.isUndefined( acp.template_editor.currentlyOpen.get('template_' + acp.template_editor.reverseCheckMap( templateid, 'template' ) ) ) ) { acp.tabbedEditor.openTab( 'template_' + acp.template_editor.reverseCheckMap( templateid, 'template' ) ); return true; } acp.template_editor.setLoadingMsg( ipb.lang['templates_loading'] ); url = ipb.vars['base_url'] + "app=core&module=ajax&section=templates&do=getTemplateForEdit&setID=" + this.currentSetData['set_id'] + '&template_id=' + acp.template_editor.checkMap( templateid, 'template' ) + '&secure_key=' + ipb.vars['md5_hash']; new Ajax.Request( url.replace( /&/g, '&' ), { method: 'GET', evalJSON: 'force', onSuccess: function (t ) { if( Object.isUndefined( t.responseJSON ) ) { alert(ipb.lang['templates_servererror'] + t.responseText ); return; } else if( t.responseJSON['error'] ) { alert(ipb.lang['templates_servererror'] + t.responseJSON['error'] ); return; } var template = t.responseJSON['templateData']; //Debug.dir( template ); acp.template_editor.openTemplateBit( templateid, template ); }, onException: function( f,e ){ alert( "Exception: " + e ); }, onFailure: function( t ){ alert( "Failure: " + t.responseText ); }, onComplete: function(t){ acp.template_editor.setLoadingMsg(''); } } ); }, /* ------------------------------ */ /** * Opens a template bit in the editor * * @param {int} templateid The template ID * @param {object} json The object returned from ajax */ openTemplateBit: function( templateid, json ) { if( Object.isUndefined( acp.template_editor.currentlyOpen.get( 'template_' + templateid ) ) ) { acp.template_editor.currentlyOpen.set( 'template_' + templateid, json ); } Debug.write( json['template_content'] ); acp.tabbedEditor.openTab( 'template_' + templateid, json['template_name'], json['_template_content'] ); // Does the toolbar need enabling? if( acp.template_editor.toolbarDisabled ) { acp.template_editor.enableToolbar('template', templateid); } }, /* ------------------------------ */ /* ! enableToolbar */ /** * Enables the toolbar for templates or css * * @param {string} type The type of toolbar (css or template) */ enableToolbar: function( type, fileid ) { Debug.write( type + ' - ' + fileid ); /* Preserve old-un */ _fileid = fileid; /* Grab remap */ fileid = acp.template_editor.checkMap( fileid, type ); Debug.write( 'Checked with map, fileid now - ' + fileid ); var toolbar = $('document_buttons'); var elems = $( toolbar ).immediateDescendants(); if( $('t_save') ) { var save = $('t_save').observe('click', acp.template_editor.saveCurrentFile); acp.template_editor.events.set('save', save ); $( 't_save' ).removeClassName('disabled'); $( 't_save' ).setStyle('cursor: pointer;'); } if( $('t_revert') ) { var state = null; // Check whether we can revert this bit try { if( type == 'template' ) { // Get current file info var info = acp.template_editor.currentlyOpen.get( 'template_' + _fileid ); if( !Object.isUndefined( info ) && $('group_' + info['template_group'] + '_bit_' + fileid) ) { var state = $('group_' + info['template_group'] + '_bit_' + fileid).readAttribute('state'); } } else { if( $('css_' + fileid) ) { var state = $('css_' + fileid).readAttribute('state'); } } } catch(err) { Debug.error( err ); } if( state == 'modified' ) { var revert = $('t_revert').observe('click', acp.template_editor.revertCurrentFile); acp.template_editor.events.set('revert', revert ); $( 't_revert' ).show().removeClassName('disabled').setStyle('cursor: pointer;'); } else { $('t_revert').stopObserving('click', acp.template_editor.revertCurrentFile); $('t_revert').show().addClassName('disabled').setStyle('cursor: default'); } } if( $('t_compare') ) { //if( type == 'template' ) //{ var compare = $('t_compare').observe('click', acp.template_editor.compareTemplate); acp.template_editor.events.set('compare', compare ); $( 't_compare' ).show().removeClassName('disabled').setStyle('cursor: pointer;'); //} //else //{ // $('t_compare').stopObserving('click', acp.template_editor.compareTemplate); // $( 't_compare' ).addClassName('disabled').setStyle('cursor: default;').hide(); //} } if( $('t_variables') ) { if( type == 'template' ) { var variables = $('t_variables').observe('click', acp.template_editor.showVariables); acp.template_editor.events.set('variables', variables ); $('t_variables').show().removeClassName('disabled').setStyle('cursor: pointer;'); } else { $('t_variables').stopObserving('click', acp.template_editor.showVariables); $('t_variables').addClassName('disabled').setStyle('cursor: default').hide(); } } if( $('t_properties') ) { if( type == 'template' ) { $('t_properties').stopObserving('click', acp.template_editor.showCssProperties); $('t_properties').hide().addClassName('disabled').setStyle('cursor: default'); } else { var properties = $('t_properties').observe('click', acp.template_editor.showCssProperties); acp.template_editor.events.set('properies', properties); $('t_properties').show().removeClassName('disabled').setStyle('cursor: pointer'); } } /* Unhide editor */ acp.template_editor._unhideEditor(); }, /* ------------------------------ */ /** * Disables the toolbar */ disableToolbar: function() { if( $('t_save') ) { $('t_save').stopObserving('click', acp.template_editor.saveCurrentFile); $('t_save').addClassName('disabled').setStyle('cursor: default;'); } if( $('t_revert') ) { $('t_revert').stopObserving('click', acp.template_editor.revertTemplate); $('t_revert').addClassName('disabled').setStyle('cursor: default;').hide(); } if( $('t_compare') ) { $('t_compare').stopObserving('click', acp.template_editor.compareTemplate); $('t_compare').addClassName('disabled').setStyle('cursor: default;').hide(); } if( $('t_variables') ) { $('t_variables').stopObserving('click', acp.template_editor.showVariables); $('t_variables').addClassName('disabled').setStyle('cursor: default;').hide(); } if( $('t_properties') ) { $('t_properties').stopObserving('click', acp.template_editor.showCssProperties); $('t_properties').addClassName('disabled').setStyle('cursor: default;').hide(); } }, /* ------------------------------ */ /** * Shows the panel for css property editing */ showCssProperties: function(e) { Event.stop(e); // Get current file info var current = acp.tabbedEditor.getCurrentFile(); if( Object.isUndefined( current ) || Object.isUndefined( current['id'] ) ) { return false; } if( !current['id'].startsWith('css_') ) { Debug.error( "This isn't a CSS file!" ); return; } var _id = current['id'].replace('css_file_', ''); var fileid = ( Object.isUndefined( acp.template_editor.currentlyOpen.get( 'css_' + _id ) ) ) ? acp.template_editor.checkMap( _id, 'css' ) : _id; var file = acp.template_editor.currentlyOpen.get( 'css_' + fileid ); // How many files are there? var cssfiles = $('css_list').childElements().size(); var options = ''; if( cssfiles ) { for( i = 0; i <= cssfiles; i++ ) { if( i != parseInt( file['css_position'] ) ){ options += "\n"; } else { options += "\n"; } } } // Now we can build/show the popup if( acp.template_editor.popups.get('properties_' + fileid) ) { $('cssposition_' + fileid).update( options ); acp.template_editor.popups.get('properties_' + fileid).show(); } else { Debug.dir( file ); var content = ipb.templates['css_properties'].evaluate( { id: fileid, cssposition: options, attributes: file['css_attributes'], app: ( file['css_app'] == "0" ) ? "" : file['css_app'], modules: ( file['css_modules'] ) ? file['css_modules'] : '', apphide: ( file['css_app_hide'] == "0" ) ? "" : "checked='checked'" }); var popup = new ipb.Popup( 'variables', { type: 'pane', modal: false, w: '700px', initial: content, hideAtStart: false, close: 'a[rel="close"]' } ); acp.template_editor.popups.set('properties_' + fileid, popup); // Add event handler for saving $('save_properties_' + fileid).observe('click', acp.template_editor.saveCssProperties.bindAsEventListener( this, fileid ) ); } }, /* ------------------------------ */ /** * Saves properties changed with the above function */ saveCssProperties: function(e, fileid) { var url = ipb.vars['base_url'] + "app=core&module=ajax&section=css&do=saveCSS&setID=" + acp.template_editor.currentSetData['set_id'] + '&css_id=' + acp.template_editor.checkMap( fileid, 'css' ) + '&secure_key=' + ipb.vars['md5_hash']; var currentContent = acp.template_editor.currentlyOpen.get('css_' + fileid)['css_content']; var currentSet = acp.template_editor.currentSetData['set_id']; var cssPosition = $F('cssposition_' + fileid); var cssAttributes = $F('cssattributes_' + fileid); var cssApp = $F('cssapp_' + fileid); var cssModules = $F('cssmodules_' + fileid); var cssHideApp = $F('cssapphide_' + fileid); var cssName = acp.template_editor.currentlyOpen.get('css_' + fileid)['css_group']; /* Set up params */ var params = { 'css_content' : acp.tabbedEditor.getContent().encodeParam(), 'css_set_id' : acp.template_editor.currentSetData['set_id'], '_css_group' : cssName.encodeParam(), 'type' : 'edit', 'css_app' : cssApp, 'css_app_hide' : cssHideApp, 'css_attributes' : cssAttributes, 'css_modules' : cssModules, 'css_position' : cssPosition }; acp.template_editor.setLoadingMsg( ipb.lang['tpl_savingproperties'] ); new Ajax.Request( url.replace( /&/g, '&' ), { method: 'POST', parameters: params, evalJSON: 'force', onSuccess: function (t) { if( Object.isUndefined( t.responseJSON ) ) { alert( ipb.lang['templates_servererror'] + t.responseText ); return; } else if( t.responseJSON['errors'] ) { acp.template_editor.displayError( t.responseJSON['errors'] ); return; } //----------------------------------- Debug.write("Current file ID: " + fileid); Debug.write("File ID returned: " + t.responseJSON['cssData']['css_id']); if( acp.template_editor.checkMap( fileid, 'css' ) != t.responseJSON['cssData']['css_id'] ) { acp.template_editor.modifyMap['css'][ t.responseJSON['cssData']['css_id'] ] = t.responseJSON['cssData']['css_id']; // Remove old map acp.template_editor.modifyMap['css'][ fileid ] = t.responseJSON['cssData']['css_id']; Debug.write("Updated modify map!"); } //----------------------------------- // Update array acp.template_editor.currentlyOpen.set( 'css_' + fileid, t.responseJSON['cssData'] ); acp.template_editor.popups.get('properties_' + fileid).hide(); acp.template_editor._buildCSS( true ); }, onException: function( f,e ){ alert( "Exception: " + e ); }, onFailure: function( t ){ alert( "Failure: " + t.responseText ); }, onComplete: function(t){ acp.template_editor.setLoadingMsg(''); } }); }, /* ------------------------------ */ /** * Shows the panel for variable editing * * @param {event} e The event */ showVariables: function(e) { Event.stop(e); // Get current file info var current = acp.tabbedEditor.getCurrentFile(); if( Object.isUndefined( current ) || Object.isUndefined( current['id'] ) ) { return false; } if( !current['id'].startsWith('template_') ) { Debug.error( "This isn't a template" ); return; } var _id = current['id'].replace('template_', ''); var fileid = ( Object.isUndefined( acp.template_editor.currentlyOpen.get( 'template_' + _id ) ) ) ? acp.template_editor.checkMap( _id, 'template' ) : _id; var _data = acp.template_editor.currentlyOpen.get( 'template_' + fileid )['template_data'].replace( /"/g, "'" ).replace( /'/g, "'" ); var content = ipb.templates['edit_variables'].evaluate( { id: fileid, value: _data } ); // Is there already a popup for this? if( acp.template_editor.popups.get('variables_' + fileid) ) { $('variables_' + fileid).value = _data; acp.template_editor.popups.get('variables_' + fileid).show(); } else { var popup = new ipb.Popup( 'variables', { type: 'pane', modal: false, w: '800px', initial: content, hideAtStart: false, close: 'a[rel="close"]' } ); acp.template_editor.popups.set('variables_' + fileid, popup); } // Add event handler for saving $('edit_variables_' + fileid).observe('click', acp.template_editor.saveVariables.bindAsEventListener( this, fileid ) ); }, /* ------------------------------ */ /** * Saves changes to the template variables * * @param {event} e The event * @param {string} fileid The id of the file being edited */ saveVariables: function(e, fileid) { if( !$('variables_' + fileid) ){ Debug.error("No variable box found"); return; } var url = ipb.vars['base_url'] + "app=core&module=ajax&section=templates&do=saveTemplateBit&setID=" + acp.template_editor.currentSetData['set_id'] + '&template_id=' + acp.template_editor.checkMap( fileid, 'template' ) + '&secure_key=' + ipb.vars['md5_hash']; var currentGroup = acp.template_editor.currentlyOpen.get('template_' + fileid)['template_group']; var currentContent = acp.template_editor.currentlyOpen.get('template_' + fileid)['template_content']; var currentSet = acp.template_editor.currentSetData['set_id']; var variableData = $F('variables_' + fileid); var params = { 'template_content' : currentContent.encodeParam(), 'template_set' : currentSet, 'template_group' : currentGroup.encodeParam(), 'template_data' : variableData }; acp.template_editor.setLoadingMsg( ipb.lang['tpl_savingvars'] ); new Ajax.Request( url.replace( /&/g, '&' ), { method: 'POST', parameters: params, evalJSON: 'force', onSuccess: function (t) { if( Object.isUndefined( t.responseJSON ) ) { alert( ipb.lang['templates_servererror'] + t.responseText ); return; } else if( t.responseJSON['errors'] ) { acp.template_editor.displayError( t.responseJSON['errors'] ); return; } //--------------------------------- Debug.write("Current file ID: " + fileid); Debug.write("File ID returned: " + t.responseJSON['templateData']['template_id']); if( acp.template_editor.checkMap( fileid, 'template' ) != t.responseJSON['templateData']['template_id'] ) { acp.template_editor.modifyMap['template'][ t.responseJSON['templateData']['template_id'] ] = undefined; // Remove old map acp.template_editor.modifyMap['template'][ fileid ] = t.responseJSON['templateData']['template_id']; Debug.write("Updated modify map!"); } //--------------------------------- // Update array acp.template_editor.currentlyOpen.set( 'template_' + fileid, t.responseJSON['templateData'] ); // Reflect edited status acp.tabbedEditor.setFileEditedMode( 'template_' + fileid, false ); acp.template_editor.loadGroupBits(e, t.responseJSON['templateData']['template_group'], true); acp.template_editor.popups.get('variables_' + fileid).hide(); }, onException: function( f,e ){ alert( "Exception: " + e ); }, onFailure: function( t ){ alert( "Failure: " + t.responseText ); }, onComplete: function(t){ acp.template_editor.setLoadingMsg(''); } }); }, /* ------------------------------ */ /* ! saveCurrentFile */ /** * Saves the currently open file * * @param {event} e The event */ saveCurrentFile: function(e) { var current = acp.tabbedEditor.getCurrentFile(); if( Object.isUndefined( current ) || Object.isUndefined( current['id'] ) ) { return false; } // So are we dealing with CSS or template? if( current['id'].startsWith('template_') ) { var type = 'template_'; var fileid = current['id'].replace('template_', ''); var url = ipb.vars['base_url'] + "app=core&module=ajax&section=templates&do=saveTemplateBit&setID=" + acp.template_editor.currentSetData['set_id'] + '&template_id=' + acp.template_editor.checkMap( fileid, 'template' ) + '&secure_key=' + ipb.vars['md5_hash']; var currentGroup = acp.template_editor.currentlyOpen.get( 'template_' + fileid )['template_group']; var params = { 'template_content' : acp.tabbedEditor.getContent().encodeParam(), 'template_set' : acp.template_editor.currentSetData['set_id'], 'template_group' : currentGroup, 'template_data' : acp.template_editor.currentlyOpen.get( 'template_' + fileid )['template_data'] }; } else { var type = 'css_'; var fileid = current['id'].replace('css_file_', ''); var _fileid = acp.template_editor.checkMap( fileid, 'css' ); var url = ipb.vars['base_url'] + "app=core&module=ajax&section=css&do=saveCSS&setID=" + acp.template_editor.currentSetData['set_id'] + '&css_id=' + acp.template_editor.checkMap( fileid, 'css' ) + '&secure_key=' + ipb.vars['md5_hash']; /* Set up params */ var params = { 'css_content' : acp.tabbedEditor.getContent().encodeParam(), 'css_set_id' : acp.template_editor.currentSetData['set_id'], '_css_group' : current['title'].replace( '.css', '' ).encodeParam(), 'type' : ( fileid == 0 ) ? 'add' : 'edit' }; /* add on other params if we're editing */ if ( params['type'] == 'edit' ) { params['css_app'] = acp.template_editor.currentlyOpen.get('css_' + fileid)['css_app']; params['css_app_hide'] = acp.template_editor.currentlyOpen.get('css_' + fileid)['css_app_hide']; params['css_attributes'] = acp.template_editor.currentlyOpen.get('css_' + fileid)['css_attributes']; params['css_modules'] = acp.template_editor.currentlyOpen.get('css_' + fileid)['css_modules']; params['css_position'] = acp.template_editor.currentlyOpen.get('css_' + fileid)['css_position']; } } // Set status acp.template_editor.setLoadingMsg( ipb.lang['tpl_savegeneric'] ); new Ajax.Request( url.replace( /&/g, '&' ), { method: 'POST', parameters: params, evalJSON: 'force', onSuccess: function (t, e) { if( Object.isUndefined( t.responseJSON ) ) { alert( ipb.lang['templates_servererror'] + t.responseText ); return; } else if( t.responseJSON['error'] ) { acp.template_editor.displayError( t.responseJSON['error'] ); return; } // Update array if( type == 'template_' ){ Debug.write("Current file ID: " + fileid); Debug.write("File ID returned: " + t.responseJSON['templateData']['template_id']); if( acp.template_editor.checkMap( fileid, 'template' ) != t.responseJSON['templateData']['template_id'] ) { acp.template_editor.modifyMap['template'][ t.responseJSON['templateData']['template_id'] ] = undefined; // Remove old map acp.template_editor.modifyMap['template'][ fileid ] = t.responseJSON['templateData']['template_id']; Debug.write("Updated modify map!"); } acp.template_editor.currentlyOpen.set( 'template_' + fileid, t.responseJSON['templateData'] ); acp.tabbedEditor.setFileEditedMode( 'template_' + fileid, false ); /* Rebuild Template groups */ acp.template_editor.loadGroupBits(e, currentGroup, true); } else { Debug.write("Current css ID: " + fileid); Debug.write("Css ID returned: " + t.responseJSON['cssData']['css_id']); if( acp.template_editor.checkMap( fileid, 'css' )!= t.responseJSON['cssData']['css_id'] ) { acp.template_editor.modifyMap['css'][ t.responseJSON['cssData']['css_id'] ] = undefined; // Remove old map acp.template_editor.modifyMap['css'][ fileid ] = t.responseJSON['cssData']['css_id']; Debug.write("Updated modify map!"); } acp.template_editor.currentlyOpen.set( 'css_' + fileid, t.responseJSON['cssData'] ); acp.tabbedEditor.setFileEditedMode( 'css_file_' + fileid, false ); /* Rebuild CSS groups */ acp.template_editor._buildCSS( true ); } }, onException: function( f,e ){ alert( "Exception: " + e ); }, onFailure: function( t ){ alert( "Failure: " + t.responseText ); }, onComplete: function(t){ acp.template_editor.setLoadingMsg(''); } }); }, /* ------------------------------ */ /** * Shows an error alert * * @param {string} err The message * @SKINNOTE Make this a nicer popup */ displayError: function(err) { alert( err ); return false; }, /* ------------------------------ */ /** * Callback: when a file is closed * * @param {object} file File object retuend from editarea */ CALLBACK_template_closed: function( file ) { if( file['id'].startsWith('template_') ) { var type = 'template_'; var fileid = file['id'].replace('template_', ''); } else { var type = 'css_'; var fileid = file['id'].replace('css_file_', ''); } // Check if this is unsaved if( file['edited'] ) { if( type == 'template_' ){ var close_anyway = confirm( ipb.lang['unsaved_template_war']); } else { var close_anyway = confirm( ipb.lang['unsaved_css_warn'] ); } if( !close_anyway ) { return false; } } try{ acp.template_editor.currentlyOpen.unset( type + fileid ); } catch( err ){ Debug.write("Unsetting " + fileid + " failed!"); } if( acp.template_editor.currentlyOpen.size() == 0 ) { acp.template_editor.disableToolbar( ); } Debug.write("Unset " + fileid + " left open=" + acp.template_editor.currentlyOpen.size() ); return true; }, /* ------------------------------ */ /** * Compares a template and shows results in a popup * * @param {event} e The event */ compareTemplate: function(e) { var current = acp.tabbedEditor.getCurrentFile(); if( Object.isUndefined( current ) || Object.isUndefined( current['id'] ) ) { return false; } /* Template bit */ if( current['id'].startsWith('template_') ) { var templateid = acp.template_editor.checkMap( current['id'].replace('template_', ''), 'template' ); var url = ipb.vars['base_url'] + "&app=core&module=ajax§ion=compare&secure_key=" + ipb.vars['md5_hash'] + '&setId=' + acp.template_editor.currentSetData['set_id'] + '&template_id=' + templateid; var _callback = function( popup, ajax ){ if( ajax == 'nopermission' ) { alert( ipb.lang['cannot_compare_templates'] ); popup.ready = false; $( popup.getObj() ).remove(); } }; } /* CSS file */ else { var fileid = acp.template_editor.checkMap( current['id'].replace('css_file_', ''), 'css' ); var url = ipb.vars['base_url'] + "&app=core&module=ajax§ion=compare&do=css&secure_key=" + ipb.vars['md5_hash'] + '&setId=' + acp.template_editor.currentSetData['set_id'] + '&file_id=' + fileid; var _callback = function( popup, ajax ){ if( ajax == 'nopermission' ) { alert( ipb.lang['cannot_compare_css'] ); popup.ready = false; $( popup.getObj() ).remove(); } }; } var _dims = document.viewport.getDimensions(); popup = new ipb.Popup( 'comparison', { type: 'pane', modal: true, w: ( _dims.width - 50 ) + 'px', h: ( _dims.height - 150 ), ajaxURL: url, hideAtStart: false, close: 'a[rel="close"]' }, { 'afterAjax': _callback } ); return false; }, /* ------------------------------ */ /** * Sets the loading message in the toolbar * * @param {string} msg The message to show */ setLoadingMsg: function(msg) { if( msg == undefined || msg.blank() ) { $('t_status').removeClassName('loading').update(); return; } $('t_status').addClassName('loading').update(msg); }, checkMap: function( id, type ) { if( type == 'template' && !Object.isUndefined( acp.template_editor.modifyMap['template'][ id ] ) ){ return acp.template_editor.modifyMap['template'][ id ]; } else if ( type == 'css' && !Object.isUndefined( acp.template_editor.modifyMap['css'][ id ] ) ){ return acp.template_editor.modifyMap['css'][ id ]; } else { return id; } }, removeFromMap: function( id, type ) { if( type == 'template' && !Object.isUndefined( acp.template_editor.modifyMap['template'][ id ] ) ){ delete( acp.template_editor.modifyMap['template'][ id ] ); } else if ( type == 'css' && !Object.isUndefined( acp.template_editor.modifyMap['css'][ id ] ) ){ delete( acp.template_editor.modifyMap['css'][ id ] ); } else { return id; } }, /** * Pass a 'new' value and return the old value * */ reverseCheckMap: function( id, type ) { if( type == 'template' && !Object.isUndefined( acp.template_editor.modifyMap['template'] ) ) { for( var i in acp.template_editor.modifyMap['template'] ) { if ( acp.template_editor.modifyMap['template'][ i ] == id ) { Debug.write( "Found reverse map for " + id + " - " + i ); return i; } } } else if ( type == 'css' && !Object.isUndefined( acp.template_editor.modifyMap['css'] ) ) { for( var i in acp.template_editor.modifyMap['css'] ) { if ( acp.template_editor.modifyMap['css'][ i ] == id ) { Debug.write( "Found reverse map for " + id + " - " + i ); return i; } } } return id; }, /** * Hide editor $('editor') */ _hideEditor: function() { }, /** * Unhide editor */ _unhideEditor: function() { } };