/*** --------------------------------------------------------------- ***/
String.prototype.trim = function() { return this.replace(/^\s+|\s+$/, ""); }
String.prototype.ltrim = function() { return this.replace(/^\s+/,""); }
String.prototype.rtrim = function() { return this.replace(/\s+$/,""); }
/*** --------------------------------------------------------------- ***/
String.prototype.fixTabs = function() { return this.replace(/[\t]/g, "     "); }
String.prototype.countRows = function(){
	var nNewLineCode = 10; // Character code for new line
	var bHasNewLine = 0;
	for(var i = 0; i < this.length; i++) {
		var cChar = parseInt(this.charCodeAt(i));
		var cCharNext = parseInt(this.charCodeAt(i + 1));
		if((cChar == 13) && (cCharNext == 10)){
			bHasNewLine++; i++; continue;
		}
		if((cChar == 10) || (cChar == 13)) {
			bHasNewLine++; continue;
		}
	}
	if(!bHasNewLine) return 0;
	if(jQuery) bHasNewLine += (!!jQuery.browser.opera * 1);
	return bHasNewLine + 1;
}
/*** --------------------------------------------------------------- ***/
String.prototype.longestLine = function(tablen){
	if(!tablen) tablen = 10;
	var lines = this.split(/[\r\n]+/g);
	var maxlen = 0;
	for(var i=0;i<lines.length;i++){
		var line = lines[i];
		var tabs = line.match(/[\t]/g);
		var linelen = line.length;
		if(tabs) linelen += tabs.length * tablen;
		maxlen = (linelen > maxlen) ? linelen : maxlen;
	}
	return maxlen;
}
/*** --------------------------------------------------------------- ***/
jQuery(function(){
	var codeBoxes = jQuery('code');
	codeBoxes.each(function(){
		var codeBox = jQuery(this); // <CODE> box
		var textArea = jQuery('<textarea wrap="off"></textarea>'); // New textarea with CSS
		textArea.attr('style','overflow: auto; width:100%; background-color:#fff; border:1px solid #ddd; font-family:courier new; font-size:13px;');
		textArea = textArea.insertAfter(codeBox); // Insert TEXTAREA
		//--
		var codeText = codeBox.text(); // Get CODE text
		codeText = codeText.trim(); // trim
		// codeText = codeText.fixTabs(); // replace tabs
		textArea.text(codeText); // Assign text to textarea
		var codeRows = codeText.countRows(); // Row count
		var codeCols = codeText.longestLine(); // Col count
		textArea.attr( { rows: codeRows, cols: codeCols } ); // Assign to textarea
		textArea.css('display','none'); // Hide text-area
		//--
		var containerDiv = jQuery('<div style="border:1px solid #ddd; padding:10px;"></div>');
		containerDiv = containerDiv.insertBefore(codeBox); // Create container
		//--
		var textAreaWrap = jQuery('<div></div>');
		textAreaWrap.append(textArea);
		containerDiv.append(codeBox).append(textAreaWrap);
		jQuery(codeBox,textArea).css('line-height','17px');
		//--
		var toolbarDiv = jQuery('<div></div>');
		toolbarDiv.attr('style','border-bottom:1px solid #eee; margin-bottom:10px; ' +
			'padding:5px; text-align:center;');
		containerDiv.prepend(toolbarDiv);
		//--
		var hightlightedLink = jQuery('<a href="#">Show Code Highlight</a>');
		var copyfriendlyLink = jQuery('<a href="#">Show Copy/Paste Version</a>');
		//--
		toolbarDiv.append(copyfriendlyLink).append(' &#8212; ').append(hightlightedLink);
		toolbarDiv.append(' &#8212; <span style="font-style:italic; color:#aaa;">by ' +
			'<a href="http://blog.5ubliminal.com/" target="_blank">5ubliminal</a></span>');
		//--
		copyfriendlyLink.click(function(){
			textArea.show(); // Show text-area
			codeBox.hide(); // Hide text-area
			return false;
		});
		hightlightedLink.click(function(){
			textArea.hide(); // Hide text-area
			codeBox.show(); // Show text-area
			return false;
		});
		return;
		// containerDiv.hide();
		var toggleCodePar = jQuery('<p></p>');
		var toggleCodeLink = jQuery('<a href="#">&#xD7; Toggle #'+codeRows+' lines code-block visibility &#xD7;</a>');
		toggleCodePar.append(toggleCodeLink);
		toggleCodePar.insertBefore(containerDiv);
		toggleCodeLink.click(function(){ containerDiv.toggle(); return false; });
	});
});
/*** --------------------------------------------------------------- ***/