﻿//Developed by www.pagecolumn.com

function syntaxhighligter(cls,code_type) {
var syntax = ["var","new","return","else","this","function","do","for","null","while","event","if","true","false"];
var codeblock = getElementsByClass(cls);
for (i = 0; i < codeblock.length; i++) {

    var str = codeblock[i].innerHTML;
    str = hltstring(str);
    
    if (code_type==undefined) {
        for (j = 0;j < syntax.length; j++) {
            var re = new RegExp('(\\b'+syntax[j]+')(\?\!")\\b', "g");  
            str = str.replace(re,'<code style="color:#6699cc">$1</code>');
        }
    }
    else if (code_type=="html") {
      str = str.replace(/&lt;\s*(\w+)/g,'&lt;<code style="color:#800080">$1</code>'); 
       str = str.replace(/(\w+)\s*&gt;/g,'<code style="color:#800080">$1</code>&gt;');  
    //|(\w+)&gt;
    }
    else if (code_type=="css") {
        str = str.replace(/:\s*([\#\w-\s\d]+);?/g,': <code style="color:#c00000">$1</code>;'); 
        str = str.replace(/([\w-]+): </g,'<code style="color:#6699cc">$1</code>: <'); 
        str = str.replace(/([\w\.\#\d\s]+)(?=\s*{)/g,'<code style="color:#800080">$1</code>'); 
    }

    str = hltcomment(str);
        
    str = str.replace(/(\/.*\/[gmi]?,)/g,function($0,$1){
    var t1 = $1.replace(/commas1{3}/g,"'").replace(/commas2{3}/g,'"');
    var re= new RegExp($1.quote(), "");
    var tmp = $0.replace(re,t1);
    return tmp;

    });
    
    if (!document.all){
        codeblock[i].innerHTML = str.replace(/([\;\{])/g,"$1</br>");
    }
    else
    {   
      var div = creatediv(codeblock[i]);    
      str = indentIE(str,"^(\\s*)");
      str = indentIE(str,"\\n([\\t ]*)");
      str = str.replace(/\n/g,"</br>");
      div.innerHTML = str;
      div.style.paddingBottom="10px";
     }
  }
}

function indentIE(str,regex) {
var re= new RegExp(regex, "g");
return str.replace(re,function($0,$1){      
       var b ="";
       for (k=0;k<$1.length;k++) {
           var a = $1.charAt(k);
           if (a==" ") b+="&nbsp;";
           if (a=="\t") b+="&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
       }
       var re= new RegExp($1, "");
       return $0.replace(re,b);
    });
}

function creatediv(el) {

var div = document.createElement("div");
div.className = el.className;

el.parentNode.insertBefore(div,el);
el.parentNode.removeChild(el);
return div;
}

function hltstring(str) {

str = str.replace(/(\/.*\/[gmi]?,)/g,function($0,$1){
    
    var t1 = $1.replace(/\'/g,"commas111").replace(/"/g,"commas222");
    var re= new RegExp($1.quote(), "");
    var tmp = $0.replace(re,t1);
 
    return tmp;

});
str = str.replace(/('[^'\n]*')/g,"<span style='color:#c00000'>$1</span>");
return str.replace(/("[^"\n]*")/g,'<span style="color:#c00000">$1</span>');
} 

String.prototype.hash=function() {
return this.replace(/</g,"&lt;").replace(/>/g,"&gt;");
}

String.prototype.quote=function() {
return this.replace(/([!$^*()|\\[\]<>?:=+])/g,"\\$1");

}

function hltcomment(str) {
var re0= new RegExp("(\\s+//.*)", "g");
var strcom = str.replace(re0, function($0,$1){
    var tmp = $1.split(/<[a-zA-Z\/][^>]*>/g);
    tmp = tmp.join("");
    var re= new RegExp( $1.quote(), "");
    var result = $0.replace(re,'<span style="color:green">'+tmp+'</span>');
    return result;
});

return strcom;
}

function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp('(^|\\\\s)'+searchClass+'(\\\\s|$)');
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

