
/*
Author: Manuel Ortega (manuel@ortega.cl)
2007-02-20 v0.2
	Added Basic Sintax Highlight, Favicons, Detach Code, Textarea Resizer
	Added more videos: iFilm, Revver, Bolt
	Removed Prototype library
2007-02-17 v0.1
	First Version, Youtube, Google Video & Metacafe
*/


// from Quirksmode http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html
function addEvent( obj, type, fn )
{
	if (obj.addEventListener)
		obj.addEventListener( type, fn, false );
	else if (obj.attachEvent)
	{
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
	}
}


// Favicons
function favicons( div ) {
	var as = div.getElementsByTagName( 'a' );
	for( var i = 0; as[i]; i++ ) {
		var a = as[i];
		if( a.href == undefined ) continue;
		if( a.href.indexOf( document.location.protocol+'//'+document.location.hostname ) == -1 ) {
			var url = a.href.match( /^(https?:\/\/[^\/]+)/ );
			if( url ) a.innerHTML = '<img src="'+url[1]+'/favicon.ico" width="0" height="0" onload="this.width=this.height=16" alt=" " /> '+a.innerHTML;
		}
	}
}


/*// Videos
function videos( div ) {
	var width = 400;
	var height = 326;

	var sites = {
		'youtube': { 'player': 'http://www.youtube.com/v/<vid>', 'var': 'video_id' },
		'metacafe': { 'player': 'http://images.metacafe.com/f/fvp/EmbedVideoPlayer_5.0.0.0.swf', 'var': 'itemID' },
		'google': { 'player': 'http://video.google.com/googleplayer.swf', 'var': 'docId' },
		'ifilm': { 'player': 'http://www.ifilm.com/efp', 'var': 'flvbaseclip' },
		'revver': { 'player': 'http://flash.revver.com/player/1.0/player.swf', 'var': 'mediaId' },
		'bolt': { 'player': 'http://www.bolt.com/video/flv_player_branded.swf', 'var': 'contentId' }
	}

	var addvideo = function( obj, site, vid ) {
		var div = document.createElement( 'div' );
		div.setAttribute( 'class', 'video' );
		var c = '<object type="application/x-shockwave-flash" data="<player>" width="'+width+'" height="'+height+'"><param name="movie" value="<player>" /><param name="FlashVars" value="<var>=<vid>" /><param name="wmode" value="transparent" /></object>';
		div.innerHTML = c.replace( /<player>/g, sites[site]['player'] ).replace( /<var>/g, sites[site]['var'] ).replace( /<vid>/g, vid );
		obj.parentNode.insertBefore( div, obj );
	}

	var as = div.getElementsByTagName( 'a' );
	for( var i = 0; as[i]; i++ ) {
		var a = as[i];
		if( a.href == undefined ) continue;
		if( vid = a.href.match( /^http:\/\/(?:www\.)?youtube\.com\/watch\?v=([^&]+)/ ) ) {
			addvideo( a, 'youtube', vid[1] );
		} else if( vid = a.href.match( /^http:\/\/www\.metacafe\.com\/watch\/([^\/]+)/ ) ) {
			addvideo( a, 'metacafe', vid[1] );
		} else if( vid = a.href.match( /^http:\/\/video\.google\.com\/videoplay\?docid=([^&]+)/ ) ) {
			addvideo( a, 'google', vid[1] );
		} else if( vid = a.href.match( /^http:\/\/www\.ifilm\.com\/video\/([^\?\/]+)/ ) ) {
			addvideo( a, 'ifilm', vid[1] );
		} else if( vid = a.href.match( /^http:\/\/one\.revver\.com\/watch\/([^\?\/]+)/ ) ) {
			addvideo( a, 'revver', vid[1] );
		} else if( vid = a.href.match( /^http:\/\/www\.bolt\.com\/[^\/]+\/video\/[^\/]+\/([^\?\/]+)/ ) ) {
			addvideo( a, 'bolt', vid[1] );
		}
	}
}
*/


