(function(){Lighter=new Class({Implements:[Options],name:"Lighter",options:{altLines:"",clipboard:null,container:null,editable:false,flame:"standard",fuel:"standard",id:null,indent:-1,matchType:"standard",mode:"pre",path:null,strict:false},initialize:function(a,b){this.setOptions(b);this.id=this.options.id||this.name+"_"+Date.now();this.codeblock=$(a);this.container=$(this.options.container);this.code=d(this.codeblock.get("html")).replace(/&lt;/gim,"<").replace(/&gt;/gim,">").replace(/&amp;/gim,"&");if(this.options.indent>-1){this.code=c(this.code,this.options.indent)}this.getPath();this.getClass();this.builder=new Hash({inline:this.createLighter.pass("code",this),pre:this.createLighter.pass("pre",this),ol:this.createLighterWithLines.pass([["ol"],["li"]],this),div:this.createLighterWithLines.pass([["div"],["div","span"],true,"span"],this),table:this.createLighterWithLines.pass([["table","tbody"],["tr","td"],true,"td"],this)});Lighter.scripts=Lighter.scripts||{};Lighter.stylesheets=Lighter.stylesheets||{};this.loadStylesheet(this.options.flame,"Flame."+this.options.flame+".css");this.loadFuel()},loadFuel:function(){try{this.fuel=new Fuel[this.options.fuel](this.code,{matchType:this.options.matchType,strict:this.options.strict});this.light()}catch(a){this.loadScript(this.options.fuel,"Fuel."+this.options.fuel+".js",{load:this.loadFuel.bind(this),error:function(){this.options.fuel="standard";this.loadFuel()}.bind(this)})}},light:function(){this.element=this.toElement();if(this.container){this.container.empty();this.element.inject(this.container)}else{this.codeblock.setStyle("display","none");this.element.inject(this.codeblock,"after");if(this.options.clipboard){this.loadClipboard()}}},unlight:function(){$(this).setStyle("display","none");this.codeblock.setStyle("display","inherit")},loadClipboard:function(){try{var b=new ZeroClipboard.Client();b.setPath(this.options.path);b.glue($(this.options.clipboard));b.setText(this.code);b.addEventListener("complete",function(h,g){alert("Copied text to clipboard:\n"+g)})}catch(a){this.loadScript("clipboard","ZeroClipboard.js",{load:this.loadClipboard.bind(this),error:Function.from()});return false}},getPath:function(){if(!Lighter.path){$$("head script").each(function(b){var f=b.src.split("?",1),a=/Lighter(\.full|\.lite)?\.js$/gi;if(f[0].match(a)){Lighter.path=f[0].replace(a,"")}})}if(!this.options.path){this.options.path=Lighter.path}},getClass:function(){var a=this.codeblock.get("class").split(" "),b=[null,null];switch(a.length){case 0:break;case 1:b=a[0].split(":");break;default:b=a[0].split(":")}if(b[0]){this.options.fuel=b[0]}if(b[1]){this.options.flame=b[1]}},loadScript:function(b,a,f){if(Lighter.scripts[b]!=undefined){Lighter.scripts[b].addEvents({load:f.load,error:f.error,readystatechange:function(){if(["loaded","complete"].contains(this.readyState)){f.load()}}})}else{Lighter.scripts[b]=new Element("script",{src:this.options.path+a+"?"+Date.now(),type:"text/javascript",events:{load:f.load,error:f.error,readystatechange:function(){if(["loaded","complete"].contains(this.readyState)){f.load()}}}}).inject(document.head)}},loadStylesheet:function(b,a){if(!Lighter.stylesheets[b]){Lighter.stylesheets[b]=new Element("link",{rel:"stylesheet",type:"text/css",media:"screen",href:this.options.path+a+"?"+Date.now()}).inject(document.head)}},createLighter:function(b){var f=new Element(b,{"class":this.options.flame+this.name}),a=0;if(this.fuel.wicks[0]==undefined){f.appendText(this.code)}else{this.fuel.wicks.each(function(e){f.appendText(this.code.substring(a,e.index));this.insertAndKeepEl(f,e.text,e.type);a=e.index+e.text.length},this);if(a<this.code.length){f.appendText(this.code.substring(a,this.code.length))}}return f},createLighterWithLines:function(i,s,q,r){var a=new Element(i[0],{"class":this.options.flame+this.name,id:this.id}),n=new Element(s[0]),o=1,t=0,b=null;if(i[0]=="table"){a.set("cellpadding",0).set("cellspacing",0).set("border",0)}if(i[1]){a=new Element(i[1]).inject(a)}if(s[1]){n=new Element(s[1]).inject(n)
}n.addClass(this.options.flame+"line");if(q){o=this.insertLineNum(n,o,r)}this.fuel.wicks.each(function(f){if(t!=f.index){b=this.code.substring(t,f.index).split("\n");for(var e=0;e<b.length;e++){if(e<b.length-1){if(b[e]===""){b[e]=" "}n=this.insertAndMakeEl(n,a,b[e],s);if(q){o=this.insertLineNum(n,o,r)}}else{this.insertAndKeepEl(n,b[e])}}}b=f.text.split("\n");for(var e=0;e<b.length;e++){if(e<b.length-1){n=this.insertAndMakeEl(n,a,b[e],s,f.type);if(q){o=this.insertLineNum(n,o,r)}}else{this.insertAndKeepEl(n,b[e],f.type)}}t=f.end},this);if(t<=this.code.length){b=this.code.substring(t,this.code.length).split("\n");for(var p=0;p<b.length;p++){n=this.insertAndMakeEl(n,a,b[p],s);if(q){o=this.insertLineNum(n,o,r)}}}if(this.options.altLines!==""){if(this.options.altLines=="hover"){a.getElements("."+this.options.flame+"line").addEvents({mouseover:function(){this.toggleClass("alt")},mouseout:function(){this.toggleClass("alt")}})}else{if(s[1]){a.getChildren(":"+this.options.altLines).getElement("."+this.options.flame+"line").addClass("alt")}else{a.getChildren(":"+this.options.altLines).addClass("alt")}}}if(s[1]){a.getFirst().getChildren().addClass(this.options.flame+"first");a.getLast().getChildren().addClass(this.options.flame+"last")}else{a.getFirst().addClass(this.options.flame+"first");a.getLast().addClass(this.options.flame+"last")}if(i[1]){a=a.getParent()}return a},insertAndKeepEl:function(b,a,h){if(a.length>0){var g=new Element("span",{text:a});if(h){g.addClass(this.fuel.aliases[h]||h)}g.inject(b)}},insertAndMakeEl:function(k,j,i,a,l){this.insertAndKeepEl(k,i,l);if(a[1]){k=k.getParent()}k.inject(j);var b=new Element(a[0]);if(a[1]){b=new Element(a[1]).inject(b)}b.addClass(this.options.flame+"line");return b},insertLineNum:function(g,a,h){var b=new Element(h,{text:a++,"class":this.options.flame+"num"});b.inject(g.getParent(),"top");return a},toElement:function(){if(!this.element){this.element=this.builder[this.options.mode]();if(this.options.editable){this.element.set("contenteditable","true")}}return this.element},toString:function(){return this.code}});Element.implement({light:function(a){return new Lighter(this,a)}});function d(a){return a.replace(/(^\s*\n|\n\s*$)/gi,"")}function c(a,g){for(var b=0,h="";b<g;b++){h+=" "}return a.replace(/\t/g,h)}})();var Fuel=new Class({Implements:[Options],options:{matchType:"standard",strict:false},language:"",patterns:new Hash(),keywords:new Hash(),delimiters:new Hash({start:null,end:null}),common:{slashComments:/(?:^|[^\\])\/\/.*$/gm,poundComments:/#.*$/gm,multiComments:/\/\*[\s\S]*?\*\//gm,aposStrings:/'[^'\\]*(?:\\.[^'\\]*)*'/gm,quotedStrings:/"[^"\\]*(?:\\.[^"\\]*)*"/gm,multiLineSingleQuotedStrings:/'[^'\\]*(?:\\.[^'\\]*)*'/gm,multiLineDoubleQuotedStrings:/"[^"\\]*(?:\\.[^"\\]*)*"/gm,multiLineStrings:/'[^'\\]*(?:\\.[^'\\]*)*'|"[^"\\]*(?:\\.[^"\\]*)*"/gm,singleQuotedString:/'[^'\\\r\n]*(?:\\.[^'\\\r\n]*)*'/gm,doubleQuotedString:/"[^"\\\r\n]*(?:\\.[^"\\\r\n]*)*"/gm,strings:/'[^'\\\r\n]*(?:\\.[^'\\\r\n]*)*'|"[^"\\\r\n]*(?:\\.[^"\\\r\n]*)*"/gm,properties:/\.([\w]+)\s*/gi,methodCalls:/\.([\w]+)\s*\(/gm,functionCalls:/\b([\w]+)\s*\(/gm,brackets:/\{|\}|\(|\)|\[|\]/g,numbers:/\b((?:(\d+)?\.)?[0-9]+|0x[0-9A-F]+)\b/gi},initialize:function(t,k,l){this.setOptions(k);this.wicks=l||[];this.code=t;this.aliases=$H();this.rules=$H();this.builder=new Hash({standard:this.findMatches,lazy:this.findMatchesLazy});if(!k.strict){if(this.delimiters.start){this.addFuel("delimBeg",this.delimiters.start,"de1")}if(this.delimiters.end){this.addFuel("delimEnd",this.delimiters.end,"de2")}}this.keywords.each(function(a,b){if(a.csv!=""){this.addFuel(b,this.csvToRegExp(a.csv,a.mod||"g"),a.alias)}},this);this.patterns.each(function(b,a){this.addFuel(a,b.pattern,b.alias)},this);var m=0,s=this.code.length,q="",r=this.delimiters,n=[],o=null,p=null;if(!k.strict){Object.append(n,this.builder[k.matchType].pass(this.code,this)())}else{if(r.start&&r.end){while((o=r.start.exec(this.code))!=null){r.end.lastIndex=r.start.lastIndex;if((p=r.end.exec(this.code))!=null){n.push(new Wick(o[0],"de1",o.index));
m=r.start.lastIndex;s=p.index-1;q=this.code.substring(m,s);n.extend(this.builder[k.matchType].pass([q,m],this)());n.push(new Wick(p[0],"de2",p.index))}}}}this.wicks=n},addFuel:function(f,e,d){this.rules[f]=e;this.addAlias(f,d)},addAlias:function(c,d){this.aliases[c]=d||c},csvToRegExp:function(d,c){return new RegExp("\\b("+d.replace(/,\s*/g,"|")+")\\b",c)},delimToRegExp:function(k,g,h,j,i){k=k.escapeRegExp();if(g){g=g.escapeRegExp()}h=(h)?h.escapeRegExp():k;var l=(g)?k+"[^"+h+g+"\\n]*(?:"+g+".[^"+h+g+"\\n]*)*"+h:k+"[^"+h+"\\n]*"+h;return new RegExp(l+(i||""),j||"")},strictRegExp:function(){var c="(";for(var d=0;d<arguments.length;d++){c+=arguments[d].escapeRegExp();c+=(d<arguments.length-1)?"|":""}c+=")";return new RegExp(c,"gim")},findMatches:function(k,i){var g=[],j=0,h=k.length;insertIndex=0,match=null,type=null,newWick=null,rule=null,rules={},currentMatch=null,futureMatch=null;i=i||0;this.rules.each(function(b,a){rules[a]={pattern:b,nextIndex:0}},this);while(j<k.length){h=k.length;match=null;for(rule in rules){rules[rule].pattern.lastIndex=j;currentMatch=rules[rule].pattern.exec(k);if(currentMatch===null){delete rules[rule]}else{if(currentMatch.index<h||(currentMatch.index==h&&match[0].length<currentMatch[0].length)){match=currentMatch;type=rule;h=currentMatch.index}rules[rule].nextIndex=rules[rule].pattern.lastIndex-currentMatch[0].length}}if(match!=null){index=(match[1]&&match[0].contains(match[1]))?match.index+match[0].indexOf(match[1]):match.index;newWick=new Wick(match[1]||match[0],type,index+i);g.push(newWick);futureMatch=rules[type].pattern.exec(k);if(!futureMatch){rules[type].nextIndex=k.length}else{rules[type].nextIndex=rules[type].pattern.lastIndex-futureMatch[0].length}var l=k.length;for(rule in rules){if(rules[rule].nextIndex<l){l=rules[rule].nextIndex}}j=Math.max(l,newWick.end-i)}else{break}}return g},findMatchesLazy:function(h,g){var f=this.wicks,e=null;index=0;g=g||0;this.rules.each(function(b,a){while((e=b.exec(h))!=null){index=(e[1]&&e[0].contains(e[1]))?e.index+e[0].indexOf(e[1]):e.index;f.push(new Wick(e[1]||e[0],a,index+g))}},this);return this.purgeWicks(f)},purgeWicks:function(e){e=e.sort(this.compareWicks);for(var f=0,d=0;f<e.length;f++){if(e[f]==null){continue}for(d=f+1;d<e.length&&e[f]!=null;d++){if(e[d]==null){continue}else{if(e[d].isBeyond(e[f])){break}else{if(e[d].overlaps(e[f])){e[f]=null}else{if(e[f].contains(e[d])){e[d]=null}}}}}}return e.clean()},compareWicks:function(c,d){return c.index-d.index}});Fuel.standard=new Class({Extends:Fuel,initialize:function(f,d,e){this.parent(f,d,e)}});var Wick=new Class({initialize:function(d,f,e){this.text=d;this.type=f;this.index=e;this.length=this.text.length;this.end=this.index+this.length},contains:function(b){return(b.index>=this.index&&b.index<this.end)},isBeyond:function(b){return(this.index>=b.end)},overlaps:function(b){return(this.index==b.index&&this.length>b.length)},toString:function(){return this.index+" - "+this.text+" - "+this.end}});
