
function txt2gfx($) 
{
    var self = this;
    this.rpcUrl = "/services/txt2gfx/txt2gfx.php";
    
    this.params = null;
    this.replacements = {};
    this.addReplacement = function ( items_name, item ) 
    {
		if( typeof this.replacements[items_name] == "undefined" ) 
		{
		    this.replacements[items_name] = new Array();
		}
        this.replacements[items_name].push( item );
    }

    this.targets = {};
    this.toclean = [];
    this.collectText = function ( items_name ) 
    {
		if ( typeof this.replacements[items_name] == "undefined"
		     || this.replacements[items_name].length == 0 ) 
		{
		   return false;
		}

    	var gcounter = 0;
    	var texts = {};

        for ( var i = 0; i < this.replacements[items_name].length; i++) 
        {
        	var curr = this.replacements[items_name][ i ];
        	var elems = [];
        	
        	if ( typeof curr.dontselect != 'undefined' 
    		    && curr.dontselect != '' 
    			&& curr.dontselect ) 
        	{
        		elems = $(curr.selector).not($(curr.dontselect));
        	}
        	else 
        	{
        		elems = $(curr.selector);
        	}
        	
        	if ( elems.length > 0 ) 
        	{
        		for( var j = 0; j < elems.length; j++ ) 
        		{
        			if( !elems[ j ] )
        				continue ;

        			var text = this.trim(this.extractText( elems[ j ] ));

        			if (text == "")
        				continue;        	    
        			
        			this.toclean.push(elems[j]);
        			
        			var tokens = curr.wordwrap ? text.split(' ') : [text];
        			var l = tokens.length;
        			for( var k = 0; k < tokens.length; k++ ) 
        			{       				
            			texts["item_"+gcounter] = {};
        				this.targets["item_"+gcounter] = elems[ j ];        				
        				if (l == 1 || k == (l - 1)) 
        				{
        					texts["item_"+gcounter].text = tokens[k];	
        				} 
        				else 
        				{
        					texts["item_"+gcounter].text = tokens[k] + ' ';
        				}
        				
        				texts["item_"+gcounter].normal = curr.params1;
        				if (curr.params2 != undefined) 
        				{
            				texts["item_"+gcounter].hover = curr.params2;
        				}
        				gcounter++;
        			}
        		}
        	}
        }
    	var texts_encoded = $.toJSON(texts);
    	var params_encoded = $.toJSON(this.params);
    	$.post(
    			this.rpcUrl, 
    			{ items : texts_encoded, params: params_encoded }, 
    			this.replacementsHandler, 
    			"json"
    	);
    }
    
    this.sprite = null;
    this.replacementsHandler = function (data, textStatus) {

    	if (textStatus == "success") 
    	{
    		self.sprite = data;
    		self.replaceText();
    	}
    }
    
    this.hoverHandler = function (event) {
		var offset_x = event.data.hover.x;
		var offset_y = event.data.hover.y;
		jQuery(this).css("background-position", offset_x + "px " + "-" + offset_y + "px");
    }

    this.normalHandler = function (event) {
		var offset_x = event.data.normal.x;
		var offset_y = event.data.normal.y;
		jQuery(this).css("background-position", offset_x + "px " + "-" + offset_y + "px");    	
    }
    
    this.replaceText = function () 
    {
    	for (var i in this.toclean) 
    	{
			while( this.toclean[i].hasChildNodes() ) 
			{
				this.toclean[i].removeChild(this.toclean[i].firstChild);
			}            	
    	}
    	for (var _item in this.sprite.items) 
    	{
    		var item = this.sprite.items[_item];
    		var normal = item.normal;
    		var elem = $(this.targets[_item]);

    		var canvas = $('<span></span>');
			canvas.width(normal.w);
			canvas.height(normal.h);
			canvas.attr("title", normal.text);
			canvas.attr("class", "replacement");
			canvas.css("display", "inline-block");
			canvas.css("background-image", "url(" + this.sprite.src + ")");
			canvas.css("background-position", normal.x + "px " + "-" + normal.y + "px");

			if (this.params.add_css_params) {
				for (var _param in this.params.add_css_params) {
					canvas.css(_param, this.params.add_css_params[_param]);
				}				
			}
			
			if ( item.hover ) 
			{
				canvas.bind( 'mouseenter', item, this.hoverHandler );
				canvas.bind( 'focus', item, this.hoverHandler );
				canvas.bind( 'mouseleave', item, this.normalHandler );
				canvas.bind( 'blur', item, this.normalHandler );
            }
			elem.append(canvas);    		
    	}
    }

    this.extractText = function ( element ) 
    {
    	if ( typeof element == "string" )
    		return element;
    	else if ( typeof element == "undefined" )
    		return element;

    	var text = "";
    	var kids = element.childNodes;

    	for( var i = 0; i < kids.length; i++ ) 
    	{
    		if ( kids [ i ].nodeType == 1 )
    			text += this.extractText( kids [ i ] );
    		else if ( kids[ i ].nodeType == 3 )
    			text += kids [ i ].nodeValue;
    	}
    	return text;
    }

    this.trim = function ( text ) {
        return(text.replace(/\s+/g," ").replace(/\s+$/,"").replace(/^\s+/,""));
    }
}
