/**
 * Returns <script> tags for all javascripts configured in view.yml or added to the response object.
 *
 * You can use this helper to decide the location of javascripts in pages.
 * By default, if you don't call this helper, symfony will automatically include javascripts before </head>.
 * Calling this helper disables this behavior.
 *
 * @return string <script> tags
 */
function get_combined_javascripts()
{
    if (!sfConfig::get('app_sfCombinePlugin_enabled', false)) {
        return get_javascripts();
    }
    sfConfig::set('symfony.asset.javascripts_included', true);
    $html = '';
    $jsFiles = array();
    $regularJsFiles = array();
    $response = sfContext::getInstance()->getResponse();
    $config = sfConfig::get('app_sfCombinePlugin_js', array());
    $doNotCombine = isset($config['combine_skip']) ? $config['combine_skip'] : array();
    foreach ($response->getJavascripts() as $files => $options) {
        if (!is_array($files)) {
            $files = array($files);
        }
        // check for js files that should not be combined
        foreach ($files as $key => $value) {
            if (skip_asset($value, $doNotCombine)) {
                array_push($regularJsFiles, $value);
                unset($files[$key]);
            }
        }
        $jsFiles = array_merge($jsFiles, $files);
    }
    if (!empty($jsFiles)) {
        $html .= str_replace(array('.js', '.pjs'), '', javascript_include_tag(url_for('sfCombine/js?key=' . _get_key($jsFiles))));
    }
    foreach ($regularJsFiles as $file) {
        $file = javascript_path($file);
        $html .= javascript_include_tag($file);
    }
    return $html;
}
 /**
  * Processes the assets corresponding to a hash
  * 
  * @param string $key Key to a list of asset files in the `sf_combine` table
  *
  * @return string Processed Javascript code
  */
 public function process($key)
 {
     $files = $this->getContents($key);
     $config = sfConfig::get('app_sfCombinePlugin_js', array());
     if (isset($config['minify']) && $config['minify']) {
         // minification
         $skipMinify = isset($config['minify_skip']) ? $config['minify_skip'] : array();
         foreach ($files as $filePath => $content) {
             if (!skip_asset($filePath, $skipMinify)) {
                 $files[$filePath] = $this->minify($content);
             }
         }
     }
     // packing
     if (isset($config['pack']) && $config['pack']) {
         $skipPack = isset($config['pack_skip']) ? $config['pack_skip'] : array();
         if (!$skipPack) {
             // simple: pack everything together
             $finalContent = $this->pack($this->merge($files));
         } else {
             // less simple: pack groups of files, avoiding the ones that should not be packed
             $finalContent = '';
             $toProcess = '';
             foreach ($files as $filePath => $content) {
                 if (skip_asset($filePath, $skipPack)) {
                     $finalContent .= $this->pack($toProcess);
                     $finalContent .= $content;
                     $toProcess = '';
                 } else {
                     $toProcess .= $content;
                 }
             }
             if ($toProcess) {
                 $packer = new JavaScriptPacker($toProcess, 'Normal', true, false);
                 $finalContent .= $packer->pack();
             }
         }
     } else {
         // no packing at all, simply merge
         $includeComment = isset($config['minify']) ? !$config['minify'] : true;
         $finalContent = $this->merge($files, $includeComment);
     }
     return $finalContent;
 }