/* Color Code samples
	V1.0 by Marc Derksen

	WMR 2008-1-8 Modified to work on Firefox

Required styles:

 span.scan { color:red }  attribute name
 span.scav { color:blue }  attribute value
 span.sctn { color:brown }  tag name
 span.scto,span.sctc { color:blue }  tag open, tag close
 span.scvo,span.scvc { color:green }  viper open, viper close

*/

function applySyntaxColoring(sin,ctype)
{
	var i,s,idx;

	if (ctype=='sql') {
		// sql
		sin= sin.replace(/([^'])('(?:[^']|'')*')(?=[^'])/g, '$1<span class="scan">$2</span>');
		sin= sin.replace(/(^|[\s\;\(\)\,])([A-Z_]+)(?=[\s\&\(\)\,]|$)/g, '$1<span class="scav">$2</span>');
		sin= sin.replace(/(--[^\n\r]*|\/\*(?:[^\*]|\*(?!\/))*\*\/)/g, '<span class="scvo">$1</span>');
	}
	else {
		// xml tags
		var matches= sin.match(/&lt;[\/\?\!]?[\w:\.]+((?:\s|&nbsp;)+[\w:\.]+="[^"]*")*(?:\s|&nbsp;)*[\/\?]?&gt;/gi);
		if (matches) {
			for (i=0; i<matches.length; i++) {
				s= matches[i];
				s= s.replace(/(\s|&nbsp;)([\w:\.]+)=("[^"]*")/g,'$1<span class="scan">$2</span>=<span class="scav">$3</span>');
				s= s.replace(/^(&lt;[\/\?\!]?)([\w:\.]+)/,'<span class="scto">$1</span><span class="sctn">$2</span>');
				s= s.replace(/([\/\?]?&gt;)$/,'<span class="sctc">$1</span>');

				idx= sin.indexOf(matches[i]);
				if (idx>=0) sin= sin.substring(0,idx)+ s + sin.substr(idx+matches[i].length);
			}
		}
	}
	// vipers
	sin= sin.replace(/(\{[a-z][a-z0-9_\.]{2,79}\()/g,'<span class="scvo">$1</span>');
	sin= sin.replace(/(\)\})/g,'<span class="scvc">$1</span>');

	return sin;
}

function colorCodeSamples()
{
	var i,n=0,elm,elms,ctype;
	var tagelems= new Array(), tagctypes= new Array();
	// detect code blocks
	elms= document.getElementsByTagName("PRE");
	for (i=0; i<elms.length; i++) {
		elm= elms[i];
		if (elm.getAttribute("xml:space")=="preserve") {
			pelm= elm.parentNode;
			for (p=0; p<10 && pelm; p++) {  // max 10 levels up
				ctype= pelm.getAttribute("codelanguage");  // find codelanguage attribute
				if (ctype!=null) {
					tagelems[n] = elm;
					tagctypes[n++]= ctype;
					break;
				}
				pelm= pelm.parentNode;
			}
		}
	}
	// update	code blocks
	for	(i=0; i<tagelems.length; i++)	{
			elm= tagelems[i];
			// if (elm) elm.innerHTML= applySyntaxColoring(elm.innerHTML);
			if (elm) {
					if (elm.outerHTML){	// Only	IE supports	outerHTML, but only	IE removes whitespace	from innerHTML
							elm.outerHTML = "<pre xml:space=\"preserve\">" + applySyntaxColoring(elm.innerHTML, tagctypes[i]) + "</pre>"
					} else {
							elm.innerHTML = applySyntaxColoring(elm.innerHTML, tagctypes[i]);
					}
			}
	}
}
