diff -urpN render/jitr/heading.php render2/jitr/heading.php
--- render/jitr/heading.php	1970-01-01 12:00:00.000000000 +1200
+++ render2/jitr/heading.php	2008-05-23 15:48:47.658366700 +1200
@@ -0,0 +1,215 @@
+<?php
+
+/*
+    Dynamic Heading Generator
+    By Stewart Rosenberger
+    http://www.stewartspeak.com/headings/    
+
+    This script generates PNG images of text, written in
+    the font/size that you specify. These PNG images are passed
+    back to the browser. Optionally, they can be cached for later use. 
+    If a cached image is found, a new image will not be generated,
+    and the existing copy will be sent to the browser.
+
+    Additional documentation on PHP's image handling capabilities can
+    be found at http://www.php.net/image/    
+*/
+
+/*
+  Altered to be used with 'jitr' plugin
+*/
+
+function check_plain($text) {
+  return drupal_validate_utf8($text) ? htmlspecialchars($text, ENT_QUOTES) : '';
+}
+
+function drupal_validate_utf8($text) {
+  if (strlen($text) == 0) {
+    return TRUE;
+  }
+  return (preg_match('/^./us', $text) == 1);
+}
+
+# ?text=there&color=000000&bgcolor=000000&size=28&font=abcd.otf
+
+$font_file  = $_SERVER['DOCUMENT_ROOT'].'/'.check_plain($_GET["font"]);
+$font_size  = check_plain($_GET["size"]);
+$font_color = check_plain($_GET["color"]);
+$background_color = check_plain($_GET["bgcolor"]);
+$cache_folder = $_SERVER['DOCUMENT_ROOT'].'/'.check_plain($_GET["cache"]);
+$transparent_background  = TRUE ;
+$cache_images = TRUE ;
+
+/*
+  ---------------------------------------------------------------------------
+   For basic usage, you should not need to edit anything below this comment.
+   If you need to further customize this script's abilities, make sure you
+   are familiar with PHP and its image handling capabilities.
+  ---------------------------------------------------------------------------
+*/
+
+$mime_type = 'image/png' ;
+$extension = '.png' ;
+$send_buffer_size = 4096 ;
+
+// check for GD support
+if(!function_exists('ImageCreate'))
+    fatal_error('Error: Server does not support PHP image generation') ;
+
+// clean up text
+if(empty($_GET['text']))
+    fatal_error('Error: No text specified.') ;
+    
+$text = $_GET['text'].' ' ;
+if(get_magic_quotes_gpc())
+    $text = stripslashes($text) ;
+$text = javascript_to_html($text) ;
+
+// look for cached copy, send if it exists
+$hash = md5(basename($font_file) . $font_size . $font_color .
+            $background_color . $transparent_background . $text) ;
+$cache_filename = $cache_folder . '/' . $hash . $extension ;
+if($cache_images && ($file = @fopen($cache_filename,'rb')))
+{
+    header('Content-type: ' . $mime_type) ;
+    while(!feof($file))
+        print(($buffer = fread($file,$send_buffer_size))) ;
+    fclose($file) ;
+    exit ;
+}
+
+// check font availability
+$font_found = is_readable($font_file) ;
+if(!$font_found)
+{
+    fatal_error('Error: The server is missing the specified font.') ;
+}
+
+// create image
+$background_rgb = hex_to_rgb($background_color) ;
+$font_rgb = hex_to_rgb($font_color) ;
+$dip = get_dip($font_file,$font_size) ;
+$box = @ImageTTFBBox($font_size,0,$font_file,$text) ;
+$image = @ImageCreate(abs($box[2]-$box[0]),abs($box[5]-$dip)) ;
+if(!$image || !$box)
+{
+    fatal_error('Error: The server could not create this heading image.') ;
+}
+
+// allocate colors and draw text
+$background_color = @ImageColorAllocate($image,$background_rgb['red'],
+    $background_rgb['green'],$background_rgb['blue']) ;
+$font_color = ImageColorAllocate($image,$font_rgb['red'],
+    $font_rgb['green'],$font_rgb['blue']) ;   
+ImageTTFText($image,$font_size,0,-$box[0],abs($box[5]-$box[3])-$box[1],
+    $font_color,$font_file,$text) ;
+
+// set transparency
+if($transparent_background)
+    ImageColorTransparent($image,$background_color) ;
+
+header('Content-type: ' . $mime_type) ;
+ImagePNG($image) ;
+
+// save copy of image for cache
+if($cache_images)
+{
+    @ImagePNG($image,$cache_filename) ;
+}
+
+ImageDestroy($image) ;
+exit ;
+
+
+/*
+	try to determine the "dip" (pixels dropped below baseline) of this
+	font for this size.
+*/
+function get_dip($font,$size)
+{
+	$test_chars = 'abcdefghijklmnopqrstuvwxyz' .
+			      'ABCDEFGHIJKLMNOPQRSTUVWXYZ' .
+				  '1234567890' .
+				  '!@#$%^&*()\'"\\/;.,`~<>[]{}-+_-=' ;
+	$box = @ImageTTFBBox($size,0,$font,$test_chars) ;
+	return $box[3] ;
+}
+
+
+/*
+    attempt to create an image containing the error message given. 
+    if this works, the image is sent to the browser. if not, an error
+    is logged, and passed back to the browser as a 500 code instead.
+*/
+function fatal_error($message)
+{
+    // send an image
+    if(function_exists('ImageCreate'))
+    {
+        $width = ImageFontWidth(5) * strlen($message) + 10 ;
+        $height = ImageFontHeight(5) + 10 ;
+        if($image = ImageCreate($width,$height))
+        {
+            $background = ImageColorAllocate($image,255,255,255) ;
+            $text_color = ImageColorAllocate($image,0,0,0) ;
+            ImageString($image,5,5,5,$message,$text_color) ;    
+            header('Content-type: image/png') ;
+            ImagePNG($image) ;
+            ImageDestroy($image) ;
+            exit ;
+        }
+    }
+
+    // send 500 code
+    header("HTTP/1.0 500 Internal Server Error") ;
+    print($message) ;
+    exit ;
+}
+
+
+/* 
+    decode an HTML hex-code into an array of R,G, and B values.
+    accepts these formats: (case insensitive) #ffffff, ffffff, #fff, fff 
+*/    
+function hex_to_rgb($hex)
+{
+    // remove '#'
+    if(substr($hex,0,1) == '#')
+        $hex = substr($hex,1) ;
+
+    // expand short form ('fff') color
+    if(strlen($hex) == 3)
+    {
+        $hex = substr($hex,0,1) . substr($hex,0,1) .
+               substr($hex,1,1) . substr($hex,1,1) .
+               substr($hex,2,1) . substr($hex,2,1) ;
+    }
+
+    if(strlen($hex) != 6)
+        fatal_error('Error: Invalid color "'.$hex.'"') ;
+
+    // convert
+    $rgb['red'] = hexdec(substr($hex,0,2)) ;
+    $rgb['green'] = hexdec(substr($hex,2,2)) ;
+    $rgb['blue'] = hexdec(substr($hex,4,2)) ;
+
+    return $rgb ;
+}
+
+
+/*
+    convert embedded, javascript unicode characters into embedded HTML
+    entities. (e.g. '%u2018' => '&#8216;'). returns the converted string.
+*/
+function javascript_to_html($text)
+{
+    $matches = null ;
+    preg_match_all('/%u([0-9A-F]{4})/i',$text,$matches) ;
+    if(!empty($matches)) for($i=0;$i<sizeof($matches[0]);$i++)
+        $text = str_replace($matches[0][$i],
+                            '&#'.hexdec($matches[1][$i]).';',$text) ;
+
+    return $text ;
+}
+
+?>
diff -urpN render/jitr/jquery.jitr.js render2/jitr/jquery.jitr.js
--- render/jitr/jquery.jitr.js	1970-01-01 12:00:00.000000000 +1200
+++ render2/jitr/jquery.jitr.js	2008-05-23 17:49:42.778566700 +1200
@@ -0,0 +1,97 @@
+/* jQuery Image Text Replacement Alpha 1
+ * Author: Jamie Thompson (jamie_at_themagictorch_d0t_org) 
+ * Website: http://jamazon.co.uk
+ * 
+ * Copyright (c) 2008 Jamie Thompson
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/* Note: Slightly altered by Patrick Harris for the 'jitr' plugin
+*/
+(function($) {
+
+	$.fn.jitr = function(font, bgcolor, jitr_dir, jitr_cache){
+		
+		var hex = function(N) {
+			if(N==null) return "00";
+			N = parseInt(N);
+			if(N==0 || isNaN(N)) return "00";
+			N = Math.max(0, N);
+			N = Math.min(N, 255);
+			N = Math.round(N);
+			return "0123456789ABCDEF".charAt((N - N%16) / 16) + "0123456789ABCDEF".charAt(N%16);
+		};
+		
+		function hex2(s) {
+	        var s = parseInt(s).toString(16);
+	        return ( s.length < 2 ) ? '0'+s : s;
+	    };
+		
+	    function gpc(node) {
+	        for ( ; node && node.nodeName.toLowerCase() != 'html'; node = node.parentNode  ) {
+	            var v = jQuery.css(node,'backgroundColor');
+	            if ( v.indexOf('rgb') >= 0 ) { 
+	                rgb = v.match(/\d+/g); 
+	                return hex2(rgb[0]) + hex2(rgb[1]) + hex2(rgb[2]);
+	            }
+	            if ( v && v != 'transparent' )
+	                
+					return v;
+	        }
+	        return 'ffffff';
+	    };
+		
+		var hexed = function(color) {
+			if(!color) { return false; };
+			if(color.search('rgb') > -1) {
+				color = color.substr(4,color.length-5).split(', ');
+				color = hex(color[0]) + hex(color[1]) + hex(color[2]);
+			};
+			color = color.replace('#','');
+			if(color.length < 6) {
+				color = color.substr(0, 1) 
+					+ color.substr(0, 1) 
+					+ color.substr(1, 1) 
+					+ color.substr(1, 1) 
+					+ color.substr(2, 1) 
+					+ color.substr(2, 1);
+			};
+			return color;
+		};
+		
+		return $(this).each(function(){
+			if( !$(this).children().length ){
+				bgcolor = bgcolor ? bgcolor : gpc(this.parentNode);
+				var color = hexed($(this).css('color'));
+				var size = parseInt($(this).css('font-size'));
+				//if($.browser.msie) size = Math.round(size / 1.7) /* why microsoft WHY? */
+				var words = $(this).text().split(' ');
+				$(this).html('');
+				
+				for (i = 0; i < words.length; i++){
+					$(this).append('<img alt="'+words[i]+'" src="/'+jitr_dir+'/heading.php?text='
+					+escape(words[i])+'&color='+color+'&bgcolor='+bgcolor+
+					'&size='+size+'&font='+font+'&cache='+jitr_cache+'">');
+				};
+			};
+			$(this).css('visibility','visible');
+		});
+	};
+})(jQuery);
\ No newline at end of file
diff -urpN render/jitr/jquery.jitr.min.js render2/jitr/jquery.jitr.min.js
--- render/jitr/jquery.jitr.min.js	1970-01-01 12:00:00.000000000 +1200
+++ render2/jitr/jquery.jitr.min.js	2008-05-23 17:57:13.740566700 +1200
@@ -0,0 +1,2 @@
+/* jQuery Image Text Replacement Alpha 1 Author: Jamie Thompson (jamie_at_themagictorch_d0t_org) Website: http://jamazon.co.uk Copyright (c) 2008 Jamie Thompson */
+eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('(c($){$.18.12=c(m,f,F,E){b k=c(N){9(N==1b)7"A";N=q(N);9(N==0||1a(N))7"A";N=r.X(0,N);N=r.L(N,I);N=r.W(N);7"u".y((N-N%16)/16)+"u".y(N%16)};c p(s){b s=q(s).J(16);7(s.j<2)?\'0\'+s:s};c B(h){G(;h&&h.R.Q()!=\'D\';h=h.z){b v=x.n(h,\'T\');9(v.U(\'e\')>=0){e=v.P(/\\d+/g);7 p(e[0])+p(e[1])+p(e[2])}9(v&&v!=\'K\')7 v}7\'O\'};b w=c(3){9(!3){7 V};9(3.1d(\'e\')>-1){3=3.a(4,3.j-5).t(\', \');3=k(3[0])+k(3[1])+k(3[2])};3=3.19(\'#\',\'\');9(3.j<6){3=3.a(0,1)+3.a(0,1)+3.a(1,1)+3.a(1,1)+3.a(2,1)+3.a(2,1)};7 3};7 $(8).14(c(){9(!$(8).10().j){f=f?f:B(8.z);b 3=w($(8).n(\'3\'));b o=q($(8).n(\'m-o\'));b l=$(8).C().t(\' \');$(8).D(\'\');G(i=0;i<l.j;i++){$(8).13(\'<11 Y="\'+l[i]+\'" Z="/\'+F+\'/15.1c?C=\'+17(l[i])+\'&3=\'+3+\'&f=\'+f+\'&o=\'+o+\'&m=\'+m+\'&H=\'+E+\'">\')}};$(8).n(\'S\',\'M\')})}})(x);',62,76,'|||color||||return|this|if|substr|var|function||rgb|bgcolor||node||length|hex|words|font|css|size|hex2|parseInt|Math||split|0123456789ABCDEF||hexed|jQuery|charAt|parentNode|00|gpc|text|html|jitr_cache|jitr_dir|for|cache|255|toString|transparent|min|visible||ffffff|match|toLowerCase|nodeName|visibility|backgroundColor|indexOf|false|round|max|alt|src|children|img|jitr|append|each|heading||escape|fn|replace|isNaN|null|php|search'.split('|'),0,{}))
