(function($) { Drupal.behaviors.adminToolbar = {}; Drupal.behaviors.adminToolbar.attach = function(context) { $('#admin-toolbar:not(.processed)').each(function() { var toolbar = $(this); toolbar.addClass('processed'); // Set initial toolbar state. Drupal.adminToolbar.init(toolbar); // Admin toggle. $('.admin-toggle', this).click(function() { Drupal.adminToolbar.toggle(toolbar); }); // Admin tabs. $('div.admin-tab', this).click(function() { Drupal.adminToolbar.tab(toolbar, $(this), true); }); $(document).bind('drupalOverlayLoad', {adminToolbar: Drupal.adminToolbar, toolbar: toolbar}, function(event) { var body = $(document.body); var adminToolbar = event.data.adminToolbar; var expand = parseInt(adminToolbar.getState('expanded')); if (!expand) { return; } var toolbar = event.data.toolbar; var size = adminToolbar.SIZE + 'px'; adminToolbar.setOverlayState(toolbar, toolbar.is('.vertical'), expand); }); }); $('div.admin-panes:not(.processed)').each(function() { var panes = $(this); panes.addClass('processed'); $('h2.admin-pane-title a').click(function() { var target = $(this).attr('href').split('#')[1]; var panes = $(this).parents('div.admin-panes')[0]; $('.admin-pane-active', panes).removeClass('admin-pane-active'); $('div.admin-pane.' + target, panes).addClass('admin-pane-active'); $(this).addClass('admin-pane-active'); return false; }); }); }; /** * Admin toolbar methods. */ Drupal.adminToolbar = {}; /** * The width or height of the toolbar, depending on orientation. */ Drupal.adminToolbar.SIZE = 260; /** * Set the initial state of the toolbar. */ Drupal.adminToolbar.init = function (toolbar) { // Set expanded state. var expanded = this.getState('expanded'); if (!$(document.body).hasClass('admin-ah')) { if (expanded == 1) { $(document.body).addClass('admin-expanded'); } } // Set default tab state. var target = this.getState('activeTab'); if (target) { if ($('div.admin-tab.'+target).size() > 0) { var tab = $('div.admin-tab.'+target); this.tab(toolbar, tab, false); } } // Add layout class to body. var classes = toolbar.attr('class').split(' '); if (classes[0] === 'nw' || classes[0] === 'ne' || classes[0] === 'se' || classes[0] === 'sw' ) { $(document.body).addClass('admin-'+classes[0]); } if (classes[1] === 'horizontal' || classes[1] === 'vertical') { $(document.body).addClass('admin-'+classes[1]); } if (classes[2] === 'df' || classes[2] === 'ah') { $(document.body).addClass('admin-'+classes[2]); } var vertical = true; if(classes[1] === 'horizontal') { vertical = false; } }; /** * Set the active tab. */ Drupal.adminToolbar.tab = function(toolbar, tab, animate) { if (!tab.is('.admin-tab-active')) { var target = $('span', tab).attr('id').split('admin-tab-')[1]; // Vertical // Use animations to make the vertical tab transition a bit smoother. if (toolbar.is('.vertical') && animate) { $('.admin-tab-active', toolbar).fadeOut('fast'); $(tab).fadeOut('fast', function() { $('.admin-tab-active', toolbar).fadeIn('fast').removeClass('admin-tab-active'); $(tab).slideDown('fast').addClass('admin-tab-active'); Drupal.adminToolbar.setState('activeTab', target); }); } // Horizontal // Tabs don't need animation assistance. else { $('div.admin-tab', toolbar).removeClass('admin-tab-active'); $(tab, toolbar).addClass('admin-tab-active'); Drupal.adminToolbar.setState('activeTab', target); } // Blocks $('div.admin-block.admin-active', toolbar).removeClass('admin-active'); $('#block-'+target, toolbar).addClass('admin-active'); } return false; }; /** * Set the width/height of the of the overlay body based on the state admin toolbar. * * @param vertical * A boolean indicating if the toolbar is vertical. * @param expanded * A boolean indicating if the toolbar is expanded. */ Drupal.adminToolbar.setOverlayState = function(toolbar, vertical, expanded) { var margin, size = this.SIZE + 65; if (!expanded) { size = 0; } margin = {marginLeft: size+'px'}; if (vertical) { if (toolbar.is('.ne') || toolbar.is('.se')) { margin = {marginRight: size+'px'} } } else { if (toolbar.is('.ne') || toolbar.is('.nw')) { margin = {marginTop: size+'px'}; } else { margin = {marginBottom: size+'px'}; } } $('iframe.overlay-element').contents().find('body').animate(margin, 'fast'); }; /** * Toggle the toolbar open or closed. */ Drupal.adminToolbar.toggle = function (toolbar) { var size = '0px'; if ($(document.body).is('.admin-expanded')) { if ($(toolbar).is('.vertical')) { $('div.admin-blocks', toolbar).animate({width:size}, 'fast'); if ($(toolbar).is('.nw') || $(toolbar).is('.sw')) { $(document.body).animate({marginLeft:size}, 'fast', function() { $(this).toggleClass('admin-expanded'); }); } else { $(document.body).animate({marginRight:size}, 'fast', function() { $(this).toggleClass('admin-expanded'); }); } this.setOverlayState(toolbar, true, false); } else { $('div.admin-blocks', toolbar).animate({height:size}, 'fast'); if ($(toolbar).is('.nw') || $(toolbar).is('.ne')) { $(document.body).animate({marginTop:size}, 'fast', function() { $(this).toggleClass('admin-expanded'); }); } else { $(document.body).animate({marginBottom:size}, 'fast', function() { $(this).toggleClass('admin-expanded'); }); } this.setOverlayState(toolbar, false, false); } this.setState('expanded', 0); } else { size = this.SIZE + 'px'; if ($(toolbar).is('.vertical')) { $('div.admin-blocks', toolbar).animate({width:size}, 'fast'); if ($(toolbar).is('.nw') || $(toolbar).is('.sw')) { $(document.body).animate({marginLeft:size}, 'fast', function() { $(this).toggleClass('admin-expanded'); }); } else { $(document.body).animate({marginRight:size}, 'fast', function() { $(this).toggleClass('admin-expanded'); }); } this.setOverlayState(toolbar, true, true); } else { $('div.admin-blocks', toolbar).animate({height:size}, 'fast'); if ($(toolbar).is('.nw') || $(toolbar).is('.ne')) { $(document.body).animate({marginTop:size}, 'fast', function() { $(this).toggleClass('admin-expanded'); }); } else { $(document.body).animate({marginBottom:size}, 'fast', function() { $(this).toggleClass('admin-expanded'); }); } this.setOverlayState(toolbar, false, true); } if ($(document.body).hasClass('admin-ah')) { this.setState('expanded', 0); } else { this.setState('expanded', 1); } } }; /** * Get the value of a cookie variable. */ Drupal.adminToolbar.getState = function(key) { if (!Drupal.adminToolbar.state) { Drupal.adminToolbar.state = {}; var cookie = $.cookie('DrupalAdminToolbar'); var query = cookie ? cookie.split('&') : []; if (query) { for (var i in query) { // Extra check to avoid js errors in Chrome, IE and Safari when // combined with JS like twitter's widget.js. // See http://drupal.org/node/798764. if (typeof(query[i]) == 'string' && query[i].indexOf('=') != -1) { var values = query[i].split('='); if (values.length === 2) { Drupal.adminToolbar.state[values[0]] = values[1]; } } } } } return Drupal.adminToolbar.state[key] ? Drupal.adminToolbar.state[key] : false; }; /** * Set the value of a cookie variable. */ Drupal.adminToolbar.setState = function(key, value) { var existing = Drupal.adminToolbar.getState(key); if (existing != value) { Drupal.adminToolbar.state[key] = value; var query = []; for (var i in Drupal.adminToolbar.state) { query.push(i + '=' + Drupal.adminToolbar.state[i]); } $.cookie('DrupalAdminToolbar', query.join('&'), {expires: 7, path: '/'}); } }; })(jQuery);