/*
 *
 *  Copyright 2008 Elephant Seven Bielefeld GmbH
 *  
 *  This code is a component part of of the E7 Text2Image framework. 
 * 
//
//	AUTHOR:		Marcel Thannhäuser (marcel.thannhaeuser@e-7.com)
//
//	VERSION:	E7 Text2Image 1.0
//
//	SYNTAX:		$(selector).text2image(options);
//
//	REQUIRES:	jQuery 1.2.6
//	
//	OPTIONS:  
//		  name			type		example		description / default
//		----------------------------------------------------------------------------------------------------------------------------		
//		- fontname		string		arial		default: style sheet font family, marked with "t2i:MyFont" as last font ( e.G. Arial, bla, "t2i:MyFont" )
//		- fontsize		integer		24pt		default: style sheet font size in pt, px or em
//		- color			string		#000000		default: style sheet color ( hex notation or rgb notation )
//		- bgcolor		string		#FFF		default: transparent
//		- url			string		/myservlet	default: [empty]
//	    - ongenerate	function				description: a callback function that will be executed just before the image is rendered.
//												it takes 2 parameters, at 1st the element, which's content will be replaced, at 2nd the html of the generated image
//      - onsuccess   	function	 			description: a callback function that will be executed just after the image has been rendered.
//												it takes 1 parameter, the element which's content has been replaced
//						
//	note that em is currently based on the value of 12, meaning that 1em results in 12pt
//						 
//	url can be absolute or relative and has to point on a servlet or a similar applications
//	
*/			
var text2imagecounter = 0;

var text2imageurl = "/text2image/";

function parseColor( color ) {
	if ( color == null || jQuery.trim( color ).length == 0 ) return "";
	if ( color.indexOf("rgb") > -1 ) {
		var str = color;
		str = str.substring(4);
		str = str.substring(0, str.length - 1);
		//alert( "parsing color " + str );		
		var strs = str.split(",");
		//alert( "parsing string " + strs[0] );
		var str_ = parseInt(jQuery.trim(strs[0])).toString(16)
		if ( str_.length < 2 ) str_ = "0" + str_;
		//alert( "string " + strs[0] + " > " + str_ );
		var ret = str_;
		//alert( "parsing string " + strs[1] );
		str_ = parseInt(jQuery.trim(strs[1])).toString(16)
		if ( str_.length < 2 ) str_ = "0" + str_;
		//alert( "string " + strs[1] + " > " + str_ );
		ret = ret + str_;
		//alert( "parsing string " + strs[2] );
		str_ = parseInt(jQuery.trim(strs[2])).toString(16)
		if ( str_.length < 2 ) str_ = "0" + str_;
		//alert( "string " + strs[2] + " > " + str_ );
		ret = ret + str_;		
		return ret;
	}	
	return color;
}

function parseFontSize( fontsize ) {
		var deffontsize = fontsize;
		var ispx = deffontsize.indexOf('px') > -1;
		var isem = deffontsize.indexOf('em') > -1;
		var deffontsize = deffontsize.substring(0, deffontsize.length - 2 );
		if ( ispx ) {
			deffontsize = deffontsize / 1.3333;
		} else if ( isem ) {
			deffontsize = deffontsize * 12;
		}
		return parseInt( deffontsize );
			
}

function parseFontName( fontname ) {
	
		//alert( 'parseFontName(' + fontname + ')');
		if ( fontname == null ) return null;
		fontname_ = jQuery.trim( fontname );
		//alert( 'parseFontName(' + fontname_ + ')');		
		if ( fontname_.length == 0 ) return null;
		if ( fontname_.indexOf(",") < 0 ) return null;
		if ( fontname_.indexOf("\"t2i:") < 0 ) return null;
		//alert( 'parseFontName(' + fontname_ + ')');		
		fontname_ = fontname_.substring( fontname_.indexOf("\"t2i:") + 5 );
		fontname_ = fontname_.substring( 0, fontname_.length - 1 );
		return fontname_;
}

