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(code,options,wicks){this.setOptions(options);this.wicks=wicks||[];this.code=code;this.aliases=$H();this.rules=$H();this.builder=new Hash({'standard':this.findMatches,'lazy':this.findMatchesLazy});if(!options.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(keywordSet,ruleName){if(keywordSet.csv!=''){this.addFuel(ruleName,this.csvToRegExp(keywordSet.csv,keywordSet.mod||"g"),keywordSet.alias);}},this);this.patterns.each(function(regex,ruleName){this.addFuel(ruleName,regex.pattern,regex.alias);},this);var codeBeg=0,codeEnd=this.code.length,codeSeg='',delim=this.delimiters,matches=[],match=null,endMatch=null;if(!options.strict){matches.extend(this.builder[options.matchType].pass(this.code,this)());}else if(delim.start&&delim.end){while((match=delim.start.exec(this.code))!=null){delim.end.lastIndex=delim.start.lastIndex;if((endMatch=delim.end.exec(this.code))!=null){matches.push(new Wick(match[0],'de1',match.index));codeBeg=delim.start.lastIndex;codeEnd=endMatch.index-1;codeSeg=this.code.substring(codeBeg,codeEnd);matches.extend(this.builder[options.matchType].pass([codeSeg,codeBeg],this)());matches.push(new Wick(endMatch[0],'de2',endMatch.index));}}}
this.wicks=matches;},addFuel:function(fuelName,RegEx,className){this.rules[fuelName]=RegEx;this.addAlias(fuelName,className);},addAlias:function(key,alias){this.aliases[key]=alias||key;},csvToRegExp:function(csv,mod){return new RegExp('\\b('+csv.replace(/,\s*/g,'|')+')\\b',mod);},delimToRegExp:function(beg,esc,end,mod,suffix){beg=beg.escapeRegExp();if(esc)esc=esc.escapeRegExp();end=(end)?end.escapeRegExp():beg;var pat=(esc)?beg+"[^"+end+esc+'\\n]*(?:'+esc+'.[^'+end+esc+'\\n]*)*'+end:beg+"[^"+end+'\\n]*'+end;return new RegExp(pat+(suffix||''),mod||'');},strictRegExp:function(){var regex='(';for(var i=0;i<arguments.length;i++){regex+=arguments[i].escapeRegExp();regex+=(i<arguments.length-1)?'|':'';}
regex+=')';return new RegExp(regex,"gim");},findMatches:function(code,offset){var wicks=[],startIndex=0,matchIndex=code.length,insertIndex=0,match=null,type=null,newWick=null,rule=null,rules={},currentMatch=null,futureMatch=null;offset=offset||0;this.rules.each(function(regex,rule){rules[rule]={pattern:regex,nextIndex:0};},this);while(startIndex<code.length){matchIndex=code.length;match=null;for(rule in rules){rules[rule].pattern.lastIndex=startIndex;currentMatch=rules[rule].pattern.exec(code);if(currentMatch===null){delete rules[rule];}else{if(currentMatch.index<matchIndex||(currentMatch.index==matchIndex&&match[0].length<currentMatch[0].length)){match=currentMatch;type=rule;matchIndex=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+offset);wicks.push(newWick);futureMatch=rules[type].pattern.exec(code);if(!futureMatch){rules[type].nextIndex=code.length;}else{rules[type].nextIndex=rules[type].pattern.lastIndex-futureMatch[0].length;}
var min=code.length;for(rule in rules){if(rules[rule].nextIndex<min){min=rules[rule].nextIndex;}}
startIndex=Math.max(min,newWick.end-offset);}else{break;}}
return wicks;},findMatchesLazy:function(code,offset){var wicks=this.wicks,match=null
index=0;offset=offset||0;this.rules.each(function(regex,rule){while((match=regex.exec(code))!=null){index=(match[1]&&match[0].contains(match[1]))?match.index+match[0].indexOf(match[1]):match.index;wicks.push(new Wick(match[1]||match[0],rule,index+offset));}},this);return this.purgeWicks(wicks);},purgeWicks:function(wicks){wicks=wicks.sort(this.compareWicks);for(var i=0,j=0;i<wicks.length;i++){if(wicks[i]==null)continue;for(j=i+1;j<wicks.length&&wicks[i]!=null;j++){if(wicks[j]==null){continue;}
else if(wicks[j].isBeyond(wicks[i])){break;}
else if(wicks[j].overlaps(wicks[i])){wicks[i]=null;}
else if(wicks[i].contains(wicks[j])){wicks[j]=null;}}}
return wicks.clean();},compareWicks:function(wick1,wick2){return wick1.index-wick2.index;}});Fuel.standard=new Class({Extends:Fuel,initialize:function(code,options,wicks){this.parent(code,options,wicks);}});var Wick=new Class({initialize:function(match,type,index){this.text=match;this.type=type;this.index=index;this.length=this.text.length;this.end=this.index+this.length;},contains:function(wick){return(wick.index>=this.index&&wick.index<this.end);},isBeyond:function(wick){return(this.index>=wick.end);},overlaps:function(wick){return(this.index==wick.index&&this.length>wick.length);},toString:function(){return this.index+' - '+this.text+' - '+this.end;}});(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(codeblock,options){this.setOptions(options);this.id=this.options.id||this.name+'_'+$time();this.codeblock=$(codeblock);this.container=$(this.options.container);this.code=chop(this.codeblock.get('html')).replace(/&lt;/gim,'<').replace(/&gt;/gim,'>').replace(/&amp;/gim,'&');if(this.options.indent>-1){this.code=tabToSpaces(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(e){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 clip=new ZeroClipboard.Client();clip.setPath(this.options.path);clip.glue($(this.options.clipboard));clip.setText(this.code);clip.addEventListener('complete',function(client,text){alert("Copied text to clipboard:\n"+text);});}catch(e){this.loadScript('clipboard','ZeroClipboard.js',{'load':this.loadClipboard.bind(this),'error':$empty});return false;}},getPath:function(){if(!$chk(Lighter.path)){$$('head script').each(function(el){var script=el.src.split('?',1),pattern=/Lighter(\.full|\.lite)?\.js$/gi;if(script[0].match(pattern)){Lighter.path=script[0].replace(pattern,'');}});}
if(!this.options.path){this.options.path=Lighter.path;}},getClass:function(){var classNames=this.codeblock.get('class').split(' '),ff=[null,null];switch(classNames.length){case 0:break;case 1:ff=classNames[0].split(':');break;default:ff=classNames[0].split(':');}
if(ff[0]){this.options.fuel=ff[0];}
if(ff[1]){this.options.flame=ff[1];}},loadScript:function(holder,fileName,events){if($chk(Lighter.scripts[holder])){Lighter.scripts[holder].addEvents({load:events.load,error:events.error,readystatechange:function(){if(['loaded','complete'].contains(this.readyState))events.load();}});}else{Lighter.scripts[holder]=new Element('script',{'src':this.options.path+fileName+'?'+$time(),'type':'text/javascript','events':{load:events.load,error:events.error,readystatechange:function(){if(['loaded','complete'].contains(this.readyState))events.load();}}}).inject(document.head);}},loadStylesheet:function(holder,fileName){if(!$chk(Lighter.stylesheets[holder])){Lighter.stylesheets[holder]=new Element('link',{rel:"stylesheet",type:"text/css",media:"screen",href:this.options.path+fileName+'?'+$time()}).inject(document.head);}},createLighter:function(parent){var lighter=new Element(parent,{'class':this.options.flame+this.name}),pointer=0;if(!$defined(this.fuel.wicks[0])){lighter.appendText(this.code);}else{this.fuel.wicks.each(function(match){lighter.appendText(this.code.substring(pointer,match.index));this.insertAndKeepEl(lighter,match.text,match.type);pointer=match.index+match.text.length;},this);if(pointer<this.code.length){lighter.appendText(this.code.substring(pointer,this.code.length));}}
return lighter;},createLighterWithLines:function(parent,child,addLines,numType){var lighter=new Element(parent[0],{'class':this.options.flame+this.name,'id':this.id}),newLine=new Element(child[0]),lineNum=1,pointer=0,text=null;if(parent[0]=="table"){lighter.set("cellpadding",0).set("cellspacing",0).set("border",0);}
if(parent[1]){lighter=new Element(parent[1]).inject(lighter);}
if(child[1]){newLine=new Element(child[1]).inject(newLine);}
newLine.addClass(this.options.flame+'line');if(addLines){lineNum=this.insertLineNum(newLine,lineNum,numType);}
this.fuel.wicks.each(function(match){if(pointer!=match.index){text=this.code.substring(pointer,match.index).split("\n");for(var i=0;i<text.length;i++){if(i<text.length-1){if(text[i]===''){text[i]=' ';}
newLine=this.insertAndMakeEl(newLine,lighter,text[i],child);if(addLines){lineNum=this.insertLineNum(newLine,lineNum,numType);}}else{this.insertAndKeepEl(newLine,text[i]);}}}
text=match.text.split('\n');for(var i=0;i<text.length;i++){if(i<text.length-1){newLine=this.insertAndMakeEl(newLine,lighter,text[i],child,match.type);if(addLines){lineNum=this.insertLineNum(newLine,lineNum,numType);}}else{this.insertAndKeepEl(newLine,text[i],match.type);}}
pointer=match.end;},this);if(pointer<=this.code.length){text=this.code.substring(pointer,this.code.length).split('\n');for(var i=0;i<text.length;i++){newLine=this.insertAndMakeEl(newLine,lighter,text[i],child);if(addLines){lineNum=this.insertLineNum(newLine,lineNum,numType);}}}
if(this.options.altLines!==''){if(this.options.altLines=='hover'){lighter.getElements('.'+this.options.flame+'line').addEvents({'mouseover':function(){this.toggleClass('alt');},'mouseout':function(){this.toggleClass('alt');}});}else{if(child[1]){lighter.getChildren(':'+this.options.altLines).getElement('.'+this.options.flame+'line').addClass('alt');}else{lighter.getChildren(':'+this.options.altLines).addClass('alt');}}}
if(child[1]){lighter.getFirst().getChildren().addClass(this.options.flame+'first');lighter.getLast().getChildren().addClass(this.options.flame+'last');}else{lighter.getFirst().addClass(this.options.flame+'first');lighter.getLast().addClass(this.options.flame+'last');}
if(parent[1]){lighter=lighter.getParent();}
return lighter;},insertAndKeepEl:function(el,text,alias){if(text.length>0){var span=new Element('span',{'text':text});if(alias){span.addClass(this.fuel.aliases[alias]||alias);}
span.inject(el);}},insertAndMakeEl:function(el,group,text,child,alias){this.insertAndKeepEl(el,text,alias);if(child[1]){el=el.getParent();}
el.inject(group);var newLine=new Element(child[0]);if(child[1]){newLine=new Element(child[1]).inject(newLine);}
newLine.addClass(this.options.flame+'line');return newLine;},insertLineNum:function(el,lineNum,elType){var newNum=new Element(elType,{'text':lineNum++,'class':this.options.flame+'num'});newNum.inject(el.getParent(),'top');return lineNum;},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(options){return new Lighter(this,options);}});function chop(str){return str.replace(/(^\s*\n|\n\s*$)/gi,'');}
function tabToSpaces(str,spaces){for(var i=0,indent='';i<spaces;i++){indent+=' ';}
return str.replace(/\t/g,indent);}})();window.addEvent('domready',function(){$$('pre').light({altLines:'hover',indent:2,mode:'ol',path:'http://localhost/Cielo/includes/JavaScript/Lighter/'});});