// Basic Sintax Highlight
function syntax( div ) {

	// VARS
	var conf = {
		'comment_start': '/*',
		'comment_end': '*/',
		'comment_one_line': '//',
		'brackets': [ '(', '[', '{', '}', ']', ')' ],
		'keywords1': [],
		'keywords2': [],
		'keywords3': []
	};

	var styles = {
		'line_number': 'color: green;',
		'keywords1':   'color: darkblue;',
		'keywords2':   'color: darkblue;',
		'keywords3':   'color: darkblue;',
		'keywords4':   'color: darkblue;',
		'comment':     'color: gray;',
		'bracket':     'color: red; font-weight: bold;',
		'quote':       'color: green;'
	};

	var cache = new Array();

	// FUNCTIONS
	var escapeHTML = function( s ) {
		return s.replace( /</g, '&gt;' ).replace( />/g, '&lt;' );
	}

	var addCache = function( tag, str ) {
		pos = cache.length;
		cache[pos] = [ tag, str ];
		return '\nCACHE__'+pos+'\n';
	}

	var apply = function( str, key ) {
		if( conf[key] == '' || conf[key] == undefined ) return str;
		var re = new RegExp( '\\b('+conf[key]+')\\b', 'gi' );
		return str.replace( re, function( a, b ) { return addCache( key, a ); } );
	}

	var cmp = function( a, b ) {
		a = a.length;
		b = b.length;
		return (a > b) - (a < b);
	}

	var clean = function( s ) {
		return escapeHTML( s ).replace( /([\/\\\$\*\+\?\{\}\(\)\[\]\.\|])/g, '\\$1' );
	}

	var highlight = function( pre ) {
		var str = escapeHTML( pre.innerHTML ).replace( /^\s+/, '' ).replace( /\s+$/, '' );
		if( str.length > 10000 ) return;

		if( ! pre.className ) {
		} else if( pre.className == 'done' ) {
			return;
		} else if( pre.className.match( /\bcss\b/ ) ) {
			conf['keywords1'] = [ 'background', 'background-attachment', 'background-color', 'background-image', 'background-position', 'background-repeat', 'border', 'border-bottom', 'border-bottom-color', 'border-bottom-style', 'border-bottom-width', 'border-collapse', 'border-color', 'border-left', 'border-left-color', 'border-left-style', 'border-left-width', 'border-right', 'border-right-color', 'border-right-style', 'border-right-width', 'border-spacing', 'border-style', 'border-top', 'border-top-color', 'border-top-style', 'border-top-width', 'border-width', 'bottom', 'caption-side', 'clear', 'clip', 'color', 'content', 'counter-increment', 'counter-reset', 'cursor', 'direction', 'display', 'display', 'empty-cells', 'float', 'font', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'height', 'left', 'letter-spacing', 'line-height', 'list-style', 'list-style-image', 'list-style-position', 'list-style-type', 'margin', 'margin-bottom', 'margin-left', 'margin-right', 'margin-top', 'marker-offset', 'max-height', 'max-width', 'min-height', 'min-width', 'outline', 'outline-color', 'outline-style', 'outline-width', 'overflow', 'padding', 'padding-bottom', 'padding-left', 'padding-right', 'padding-top', 'position', 'quotes', 'right', 'table-layout', 'text-align', 'text-decoration', 'text-indent', 'text-shadow', 'text-transform', 'top', 'unicode-bidi', 'vertical-align', 'visibility', 'white-space', 'width', 'word-spacing', 'z-index' ];
			conf['keywords2'] = [ '!important', '%', '@charset', '@font-face', '@import', '@media', '@page', 'Hz', 'active', 'attr', 'cm', 'cursive', 'deg', 'em', 'ex', 'fantasy', 'first-child', 'focus', 'grad', 'hover', 'in', 'kHz', 'lang', 'link', 'local', 'mm', 'monospace', 'ms', 'pc', 'pt', 'px', 'rad', 'rgb', 's', 'sans-serif', 'serif', 'url', 'visited' ];
			conf['keywords3'] = [ 'ASCII', 'EBCDIC', 'ISO-8859-1', 'ISO-8859-15', 'UCS-4', 'US-ASCII', 'UTF-16', 'UTF-8', 'above', 'absolute', 'all', 'always', 'armenian', 'aural', 'auto', 'avoid', 'baseline', 'behind', 'below', 'bidi-override', 'bitmap', 'blink', 'block', 'bold', 'bolder', 'both', 'bottom', 'braille', 'capitalize', 'caption', 'center', 'center-left', 'center-right', 'circle', 'cjk-ideographic', 'close-quote', 'collapse', 'compact', 'condensed', 'continuous', 'crop', 'cross', 'crosshair', 'dashed', 'decimal', 'decimal-leading-zero', 'default', 'digits', 'disc', 'dotted', 'double', 'e-resize', 'embed', 'embossed', 'expanded', 'extra-condensed', 'extra-expanded', 'far-left', 'far-right', 'fast', 'faster', 'fixed', 'format', 'georgian', 'grid', 'groove', 'handheld', 'hebrew', 'help', 'hidden', 'hide', 'high', 'higher', 'hiragana', 'hiragana-iroha', 'icon', 'inherit', 'inline', 'inline-table', 'inset', 'interactive', 'invert', 'italic', 'justify', 'katakana', 'katakana-iroha', 'landscape', 'left', 'left-side', 'leftwards', 'level', 'lighter', 'line-through', 'list-item', 'loud', 'low', 'lower', 'lower-alpha', 'lower-greek', 'lower-latin', 'lower-roman', 'lowercase', 'ltr', 'marker', 'medium', 'menu', 'message-box', 'middle', 'move', 'n-resize', 'narrower', 'ne-resize', 'no-close-quote', 'no-open-quote', 'no-repeat', 'none', 'normal', 'nowrap', 'nw-resize', 'oblique', 'once', 'open-quote', 'outset', 'overline', 'paged', 'pointer', 'portrait', 'pre', 'print', 'projection', 'relative', 'repeat', 'repeat-x', 'repeat-y', 'ridge', 'right', 'right-side', 'rightwards', 'rtl', 'run-in', 's-resize', 'screen', 'scroll', 'se-resize', 'semi-condensed', 'semi-expanded', 'separate', 'show', 'silent', 'slow', 'slower', 'small-caps', 'small-caption', 'soft', 'solid', 'spell-out', 'square', 'static', 'status-bar', 'sub', 'super', 'sw-resize', 'table', 'table-caption', 'table-cell', 'table-column', 'table-column-group', 'table-footer-group', 'table-header-group', 'table-row', 'table-row-group', 'tactile', 'text', 'text-bottom', 'text-top', 'top', 'transparent', 'tty', 'tv', 'ultra-condensed', 'ultra-expanded', 'underline', 'upper-alpha', 'upper-latin', 'upper-roman', 'uppercase', 'visible', 'visual', 'w-resize', 'wait', 'wider', 'x-fast', 'x-high', 'x-loud', 'x-low', 'x-slow', 'x-soft' ];

		} else if( pre.className.match( /\bphp\b/ ) ) {
			conf['keywords1'] = [ 'as', 'break', 'case', 'continue', 'do', 'else', 'elseif', 'endfor', 'endif', 'endswitch', 'endwhile', 'exit', 'for', 'foreach', 'if', 'include', 'include_once', 'require', 'require_once', 'return', 'switch', 'while', 'array', 'double', 'float', 'int', 'integer', 'object', 'real', 'string', 'and', 'die', 'echo', 'new', 'or', 'print', 'xor', 'class', 'const', 'extends', 'function', 'global', 'list', 'old_function', 'static', 'var' ];
			conf['keywords2'] = [ '__FILE__', '__LINE__', 'PHP_VERSION', 'PHP_OS', 'TRUE', 'true', 'FALSE', 'false', 'E_ERROR', 'E_WARNING', 'E_PARSE', 'E_NOTICE', 'E_ALL', 'E_CORE_ERROR', 'E_CORE_WARNING', 'E_COMPILE_ERROR', 'E_COMPILE_WARNING', 'E_USER_ERROR', 'E_USER_WARNING', 'E_USER_NOTICE', '$GATEWAY_INTERFACE', '$SERVER_NAME', '$SERVER_SOFTWARE', '$SERVER_PROTOCOL', '$REQUEST_METHOD', '$QUERY_STRING', '$DOCUMENT_ROOT', '$HTTP_ACCEPT', '$HTTP_ACCEPT_CHARSET', '$HTTP_ENCODING', '$HTTP_ACCEPT_LANGUAGE', '$HTTP_CONNECTION', '$HTTP_HOST', '$HTTP_REFERER', '$HTTP_USER_AGENT', '$REMOTE_ADDR', '$REMOTE_PORT', '$SCRIPT_FILENAME', '$SERVER_ADMIN', '$SERVER_PORT', '$SERVER_SIGNATURE', '$PATH_TRANSLATED', '$SCRIPT_NAME', '$REQUEST_URI', '$argv', '$argc', '$PHP_SELF', '$HTTP_COOKIE_VARS', '$HTTP_GET_VARS', '$HTTP_POST_VARS', '$HTTP_POST_FILES', '$HTTP_ENV_VARS', '$HTTP_SERVER_VARS', '$this', '$_POST', '$_GET', '$_SESSION', '$_COOKIE', '$_ENV', '$_SERVER', '$_REQUEST', '$_FILES', '$GLOBALS', '$PHP_AUTH_USER', '$PHP_AUTH_PW', '$PHP_AUTH_TYPE', '$REMOTE_USER' ];
			conf['keywords4'] = [ 'array', 'array_count_values', 'array_diff', 'array_flip', 'array_intersect', 'array_keys', 'array_merge', 'array_merge_recursive', 'array_multisort', 'array_pad', 'array_pop', 'array_push', 'array_rand', 'array_reverse', 'array_shift', 'array_slice', 'array_splice', 'array_unique', 'array_unshift', 'array_values', 'array_walk', 'arsort', 'asort', 'compact', 'count', 'current', 'each', 'end', 'extract', 'in_array', 'array_search', 'key', 'krsort', 'ksort', 'list', 'natsort', 'natcasesort', 'next', 'pos', 'prev', 'range', 'reset', 'rsort', 'shuffle', 'sizeof', 'sort', 'uasort', 'uksort', 'usort', 'JDToGregorian', 'GregorianToJD', 'JDToJulian', 'JulianToJD', 'JDToJewish', 'JewishToJD', 'JDToFrench', 'FrenchToJD', 'JDMonthName', 'JDDayOfWeek', 'easter_date', 'easter_days', 'unixtojd', 'jdtounix', 'checkdate', 'date', 'getdate', 'gettimeofday', 'gmdate', 'gmmktime', 'gmstrftime', 'localtime', 'microtime', 'mktime', 'strftime', 'time', 'strtotime', 'chroot', 'chdir', 'dir', 'closedir', 'getcwd', 'opendir', 'readdir', 'rewinddir', 'basename', 'chgrp', 'chmod', 'chown', 'clearstatcache', 'copy', 'delete', 'dirname', 'diskfreespace', 'fclose', 'feof', 'fflush', 'fgetc', 'fgetcsv', 'fgets', 'fgetss', 'file', 'file_exists', 'fileatime', 'filectime', 'filegroup', 'fileinode', 'filemtime', 'fileowner', 'fileperms', 'filesize', 'filetype', 'flock', 'fopen', 'fpassthru', 'fputs', 'fread', 'fscanf', 'fseek', 'fstat', 'ftell', 'ftruncate', 'fwrite', 'set_file_buffer', 'is_dir', 'is_executable', 'is_file', 'is_link', 'is_readable', 'is_writable', 'is_uploaded_file', 'link', 'linkinfo', 'mkdir', 'move_uploaded_file', 'pclose', 'popen', 'readfile', 'readlink', 'rename', 'rewind', 'rmdir', 'stat', 'lstat', 'realpath', 'symlink', 'tempnam', 'tmpfile', 'touch', 'umask', 'unlink', 'bindtextdomain', 'dcgettext', 'dgettext', 'gettext', 'textdomain', 'abs', 'acos', 'asin', 'atan', 'atan2', 'base_convert', 'bindec', 'ceil', 'cos', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'floor', 'getrandmax', 'hexdec', 'lcg_value', 'log', 'log10', 'max', 'min', 'mt_rand', 'mt_srand', 'mt_getrandmax', 'number_format', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sqrt', 'srand', 'tan', 'preg_match', 'preg_match_all', 'preg_replace', 'preg_split', 'preg_quote', 'preg_grep', 'ereg', 'ereg_replace', 'eregi', 'eregi_replace', 'split', 'spliti', 'sql_regcase', 'AddCSlashes', 'AddSlashes', 'bin2hex', 'Chop', 'Chr', 'chunk_split', 'convert_cyr_string', 'count_chars', 'crc32', 'crypt', 'explode', 'get_html_translation_table', 'get_meta_tags', 'hebrev', 'hebrevc', 'htmlentities', 'htmlspecialchars', 'implode', 'join', 'levenshtein', 'localeconv', 'ltrim', 'md5', 'Metaphone', 'nl2br', 'Ord', 'parse_str', 'printf', 'quoted_printable_decode', 'quotemeta', 'rtrim', 'sscanf', 'setlocale', 'similar_text', 'soundex', 'sprintf', 'strncasecmp', 'strcasecmp', 'strchr', 'strcmp', 'strcoll', 'strcspn', 'strip_tags', 'stripcslashes', 'stripslashes', 'stristr', 'strlen', 'strnatcmp', 'strnatcasecmp', 'strncmp', 'str_pad', 'strpos', 'strrchr', 'str_repeat', 'strrev', 'strrpos', 'strspn', 'strstr', 'strtok', 'strtolower', 'strtoupper', 'str_replace', 'strtr', 'substr', 'substr_count', 'substr_replace', 'trim', 'ucfirst', 'ucwords', 'wordwrap' ];

		} else if( pre.className.match( /\bxml\b/ ) ) {
			conf['comment_one_line'] = '----';
			conf['comment_start'] = '<!--';
			conf['comment_end'] = '-->';
			conf['brackets'] = [ '<', '>' ];
			conf['keywords1'] = [ '!ATTLIST', '!DOCTYPE', '!ELEMENT', '!ENTITY' ];
			conf['keywords2'] = [ '#FIXED', '#IMPLIED', '#PCDATA', 'PUBLIC' ];

		} else if( pre.className.match( /\bjavascript\b/ ) ) {
			conf['keywords1'] = [ 'alert', 'all', 'body', 'break', 'byteToString', 'case', 'continue', 'default', 'delete', 'do', 'document', 'else', 'event', 'export', 'for', 'function', 'if', 'import', 'in', 'isNaN', 'item', 'mimeTypes', 'navigator', 'new', 'onAbort', 'onBlur', 'onChange', 'onClick', 'onDblClick', 'onDragDrop', 'onError', 'onFocus', 'onKeyDown', 'onKeyPress', 'onKeyUp', 'onLoad', 'onMouseDown', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onMove', 'onReset', 'onSelect', 'onSubmit', 'onUnload', 'onresize', 'options', 'parseFloat', 'parseInt', 'prototype', 'return', 'screen', 'switch', 'unit', 'var', 'void', 'while', 'window', 'with' ];
			conf['keywords2'] = [ 'Array', 'Boolean', 'Date', 'Function', 'Image', 'Layer', 'Math', 'Number', 'Object', 'Option', 'RegExp', 'String', 'caption', 'cols', 'colspan', 'col', 'colgroup', 'multicol', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr' ];
			conf['keywords3'] = [ 'Anchor', 'Applet', 'Area', 'Button', 'Checkbox', 'FileUpload', 'Form', 'Frame', 'Hidden', 'Link', 'MimeType', 'Password', 'Plugin', 'Radio', 'Reset', 'Select', 'Submit', 'Text', 'Textarea', 'abs', 'acos', 'alert', 'anchor', 'asin', 'atan', 'atan2', 'back', 'big', 'blink', 'blur', 'bold', 'captureEvents', 'ceil', 'charAt', 'charCodeAt', 'clearInterval', 'clearTimeout', 'click', 'close', 'concat', 'confirm', 'cos', 'disableExternalCapture', 'enableExternalCapture', 'eval', 'exp', 'find', 'fixed', 'floor', 'focus', 'fontcolor', 'fontsize', 'forward', 'fromCharCode', 'getDate', 'getDay', 'getHours', 'getMinutes', 'getMonth', 'getOptionValue', 'getOptionVAlueCount', 'getSeconds', 'getSelection', 'getTime', 'getTimezoneOffset', 'getYear', 'go', 'handleEvent', 'home', 'indexOf', 'italics', 'javaEnabled', 'join', 'lastIndexOf', 'link', 'load', 'log', 'match', 'max', 'min', 'moveAbove', 'moveBelow', 'moveBy', 'moveTo', 'moveToAbsolute', 'open', 'parse', 'plugins', 'pop', 'pow', 'preference', 'print', 'prompt', 'push', 'random', 'refresh', 'releaseEvents', 'reload', 'replace', 'reset', 'resizeBy', 'resizeTo', 'reverse', 'round', 'routeEvent', 'scroll', 'scrollBy', 'scrollTo', 'search', 'select', 'setDate', 'setHours', 'setInterval', 'setMinutes', 'setMonth', 'setSeconds', 'setTime', 'setTimeout', 'setYear', 'shift', 'sin', 'slice', 'small', 'sort', 'splice', 'split', 'sqrt', 'stop', 'strike', 'sub', 'submit', 'substr', 'substring', 'sup', 'taintEnabled', 'tan', 'toGMTString', 'toLocaleString', 'toLowerCase', 'toString', 'toUpperCase', 'unshift', 'unwatch', 'UTC', 'valueOf', 'watch', 'write', 'writeln' ];
			conf['keywords4'] = [ 'E', 'LN10', 'LN2', 'LOG10E', 'LOG2E', 'MAX_VALUE', 'MIN_VALUE', 'NEGATIVE_INFINITY', 'NaN', 'PI', 'POSITIVE_INFINITY', 'URL', 'above', 'action', 'alinkColor', 'anchors', 'appCodeName', 'appName', 'appVersion', 'applets', 'arguments', 'arity', 'availHeight', 'availWidth', 'background', 'backgroundColor', 'below', 'bgColor', 'border', 'bottom', 'caller', 'cancelBubble', 'checked', 'clientHeight', 'clientWidth', 'clientX', 'clientY', 'clip', 'closed', 'color', 'colorDepth', 'complete', 'constructor', 'cookie', 'count', 'current', 'defaultChecked', 'defaultSelected', 'defaultStatus', 'defaultValue', 'description', 'display', 'document', 'domain', 'elements', 'embeds', 'enabledPlugin', 'encoding', 'false', 'fgColor', 'filename', 'form', 'formName', 'forms', 'frames', 'hash', 'height', 'history', 'host', 'hostname', 'href', 'hspace', 'images', 'innerHeight', 'innerWidth', 'language', 'lastModified', 'layers', 'left', 'length', 'linkColor', 'links', 'location', 'locationbar', 'lowsrc', 'menubar', 'method', 'mimeTypes', 'name', 'next', 'null', 'offsetHeight', 'offsetLeft', 'offsetParent', 'offsetWidth', 'opener', 'outerHeight', 'outerWidth', 'pageX', 'pageXOffset', 'pageY', 'pageYOffset', 'parent', 'parentLayer', 'pathname', 'personalbar', 'pixelDepth', 'platform', 'plugins', 'port', 'posWidth', 'previous', 'protocol', 'prototype', 'referrer', 'right', 'scrollTop', 'scrollbars', 'search', 'selected', 'selectedIndex', 'self', 'siblingAbove', 'siblingBelow', 'src', 'srcElement', 'status', 'statusbar', 'style', 'suffixes', 'tags', 'target', 'text', 'this', 'title', 'toolbar', 'top', 'true', 'type', 'userAgent', 'value', 'visibility', 'vlinkColor', 'vspace', 'width', 'window', 'zIndex' ];
		}

		for( var i in conf ) {
			if( typeof( conf[i] ) == 'object' ) {
				conf[i].sort( cmp );
				for( var j = 0; conf[i][j]; j++ ) conf[i][j] = clean( conf[i][j] );
				conf[i] = conf[i].join( '|' );
			} else {
				conf[i] = clean( conf[i] );
			}
		}

		re = new RegExp( '('+conf['comment_start']+'[\\s\\S]*?'+conf['comment_end']+'|'+conf['comment_one_line']+'.*?\\n)', 'mg' );
		str = str.replace( re, function( a, b ) { return addCache( 'comment', b ); } );

		str = str.replace( /(".*?"|'.*?')/g, function( a, b ) { return addCache( 'quote', b ); } );

		re = new RegExp( '('+conf['brackets']+')', 'g' );
		str = str.replace( re, function( a, b ) { return addCache( 'bracket', b ); } );

		str = apply( str, 'keywords1' );
		str = apply( str, 'keywords2' );
		str = apply( str, 'keywords3' );
		str = apply( str, 'keywords4' );

		str = str.replace( /\nCACHE__(\d+)\n/g, function( a, b ) { return '<span style="'+styles[cache[b][0]]+'" class="'+cache[b][0]+'">'+cache[b][1]+'</span>'; } );

		var i = 1;
		str = '<span style="'+styles['line_number']+'" class="line_number">  1. </span>'+str;
		str = str.replace( /(\n\r|\r\n|\n|\r)/mg, function(match) { i = ++i<100?' '+(i<10?' '+i:i):i; return match+'<span style="'+styles['line_number']+'" class="line_number">'+i+'. </span>'; } );

		if( 'outerHTML' in pre ) pre.outerHTML = '<pre class="done">'+str+'</pre>';
		else pre.innerHTML = str;
	}

	var pres = div.getElementsByTagName( 'pre' );
	for( var i = 0; pres[i]; i++ ) {
		if( pres[i].innerHTML ) highlight( pres[i] );
	}
}


// Detach Code
function detach( arg ) {
	if( typeof arg == 'object' ) {
		for( var i = 0; arg.childNodes[i]; i++ ) {
			if( arg.childNodes[i].tagName != 'DIV' || arg.childNodes[i].className != 'codebox' ) continue;
			var h4s = arg.childNodes[i].getElementsByTagName( 'h4' );
			var id = 'detach_'+Math.floor( Math.random()*10000 );
			h4s[0].innerHTML = '<a href="javascript:detach(\''+id+'\')" id="'+id+'">'+h4s[0].innerHTML+'</a>';
		}
	} else {
		var w = window.open( '', 'code' );
		w.document.open();
		w.document.write( '<html><body>'+document.getElementById( arg ).parentNode.parentNode.parentNode.innerHTML+'</body></html>' );
		w.document.close();
		w.focus();
		return void(0);
	}
}


// Textarea Resizer based on http://tuckey.org/textareasizer/
// TODO: long lines (>textarea.cols) break algorithm
function resizer( t ) {
	var resize = function( t ) {
		if( ! ( 'rows' in t ) ) t = this;
		if( ! t.value ) return;
		var v = t.value.replace( new RegExp( '.{'+t.cols+'}', 'mg' ), "!!!\n" );
		var nl = (v.match( /(\r\n|\n\r|\n|\r)/g ) || '').length + 1;
		t.rows = Math.max( t.min, nl );
	}
	t.min = t.rows;
	addEvent( t, 'keydown', resize );
	addEvent( t, 'keyup', resize );
	resize( t );
}



// Javascript Trigger
addEvent( window, 'load', function() {

	var t = document.getElementsByTagName( 'textarea' );
	for( var i = 0; t[i]; i++ ) {
		resizer( t[i] );
	}

	var divs = document.getElementsByTagName( 'div' );
	for( var i = 0; divs[i]; i++ ) {
		if( divs[i].className == undefined || divs[i].className != 'postmsg' ) continue;
		detach( divs[i] );
		videos( divs[i] );
		syntax( divs[i] );
		favicons( divs[i] );
	}
} );