function generate( targetelement, theurl, size, color, bgcolor, font, text, format, ongenerate, onsuccess ) {
		var alttext = text.replace(/<(.|\n)+?>/gi, ' ');
		text = text.replace(/&nbsp;/g, ' ').replace(/&amp;/g, '&').replace(/<br>/gi, '<t2i:break>').replace(/<br\/>/gi, '<t2i:break>').replace(/\r/g, '').replace(/\n/g, '<t2i:break>').replace(/\//, '<t2i:slash>').replace(/\\/, '<t2i:backslash>').replace(/\?/g, '<t2i:qmark>');
		text = encodeURIComponent( text );
		//alert( text );		
		font = encodeURI( font );
		//var text = elem.text();
		//alert( text );
		size = encodeURI( parseFontSize( size) );
		color = encodeURI( parseColor( color ).replace(/#/, '') );
		bgcolor = encodeURI( parseColor( bgcolor ).replace(/#/, '') );
		var imageHtml = null;
		//for msie create height and width
		if (jQuery.browser.msie && jQuery.browser.version <= 6.0 ) {	
			var genurl = theurl + "generate/" + size + "/" + color + "/" + bgcolor + "/" + font + "/" + text + "/" + format + "/" + text2imagecounter + "." + format;
			var dimensionsurl = theurl + "getdimensions/" + size + "/" + color + "/" + bgcolor + "/" + font + "/" + text + "/" + format + "/" + text2imagecounter + "." + format;
			var dimensions_ = $.ajax({
				type: "GET",
				dataType: "text",
	  			url: dimensionsurl,
	  			async: false
	 			}).responseText;
			var dimensions = dimensions_.split(",");
			var width = dimensions[0];
			var height = dimensions[1];
			imageHtml = "<img alt=\"" + alttext + "\" width=\"" + width + "\" height=\"" + height + "\" src=\"" + genurl + "\">";		
		} else {
			var genurl = theurl + "generate/" + size + "/" + color + "/" + bgcolor + "/" + font + "/" + text + "/" + format + "/" + text2imagecounter + "." + format;
			imageHtml = "<img alt=\"" + alttext + "\" src=\"" + genurl + "\">";
		}
		text2imagecounter++;
		if ( typeof ongenerate != 'undefined' && typeof ongenerate == 'function' && ongenerate != null ) {
			ongenerate( targetelement, imageHtml );
		}
		targetelement.html( imageHtml );
		if ( typeof onsuccess != 'undefined' && typeof onsuccess == 'function' && onsuccess != null ) {
			onsuccess( targetelement );
		} 			
}

function doGenerate( elem, options ) {
	var deffontsize = elem.css("font-size");
	var fntnam = parseFontName( elem.css("font-family") );
	var defbgcolor = elem.css("background-color");
	if ( defbgcolor != null && defbgcolor == "" ) defbgcolor = null;
	var opt = $.extend({
		color : elem.css("color"),
		// no default background color
		bgcolor: defbgcolor,
		fontsize : deffontsize,
		url : text2imageurl,
		format: "png",
		ongenerate : null,
		onsuccess: null
		}, options );
	if ( fntnam != null ) {
		//alert( "fntnam = " + fntnam );				
		opt = $.extend( { fontname: fntnam }, opt );
	}
	if ( opt.fontname ) {
		var text = elem.html();
		generate( elem, opt.url, opt.fontsize, opt.color, opt.bgcolor, opt.fontname, text, opt.format, opt.ongenerate, opt.onsuccess );
	}	
}

function setText2ImageUrl( theurl ) {
	text2imageurl = theurl;
}

(function($){
	$.fn.text2image = function(options) {
		
		return this.each(function() {
		
			var elem = $(this);
			doGenerate( elem, options );
		
		});
	}
})(jQuery);

