/***
**  JQUERY MINITHESAURUS PLUGIN
**	WRITTEN BY TOM ROMBAUT
**  Version 0.1
**  09/2010
**  DEPENDENCIES : JQUERY 1.3.1+ , JQUERY MINITOOLTIP
***/
var MiniThesaurus = function(element, options) {
	var conf = $.extend({}, $.fn.minithesaurus.defaults, options);
	var container = element;
	var ignore_tags = ['SCRIPT', 'BASE', 'LINK', 'META', 'STYLE', 'TITLE', 'APPLET', 'OBJECT'];
	var TPL_TAG_OPEN = '<span class="'+conf.highlightClass+'">';
    var TPL_TAG_CLOSE = '</span>';
    var ESCAPERS = '[\\s!;,%\"\'\\(\\)\\{\\}]';
    var terms = [];
	
	var _initialize = function(){
		/** FIRST GET ALL WORDS **/
		$.ajax({
			type: 		conf.method,
			url: 		conf.url,
			data: 		conf.params,
			dataType: 	conf.datatype,
			success: 	function(data){
				terms = data;
				_searchTermsInDOM(container);
				_initToolTip(container);
			}
		}); 
	};
	
	var _searchTermsInDOM = function(element){
		if($(element).children().length > 0){
			$(element).children().each(function(){
				if($.inArray(this.tagName,ignore_tags) === -1){
					if($(this).children().length > 0){
						_searchTermsInDOM(this);
					}else{
						_initTerms(this);
					}
				}
			});
		}else{
			_initTerms(element);
		}
	};	
	
	var _initTerms = function(element){
		var content = $(element).html();
		for(i=0;i<terms.length;i++){
			content = _markTerm(terms[i],content)
		}
		$(element).html(content);
	};
	
	var _markTerm = function(term, line) {
        var modifier = "gi";
        if(term == line) {
            return TPL_TAG_OPEN + line + TPL_TAG_CLOSE;
        }
        var re = new RegExp("^("+term+")(" + ESCAPERS + ")", modifier);
        line = line.replace(re, TPL_TAG_OPEN + "$1" + TPL_TAG_CLOSE + "$2");
        re = new RegExp("(" + ESCAPERS + ")("+term+")$", modifier);
        line = line.replace(re, "$1" + TPL_TAG_OPEN + "$2" + TPL_TAG_CLOSE);
        re = new RegExp("(" + ESCAPERS + ")("+term+")(" + ESCAPERS + ")", modifier);
        line = line.replace(re, "$1" + TPL_TAG_OPEN +"$2" + TPL_TAG_CLOSE + "$3");
        return line;
    }
	
	var _initToolTip = function(container){
		$("."+conf.highlightClass,container).each(function(){
			var termv = $(this).html();
			$(this).minitooltip({
				title		:	termv.charAt(0).toUpperCase()+termv.substr(1),
				source		:	"ajax",
				url			: 	conf.url,
				method		:	"POST",			//AJAX REQUEST METHOD
				datatype	: 	"json",	
				params		:   {term:termv}
			});
		});
	}
	_initialize();
	return container;
};



/**
**	JQUERY PLUGIN
**/
(function($) {	
	$.fn.minithesaurus = function(options) {
		return this.each(function() {
			var element = $(this);
			if (element.data('minithesaurus')) return;
			var w = new MiniThesaurus(this, options);
			element.data('minithesaurus', w);
		});
	};
})(jQuery);

$.fn.minithesaurus.defaults = {
	url					:	'/',			//AJAX REQUEST URL
	method				:	"POST",			//AJAX REQUEST METHOD
	datatype			: 	"json",			//AJAX REQUEST DATATYPE
	params				:	{},
	highlightClass		:	"mt-highlight"
};
