section of the page */ static function insertHeadTags($tags) { Requirements::$customHeadTags .= $tags . "\n"; } /** * Load the given javascript template with the page. * @param file The template file to load. * @param vars The array of variables to load. These variables are loaded via string search & replace. */ static function javascriptTemplate($file, $vars, $uniquenessID = null) { $script = file_get_contents(Director::getAbsFile($file)); foreach($vars as $k => $v) { $search[] = '$' . $k; $replace[] = str_replace("\\'","'", Convert::raw2js($v)); } $script = str_replace($search, $replace, $script); Requirements::customScript($script, $uniquenessID); } /** * Register the given stylesheet file as required. * * @param $file String Filenames should be relative to the base, eg, 'jsparty/tree/tree.css' * @param $media String Comma-separated list of media-types (e.g. "screen,projector") * @see http://www.w3.org/TR/REC-CSS2/media.html */ static function css($file, $media = null) { Requirements::$css[$file] = array( "media" => $media ); } /** * Register the given "themeable stylesheet" as required. * Themeable stylesheets have globally unique names, just like templates and PHP files. * Because of this, they can be replaced by similarly named CSS files in the theme directory. * * @param $name String The identifier of the file. For example, css/MyFile.css would have the identifier "MyFile" * @param $media String Comma-separated list of media-types (e.g. "screen,projector") */ static function themedCSS($name, $media = null) { global $_CSS_MANIFEST; $theme = SSViewer::current_theme(); if($theme && isset($_CSS_MANIFEST[$name]) && isset($_CSS_MANIFEST[$name]['themes']) && isset($_CSS_MANIFEST[$name]['themes'][$theme])) Requirements::css($_CSS_MANIFEST[$name]['themes'][$theme], $media); else if(isset($_CSS_MANIFEST[$name]) && isset($_CSS_MANIFEST[$name]['unthemed'])) Requirements::css($_CSS_MANIFEST[$name]['unthemed'], $media); // Normal requirements fails quietly when there is no css - we should do the same // else user_error("themedCSS - No CSS file '$name.css' found.", E_USER_WARNING); } /** * Clear either a single or all requirements. * Caution: Clearing single rules works only with customCSS and customScript if you specified a {@uniquenessID}. * * @param $file String */ static function clear($fileOrID = null) { if($fileOrID) { foreach(array('javascript','css', 'customScript', 'customCSS') as $type) { if(isset(Requirements::${$type}[$fileOrID])) { Requirements::$disabled[$type][$fileOrID] = Requirements::${$type}[$fileOrID]; unset(Requirements::${$type}[$fileOrID]); } } } else { Requirements::$disabled['javascript'] = Requirements::$javascript; Requirements::$disabled['css'] = Requirements::$css; Requirements::$disabled['customScript'] = Requirements::$customScript; Requirements::$disabled['customCSS'] = Requirements::$customCSS; Requirements::$javascript = array(); Requirements::$css = array(); Requirements::$customScript = array(); Requirements::$customCSS = array(); } } /** * Needed to actively prevent the inclusion of a file, * e.g. when using your own prototype.js. * Blocking should only be used as an exception, because * it is hard to trace back. You can just block items with an * ID, so make sure you add an unique identifier to customCSS() and customScript(). * * @param string $fileOrID */ static function block($fileOrID) { self::$blocked[$fileOrID] = $fileOrID; } /** * Removes an item from the blocking-list. * CAUTION: Does not "re-add" any previously blocked elements. * @param string $fileOrID */ static function unblock($fileOrID) { unset(self::$blocked[$fileOrID]); } /** * Removes all items from the blocking-list. */ static function unblock_all() { self::$blocked = array(); } /** * Restore requirements cleared by call to Requirements::clear */ static function restore() { Requirements::$javascript = Requirements::$disabled['javascript']; Requirements::$css = Requirements::$disabled['css']; Requirements::$customScript = Requirements::$disabled['customScript']; Requirements::$customCSS = Requirements::$disabled['customCSS']; } /** * Update the given HTML content with the appropriate include tags for the registered * requirements. * @todo Calculate $prefix properly */ static function includeInHTML($templateFile, $content) { if(isset($_GET['debug_profile'])) Profiler::mark("Requirements::includeInHTML"); if(strpos($content, ' $dummy) { if(substr($file,0,7) == 'http://' || Director::fileExists($file)) { $requirements .= "\n"; } } if(self::$customScript) { $requirements .= "\n"; } foreach(array_diff_key(self::$css,self::$blocked) as $file => $params) { if(Director::fileExists($file)) { $media = (isset($params['media'])) ? " media=\"{$params['media']}\"" : ""; $requirements .= "\n"; } } foreach(array_diff_key(self::$customCSS,self::$blocked) as $css) { $requirements .= "\n"; } $requirements .= self::$customHeadTags; if(isset($_GET['debug_profile'])) Profiler::unmark("Requirements::includeInHTML"); return eregi_replace("(]*>)", $requirements . "\\1", $content); } else { if(isset($_GET['debug_profile'])) Profiler::unmark("Requirements::includeInHTML"); return $content; } } static function get_custom_scripts() { $requirements = ""; if(Requirements::$customScript) { foreach(Requirements::$customScript as $script) { $requirements .= "$script\n"; } } return $requirements; } static function debug() { Debug::show(Requirements::$javascript); Debug::show(Requirements::$css); Debug::show(Requirements::$customCSS); Debug::show(Requirements::$customScript); Debug::show(Requirements::$customHeadTags); } } ?>