(function() { var sh = SyntaxHighlighter; /** * Provides functionality to dynamically load only the brushes that a needed to render the current page. * * There are two syntaxes that autoload understands. For example: * * SyntaxHighlighter.autoloader( * [ 'applescript', 'Scripts/shBrushAppleScript.js' ], * [ 'actionscript3', 'as3', 'Scripts/shBrushAS3.js' ] * ); * * or a more easily comprehendable one: * * SyntaxHighlighter.autoloader( * 'applescript Scripts/shBrushAppleScript.js', * 'actionscript3 as3 Scripts/shBrushAS3.js' * ); */ sh.autoloader = function() { var list = arguments, elements = sh.findElements(), brushes = {}, scripts = {}, all = SyntaxHighlighter.all, allCalled = false, allParams = null, i ; SyntaxHighlighter.all = function(params) { allParams = params; allCalled = true; }; function addBrush(aliases, url) { for (var i = 0; i < aliases.length; i++) brushes[aliases[i]] = url; }; function getAliases(item) { return item.pop ? item : item.split(/\s+/) ; } // create table of aliases and script urls for (i = 0; i < list.length; i++) { var aliases = getAliases(list[i]), url = aliases.pop() ; addBrush(aliases, url); } // dynamically add <script /> tags to the document body for (i = 0; i < elements.length; i++) { var url = brushes[elements[i].params.brush]; if (!url) continue; scripts[url] = false; loadScript(url); } function loadScript(url) { var script = document.createElement('script'), done = false ; script.src = url; script.type = 'text/javascript'; script.language = 'javascript'; script.onload = script.onreadystatechange = function() { if (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete')) { done = true; scripts[url] = true; checkAll(); // Handle memory leak in IE script.onload = script.onreadystatechange = null; script.parentNode.removeChild(script); } }; // sync way of adding script tags to the page document.body.appendChild(script); }; function checkAll() { for(var url in scripts) if (scripts[url] == false) return; if (allCalled) SyntaxHighlighter.highlight(allParams); }; }; })();