var Lighter=new Class({Implements:[Options],name:"Lighter",options:{altLines:"",container:null,editable:false,flame:"standard",fuel:"standard",id:null,indent:-1,jsStyles:true,matchType:"standard",mode:"pre",path:"./",strict:false},initialize:function(c,b){this.setOptions(b);b=this.options;this.id=b.id||this.name+"_"+$time();this.codeblock=$(c);this.code=c.get("html").chop().replace(/&lt;/gim,"<").replace(/&gt;/gim,">").replace(/&amp;/gim,"&");this.container=$(this.options.container);if(b.indent>-1){this.code=this.code.tabToSpaces(b.indent)}this.builder=new Hash({pre:this.createLighter.bind(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)});var a=this.codeblock.get("class").split(":");if(!a[0]){a[0]=this.options.fuel}if(!a[1]){a[1]=this.options.flame}this.loadFlameSrc(a)},loadFlameSrc:function(b){if(!$chk(Flame[b[1]])){var a=new Element("script",{src:this.options.path+"Flame."+b[1]+".js",type:"text/javascript"}).addEvents({load:function(){this.loadFlame(b)}.bind(this),error:function(){b[1]="standard";this.loadFlame(b)}.bind(this)}).inject(document.head)}else{this.loadFlame(b)}},loadFlame:function(a){this.flame=new Flame[a[1]](this);this.loadFuelSrc(a)},loadFuelSrc:function(a){if(!$chk(Fuel[a[0]])){var b=new Element("script",{src:this.options.path+"Fuel."+a[0]+".js",type:"text/javascript"}).addEvents({load:function(){this.loadFuel(a)}.bind(this),error:function(){a[0]="standard";this.loadFuel(a)}.bind(this)}).inject(document.head)}else{this.loadFuel(a)}},loadFuel:function(a){this.fuel=new Fuel[a[0]](this,this.flame,{matchType:this.options.matchType,strict:this.options.strict});this.light()},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")}},createLighter:function(){var a=new Element("pre",{"class":this.flame.shortName+this.name}),b=0;if(!$defined(this.fuel.wicks[0])){a.appendText(this.code)}else{this.fuel.wicks.each(function(c){a.appendText(this.code.substring(b,c.index));this.insertAndKeepEl(a,c.text,c.type);b=c.index+c.text.length},this);if(b<this.code.length){a.appendText(this.code.substring(b,this.code.length))}}return a},createLighterWithLines:function(h,b,d,c){var k=new Element(h[0],{"class":this.flame.shortName+this.name,id:this.id}),g=new Element(b[0]),f=1,a=0,j=null;if(h[0]=="table"){k.set("cellpadding",0).set("cellspacing",0).set("border",0)}if(h[1]){k=new Element(h[1]).inject(k)}if(b[1]){g=new Element(b[1]).inject(g)}g.addClass(this.flame.shortName+"line");if(d){f=this.insertLineNum(g,f,c)}this.fuel.wicks.each(function(l){if(a!=l.index){j=this.code.substring(a,l.index).split("\n");for(var m=0;m<j.length;m++){if(m<j.length-1){if(j[m]==""){j[m]=" "}g=this.insertAndMakeEl(g,k,j[m],b);if(d){f=this.insertLineNum(g,f,c)}}else{this.insertAndKeepEl(g,j[m])}}}j=l.text.split("\n");for(m=0;m<j.length;m++){if(m<j.length-1){g=this.insertAndMakeEl(g,k,j[m],b,l.type);if(d){f=this.insertLineNum(g,f,c)}}else{this.insertAndKeepEl(g,j[m],l.type)}}a=l.end},this);if(a<=this.code.length){j=this.code.substring(a,this.code.length).split("\n");for(var e=0;e<j.length;e++){g=this.insertAndMakeEl(g,k,j[e],b);if(d){f=this.insertLineNum(g,f,c)}}}if(this.options.altLines!==""){if(this.options.altLines=="hover"){k.getElements("."+this.flame.shortName+"line").addEvents({mouseover:function(){this.toggleClass("alt")},mouseout:function(){this.toggleClass("alt")}})}else{if(b[1]){k.getChildren(":"+this.options.altLines).getElement("."+this.flame.shortName+"line").addClass("alt")}else{k.getChildren(":"+this.options.altLines).addClass("alt")}}}if(b[1]){k.getFirst().getChildren().addClass(this.flame.shortName+"first");k.getLast().getChildren().addClass(this.flame.shortName+"last")}else{k.getFirst().addClass(this.flame.shortName+"first");k.getLast().addClass(this.flame.shortName+"last")}if(h[1]){k=k.getParent()}return k},insertAndKeepEl:function(c,d,a){if(d.length>0){var b=new Element("span");b.set("text",d);if(a){b.addClass(this.flame.aliases[a])}b.inject(c)}},insertAndMakeEl:function(b,c,d,f,a){this.insertAndKeepEl(b,d,a);if(f[1]){b=b.getParent()}b.inject(c);var e=new Element(f[0]);if(f[1]){e=new Element(f[1]).inject(e)}e.addClass(this.flame.shortName+"line");return e},insertLineNum:function(b,d,a){var c=new Element(a,{text:d++,"class":this.flame.shortName+"num"});c.inject(b.getParent(),"top");return d},toElement:function(){if(!this.element){this.element=this.builder[this.options.mode]();if(this.options.editable){this.element.set("contenteditable","true")}}return this.element},replaces:function(a){a=$(a,true);a.parentNode.replaceChild(this.toElement(),a);return this}});Element.implement({light:function(a){return new Lighter(this,a)}});String.implement({chop:function(){return this.replace(/(^\s*\n|\n\s*$)/gi,"")},tabToSpaces:function(b){for(var c=0,a="";c<b;c++){a+=" "}return this.replace(/\t/g,a)}});var Fuel=new Class({Implements:[Options],options:{matchType:"standard",strict:false},language:"",defaultFlame:"standard",patterns:new Hash(),keywords:new Hash(),rules:new Hash(),delimiters:new Hash({start:null,end:null}),common:{slashComments:/(?:^|[^\\])\/\/.*$/gm,poundComments:/#.*$/gm,multiComments:/\/\*[\s\S]*?\*\//gm,aposStrings:/'[^'\\]*(?:\\.[^'\\]*)*'/gm,quotedStrings:/"[^"\\]*(?:\\.[^"\\]*)*"/gm,strings:/'[^'\\]*(?:\\.[^'\\]*)*'|"[^"\\]*(?:\\.[^"\\]*)*"/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(j,i,k,h){this.setOptions(k);this.wicks=h||[];this.lighter=j;this.flame=i;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(m,l){if(m.csv!=""){this.addFuel(l,this.csvToRegExp(m.csv,"g"),m.alias)}},this);this.patterns.each(function(l,m){this.addFuel(m,l.pattern,l.alias)},this);var g=0,a=j.code.length,c="",b=this.delimiters,f=[],e=null,d=null;if(!k.strict){f.extend(this.builder[k.matchType].pass(j.code,this)())}else{if(b.start&&b.end){while((e=b.start.exec(j.code))!=null){b.end.lastIndex=b.start.lastIndex;if((d=b.end.exec(j.code))!=null){f.push(new Wick(e[0],"de1",e.index));g=b.start.lastIndex;a=d.index-1;c=j.code.substring(g,a);f.extend(this.builder[k.matchType].pass([c,g],this)());f.push(new Wick(d[0],"de2",d.index))}}}}this.wicks=f},addFuel:function(c,a,b){this.rules[c]=a;this.flame.addAlias(c,b)},csvToRegExp:function(a,b){return new RegExp("\\b("+a.replace(/,\s*/g,"|")+")\\b",b)},delimToRegExp:function(c,b,a,d,e){c=c.escapeRegExp();if(b){b=b.escapeRegExp()}a=(a)?a.escapeRegExp():c;pat=(b)?c+"[^"+a+b+"\\n]*(?:"+b+".[^"+a+b+"\\n]*)*"+a:c+"[^"+a+"\\n]*"+a;return new RegExp(pat+(e||""),d||"")},strictRegExp:function(){var b="(";for(var a=0;a<arguments.length;a++){b+=arguments[a].escapeRegExp();b+=(a<arguments.length-1)?"|":""}b+=")";return new RegExp(b,"gim")},findMatches:function(d,f){var b=[],e=0,a=d.length;insertIndex=0,match=null,type=null,newWick=null,rule=null,rules={},currentMatch=null,futureMatch=null;f=f||0;this.rules.each(function(g,h){rules[h]={pattern:g,lastIndex:0}},this);while(e<d.length){a=d.length;match=null;for(rule in rules){rules[rule].pattern.lastIndex=e;currentMatch=rules[rule].pattern.exec(d);if(currentMatch===null){delete rules[rule]}else{if(currentMatch.index<a||(currentMatch.index==a&&match[0].length<currentMatch[0].length)){match=currentMatch;type=rule;a=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+f);b.push(newWick);futureMatch=rules[type].pattern.exec(d);if(!futureMatch){rules[type].nextIndex=d.length}else{rules[type].nextIndex=rules[type].pattern.lastIndex-futureMatch[0].length}var c=d.length;for(rule in rules){if(rules[rule].nextIndex<c){c=rules[rule].nextIndex}}e=Math.max(c,newWick.end-f)}else{break}}return b},findMatchesLazy:function(c,d){var a=this.wicks,b=null;index=0;d=d||0;this.rules.each(function(e,f){while((b=e.exec(c))!=null){index=(b[1]&&b[0].contains(b[1]))?b.index+b[0].indexOf(b[1]):b.index;a.push(new Wick(b[1]||b[0],f,index+d))}},this);return this.purgeWicks(a)},purgeWicks:function(a){a=a.sort(this.compareWicks);for(var c=0,b=0;c<a.length;c++){if(a[c]==null){continue}for(b=c+1;b<a.length&&a[c]!=null;b++){if(a[b]==null){continue}else{if(a[b].isBeyond(a[c])){break}else{if(a[b].overlaps(a[c])){a[c]=null}else{if(a[c].contains(a[b])){a[b]=null}}}}}}return a.clean()},compareWicks:function(b,a){return b.index-a.index}});Fuel.standard=new Class({Extends:Fuel,initialize:function(a,d,c,b){this.parent(a,d,c,b)}});var Wick=new Class({initialize:function(b,c,a){this.text=b;this.type=c;this.index=a;this.length=this.text.length;this.end=this.index+this.length},contains:function(a){return(a.index>=this.index&&a.index<this.end)},isBeyond:function(a){return(this.index>=a.end)},overlaps:function(a){return(this.index==a.index&&this.length>a.length)},toString:function(){return this.index+" - "+this.text+" - "+this.end}});var Flame=new Class({shortName:"lt",aliases:new Hash(),common:new Hash(),layout:new Hash(),styles:new Hash(),defaultCommon:new Hash({"font-family":"Monaco, Courier, Monospace","font-size":"12px","line-height":"1.5",overflow:"auto","white-space":"pre-wrap","word-wrap":"break-word"}),defaultLayout:new Hash({numBgColor:new Hash(),lineBgColor:new Hash(),lineNumStyles:new Hash(),lineStyles:new Hash(),altLineStyles:new Hash(),top:new Hash(),right:new Hash(),bottom:new Hash(),left:new Hash(),codeStyles:new Hash()}),fixes:new Hash({div:new Hash({div:new Hash({clear:"left",overflow:"auto"}),num:new Hash({display:"block","float":"left","text-align":"center",width:"30px"}),line:new Hash({display:"block","margin-left":"30px"})}),table:new Hash({num:new Hash({"text-align":"center",width:"30px"})}),ol:new Hash({ol:new Hash({"margin-top":"0","margin-bottom":"0","margin-left":"0","padding-left":"0"}),li:new Hash({"margin-left":"40px"})})}),initialize:function(a,b){this.lighter=a;this.fuel=b;this.common.combine(this.defaultCommon);this.layout.combine(this.defaultLayout);this.styles.each(function(d,c){this.addAlias(c)},this);if(this.lighter.options.jsStyles){this.injectTag()}},addAlias:function(b,a){this.aliases[b]=a||b},injectTag:function(){this.styleTag=new Element("style").setProperty("type","text/css").inject(document.head);this.styleText="";var c=this.lighter.options.mode,f=c+"."+this.shortName+this.lighter.name,d=f+" ."+this.shortName,b=this.layout.lineNumStyles.extend(this.layout.numBgColor),a=this.layout.lineStyles.extend(this.layout.lineBgColor),e=this.layout.left.extend(this.layout.right);this.addCSS(f,this.common);this.addCSS(f,new Hash({"white-space":"-moz-pre-wrap"}));this.addCSS(f,new Hash({"white-space":"-pre-wrap"}));this.addCSS(f,new Hash({"white-space":"-o-pre-wrap"}));switch(c){case"pre":e=e.extend(this.layout.top).extend(this.layout.bottom);this.addCSS(f,this.layout.lineBgColor.extend(e));this.addCSS(f+" span",this.layout.codeStyles);break;case"ol":this.addCSS(f,b.extend(this.fixes.ol["ol"]));this.addCSS(f+" li",a.extend(e).extend(this.fixes.ol["li"]));this.addCSS(d+"first",this.layout.top);this.addCSS(d+"last",this.layout.bottom);this.addCSS(f+" .alt",this.layout.altLineStyles);this.addCSS(f+" span",this.layout.codeStyles);break;case"div":this.addCSS(d+"num",b.extend(this.fixes.div.num));this.addCSS(d+"line",a.extend(e).extend(this.fixes.div.line));this.addCSS(f+" div",this.fixes.div["div"].extend(this.layout.numBgColor));this.addCSS(d+"first",this.layout.top);this.addCSS(d+"last",this.layout.bottom);this.addCSS(f+" .alt",this.layout.altLineStyles);this.addCSS(f+" span",this.layout.codeStyles);break;case"table":this.addCSS(d+"num",b.extend(this.fixes.table["num"]));this.addCSS(d+"line",a.extend(e));this.addCSS(d+"first",this.layout.top);this.addCSS(d+"last",this.layout.bottom);this.addCSS(f+" .alt",this.layout.altLineStyles);this.addCSS(f+" span",this.layout.codeStyles);break}this.styles.each(function(g,h){this.addCSS(f+" ."+h,g)},this);if(Browser.Engine.trident){this.styleTag.styleSheet.cssText+=this.styleText}else{this.styleTag.appendText(this.styleText)}},addCSS:function(b,a){var c="\n"+b+" {\n";if(a){a.each(function(e,d){c+="\t"+d+": "+e+";\n"})}c+="}\n";this.styleText+=c}});Flame.standard=new Class({Extends:Flame,styles:new Hash({de1:new Hash({}),de2:new Hash({}),kw1:new Hash({color:"#1b609a"}),kw2:new Hash({color:"#9a6f1b"}),kw3:new Hash({color:"#784e0c"}),kw4:new Hash({color:"#9a6f1b"}),co1:new Hash({color:"#888888"}),co2:new Hash({color:"#888888"}),st0:new Hash({color:"#489a1b"}),st1:new Hash({color:"#489a1b"}),st2:new Hash({color:"#489a1b"}),nu0:new Hash({color:"#70483d"}),me0:new Hash({color:"#666666"}),br0:new Hash({color:"#444444"}),sy0:new Hash({color:"#444444"}),es0:new Hash({color:"#444444"}),re0:new Hash({color:"#784e0c"})}),layout:new Hash({numBgColor:new Hash({"background-color":"#f2f2f2"}),lineBgColor:new Hash({"background-color":"#fff"}),lineNumStyles:new Hash({color:"#939393","font-size":"10px","list-style":"decimal-leading-zero"}),lineStyles:new Hash({"border-top":"1px solid #fff","border-bottom":"1px solid #fff","border-left":"1px solid #939393",padding:"0 3px 0 10px"}),altLineStyles:new Hash({"border-top":"1px solid #eee","border-bottom":"1px solid #eee","background-color":"#F4F8FC"}),top:new Hash({"padding-top":"5px"}),right:new Hash({"padding-right":"5px"}),bottom:new Hash({"padding-bottom":"5px"}),left:new Hash({"padding-left":"15px"}),codeStyles:new Hash({color:"black","font-size":"12px"})}),initialize:function(a,b){this.parent(a,b)}});
