$url .= '/' . implode('/', $args);
      }
      return $url;
  }
  /**
 * AJAX comman to present a dialog with our crazy shtuff
 */
  function ajax_select_cns_content($region = NULL, $category = NULL)
  {
      if (!array_key_exists($region, $this->plugins['layout']['regions'])) {
  /**
   * AJAX entry point for to configure vsibility rule.
   */
  function ajax_access_configure_test($pid = NULL, $id = NULL) {
    if (empty($this->display->content[$pid])) {
      ctools_modal_render(t('Error'), t('Invalid pane id.'));
    }

    $pane = &$this->display->content[$pid];
    $subtype = ctools_content_get_subtype($pane->type, $pane->subtype);

    // Set this up here because $id gets changed later.
    $url = $this->get_url('access-configure-test', $pid, $id);

    // If we're adding a new one, get the stored data from cache and
    // add it. It's stored as a cache so that if this is closed
    // we don't accidentally add an unconfigured plugin.
    if ($id == 'add') {
      $pane->access['plugins'][] = $this->cache->new_plugin;
      $id = max(array_keys($pane->access['plugins']));
    }
    else if (empty($pane->access['plugins'][$id])) {
      ctools_modal_render(t('Error'), t('Invalid test id.'));
    }

    $form_state = array(
      'display' => &$this->display,
      'pane' => &$pane,
      'ajax' => TRUE,
      'title' => t('Configure visibility rule for !subtype_title', array('!subtype_title' => $subtype['title'])),
      'test' => &$pane->access['plugins'][$id],
      'plugin' => ctools_get_access_plugin($pane->access['plugins'][$id]['name']),
      'url' => url($url, array('absolute' => TRUE)),
    );

    $output = ctools_modal_form_wrapper('panels_edit_configure_access_test_form', $form_state);
    if (empty($form_state['executed'])) {
      $this->commands = $output;
      return;
    }

    // Unset the new plugin
    if (isset($this->cache->new_plugin)) {
      unset($this->cache->new_plugin);
    }

    if (!empty($form_state['remove'])) {
      unset($pane->access['plugins'][$id]);
    }

    panels_edit_cache_set($this->cache);
    $this->command_update_pane($pid);
    $this->commands[] = ctools_modal_command_dismiss();
  }
 /**
  * AJAX entry point to edit a pane.
  */
 function ajax_edit_pane($pid = NULL, $step = NULL)
 {
     if (empty($this->cache->display->content[$pid])) {
         ctools_modal_render(t('Error'), t('Invalid pane id.'));
     }
     $pane =& $this->cache->display->content[$pid];
     // Check if we should skip pane translation.
     if (_mlpanels_pane_skip($pane->type, $pane->subtype)) {
         // Pass to default renderer.
         return parent::ajax_edit_pane($pid, $step);
     }
     $content_type = ctools_get_content_type($pane->type);
     $subtype = ctools_content_get_subtype($content_type, $pane->subtype);
     $settings = _mlpanels_settings();
     if (empty($step)) {
         $messages[] = t('You can translate settings for different languages,
   but you must set %renderer as display renderer in order to see result.', array('%renderer' => t('Multilingual Standard')));
     }
     if ($settings['show_types']) {
         $messages[] = t('Pane type to disable %type', array('%type' => $pane->type . '::' . $pane->subtype));
     }
     // Get language.
     $path = explode('/', $_GET['q']);
     $tmp = explode('_', end($path));
     if ($tmp[0] == 'mlpanels') {
         $conf_lng = $tmp[1];
     }
     if (empty($conf_lng)) {
         $conf_lng = LANGUAGE_NONE;
     }
     // Prepare language dependent config.
     if (!empty($pane->configuration['mlpanels'])) {
         $ml_config = $pane->configuration['mlpanels'];
         $ml_config[LANGUAGE_NONE] = $pane->configuration;
         unset($ml_config[LANGUAGE_NONE]['mlpanels']);
     } else {
         $ml_config[LANGUAGE_NONE] = $pane->configuration;
     }
     if (!empty($ml_config[$conf_lng])) {
         $configuration = $ml_config[$conf_lng];
     } else {
         $messages[] = t('No configuration exists for this language yet, using default.');
         $configuration = $ml_config[LANGUAGE_NONE];
     }
     // Safety check.
     if (isset($configuration['mlpanels'])) {
         unset($configuration['mlpanels']);
     }
     // Change finish button text.
     $finish_text = t('Finish');
     if ($conf_lng != LANGUAGE_NONE) {
         if (_mlpanels_settings('keep_window')) {
             $finish_text = t('Save Translation and Continue');
         } else {
             $finish_text = t('Save Translation and Finish');
         }
     }
     $form_state = array('display' => &$this->cache->display, 'contexts' => $this->cache->display->context, 'pane' => &$pane, 'display cache' => &$this->cache, 'ajax' => TRUE, 'modal' => TRUE, 'modal return' => TRUE, 'commands' => array());
     $form_info = array('path' => $this->get_url('edit-pane', $pid, '%step', 'mlpanels_' . $conf_lng), 'show cancel' => TRUE, 'finish text' => $finish_text, 'next callback' => 'panels_ajax_edit_pane_next', 'finish callback' => 'panels_ajax_edit_pane_finish', 'cancel callback' => 'panels_ajax_edit_pane_cancel');
     // This is used to get our form in form alter.
     if ($conf_lng != LANGUAGE_NONE) {
         $form_info['untranslate text'] = t('Remove Translation');
         $form_info['untranslate hidden'] = empty($ml_config[$conf_lng]);
     }
     // Building form.
     $output = ctools_content_form('edit', $form_info, $form_state, $content_type, $pane->subtype, $subtype, $configuration, $step);
     // Add language links to the form.
     $languages = array(LANGUAGE_NONE => (object) array('name' => t('Default'), 'language' => LANGUAGE_NONE)) + language_list();
     foreach ($languages as $lng) {
         $class = array('ctools-use-modal');
         $class[] = $lng->language;
         if (empty($ml_config[$lng->language])) {
             $class[] = 'empty';
         }
         if ($conf_lng == $lng->language) {
             $class[] = 'current';
         }
         $links[] = l($lng->name, $this->get_url('edit-pane', $pid, $form_state['step'], 'mlpanels_' . $lng->language), array('attributes' => array('class' => $class), 'html' => TRUE));
     }
     $output['mlpanels'] = array('#markup' => theme('item_list', array('items' => $links, 'attributes' => array('class' => array('mlpanels_lnd_list')))));
     $output['mlpanels_messages'] = array('#markup' => '<div class="message-target"></div>');
     // If $rc is FALSE, there was no actual form.
     if ($output === FALSE || !empty($form_state['cancel'])) {
         // Dismiss the modal.
         $this->commands[] = ctools_modal_command_dismiss();
     } elseif (!empty($form_state['clicked_button']) && $form_state['clicked_button']['#wizard type'] == 'untranslate') {
         // Unset surrent translation.
         unset($ml_config[$conf_lng]);
         // Update pane configuration.
         $form_state['pane']->configuration = array('mlpanels' => $ml_config) + $ml_config[LANGUAGE_NONE];
         // References get blown away with AJAX caching. This will fix that.
         $this->cache->display->content[$pid] = $form_state['pane'];
         panels_edit_cache_set($this->cache);
         $this->command_update_pane($pid);
         if (_mlpanels_settings('keep_window') && $conf_lng != LANGUAGE_NONE) {
             drupal_set_message(t('Translation removed.'));
             $this->commands[] = ajax_command_remove('#modal-content .messages');
             $this->commands[] = ajax_command_html('#modal-content .message-target', theme('status_messages'));
             $this->commands[] = ajax_command_invoke('#modal-content input.pane-untranslate', 'hide');
             $this->commands[] = ajax_command_invoke('.mlpanels_lnd_list a.' . $conf_lng, 'addClass', array('empty'));
         } else {
             $this->commands[] = ctools_modal_command_dismiss();
         }
     } elseif (!empty($form_state['complete'])) {
         // Save our settings for selected language.
         $ml_config[$conf_lng] = $configuration;
         // Update pane configuration.
         $form_state['pane']->configuration = array('mlpanels' => $ml_config) + $ml_config[LANGUAGE_NONE];
         // References get blown away with AJAX caching. This will fix that.
         $this->cache->display->content[$pid] = $form_state['pane'];
         panels_edit_cache_set($this->cache);
         $this->command_update_pane($pid);
         if (_mlpanels_settings('keep_window') && $conf_lng != LANGUAGE_NONE) {
             drupal_set_message(t('Translation updated.'));
             $this->commands[] = ajax_command_remove('#modal-content .messages');
             $this->commands[] = ajax_command_html('#modal-content .message-target', theme('status_messages'));
             $this->commands[] = ajax_command_invoke('#modal-content input.pane-untranslate', 'show');
             $this->commands[] = ajax_command_invoke('.mlpanels_lnd_list a.' . $conf_lng, 'removeClass', array('empty'));
         } else {
             $this->commands[] = ctools_modal_command_dismiss();
         }
     } else {
         // Show messages.
         if ($settings['show_messages']) {
             if (isset($messages)) {
                 foreach ($messages as $msg) {
                     drupal_set_message($msg);
                 }
             }
         }
         // This overwrites any previous commands.
         $this->commands = ctools_modal_form_render($form_state, $output);
         array_unshift($this->commands, array('command' => 'mlpanels_ckefix'));
     }
 }