/***
**  JQUERY MINIBUTTON PLUGIN
**	WRITTEN BY TOM ROMBAUT
**  Version 0.1
**  11/2009
**  DEPENDENCIES : JQUERY 1.3.1+
***/

var MiniButton = function(element, options) {
	var conf = $.extend({}, $.fn.minibutton.defaults, options);
	var button = $(element);
	var initialize = function() {
		button.addClass("mini-button");
		button.append($("<div class='mb-inner-button'><span>"+conf.text+"</span></div>"));
		if(conf.icon){
			$(".mb-inner-button",button).prepend($("<img src='"+conf.icon+"' class='mb-icon'/>"));
		}
		button.hover(function(){
			$(this).addClass(conf.hoverclass);
		},function(){
			$(this).removeClass(conf.hoverclass);
		});	
		$("span,.mb-inner-button",button).hover(function(){
			$(this).addClass(conf.hoverclass);
		});	
		button.mousedown(function(){
			$(this).addClass(conf.downclass);
		});
		button.mouseup(function(){
			$(this).removeClass(conf.downclass);
		});
		button.mouseout(function(e){
			if(!$(e.target).parent(0).hasClass("mini-button") && $(e.target).parent(0).parent(0).hasClass("mini-button")){
				$(this).removeClass(conf.downclass);
				$(this).removeClass(conf.hoverclass);
			}
		});
		button.click(function(){
			button.onclick();			
		});	
	};	
	button.onclick = function(){
		if(!button.hasClass(conf.disableclass)){
			if($.isFunction(conf.onclick))
				conf.onclick(button);
		}
	};
	button.disable = function(){
		button.addClass(conf.disableclass);
	};
	button.enable = function(){
		button.removeClass(conf.disableclass);
	};
	initialize();
	return button;
};

(function($) {	
	$.fn.minibutton = function(options) {
		return this.each(function() {
			var element = $(this);
			// Return early if this element already has a plugin instance
			if (element.data('minibutton')) return;
			// pass options to plugin constructor
			var w = new MiniButton(this, options);
			// Store plugin object in this element's data
			element.data('minibutton', w);
		});
	};
	
})(jQuery);

$.fn.minibutton.defaults = {
	text			:	"button-text",
	icon			:	'',
	hoverclass		:	"mb-hover",
	downclass		:	"mb-down",
	disableclass	:	"mb-disabled",
	onclick			: 	false
};/***
**  JQUERY MINICONTEXT PLUGIN
**	WRITTEN BY TOM ROMBAUT
**  Version 0.1
**  11/2009
**  DEPENDENCIES : JQUERY 1.3.1+ , JQUERY UI 1.7.2+, MINI-MENU
***/
var MiniContext = function(element,options) {
	var conf = $.extend({}, $.fn.minicontext.defaults, options);
	var trigger = $(element);
	var minimenu = null;
	var contextob = {};
	var _initialize = function(){
		minimenu = new MiniMenu(conf.menu);
		if(conf.event == "rightclick"){
			trigger.bind('contextmenu', function() {
				 minimenu.show();
				 return false; 
			});
		}else if(conf.event == "click"){
			trigger.click(function(){
				minimenu.show();
				return false; 
			});
		}else if(conf.event == "dblclick"){
			trigger.click(function(){
				minimenu.show();
				return false; 
			});
		}
		trigger.mousedown(function(evt){
			pos = {};
			pos.x = evt.pageX; 
			pos.y = evt.pageY;
			minimenu.setPosition(pos);
			trigger.mouseout(function(evt){
				minimenu.setHideTimer();
				trigger.unbind("mouseout");
			});
		});
	}
	trigger.menu = function(){
		return menu;
	};
	_initialize();
	return trigger;
};

/**
**	JQUERY EXTENSION
***/
	
(function($) {	
	$.fn.minicontext = function(options) {
		return this.each(function() {
			var element = $(this);
			if (element.data('minicontext')) return;
			var w = new MiniContext(this, options);
			element.data('minicontext', w);
		});
	};
})(jQuery);

/**
**	DEFAULT CONTEXT SETTINGS
**/

$.fn.minicontext.defaults = {
	event	: 'rightclick',	// click / dblclick / rightclick / none
	menu	: {
		data			: false,		// IF DATA IS GIVEN
		method			: "POST",		// METHOD
		datatype		: "json",		// SOURCE DATATYPE - JSON / ELEMENT ($("ul")) - not yet implemented;
		url				: '/',			// AJAX URL
		params			: {},  			// PARAMS TO POST
		preload			: false,
		showIcon		: true,			// SHOW ICON
		timeToHide		: 500			// Time needed before the context hides on mouseout	
	}
};
/***
**  JQUERY MINIDIALOG PLUGIN
**	WRITTEN BY TOM ROMBAUT
**  Version 0.1
**  11/2009
**  DEPENDENCIES : JQUERY 1.3.1+ , JQUERY UI 1.7.2+
***/

var MiniDialog = function(element, options) {
	var conf = $.extend({}, $.fn.minidialog.defaults, options);
	var dialog;
	if(conf.prependto){
		$(element).prependTo($(conf.prependto));
	}
	if(conf.clone){
		dialog = $(element).clone().prependTo('body');
	}else{
		dialog = $(element);
	}
	var initialize = function() {
		var disp = "block";
		if(!conf.show)
			disp = "none";
			
		/*move dialog to body*/
		if(conf.clone){
			$(element).remove();
		}
					
		dialog.prepend($("<div class='md-title'>"+conf.title+"</div>"));
		dialog.prepend($("<div class='md-btnholder'><div class='md-dialog-btn md-close'></div></div>"));
		dialog.addClass("mini-dialog");
		
		dialog.css({
				width:	conf.width	==	"auto"?conf.width:conf.width+"px",
		  		height:	conf.height	==	"auto"?conf.height:conf.height+"px",
		  		display: disp
		});	
		
		if($(".footer",dialog).length > 0){
			$(".footer",dialog).addClass("md-footer");
		}else if(conf.footer != false)
			dialog.append("<div class='md-footer'></div>");
			
		$(".md-close",dialog).hover(function(){
								$(this).addClass("md-hover");
			  			   	},function(){
								$(this).removeClass("md-hover");
						   	})
							.mousedown(function(){
							$(this).addClass("md-down");
							})
							.mouseup(function(){
								$(this).removeClass("md-down");
							})
							.click(function(){
								dialog.close();
							});
		if(conf.draggable){
			dialog.draggable({
				handle: ".md-title",
				start:	function(){
					$(".md-body",dialog).css("visibility","hidden");
				},
				stop: function(){
					$(".md-body",dialog).css("visibility","visible");
				}
			});
		}
		if(conf.resizable){
			dialog.resizable();
		}
		if(conf.trigger){
			$(conf.trigger).click(function(){
				dialog.open();
				return false;
			});
		}
	};
	dialog.setTitle = function(title){
		$(".md-title",dialog).html(title);
	};
	dialog.open = function(){
		if($.isFunction(conf.onopen))
			conf.onopen(dialog);
		
		if(conf.overlay){
			$("body").append("<div class='md-overlay'></div>");
			$(".md-overlay").css({
						"opacity"	:	conf.overlay_op,
						"width"		:	$(document).width(),
						"height"	:	$(document).height()
					});
		}
			
		
		/** positionelement **/
		var left,top = 0;
		if(!conf.left){
			var windowwidth  = $(window).width();
			var width = dialog.width();
			left = (windowwidth/2) - (width/2);
		}else
			left = conf.left;
	
		if(!conf.top){
			var windowheight = $(window).height();
			var height = dialog.height();
			top = ((windowheight/2) - (height/2)) + $(window).scrollTop();
		}else
			top = conf.top;
			
		dialog.css({left:left,top:top});
		dialog.show();
		
		
		/** IE BUG **/
		
		if($.isFunction(conf.onopen_end))
			conf.onopen_end(dialog);
		
		/*
		$(".md-title",dialog).css("width",$(dialog).width()-($(".md-title",dialog).css("paddingLeft").replace("px","")*1)+2);
		*/
		
	};
	dialog.reposition = function(){
		var left,top = 0;
		if(!conf.left){
			var windowwidth  = $(window).width();
			var width = dialog.width();
			left = (windowwidth/2) - (width/2);
		}else
			left = conf.left;
	
		if(!conf.top){
			var windowheight = $(window).height();
			var height = dialog.height();
			top = ((windowheight/2) - (height/2)) + $(window).scrollTop();
		}else
			top = conf.top;
			
		dialog.css({left:left,top:top});
	};
	dialog.close = function(){
		if($.isFunction(conf.onclose)){
			if(conf.onclose()){
				if(conf.overlay){
					$(".md-overlay").remove();
				}
				dialog.hide();
				if(conf.close_and_remove){
					dialog.remove();
				}
			}
		}else{
			if(conf.overlay){
				$(".md-overlay").remove();
			}
			dialog.hide();
			if(conf.close_and_remove){
				dialog.remove();
			}
		}
	};
	initialize();
	return dialog;
};

/**
**	JQUERY PLUGIN
**/
(function($) {	
	$.fn.minidialog = function(options) {
		return this.each(function() {
			var element = $(this);
			// Return early if this element already has a plugin instance
			if (element.data('minidialog')) return;
			// pass options to plugin constructor
			var w = new MiniDialog(this, options);
			// Store plugin object in this element's data
			element.data('minidialog', w);
		});
	};
})(jQuery);

$.fn.minidialog.defaults = {
	width		:	"auto",
	height		:	"auto",
	overlay		:	false,
	overlay_op	:	0.5,
	clone		:	false,
	prependto	:	false,
	left		:	false,
	top			:	false,
	title		:  	"",
	footer		: 	false,
	show		: 	false,
	trigger		:	false,
	draggable	: 	true,
	resizable	: 	false,
	onopen		: 	false,
	onopen_end	:	false,
	onclose		:	false,
	close_and_remove	:	false
};

var MiniGallery = function(element, options) {
	var conf = $.extend({}, $.fn.minigallery.defaults, options);
	var gallery = $(element);
	var galleryPreview = $("<div class='mg-preview'><div class='mg-preview-wrap'><ul></ul><div style='clear:both'></div></div></div>");
	var intervalID = false;
	var thumbHolderWidth = 0;
	var shown = 0;
	
	var initialize = function() {
		gallery.addClass("minigallery");
		$("img",gallery).css("visibility","hidden");

		if(!gallery.parent(0).is('body'))
			gallery.parent(0).css("position","relative");
			
		/** ADD BASIC ELEMENTS **/
		gallery.append("<div class='mg-back'></div>");
		gallery.append("<div class='mg-next'></div>");
		if(conf.raster){
			gallery.append("<div class='"+conf.rasterclass+"'></div>");
			$(".mg-raster",gallery).css("opacity",conf.rasteropacity);
		}
		gallery.append("<div class='mg-info-trigger'>i</div>");
		gallery.append("<div class='mg-info'></div>");
		
		if($("div.mg-intro",gallery).length > 0){
			var size = _getParentSize();
			$("div.mg-intro",gallery).css("height",size.height-85);
		}	
		
		
		
		$(".mg-back",gallery).click(function(){
			gallery.showPrevious();
		});
		$(".mg-next",gallery).click(function(){
			gallery.showNext();
		});
		$(".mg-info-trigger",gallery).click(function(){
			gallery.showInfo();
		});
			
		/** CREATE THUMBNAILS **/
		gallery.append(galleryPreview);
		$(".mg-preview").css({
			opacity	:	conf.previewopacity
		});
		thumbHolderWidth = 0;
		
		_preload(gallery.find("img."+conf.galleryclass+":first"));
		
		/** INIT KEY DOWN **/
		 
		$(document).keydown(function(event) {
            if(event.keyCode == 39 || event.keyCode == 38){
            	gallery.showNext();
            	return false;
            }
            if(event.keyCode == 37 || event.keyCode == 40){
            	gallery.showPrevious();
            	return false;
            }
         });

		
	};
	var _preload = function(img){
		var item = $("<li></li>");
		item.append(img);
		img.removeClass(conf.galleryclass);
		item.addClass(conf.loadingclass);
		$("ul",galleryPreview).append(item);
		thumbHolderWidth += item.outerWidth()+(item.css("marginLeft").replace("px","")*1)+(item.css("marginRight").replace("px","")*1);
		$("ul",galleryPreview).css("width",thumbHolderWidth);
		
		
		var image_t   = $(new Image());
		image_t.attr('src',img.attr('rel'));
		if(image_t.attr("width")){
			image_t.remove();
		}else{
			image_t.load(function(){
				image_t.remove();
			});
		}
		
		var image   = $(new Image());
		image.attr('src',img.attr('src'));
		if(image.attr("width")){
			_preloadFinish(item);
			image.remove();
		}else{
			image.load(function(){
				_preloadFinish(item);
				image.remove();
			});
		}
	};
	var _preloadFinish = function(item){
		/*item.css({	backgroundImage:'url('+$("img",item).attr("rel")+')',
			backgroundRepeat:'no-repeat',
			backgroundPosition:'50% 50%',
			opacity:conf.thumbhoveropacity});
		 */
		 item.css({
			opacity		:	conf.thumbhoveropacity,
			overflow	:	'hidden'	
		 });
		 var thumb = $("<img />").attr("src",$("img",item).attr("rel"));
		 item.prepend(thumb);
		
		 item.removeClass(conf.loadingclass);
		 item.hover(function(){
			if(!$(this).hasClass(conf.activeclass)){
				item.animate({"opacity":"1"},"fast");
			}
		},function(){
			if(!$(this).hasClass(conf.activeclass)){
				item.animate({"opacity":conf.thumbhoveropacity},"fast");
			}
		});
		item.click(function(){
			gallery.showImage(item);
			return false;
		});
		if(gallery.find("img."+conf.galleryclass+":first").length > 0){
			_preload(gallery.find("img."+conf.galleryclass+":first"));
		}else{
			if(thumbHolderWidth > galleryPreview.width()){
				_initscrolling();
			}
			if(conf.showfirst){
				$("ul li:first",galleryPreview).each(function(){
					gallery.showImage($(this));
				});
			}
		}
	};
	
	/** SCROLL WHEN OVERFLOW **/
	var _initscrolling = function(){
		previewscrolling = true;
		galleryPreview.append("<div class='mg-preview-scrollleft'></div>");
		galleryPreview.append("<div class='mg-preview-scrollright'></div>");
		$(".mg-preview-scrollleft",galleryPreview).mouseover(function(){
			_startscrolling("left");
		});
		$(".mg-preview-scrollleft",galleryPreview).mouseout(function(){
			_endscrolling("right");
		});
		$(".mg-preview-scrollright",galleryPreview).mouseover(function(){
			_startscrolling("right");
		});
		$(".mg-preview-scrollright",galleryPreview).mouseout(function(){
			_endscrolling("right");
		});
	};
	var _startscrolling = function(type){
		if(!intervalID){
			intervalID = setInterval(function(){_scroll(type)},conf.scrollinterval);
		}
	};
	var _endscrolling = function(type){
		if(intervalID){
			clearInterval(intervalID);
			intervalID = false;
		}
	};
	var _scroll = function(type){
		if(type == "left"){
			if(_getmargins().left < 0){
				$("ul:first",galleryPreview).css("marginLeft",(_getmargins().left + 5)+"px");
			}else{
				_endscrolling(type);
			}
		}else if(type == "right"){
			if(_getmargins().right > 0){
				$("ul:first",galleryPreview).css("marginLeft",(_getmargins().left - 5)+"px");
			}else{
				_endscrolling(type);
			}
		}
		if(_getmargins().left < 0)
			$(".mg-preview-scrollleft",galleryPreview).removeClass("mg-disabled");
		else
			$(".mg-preview-scrollleft",galleryPreview).addClass("mg-disabled");
		
		if(_getmargins().right > 0)
			$(".mg-preview-scrollright",galleryPreview).removeClass("mg-disabled");
		else
			$(".mg-preview-scrollright",galleryPreview).addClass("mg-disabled");
	};
	var _getmargins = function(){
		var leftm = ($("ul:first",galleryPreview).css("marginLeft").replace("px","")*1);
		var rightm = $("ul:first",galleryPreview).width() - ((galleryPreview.width() + Math.abs(leftm)));
		return {left: leftm, right:rightm};	
	};
	var _getParentSize = function(){
		var parentHeight = $(window).height();
		var parentWidth = $(window).width();
		if(!gallery.parent(0).is('body')){
			parentHeight = gallery.parent(0).height();
			parentWidth = gallery.parent(0).width();
		}
		return {width:parentWidth,height:parentHeight}
	};
	
	/** PUBLIC FUNCTIONS **/
	gallery.showNext = function(){
		$(".mg-active",galleryPreview).each(function(){
			$(".mg-active",galleryPreview).each(function(){
				if($(this).next().is("li")){
					gallery.showImage($(this).next());
				}
			});
		});
	};
	gallery.showPrevious = function(){
		$(".mg-active",galleryPreview).each(function(){
			if($(this).prev().is("li")){
				gallery.showImage($(this).prev());
			}
		});
	};
	gallery.showImage = function(item){
		$("."+conf.activeclass,galleryPreview).each(function(){
			$(this).css("opacity",conf.thumbhoveropacity);
			$(this).removeClass(conf.activeclass);
		});
		
		if($("div.mg-intro",gallery).length > 0){
			$("div.mg-intro",gallery).css("display","none");
		}	
			
		item.addClass(conf.activeclass);
		item.css("opacity","1");
		if(conf.fadeimage){
			$("img."+conf.imageclass,gallery).fadeOut(conf.fade,function(){
				$(this).remove();
			});
		}else{
			$("img."+conf.imageclass,gallery).remove();
		}
		var image = item.find("img:last").clone();
		
		/*$(window).unbind("resize");
		$(window).resize(function(){ 
			gallery.resize(image);
		});*/
		image.css("visibility","visible");
		gallery.append(image);
		image.addClass(conf.imageclass);
		gallery.resize(image);
		
		if(conf.fadeimage){
			$("img."+conf.imageclass,gallery).fadeIn(conf.fade);
		}else{
			image.css("display","block");
			
		}
		
		
		/**
		 * CHECK IF THUMB IS VISIBLE, IF NOT, ANIMATE THE MARGIN
		 */
		var elementLeft = item.position().left;
		var currentLeft = _getmargins().left;
		var elWidth = item.outerWidth()+(item.css("marginLeft").replace("px","")*1)+(item.css("marginRight").replace("px","")*1);
		if(elementLeft < 0){
			var nLeft = currentLeft + Math.abs(elementLeft);
			$("ul:first",galleryPreview).animate({"marginLeft": nLeft+"px"}, "slow");
		}else if((elementLeft+elWidth) > galleryPreview.width()){
			var nLeft = galleryPreview.width() - (elementLeft+elWidth+Math.abs(currentLeft));
			$("ul:first",galleryPreview).animate({"marginLeft": nLeft+"px"}, "slow");
		}
	};
	gallery.resize = function(image){
		if(image.attr("title")){
			$(".mg-info-trigger",gallery).css("display","block");
			$(".mg-info",gallery).html("<div class='mg-info-title'>"+image.attr("title")+"</div><div class='mg-info-caption'>"+image.attr("alt")+"</div>");
		}else{
			$(".mg-info-trigger",gallery).css("display","none");
			$(".mg-info",gallery).css("display","none");
		}
		
		var or_height = image.attr("or_height");
		var or_width = image.attr("or_width");
		if(!or_height)
			or_height = image.height();
		if(!or_width)
			or_width = image.width();
		
		
		var botoffset = $(".mg-preview").height()+($(".mg-preview").css("bottom").replace("px","")*1);
		
		var size = _getParentSize();
		var parentHeight = size.height-botoffset;
		var parentWidth = size.width;
		
		var w_ratio = parentWidth/or_height;
		var h_ratio = parentHeight/or_height;
		image.css({
			minWidth:0,
			minHeight:0
		});
		if(w_ratio < h_ratio){
			image.css({width:(or_width*w_ratio), height:"auto"});
		}else{
			image.css({height:(or_height*h_ratio),width:"auto"});
		}
	};
	gallery.showInfo = function(){
		if($(".mg-info",gallery).css("display") == "block"){
			$(".mg-info",gallery).css("display","none");
		}else{
			$(".mg-info",gallery).css("display","block");
		}
	};	
	
	initialize();
	return gallery;
};

(function($) {	
	$.fn.minigallery = function(options) {
		return this.each(function() {
			var element = $(this);

			// Return early if this element already has a plugin instance
			if (element.data('minigallery')) return;
			// pass options to plugin constructor
			var w = new MiniGallery(this, options);
			// Store plugin object in this element's data
			element.data('minigallery', w);
		});
	};
	
})(jQuery);

$.fn.minigallery.defaults = {
	galleryclass		:	"gallery",			//The class that images have
	loadingclass		:	"mg-loading",
	activeclass			:	"mg-active",
	imageclass			:	"mg-image",
	rasterclass			:	"mg-raster",
	fadeimage			:	false,				//ImageFading
	fade				:	200,				//Speed of fade
	raster				:	true,				//Show raster or not
	rasteropacity		:	0.2,				//Opacity of the raster
	thumbhoveropacity	:	0.4,				//Opacity of thumbnails			
	previewopacity		:	0.8,
	scrollinterval		:	20,
	showfirst			:	true
};/***
**  JQUERY MINIGRID PLUGIN
**	WRITTEN BY TOM ROMBAUT
**  Version 0.1
**  11/2009
**  DEPENDENCIES : JQUERY 1.3.1+ , JQUERY UI 1.7.2+, JQUERY.MINIDIALOG.JS
***/

var MiniGrid = function(element, options) {
	var conf = $.extend({}, $.fn.minigrid.defaults, options);
	var grid = $(element);
	var cols = new Array();
	var currentpage = 1;
	var perpage = conf.perpage;
	var rowcount = 0;
	var query = "";
	var queryfields = "*";
	var searchdialog = false;
	var sortfield = conf.sortfield;
	var sortorder = conf.sortorder;
	var params = conf.params;
	var loading = false;
	
	
	var _initialize = function() {
		grid.addClass("minigrid")
			.css({
				width: conf.width,
				display: "block"
			});
		/** **/
		for(i=0;i<conf.columns.length;i++){
			conf.columns[i].id = conf.columns[i].id.replace(".","-");
		}
		/** ADD COLUMNS **/
		var head = $("<div class='minigrid-head'><table cellspacing='0' cellpadding='0'><thead><tr></tr></thead></table></div>");
		$("table",head).css("width","100%");
		head.addClass("header");
		grid.append(head);
		
		_setPhysicalWidth();
		
		for(i=0;i<conf.columns.length;i++){
			var field = $("<th><div id='"+conf.columns[i].id+"'>"+conf.columns[i].label+"</div></th>");
			field.css({width: conf.columns[i].pwidth});
			$("div",field).css({overflow:"hidden",
								whitespace: "nowrap"});
			$("tr",head).append(field);
			
			$("div",field).hover(function(){
				$(this).addClass("hover");
			},function(){
				$(this).removeClass("hover");
			});
			if(conf.columns[i].sortable && conf.sortable){
				$("div",field).click(function(){
					grid.sortGrid($(this));
				});
			}
			cols[cols.length] = conf.columns[i].id;
		}
		
		/** RESIZABLE COLUMNS **/
		lastpos = 0;
		if(conf.resizable_columns){
			for(i=1;i<conf.columns.length;i++){
				var handle = $("<div class='minigrid-column-resize-handle' rel='"+conf.columns[i-1].id+"'></div>");
				grid.append(handle);
				if($("#"+conf.columns[i].id).length>0){
					w = $("#"+conf.columns[i].id).parent(0).position().left;
					handle.css({left:w});
				}else{
					alert("not found"+conf.columns[i].id);
				}
			}
			$(".minigrid-column-resize-handle",grid).draggable({
					axis : 'x',
					stop: function(event,ui){
						var left = $(this).position().left;
						var rel = $(this).attr("rel");
						var found = false;
						var offset = 0;
						var mwidth = 0;
						var twidth = $(".minigrid-head",grid).width();
						var ncols = new Array();
						for(i=0;i<conf.columns.length;i++){
							if(conf.columns[i].id == rel){
								found = true;
								var w = left-offset;
								conf.columns[i].pwidth = w;
								$("#"+conf.columns[i].id,grid).parent(0).css("width",w);
									offset += w;
								}else{
									if(!found){
										offset += $("#"+conf.columns[i].id,grid).parent(0).outerWidth();
									}else{
										conf.columns[i].nr = i;
										ncols[ncols.length] = conf.columns[i];
									}
							}
						}
						var totalw=0;
						var nwidth = twidth-offset;
						var cwidth = 0;
						for(i=0;i<ncols.length;i++){
							totalw += $("#"+ncols[i].id,grid).parent(0).outerWidth();
						}
						for(i=0;i<ncols.length;i++){
							var w = $("#"+ncols[i].id,grid).parent(0).outerWidth();
							if(i == ncols.length-1){
								var pw = nwidth-cwidth-ncols.length;
							}else{
								var pper = (w/totalw)*100;
								var pw = Math.floor((nwidth/100)*pper);
							}
							conf.columns[ncols[i].nr].pwidth = w;
							$("#"+ncols[i].id,grid).parent(0).css("width",pw);
							cwidth += pw;
						}
						_updateColumnSize();
					}
			});	
		}
		
		
		/** ADD BODY **/
		grid.append("<div class='minigrid-body'></div>");
		$(".minigrid-body",grid).css({overflowY:"auto",
									overflowX: "hidden"
								});
		
		if(conf.height != "max"){
			$(".minigrid-body",grid).css("height",conf.height);
		}
			/** ADD FOOTER AND FOOTER BUTTONS **/
		grid.append("<div class='minigrid-footer'></div>");
		$(".minigrid-footer",grid).css("overflow","hidden");
		
		if(conf.filter){
			$(".minigrid-footer",grid).append("<div class='button filter'></div>")
									.append("<div class='btnseparator'></div>");
		}
		$(".minigrid-footer",grid).append("<div class='button first'></div>")
							  .append("<div class='button prev'></div>")
							  .append("<div class='btnseparator'></div>")
							  .append("<div class='label paging'></div>")
							  .append("<div class='btnseparator'></div>")
							  .append("<div class='button next'></div>")
							  .append("<div class='button last'></div>")
							  .append("<div class='btnseparator'></div>")
							  .append("<div class='button reload'></div>")
							  .append("<div class='loader'></div>");
		$(".minigrid-footer .button",grid).hover(function(){
			if(!$(this).hasClass("disable"));
				$(this).addClass("hover");
		},function(){
			$(this).removeClass("hover");
		});					  
		$(".minigrid-footer .button",grid).click(function(){
			grid.btnClick($(this));
		});
		
		/** EVENTS **/
		if(conf.height == "max")
			$(window).bind("resize", function(){_setPhysicalWidth();_updateHeight();_updateColumnSize();});
		if(conf.height == "max"){
			_updateHeight();
		}
		if(conf.filter)
			_initSearchBox();
		grid.load();
	};
	var _setPhysicalWidth = function(ex){
		
		var totalPercent = 0;
		var twidth = $(".minigrid-head",grid).width();
		var cwidth = 0;
		for(i=0;i<conf.columns.length;i++){
			var w = conf.columns[i].width.replace("%","");
			totalPercent += (w*1);
		}
		for(i=0;i<conf.columns.length;i++){
			var w = conf.columns[i].width.replace("%","");
			if(i == conf.columns.length-1){
				var pw = twidth-cwidth-conf.columns.length;
			}else{
				var pper = (w/totalPercent)*100;
				var pw = Math.floor((twidth/100)*pper);
			}
			conf.columns[i].pwidth = pw;
			cwidth += pw;
		}
		if(ex && ex == true){
			for(i=0;i<conf.columns.length;i++){
				$("div#"+conf.columns[i].id,grid).css({width : conf.columns[i].pwidth});
			}
		}
	};
	var _startloading = function(){
		$(".minigrid-footer .loader",grid).css("display","block");
		loading = true;
	};
	var _endloading = function(){
		$(".minigrid-footer .loader",grid).css("display","none");
		loading = false;
	};
	var scrollbarWidth = function(){
	    var div = $('<div style="width:50px;height:50px;overflow:hidden;position:absolute;top:-200px;left:-200px;"><div style="height:100px;"></div>');
	    $('body').append(div);
	    var w1 = $('div', div).innerWidth();
	    div.css('overflow-y', 'scroll');
	    var w2 = $('div', div).innerWidth();
	    $(div).remove();
	    return (w1 - w2);
	}
	
	var _updateColumnSize = function(){
		for(i=0;i<conf.columns.length;i++){
			var field = $("#"+conf.columns[i].id,grid);
			field.parent(0).css({width: conf.columns[i].pwidth});
		}
		
		for(a=0;a<conf.columns.length;a++){
			var w = $("#"+conf.columns[a].id,grid).width();
			if($(".minigrid-body").height() < $(".minigrid-body table").height() && a == conf.columns.length-1){
				w = w-scrollbarWidth();
			}
			$("td div[rel='"+conf.columns[a].id+"']",grid).css("width",w);
		}
		if(conf.resizable_columns){
			soffset = 0;
			for(i=1;i<conf.columns.length;i++){
				var handle = $(".minigrid-column-resize-handle[rel='"+conf.columns[i-1].id+"']",grid);
				if($("#"+conf.columns[i].id).length>0){
					w = $("#"+conf.columns[i].id).parent(0).position().left;
					handle.css({left:w});
				}
			}
		}
	};
	var _updateHeight = function(){
		var dh = 0;
		if(grid.parent(0).is('body')){
			dh = $(window).height();
		}else{
			dh = grid.parent(0).height();
		}
		
		var sh = 0;
		grid.parent(0).children().each(function(){
			if(!$(this).hasClass("minigrid") && !$(this).hasClass("minimenu") && !$(this).hasClass("search-dialog") && $(this).attr("tagName") != "SCRIPT"){
				sh += $(this).outerHeight();
				sh += ($(this).css("paddingTop").replace("px","") * 1);
				sh += ($(this).css("paddingBottom").replace("px","") * 1);
			}
		});
		var fh = $(".minigrid-footer",grid).outerHeight();
		var th = $(".minigrid-head",grid).outerHeight();
		
		var ns = dh-fh-th-sh;
		
		
		$(".minigrid-body",grid).css("height",ns);
	}
	var _initSearchBox = function(){
	 	searchdialog = $('<div class="search-dialog"><div class="body"></div></div>');
		var options = "";
		for(a=0;a<conf.columns.length;a++){
			options += "<option value='"+conf.columns[a].id+"'>"+conf.columns[a].label+"</option>";
		}
		html = '<div class="dialog-form-line">';
		html +='	<div class="dialog-form-col one-five ">';
		html +='		<label class="dialog-form-label">';
		html +='			Search term';
		html +='		</label>';
		html +='	</div>';
		html +='	<div class="dialog-form-col three-five " style="position:relative">';
		html +='			<input type="text" name="minigrid-query" id="minigrid-query" value="" />';
		html +='	</div>';
		html +='	<div class="dialog-form-col one-five last">';
		html +='		<input type="button" id="minigrid-search" name="minigrid-search" value="Search" class="submit" />';
		html +='	</div>';
		html +='</div>';
		html +='<div class="dialog-form-hseperator"></div>';
		html +='<div class="dialog-form-line">';
		html +='	<div class="dialog-form-col one-five "><span class="form-radio-span">Search where</span></div>';	
		html +='	<div class="dialog-form-col two-five "><input type="radio" name="minigrid-search-where" value="1" class="form-radio" checked/><span class="form-radio-span">All Fields</span></div>';
		html +='</div"><br/>';
		html +='<div class="dialog-form-line">';
		html +='	<div class="dialog-form-col one-five ">&nbsp;</div>';	
		html +='	<div class="dialog-form-col two-five "><input type="radio" name="minigrid-search-where" value="2" class="form-radio"/><span class="form-radio-span">One field</span></div>';
		html +='	<div class="dialog-form-col two-five "><select name="minigrid-queryfield" id="minigrid-queryfield">'+options+'</select></div>';
		html +='</div">';
		html +='<div class="clearfix"></div>';
		
		$(".body",searchdialog).append($(html));
		
		$("#minigrid-search",searchdialog).click(function(){
			grid.searchGrid();
		});
		$("#minigrid-query",searchdialog).keyup(function(evt){
			if(evt.which == 13){
				grid.searchGrid();
				return false;
			}
		});
		$('body').append(searchdialog);
		searchdialog.minidialog({
				title:	"Search",
				width:500,
				height:150,
				resizable: false
		});
		
		/** SET KEYDOWN FOR WHOLE APPLICATION **/
		$(document).bind('keypress', 'Ctrl+F',function (evt){
			if(evt.which == 102 && evt.ctrlKey){
		 		searchdialog.data("minidialog").open();
		 		return false;
		 	}
		});
		/*
		$(document).bind("minigrid_load",function(){
			if ( typeof(dialogObject) != "undefined" ) {
   				dialogObject.bindEvent("document","keypress",function(e){
					if(dialogObject.isActive() && e.which == 102 && e.ctrlKey){
						searchdialog.data("minidialog").open();
						return false;
					}
				});
			}
		});*/
		$(window).load(function(){
			setTimeout(function(){$(document).trigger("minigrid_load");},250);
		});
	};
	grid.updateColumns = function(){
		_setPhysicalWidth(true);
		_updateColumnSize();
	};	
	grid.updateHeight = function(){
		_updateHeight();
	};
	grid.setQuery = function(q,f){
		query = q;
		queryfields = f;
		grid.load();
	};
	grid.clearQuery = function(){
		$("#minigrid-query",searchdialog).val("");
		grid.searchGrid();
	};
	grid.searchGrid = function(){
		var squery = $("#minigrid-query",searchdialog).val();
		if(squery){
			if($(".minigrid-footer .clearfilter",grid).length == 0){
				$(".minigrid-footer .filter",grid).after($("<div class='button clearfilter'></div>"));
				$(".minigrid-footer .clearfilter",grid).hover(function(){
					if(!$(this).hasClass("disable"));
						$(this).addClass("hover");
					},function(){
						$(this).removeClass("hover");
				});					  
				$(".minigrid-footer .clearfilter",grid).click(function(){
					grid.btnClick($(this));
				});
			}
		}else{
			if($(".minigrid-footer .clearfilter",grid).length == 1){
				$(".minigrid-footer .clearfilter",grid).remove();	
			}
		}
		if($("input[@name='minigrid-queryfield']:checked",searchdialog).val() == 1){
			grid.setQuery(squery,cols.join(";"));
		}else{
			grid.setQuery(squery,$("#minigrid-queryfield",searchdialog).val());
		}
	};
	grid.sortGrid = function(col){
		fieldID = col.attr("id");
		fieldID = fieldID.replace("-",".");
		if(fieldID == sortfield){
			if(sortorder == "asc"){
				sortorder = "desc";
				col.removeClass("asc");
			}else{
				sortorder = "asc";
				col.removeClass("desc");
			}
		}else{
			$(".minigrid-head th div",grid).removeClass("asc")
									  	   .removeClass("desc");
			sortfield = fieldID;
			sortorder = conf.sortorder;
		}
		col.addClass(sortorder);
		grid.load();
	};
	grid.btnClick = function(btn){
		if(!btn.hasClass("disable")){
			if(btn.hasClass("first")){
				currentpage = 1;
			}
			if(btn.hasClass("prev")){
				currentpage = currentpage-1;
			}
			if(btn.hasClass("next")){
				currentpage = currentpage+1;
			}
			if(btn.hasClass("last")){
				currentpage = Math.ceil(rowcount/perpage);
			}
			if(btn.hasClass("filter")){
				searchdialog.data("minidialog").open();
				return;
			}
			if(btn.hasClass("clearfilter")){
				grid.clearQuery();
				return;
			}
			grid.load();
		}
	};
	grid.refreshbuttons = function(){
		if((currentpage * perpage) >= rowcount){
			$(".minigrid-footer .next",grid).addClass("disable")
									   .css("opacity",conf.btn_disable_opacity);
			$(".minigrid-footer .last",grid).addClass("disable")
			 						   .css("opacity",conf.btn_disable_opacity);
		}else{
			$(".minigrid-footer .next",grid).removeClass("disable")
									    .css("opacity",1);
			$(".minigrid-footer .last",grid).removeClass("disable")
										.css("opacity",1)
		}
		if(currentpage == 1){
			$(".minigrid-footer .prev",grid).addClass("disable")
									    .css("opacity",conf.btn_disable_opacity);
			$(".minigrid-footer .first",grid).addClass("disable")
									    .css("opacity",conf.btn_disable_opacity);
		}else{
			$(".minigrid-footer .prev",grid).removeClass("disable")
									   .css("opacity",1);
			$(".minigrid-footer .first",grid).removeClass("disable")
										.css("opacity",1);
														
		}
		$(".minigrid-footer .paging",grid).html("page "+currentpage+" "+" of "+Math.ceil(rowcount/perpage));
	};
	grid.selectRow = function(row){
		if(row.hasClass("selected")){
			if($.isFunction(conf.ondeselectrow))
				conf.ondeselectrow(row);
			row.removeClass("selected");
		}else{
			if(!conf.multiselect){
				$(".minigrid-body tr",grid).removeClass("selected");
			}
			if($.isFunction(conf.onselectrow))
				conf.onselectrow(row);
			row.addClass("selected");
		}
	};
	grid.getSelectedRows = function(){
		return $("tr.selected",".minigrid-body");
	};
	grid.clear = function(){
		$(".minigrid-body",grid).html("");
	};
	grid.getParams = function(){
		strfields = cols.join(";");
		params.fields = strfields;
		params.page = currentpage;
		params.perpage = perpage;
		params.query = query;
		params.queryfields = queryfields,
		params.sortfield = sortfield;
		params.sortorder = sortorder;
		return params;
	};
	grid.load = function(){
		if(loading)
			return;
		_startloading();
		
		params = grid.getParams();
		$.ajax({
			type: conf.method,
			url: conf.url,
			data: params,
			dataType: conf.datatype,
			success: function(data){grid.fill(data);},
			timeout: function(){
				alert("Request timeout - please contact system administrator");
				_endloading();
			},
			error : function(XMLHttpRequest, textStatus, errorThrown){
				alert("An error has occured: "+textStatus);
				_endloading();
			}
		}); 
	};
	grid.fill = function(items){
		grid.clear();
		rowcount = items.total;
		var body = $("<table cellspacing='0' cellpadding='0'><tbody></tbody></table>");
		var css_class = "";
		for(i=0; (i < items.rows.length && i < conf.perpage); i++){
			if(css_class == "")
				css_class = "even";
			else
				css_class = "";
			var row = $("<tr></tr>").addClass(css_class);
			
			if(items.rows[i].id)
				row.attr("id","row"+items.rows[i].id);
			
			for(a=0;a<conf.columns.length;a++){
				var value = items.rows[i].cell[a];
				if(conf.highlight && query){
					if(queryfields.indexOf(conf.columns[a].id) !== -1)
						value =  value.replace( new RegExp(query,"g"), "<span class='minigrid-highlight'>"+query+"</span>" );  
				}
				var field = $("<td><div rel='"+conf.columns[a].id+"'>"+value+"</div></td>");
				//field.css({width: conf.columns[a].width});
				$("div",field).css({overflow:	"hidden",
									whitespace: "nowrap"
							   });
				row.append(field);
			}
			row.hover(function(){
				$(this).addClass("hover");
			},function(){
				$(this).removeClass("hover");
			});
			row.click(function(){
				grid.selectRow($(this));
			});
			
			if($.isFunction(conf.ondblclickrow)){
				row.dblclick(function(){
					conf.ondblclickrow($(this));
				});
			}
			if($.isFunction(conf.onrightclickrow)){
				row.add('.minicontext').bind('contextmenu', function() { return false; });
				row.mouseup( function(evt) {
					if( evt.button == 2 ) {
						conf.onrightclickrow($(this));
						return false;
					}
					return true; 
				});
			}
					
			$("tbody",body).append(row);
		}
		
		body.css("width","100%");
		$(".minigrid-body",grid).append(body);
		
		_updateColumnSize();
		grid.refreshbuttons();
		_endloading();
		
		if(conf.height == "max"){
			_updateHeight();
		}
		
	};
	grid.setParam = function(key,value){
		eval("params."+key+" = value;");
	};
	
	_initialize();
	return grid;	
};
/**
**	JQUERY PLUGING
**/
(function($) {	
	$.fn.minigrid = function(options) {
		return this.each(function() {
			var element = $(this);
			if (element.data('minigrid')) return;
			var w = new MiniGrid(this, options);
			element.data('minigrid', w);
		});
	};
})(jQuery);

$.fn.minigrid.defaults = {
	width				:	"auto",		//GRIDWIDTH AUTO / PX
	height				:	"max",		//GRIDHEIGHT AUTO / MAX / PX
	perpage				:	20,			//ROWS PER PAGE
	columns				: 	[{label:"column 1",id:"column",width:"100%",sortable:false}],
	url					:	'/',		//AJAX REQUEST URL
	method				:	"POST",		//AJAX REQUEST METHOD
	datatype			: 	"json",		//AJAX REQUEST DATATYPE
	params				:	{},							
	multiselect			: 	false,		//SELECT MULTIPLE LINES
	resizable_columns	: 	true,		//RESIZABLE COLUMNS
	sortable			: 	false,		//SORTABLE  COLUMNS	
	sortfield			: 	"",	
	sortorder			: 	"asc",				
	filter				:	true,		//USE FILTER
	highlight			: 	true,		//HIGHTLIGHT SEARCH RESULTS
	btn_disable_opacity	: 	0.2,		//DISABLE BTN OPACITY
	onselectrow			:	false,		//FUNCTION ON SELECT
	ondeselectrow		:	false,		//FUNCTION ON DESELECT
	ondblclickrow		:	false,		//FUNCTION ON DBL CLICK
	onrightclickrow		:	false		//FUNCTION ON RIGHT CLICK	
};/***
**  JQUERY MINIMENU PLUGIN
**	WRITTEN BY TOM ROMBAUT
**  Version 0.1
**  11/2009
**  DEPENDENCIES : JQUERY 1.3.1+ , JQUERY UI 1.7.2+
***/
var MiniMenu = function(options) {
	var conf = $.extend({}, $.fn.minimenu.defaults, options);
	var menu = $("<div class='minimenu'></div>");
	var status = "hidden";
	var pos = {};
	var loaded = false;
	var children = new Array();
	var cached = false;
	var timeout = false;
	var parent = false;
	var data = false;
	var menuItems = new Array();
	var intervalID = false;
	var ulheight = 0;
	var liheight = 0;
	
	var _initialize = function() {
		if(conf.data){
			data = conf.data;
		}
		if(conf.classname)
			menu.addClass(conf.classname);
		
		if(conf.showIcon)
			menu.addClass(conf.hasiconclass);
		if(conf.preload){
			_load(false);
		}
	};
	/** 
	***LOAD DATA
	**/
	var _load = function(show){
		if(data){
			loaded = true;
			_createMenuItems(data);
			if(show){
				_show();
			}
		}else{
			$.ajax({
				type		: conf.method,
				url			: conf.url,
				data		: conf.params,
				dataType	: conf.datatype,
				success		: function(data){
								_createMenuItems(data);
								if(show){
									loaded = true;
									_show();
								}
							  }
			});
		}
	};
	/** 
	**	CREATE MENU ITEMS 
	**/	
	var _createMenuItems = function(data){
		menu.append($("<ul></ul>"));
		
		for(i=0;i<data.length;i++){
			if(data[i].separator)
				$("ul",menu).append($('<li class="mm-separator"></li>'));
		
		
			var menuItem = new MiniMenuItem(data[i],conf,menu);
			$("ul",menu).append(menuItem);
			menuItems[menuItems.length] = menuItem;
		
		}
		_createEvents();
		if(conf.oddclass){
			for(i=0;i<menuItems.length;i++){
				if(i%2==0){
					menuItems[i].addClass(conf.oddclass);
				}
			}
		}
		if(conf.evenclass){
			for(i=0;i<menuItems.length;i++){
				if(i%2==1){
					menuItems[i].addClass(conf.evenclass);
				}
			}
		}
		
			
		$('body').append(menu);
		if(conf.width == "auto"){
			if($.browser.msie && $.browser.version < 8){
				for(i=0;i<menuItems.length;i++){
					menuItems[i].css("width",menu.width());
				}
			}
		}else{
			menu.css("width",conf.width);
		}
		
		if(conf.maxitems && conf.maxitems < menuItems.length){
			liheight = 0;
			ulheight = 0;
			
			for(i=0;i<conf.maxitems;i++){
				liheight += menuItems[i].outerHeight();
			}
			for(i=0;i<menuItems.length;i++){
				ulheight += menuItems[i].outerHeight();
			}
			$("ul",menu).css({
				height 		:	liheight,
				overflow	:	"hidden",
				padding		:	0
			});
			_initscrolling();
			
		}
		
	};
	/** 
	**	CREATE REGULAR EVENTS
	**/
	var _createEvents = function(){
		$("li",menu).mouseover(function(){
			//menu.hideChildren();
		});
		menu.hover(function(){
			menu.clearHideTimer();
		},function(){
			menu.setHideTimer();
		});
	};
	
	/** SHOW MENU **/
	var _show = function(){
		if(status == "hidden"){
			if(loaded){
				menu.css({left:pos.x,top:pos.y});
				menu.css("visibility","visible");
				status = "shown";
				if($.isFunction(conf.onshow)){
					conf.onshow(menu);
				}
			}else{
				_load(true);
			}
		}
	};
	/** HIDE MENU **/
	var _hide = function(all){
		if(status == "shown"){
			menu.hideChildren();
			if(all && parent)
				parent.hide(true);
			
			menu.css("visibility","hidden");
			status = "hidden";
			if($.isFunction(conf.onhide)){
				conf.onhide(menu);
			}
		}
	};
	/** INIT SCROLLING WHEN NEC **/
	var _initscrolling = function(){
		menu.prepend($("<div class='mm-scroller mm-s-up'></div>"));
		menu.append($("<div class='mm-scroller mm-s-down'></div>"));
		$(".mm-s-up",menu).mouseover(function(){
			_startscrolling("up");
		});
		$(".mm-s-up",menu).mouseout(function(){
			_endscrolling("up");
		});
		$(".mm-s-down",menu).mouseover(function(){
			_startscrolling("down");
		});
		$(".mm-s-down",menu).mouseout(function(){
			_endscrolling("down");
		});
		_checkscrollers();
	};
	var _startscrolling = function(type){
		if(!intervalID){
			intervalID = setInterval(function(){_scroll(type)},conf.scrollinterval);
		}
	};
	var _endscrolling = function(type){
		if(intervalID){
			clearInterval(intervalID);
			intervalID = false;
		}
	};
	var _scroll = function(type){
		var diff = $("ul li:first",menu).height();
		
		if(type == "up"){
			$("ul li:first",menu).animate({marginTop: (_getmargin() + diff)+"px"},100,function(){_checkscrollers();});
		}else if(type == "down"){
			$("ul li:first",menu).animate({marginTop: (_getmargin() - diff)+"px"},100,function(){_checkscrollers();});
		}
		_checkscrollers();
	};
	var _checkscrollers = function(){
		if(_getmargin() >= 0){
			if($(".mm-s-up",menu).css("display") != "none"){
				_endscrolling();
				$(".mm-s-up",menu).css("display","none");
			}
		}else{
			$(".mm-s-up",menu).css("display","block");
		}
		if(Math.abs(_getmargin()) >= (Math.abs(ulheight)-liheight) ){
			if($(".mm-s-down",menu).css("display") != "none"){
				$(".mm-s-down",menu).css("display","none");
				_endscrolling();
			}
		}else{
			$(".mm-s-down",menu).css("display","block");
		}
	}
	var _getmargin = function(){
		return ($("ul li:first",menu).css("marginTop").replace("px","")*1);
	};
	
	/** PUBLIC METHOD **/
	menu.getStatus = function(){
		return status;
	};
	menu.hide = function(all){
		_hide(all);
	};
	menu.hideChildren = function(){
		/*for(key in children){
			if(children[key].getStatus() == "shown"){
				children[key].hide();
			}
		}*/
		for(var i=0;i<menuItems.length;i++){
			menuItems[i].hideChild();
		}
	}
	menu.show = function(){
		_show();
	};
	menu.setPosition = function(position){
		pos = position;
	};
	menu.getPosition = function(){
		return pos;
	};
	menu.clearHideTimer = function(){
		if(timeout){
			clearTimeout(timeout);
			timeout = false;
		}
		if(parent){
			parent.clearHideTimer();
		}
		
	};
	menu.setHideTimer = function(){
		if(!timeout){
			timeout = setTimeout(function(){menu.hide();},conf.timeToHide);
		}
		if(parent){
			parent.setHideTimer();
		}
	};
	menu.setParent = function(p){
		parent = p;
	}
	menu.setData = function(d){
		data = d;
	}
	menu.preload = function(){
		if(!loaded)
			_load(false);
	};
	menu.destroy = function(){
		if(children.length > 0){
			for(i=0;i<children.length;i++){
				children[i].destroy();
			}
		}
		menu.remove();
	}
	_initialize();
	return menu;
};

var MiniMenuItem = function(data,options,menu){
	var conf = $.extend({}, $.fn.minimenu.defaults, options);
	var item = $("<li></li>");
	var status = false;
	var type = false;
	var child = false;
	
	var _initialize = function(){
		if(data.id)
			item.attr("rel",data.id);
		
		/** FOR OTHER TYPES THEN REGULAR **/
		if(data.type){
			type = data.type;
			status = data.status;
			_initSpecialType();
		}else if(conf.showIcon){
			if(data.icon)
				item.append("<img src='"+data.icon+"' class='mm-icon'/>");
			else
				item.append("<img src='"+conf.blankimg+"' class='mm-icon'/>");
		}	
		
		if(data.label)
			item.append("<span>"+data.label+"</span><div class='mm-clear'></div>");
		
		if(data.children){
			item.addClass("mm-container");
			var ob = new MiniMenu(conf);
			ob.setData(data.children);
			ob.setParent(menu);
			child = ob;
		}else{
			item.addClass("mm-item");
		}
		
		if(data.classname){
			item.addClass(data.classname);
		}
		
		if(data.href){
			item.click(function(){
				window.location.href = data.href;
			});
		}
		
		if(data.onclick){
			if(!$.isFunction(data.onclick)){
				try{
					var customfunc = false;
					eval("customfunc = "+data.onclick+";");
					if($.isFunction(customfunc)){
						data.onclick = customfunc;
					}
				}catch(e){
					//alert(e);
				}
			}
			if($.isFunction(data.onclick)){
				item.click(function(){data.onclick(item)});
			}
		}
		
		_createEvents();
	};
	
	_createEvents = function(){
		item.hover(function(){
			menu.hideChildren(false);
			$(this).addClass("mm-hover");
		},function(){
			$(this).removeClass("mm-hover");
		});
		if(child){
			item.mouseover(function(){
				var npos = {};
				menu.preload();
				var itemWidth = $(this).width();
				var itemTop = $(this).position().top;
				var itemHeight = $(this).height();
				var wwidth = $("body").width();
				var left = menu.getPosition().x + itemWidth;
				var top = menu.getPosition().y + itemTop /*- itemHeight*/;
				
				if(left + menu.width() > wwidth){
					left = menu.getPosition().x - (itemWidth/2);
				}
				/*if(parent){
					npos.x = parent.getPosition().x + itemWidth;
					npos.y = parent.getPosition().y + itemTop;
				}else{*/
				npos.x = left;
				npos.y = top;
				//}
				child.setPosition(npos);
				child.show();	
			});
		}
		item.mousedown(function(){
			$(this).addClass("mm-down");
		});
		item.mouseup(function(){
			$(this).removeClass("mm-down");
		});
		
		if(conf.onclick){
			if(!$.isFunction(conf.onclick)){
				try{
					var customfunc = false;
					eval("customfunc = "+conf.onclick+";");
					if($.isFunction(customfunc)){
						conf.onclick = customfunc;
					}
				}catch(e){
					//alert(e);
				}
			}
			if($.isFunction(conf.onclick)){
				item.click(function(){conf.onclick(item)});
			}
		}
		item.click(function(){
			$(this).removeClass("mm-down");
			if(!type){
				menu.hide(true); 
			}
		});
	};
	
	_initSpecialType = function(){
		if(type == "check"){
			var icon = "";
			if(status == "checked"){
				icon = conf.iconchecked;
			}else{
				icon = conf.iconunchecked;
				status = "unchecked";
			}
			item.append("<img src='"+icon+"' class='mm-icon'/>");
			
			item.click(function(){
				var icon = conf.iconchecked;
				if(status == "checked"){
					icon = conf.iconunchecked;
					status = "unchecked";
				}else{
					status = "checked";
				}
				$("img",item).attr("src",icon);
			});
		}
		
	};
	
	item.setStatus = function(newStatus){
		status = newStatus;
	};
	item.getStatus = function(){
		return status;
	};
	item.hideChild = function(){
		if(child){
			child.hide(false);
		}
	};
	_initialize();
	return item;
};


/**
**	JQUERY EXTENSION
**/	
(function($) {	
	$.fn.minimenu = function(options) {
		return this.each(function() {
			var element = $(this);
			if (element.data('minimenu')) return;
			var w = new MiniMenu(this, options);
			element.data('minimenu', w);
		});
	};
	
})(jQuery);


$.fn.minimenu.defaults = {
	source			: "ajax",
	data			: false,		// FOR SUBITEMS
	method			: "POST",		// METHOD
	datatype		: "json",		// SOURCE DATATYPE - JSON / ELEMENT ($("ul")) - not yet implemented;
	url				: '/',			// AJAX URL
	params			: {},  			// PARAMS TO POST
	preload			: false,		// PRELOAD DATA - AJAX
	showIcon		: false,		// SHOW ICON
	timeToHide		: 500,			// Time needed before the menu hides on mouseout	
	parent			: false,
	evenclass		: "",
	oddclass		: "",
	classname		: "",
	hasiconclass	: "mm-hasicon",
	maxitems		: false,		//LIMIT NR OF VISIBLE MENU ITEMS
	scrollinterval	: 150,
	blankimg		: "/design/default/images/miniplugins/icons/blank.gif",
	iconchecked		: "/design/default/images/miniplugins/icons/ui-check-box-mix.png",
	iconunchecked	: "/design/default/images/miniplugins/icons/ui-check-box-uncheck.png",
	onshow			: false,		//FUNCTION TRIGGERED WHEN MENU IS SHOWN
	onhide			: false,		//FUNCTION TRIGGERED WHEN MENU IS HIDDEN
	width			: 'auto'		//OR PX OR TRIGGER
};

/** DATA ELEMENT OPTIONS 
button {
	id		:  "buttonid",
	label	:  "the label",
	onclick :  function(){ your action here },
	href	:  "Path/To/Url",
	icon	:  "Path/to/icon.gif",
	classname: "extraclass",
	type	:  "check",	  	   specialtypes not required
	status	:  "unchecked",  - or checked when is a specialtype 
}***/



/***
**  JQUERY MINISLIDER PLUGIN
**	WRITTEN BY TOM ROMBAUT
**  Version 0.1
**  11/2009
**  DEPENDENCIES : JQUERY 1.3.1+ 
***/
var MiniSlider = function(element, options) {
	var conf = $.extend({}, $.fn.minislider.defaults, options);
	var slider = $(element);
	var itemCount = 0;
	var loadCount = 0;
	var intervalID = false;
	
	var _initialize = function() {
		slider.wrap("<div class='ms'></div>");
		slider.css("width",0);
		slider.css("height",0);
		
		slider.parent(0).append("<div class='ms-prev ms-button'></div>");
		slider.parent(0).append("<div class='ms-next ms-button'></div>");
		
		//PRELOAD ELEMENTS WITHOUT IMAGES
		itemCount = $("li",slider).length;
		loadCount = 0;
		
		$("li",slider).each(function(){
			if("img",$(this).length == 0){
				var curwidth = slider.width();
				_setWidth(slider,curwidth+_getWidth($(this)));
				if(_getHeight($(this))> slider.height()){
					slider.css("height",_getHeight($(this)));
				}
				loadCount++;
				if(loadCount >= itemCount){
					_finishInit();
				}
			}else{
				_preload($(this));
			}
		});
		
	};
	var _finishInit = function(){
		if(conf.scrolldown){
			$(".ms-next",slider.parent(0)).mousedown(function(){
				_startscrolling("right");
			});
			$(".ms-next",slider.parent(0)).mouseup(function(){
				_endscrolling("right");
			});
			$(".ms-prev",slider.parent(0)).mousedown(function(){
				_startscrolling("left");
			});
			$(".ms-prev",slider.parent(0)).mouseup(function(){
				_endscrolling("left");
			});
		}
		if(conf.scrollhover){
			$(".ms-next",slider.parent(0)).hover(function(){
				_startscrolling("right");
			},function(){
				_endscrolling("right");
			});
			$(".ms-prev",slider.parent(0)).hover(function(){
				_startscrolling("left");
			},function(){
				_endscrolling("left");
			});
		}
	};
	
	var _startscrolling = function(type){
		if(!intervalID){
			intervalID = setInterval(function(){_scroll(type)},conf.scrollinterval);
		}
	};
	
	var _endscrolling = function(type){
		if(intervalID){
			clearInterval(intervalID);
			intervalID = false;
		}
	};
	
	var _scroll = function(type){
		if(type == "left"){
			if(_getmargins().left < 0){
				slider.css("marginLeft",(_getmargins().left + conf.scrollsize)+"px");
			}else{
				_endscrolling(type);
			}
		}else if(type == "right"){
			if(_getmargins().right > 0){
				slider.css("marginLeft",(_getmargins().left - conf.scrollsize)+"px");
			}else{
				_endscrolling(type);
			}
		}
		if(_getmargins().left < 0){
			$(".ms-prev",slider.parent(0)).removeClass("ms-hidden");
		}else
			$(".ms-prev",slider.parent(0)).addClass("ms-hidden");
		
		if(_getmargins().right > 0){
			$(".ms-next",slider.parent(0)).removeClass("ms-hidden");
		}else
			$(".ms-next",slider.parent(0)).addClass("ms-hidden");
	};
	var _getmargins = function(){
		var leftm = (slider.css("marginLeft").replace("px","")*1);
		var rightm = slider.width() - ((slider.parent(0).width() + Math.abs(leftm)));
		return {left: leftm, right:rightm};	
	};
	
	var _getWidth = function(el){
		return el.outerWidth()+(el.css("marginLeft").replace("px","")*1)+(el.css("marginRight").replace("px","")*1);
	};
	var _getHeight = function(el){
		return el.outerHeight()+(el.css("marginTop").replace("px","")*1)+(el.css("marginBottom").replace("px","")*1);
	};
	var _setWidth = function(el,width){
		el.css("width",width);
	};
	var _preload = function(el){
		var img = el.find("img");
		var image   = $(new Image());
		image.attr('src',img.attr('src'));
		if(image.attr("width")){
			_preloadFinish(el);
			image.remove();
		}else{
			image.load(function(){
				_preloadFinish(el);
				image.remove();
			});
		}
	};
	var _preloadFinish = function(el){
		var curwidth = slider.width();
		_setWidth(slider,curwidth+_getWidth(el));
		if(_getHeight(el)> slider.height()){
			slider.css("height",_getHeight(el));
		}
		loadCount++;
		if(loadCount >= itemCount){
			_finishInit();
		}
	};
	
	
	_initialize();
	return slider;
};
	

/**
**	JQUERY PLUGIN
**/
(function($) {	
	$.fn.minislider = function(options) {
		return this.each(function() {
			var element = $(this);
			if (element.data('minislider')) return;
			var w = new MiniSlider(this, options);
			element.data('minislider', w);
		});
	};
	
})(jQuery);

$.fn.minislider.defaults = {
	scrollinterval	:	20,
	scrollsize		:	5,
	scrollhover		:	false,
	scrolldown		:	true
};















/***
**  JQUERY MINISUGGEST PLUGIN
**	WRITTEN BY TOM ROMBAUT
**  Version 0.1
**  03/2010
**  DEPENDENCIES : JQUERY 1.3.1+ , JQUERY UI 1.7.2+
***/
var MiniSuggest = function(element, options) {
	var conf = $.extend({}, $.fn.minisuggest.defaults, options);
	var trigger = $(element);
	var suggest = $('<ul class="mini-suggest"></ul>');
	var currentdata = {};
	var selindex = 0;
	
	var _initialize = function() {
		$("body").append(suggest);
		trigger.focus(function(){_buildsuggest()});
		trigger.blur(function(event){
			setTimeout(function(){_hidesuggest()},500);
		});
		
		trigger.keyup(function(e){
			switch(e.keyCode){
				//LEFT & RIGHT:
				case 37:	
				case 39:	return true;
				//UP	
				case 38:	if($("li."+conf.hoverclass,suggest).length > 0){
								if($("li."+conf.hoverclass,suggest).prev().is("li")){
									var el = $("li."+conf.hoverclass,suggest).prev();
									$("li."+conf.hoverclass,suggest).removeClass(conf.hoverclass);
									el.addClass(conf.hoverclass);
								}
							}
							return false;
				//DOWN
				case 40:	if($("li."+conf.hoverclass,suggest).length > 0){
								if($("li."+conf.hoverclass,suggest).next().is("li")){
									var el = $("li."+conf.hoverclass,suggest).next();
									$("li."+conf.hoverclass,suggest).removeClass(conf.hoverclass);
									el.addClass(conf.hoverclass);
								}
							}else{
								$("li:first",suggest).addClass(conf.hoverclass);
							}
							return false;
				//TAB & ENTER
				case 13:	if($("li."+conf.hoverclass,suggest).length > 0){
								var key = $("li."+conf.hoverclass,suggest).attr("rel");
								_select(key);
							}
							return true;
				//ESC
				case 27:	_hidesuggest();
							return true;
				//BACKSPACE
				case 8:		
				default:	_buildsuggest();
				
			}
		});
		trigger.keydown(function(e){
			if(e.keyCode == 9){
				if($("li."+conf.hoverclass,suggest).length > 0){
					var key = $("li."+conf.hoverclass,suggest).attr("rel");
					_select(key);
				}
				return true;
			}
		});
	};
	var _showsuggest = function(){
		suggest.css({
			top		:	trigger.position().top + trigger.outerHeight(),
			left	:	trigger.position().left,
			width	:	trigger.innerWidth()
		});
		
		suggest.css("display","block");
	};
	var _hidesuggest = function(){
		suggest.css("display","none");
	};
	var _buildsuggest = function(){
		var val = "";
		if(conf.source != null)
			val = conf.source.attr("value");
		else
			val = trigger.attr("value");
		
		var params = conf.params;
		params.value = val;
		
		if($.isFunction(conf.getextraparams)){
			eparams = conf.getextraparams();
			for(key in eparams){
				params[key] = eparams[key];
			}
		}
		$.ajax({
			type	: conf.method,
			url		: conf.url,
			data	: params,
			dataType: conf.datatype,
			success	: function(data){
				currentdata = data;
				_fill(data);
			}
		}); 
	};
	var _fill = function(items){
		$("li",suggest).remove();
		var res = 0;
		for(var key in items){
			if((conf.maxresults > 0 && res < conf.maxresults) || conf.maxresults == 0){
				var li = $("<li rel='"+key+"'>"+items[key].label+"</li>")
				suggest.append(li);
				li.click(function(){
					var k = $(this).attr("rel");
					_select(k);
				});
				
				li.mouseover(function(){
					$("li",suggest).removeClass(conf.hoverclass);
					$(this).addClass(conf.hoverclass);
				});
				res++;
			}
		}
		if($("li",suggest).length > 0){
			_showsuggest();
		}else
			_hidesuggest();
	};	
	var _select = function(key){
		var item = currentdata[key];
		trigger.attr("value",item.label);
		if($.isFunction(conf.onselect))
			conf.onselect(item);
		_hidesuggest();
	};
	_initialize();
	return trigger;
};

/**
**	JQUERY PLUGIN
**/
(function($) {	
	$.fn.minisuggest = function(options) {
		return this.each(function() {
			var element = $(this);
			if (element.data('minisuggest')) return;
			var w = new MiniSuggest(this, options);
			element.data('minisuggest', w);
		});
	};
})(jQuery);

$.fn.minisuggest.defaults = {
	source				:	null,			//VALUE FROM OTHER SOURCE THAN TRIGGER (ELEMENT)
	hoverclass			:	"ms-select",	//CLASSNAME HOVER/SEL
	maxresults			:	0,				//MAX DISPLAYED RESULTS
	url					:	'/',			//AJAX REQUEST URL
	method				:	"POST",			//AJAX REQUEST METHOD
	datatype			: 	"json",			//AJAX REQUEST DATATYPE
	params				:	{action:"get"},	//DEFAULT AJAX PARAMS
	getextraparams		:	false,			//EXTRA FUNCTION TO RETREIVE PARAMS (OBJECT)
	onselect			:	false			//ON SELECT FUNCTION
};/***
**  JQUERY MINITREE PLUGIN
**	WRITTEN BY TOM ROMBAUT
**  Version 0.1
**  11/2009
**  DEPENDENCIES : JQUERY 1.3.1+ , JQUERY UI 1.7.2+
***/
var MiniTabBar = function(element, options) {
	var conf = $.extend({}, $.fn.minitabs.defaults, options);
	var tabbar = $(element);
	var tabholder = null;
	var tabbody = null;
	var tabwrap = null;
	var tabs = new Array();
	var intervalID = false;
	
	var _initialize = function(){
		tabbar.addClass("minitabs");
		if(conf.items.length > 0){
			tabbar.html("");
			for(i = 0;i < conf.items.length; i++){
				var link = conf.items[i].url?conf.items[i].url:'';
				tabbar.append($("<a href='"+link+"'>"+conf.items[i].title+"</a>"));					
				tabbar.append($("<div></div>"));
			}
		}
		tabbody = $("<div class='mt-tab-body'></div>");
		tabbar.prepend(tabbody);
		tabwrap = $("<div class='mt-tab-wrapper'></div>");
		tabwrap.append($("<div class='mt-tab-holder-end'></div>"));
		tabholder = $("<ul class='mt-tab-holder'></ul>");
		tabwrap.prepend(tabholder);
		tabbar.prepend(tabwrap); 
		
		if(conf.height != "auto"){
			tabbody.css("height",conf.height+"px");	
		}
		if(conf.width != "auto"){
			tabbar.css("width",conf.width+"px");
		}
		
		var count = 1;
		var totalwidth = 0;
		tabbar.children("a").each(function(){
			var tab = $("<li rel='tab"+count+"'><a href='#'><span></span></a></li>");
			$("span",tab).html($(this).html());
			tab.attr("key",count);
			var content = "";
			if($(this).next().is("div")){
				content = $(this).next().html();
				$(this).next().remove();
			}
			$(this).remove();
			
			var tabpanel = $("<div class='mt-tab-panel' rel='tab"+count+"'></div>");
			tabpanel.html(content);
			tabholder.append(tab);
			tabbody.append(tabpanel);
			
			if(conf.height == "auto"){
				tabpanel.css("overflowY","hidden");
			}
			if(conf.width == "auto"){
				tabpanel.css("overflowX","hidden");
			}
			
			totalwidth += tab.outerWidth() + (tab.css("marginLeft").replace("px","")*1) + (tab.css("marginRight").replace("px","")*1) + 10;
			tab.attr("left",totalwidth);
			
			tabs[tabs.length] = new MiniTab(tab,tabbar,conf);
			
			tabholder.css("width",totalwidth);
			count++;
		});
		if(tabwrap.width() <= totalwidth){
			_initScrolling();
		}

		if(conf.defaultIndex){
			if(tabbar.getTab(conf.defaultIndex-1)){
				tabbar.getTab(conf.defaultIndex-1).activate();
			}
		}
		if(conf.height != "auto"){
			$(window).bind("resize", function(){_updateHeight();});
			_updateHeight();
		}
		
		if($.isFunction(conf.onload)){
			conf.onload();
		}
	};
	var _initScrolling = function(){
		tabholder.css("marginLeft","15px");
		tabwrap.append($("<div class='mt-tab-scroller mt-scroll-left disabled'><div class='mt-scroller'></div></div>"));
		tabwrap.append($("<div class='mt-tab-scroller mt-scroll-right'><div class='mt-scroller'></div></div>"));
		
		$(".mt-scroll-left",tabbar).mousedown(function(){
			if(!$(this).hasClass("disabled")){
				_startscrolling("left");
			}
		});
		$(".mt-scroll-left",tabbar).mouseup(function(){
			_endscrolling("left");
		});
		
		$(".mt-scroll-right",tabbar).mousedown(function(){
			if(!$(this).hasClass("disabled")){
				_startscrolling("right");
			}
		});
		$(".mt-scroll-right",tabbar).mouseup(function(){
			_endscrolling("right");
		});
		
	};
	var _updateHeight = function(){
		
		var paddingTop = (tabbody.css("paddingTop").replace("px","") *1);
		var paddingBottom = (tabbody.css("paddingBottom").replace("px","") *1);
		var pad = paddingTop + paddingBottom;
		var height = tabbody.height();
		var width = tabbody.width();
		$(".mt-tab-panel",tabbar).css("height",height+"px");
		$(".mt-tab-panel",tabbar).css("width",width+"px");
		
	};
	
	var _startscrolling = function(type){
		if(!intervalID){
			intervalID = setInterval(function(){_scroll(type)},conf.scrollInterval);
		}
	};
	var _endscrolling = function(type){
		if(intervalID){
			clearInterval(intervalID);
			intervalID = false;
		}
	};
	
	var _scroll = function(type){
		if(type == "left"){
			if(_getmargins().left < 15){
				tabholder.css("marginLeft",(_getmargins().left + 5)+"px");
			}else{
				_endscrolling(type);
			}
		}else if(type == "right"){
			if(_getmargins().right > -15){
				tabholder.css("marginLeft",(_getmargins().left - 5)+"px");
			}else{
				_endscrolling(type);
			}
		}
		if(_getmargins().left < 15)
			$(".mt-scroll-left",tabbar).removeClass("disabled");
		else
			$(".mt-scroll-left",tabbar).addClass("disabled");
		
		if(_getmargins().right > -15)
			$(".mt-scroll-right",tabbar).removeClass("disabled");
		else
			$(".mt-scroll-right",tabbar).addClass("disabled");
	};
		
	var _getmargins = function(){
		var leftm = (tabholder.css("marginLeft").replace("px","")*1);
		var rightm = tabholder.width() - ((tabwrap.width() + Math.abs(leftm)));
		return {left: leftm, right:rightm};	
	};
	tabbar.deselectAll = function(){
		for(i=0;i<tabs.length;i++){
			if(tabs[i])
				tabs[i].deactivate();
		}
	};
	tabbar.remove = function(key){
		if(tabs[key])
			tabs[key].remove();
	};
	tabbar.unset = function(key){
		tabs[key] = false;
	};
	tabbar.getTab = function(key){
		if(tabs[key])
			return tabs[key];
		else
			return false;
	};
	
	_initialize();
	return tabbar;
};

var MiniTab = function(element,tabbar,conf) {
	var tab = $(element);
	var status = "inactive";
	var related = null;
	var key = tab.attr("key");
	var _initialize = function(){
		tab.click(function(){
			tab.activate();
			return false;
		});
		if(tab.attr("rel")){
			related = $("div[rel='"+tab.attr("rel")+"']",tabbar);
		}
		related.hide();
	};
	
	tab.deactivate = function(){
		if(status == "active"){
			tab.removeClass("active");
			related.hide();
			status = "inactive";
			if($.isFunction(conf.ondeactive)){
				conf.ondeactive(tab,related);
			}
		}
	};
	tab.activate = function(){
		if(status == "inactive"){
			tabbar.deselectAll();
			tab.addClass("active");
			related.show();
			status = "active";
			if($.isFunction(conf.onactivate)){
				conf.onactivate(tab,related);
			}
		}
	};
	tab.remove = function(){
		$(tab,tabbar).remove();
		tabbar.unset(key);
	};
	
	
	_initialize();
	return tab;
};

/**
**	JQUERY PLUGIN
**/
(function($) {	
	$.fn.minitabs = function(options) {
		return this.each(function() {
			var element = $(this);
			if (element.data('minitabs')) return;
			var w = new MiniTabBar(this, options);
			element.data('minitabs', w);
		});
	};
	
})(jQuery);

$.fn.minitabs.defaults = {
	items 			:	[],
	defaultIndex	:	1,
	height			:	"auto",
	width			:	"auto",
	scrollInterval	:	15,
	onload			:	false,
	onactive		:	false,
	ondeactive		:	false
};/***
**  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 npar = conf.params;
			npar.term = $(this).html();
			$(this).minitooltip({
				title		:	npar.term.charAt(0).toUpperCase()+npar.term.substr(1),
				source		:	"ajax",
				url			: 	conf.url,
				method		:	"POST",			//AJAX REQUEST METHOD
				datatype	: 	"json",	
				params		:   npar
			});
		});
	}
	
	_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"
};/***
**  JQUERY MINITOOLBAR PLUGIN
**	WRITTEN BY TOM ROMBAUT
**  Version 0.12
**  15/07/2010
**  DEPENDENCIES : JQUERY 1.3.1+ , JQUERY UI 1.7.2+
***/
var MiniToolbar = function(element, options) {
	var conf = $.extend({}, $.fn.minitoolbar.defaults, options);
	var toolbar = $(element);
	var buttonlist = new Array();
	var _initialize = function() {
		toolbar.addClass("minitoolbar");
		if(conf.buttons && conf.buttons.length > 0){
			initbuttons(conf.buttons);
		}else if(conf.url){
			$.ajax({
				url	 		:  conf.url,
				type 		:  "POST",
				dataType 	:  "json",
				data		:  conf.params,
				success		:  function(buttons){
					initbuttons(buttons);
				}
			});
		}
	};
	
	var initbuttons = function(buttons){
		for(var i=0;i<buttons.length;i++){
			if(buttons[i].type == "separator"){
				toolbar.append($('<div class="mtb-separator"></div>'));
			}else{
				var btn = new MiniToolbarButton(buttons[i]);
				buttonlist[buttonlist.length] = btn;
				toolbar.append(btn);
			}
		};
		toolbar.append($('<div class="mtb-clear"></div>'));
	
	}
	
	toolbar.destroy = function(){
		for(var i=0;i<buttonlist.length;i++){
			buttonlist[i].destroy();
		}
		$(this).html("");
		toolbar.data('minitoolbar', null);
	};
	
	_initialize();
	return toolbar;
};
	
var MiniToolbarButton = function(options) {
	var element = $('<div class="mtb-button"></div>');
	var timeout = false;
	var menu = false;
	var _initialize = function() {
		
		element.hover(function(){
			$(this).addClass("mtb-hover");
		},function(){
			$(this).removeClass("mtb-hover");
		});
		element.mousedown(function(){
			$(this).addClass("mtb-down");
		});
		element.mouseup(function(){
			$(this).removeClass("mtb-down");
		});
		
		/** START CREATING BUTTON **/
		if(options.id){
			element.attr("id",options.id);
		}
		if(options.classname)
			element.addClass(options.classname);
		
		if(options.icon){
			element.append($("<img class='mtb-icon'/>"));
			$("img",element).attr("src",options.icon);
		}
		if(options.label){
			element.append($("<span></span>"));
			$("span",element).html(options.label);
		}
		
		if(options.type == "select"){
			
			element.append($("<div class='mtb-toggle-select'></div>"));
			element.addClass('mtb-select');
			if(options.position)
				options.menu.preload = true;
			menu = new MiniMenu(options.menu);
			menu.setParent(element);
			element.hover(function(){
				element.clearHideTimer();
			},function(){
				element.setHideTimer();
			});
			element.click(function(){
				if(menu.getStatus() == "shown"){
					menu.hide();
					$(this).removeClass("mtb-down");	
				}else{
					/** POSITION MENU **/
					menu.preload();
					var alignel = element;
					var extra = 0;
					if(options.alignwith){
						alignel = options.alignwith;
						menu.css("width",options.alignwith.innerWidth());
						extra = 1;
					}else if(alignel.width() > menu.width()){
						menu.css("width",alignel.outerWidth());
					}
					
					var setpos = false;
					var top =  alignel.position().top + alignel.outerHeight() + (alignel.css("marginTop").replace("px","")*1);
					var left = alignel.position().left + extra + (alignel.css("marginLeft").replace("px","")*1);
					
					var right = alignel.position().left + alignel.outerWidth() + (alignel.css("marginRight").replace("px","")*1) + (alignel.css("marginLeft").replace("px","")*1);
					var wwidth = $("body").width();
					if(options.position){
						if(options.position == "right"){
							left = right - menu.width();
							setpos = true;
						}
					}
					if(setpos == false){
						if(left + menu.width() > wwidth){
							left = right - menu.width();
						}
					}
					menu.setPosition({x:left,y:top});
					menu.show();
					$(this).addClass("mtb-down");
				}
			});
		}
		if(options.href){
			element.click(function(){
				window.location.href = options.href;
			});
		}
		
		if(options.onclick){
			if(!$.isFunction(options.onclick)){
				try{
					var customfunc = false;
					eval("customfunc = "+options.onclick+";");
					if($.isFunction(customfunc)){
						options.onclick = customfunc;
					}
				}catch(e){
					//alert(e);
				}
			}
			if($.isFunction(options.onclick)){
				element.click(function(){options.onclick()});
			}
		}
	
	};
	element.destroy = function(){
		if(menu){
			menu.destroy();
		}
		element.remove();
	}
	element.hide = function(){
		menu.hide();
		element.removeClass("mtb-down");
	};
	element.clearHideTimer = function(){
		if(timeout){
			clearTimeout(timeout);
			timeout = false;
		}
		//menu.clearHideTimer();
	};
	element.setHideTimer = function(){
		if(!timeout){
			timeout = setTimeout(function(){menu.hide();element.removeClass("mtb-down");},500);
		}
	};
	
	
	_initialize();
	return element;	
};
/**
**	JQUERY PLUGIN
**/
(function($) {	
	$.fn.minitoolbar = function(options) {
		return this.each(function() {
			var element = $(this);
			if (element.data('minitoolbar')) return;
			var w = new MiniToolbar(this, options);
			element.data('minitoolbar', w);
		});
	};
	
})(jQuery);

$.fn.minitoolbar.defaults = {
	buttons	:	[],		/* BUTTONS OBJECT */
	url		:	"",		/* AJAX URL TO GET THE JSON DATA */
	params	: 	{} 		// PARAMS TO POST
		
};
/** BUTTON OPTIONS 
button {
	type	:  "button",	 OR select, OR separator 
	id		:  "buttonid",
	label	:  "the label",
	position:  "left",	IF SELECT
	onclick :  function(){ your action here },
	href	:  "Path/To/Url",
	icon	:  "Path/to/icon.gif",
	classname: "extraclass",
	alignwith	: false			//ALIGN WITH A DIFFERENT ELEMNT
}***/
/***
**  JQUERY MINITOOLTIP PLUGIN
**	WRITTEN BY TOM ROMBAUT
**  Version 0.1
**  09/2010
**  DEPENDENCIES : JQUERY 1.3.1+ 
***/
var MiniTooltip = function(element, options) {
	var conf = $.extend({}, $.fn.minitooltip.defaults, options);
	var trigger = $(element);
	var content = "";
	var loaded = false;
	var timeout = false;
	var tooltip = null;
	var shown = false;
	
	var _initialize = function(){
		
		if(conf.preload == true){
			_load(false);
		}
		trigger.hover(function(e){
			if(shown){
				_clearHideTimer();
			}else{
				_show(e);
			}
		},function(){
			_setHideTimer();
		});
		
	};
	
	var _load = function(show,e){
		if(conf.source == "ajax"){
			$.ajax({
				type: 		conf.method,
				url: 		conf.url,
				data: 		conf.params,
				dataType: 	conf.datatype,
				success: 	function(data){
					loaded = true;
					content = data;
					if(show){
						_show(e);
					}
				}
			}); 
		}else{
			content = trigger.attr(conf.source);
			loaded = true;
			if(show){
				_show(e);
			}
		}
		
	}
	
	var _show = function(e){
		if(!loaded){
			_load(true,e);
		}else{
			tooltip = $("<div class='mtt-container'><div class='mtt-body'></div></div>");
			if(conf.title){
				tooltip.prepend($("<div class='mtt-title'>"+conf.title+"</div>"));
			}
			$(".mtt-body",tooltip).html(content);
			
			/** POSITION **/
			var tooltipLeft = e.pageX;
			var tooltipRight = e.pageY;
			tooltip.css({
				visibility : "hidden"
			});
			$("body").append(tooltip);
			
			var wwidth = $("body").width();
			if(tooltipLeft + tooltip.width() > wwidth)
				tooltipLeft = tooltipLeft - tooltip.width();
			
			tooltip.css({
				left	:	tooltipLeft,
				top		:	tooltipRight,
				visibility:	"visible"
			});
			
			
			shown = true;
			tooltip.hover(function(e){
				_clearHideTimer();
			},function(){
				_setHideTimer();
			});
		}
	}
	
	var _hide = function(){
		shown = false;
		tooltip.remove();
	}
	
	var _clearHideTimer = function(){
		if(timeout){
			clearTimeout(timeout);
			timeout = false;
		}
	};
	
	var _setHideTimer = function(){
		if(!timeout){
			timeout = setTimeout(function(){_hide();},conf.timeToHide);
		}
	};
	
	_initialize();
	return trigger;
};

/**
**	JQUERY PLUGIN
**/
(function($) {	
	$.fn.minitooltip = function(options) {
		return this.each(function() {
			var element = $(this);
			if (element.data('minitooltip')) return;
			var w = new MiniTooltip(this, options);
			element.data('minitooltip', w);
		});
	};
})(jQuery);

$.fn.minitooltip.defaults = {
	preload				:	false,
	title				:	"",				//TOOLTIP TITLE 
	source				:	"title",		//source attribute, or ajax
	url					:	'/',			//AJAX REQUEST URL
	method				:	"POST",			//AJAX REQUEST METHOD
	datatype			: 	"json",			//AJAX REQUEST DATATYPE
	params				:	{},
	highlightClass		:	"mt-highlight",
	timeToHide			:	500
};/***
**  JQUERY MINITREE PLUGIN
**	WRITTEN BY TOM ROMBAUT
**  Version 0.1
**  11/2009
**  DEPENDENCIES : JQUERY 1.3.1+ , JQUERY UI 1.7.2+
***/
var MiniTree = function(element, options) {
	var conf = $.extend({}, $.fn.minitree.defaults, options);
	var tree = $(element);
	
	var _initialize = function() {
		tree.addClass("minitree");
		_loadChildren(tree);
	};
	var _loadChildren = function(node){
		nodeID = conf.baseNodeID;
		if(node.attr("rel")){
			nodeID = node.attr("rel");
		}
		var params = {action:conf.action,node:nodeID};
		$.ajax({
			type: conf.method,
			url: conf.url,
			data: params,
			dataType: conf.datatype,
			success: function(data){
				_createSubTree(data,node);
				if(node.hasClass("minitree"))
					tree.append("<div class='clear'></div>");
			}
		}); 
	};
	
	var _createSubTree = function(nodes,parentnode){
		if(nodes.length == 0)
			return;
			
		var stree = $("<ul></ul>");
		
		var lastNode = nodes.length-1;
		for(var i=0;i<nodes.length;i++){
			var branch = $("<li rel='"+nodes[i].id+"'></li>");
			
			/**ADD OPENER **/
			if(conf.showOpener){
				branch.append("<div class='opener'></div>");
				$(".opener",branch).click(function(){
					_toggleBranch($(this).parent(0));
				});
				if(i == lastNode)
					branch.addClass("last");
			}
			
			/** ADD CLASS **/
			if(nodes[i].hasChildren){
				if(nodes[i].children){
					branch.addClass("open");
				}else{
					branch.addClass("closed");
				}
				branch.addClass("container");
			}else{
				branch.addClass("leaf");
			}
			
			if(nodes[i].classname){
				branch.addClass(nodes[i].classname);
			}
			
			/** ADD ICON **/
			if(conf.showIcon){
				if(nodes[i].icon){
					branch.append("<img src='"+nodes[i].icon+"' class='icon fixed' />");
				}else{
					branch.append("<div class='icon'></div>");
				}
			}
			
			/** ADD SPAN **/
			branch.append("<span>"+nodes[i].label+"</span>");
			var left = 0;
			if(conf.showIcon){
				left += 18;
			}
			if(conf.showOpener){
				left += 18;
			}
			$("span",branch).css({left: left+"px"});
			
			$("span",branch).dblclick(function(){
				_toggleBranch($(this).parent(0));
			});
			$("span",branch).click(function(){
				if(!$(this).hasClass("selected")){
					$("span.selected",tree).removeClass("selected");
					$(this).addClass("selected");
					if($.isFunction(conf.onselect)){
						conf.onselect($(this).parent(0));
					}
				}
			});
			if($.isFunction(conf.onclick)){
				$("span",branch).click(function(){
					conf.onclick($(this).parent(0));
				});
			}
			if($.isFunction(conf.rightclick)){
				$("span",branch).add('.minitree').bind('contextmenu', function() { return false; });
				$("span",branch).mouseup( function(evt) {
					if( evt.button == 2 ) {
						conf.rightclick($(this).parent(0));
						return false;
					}
					return true; 
				});
			}
			if($.isFunction(conf.leaf_onload)){
				conf.leaf_onload(branch);
			}
			
			stree.append(branch);
			if(nodes[i].children){
				_createSubTree(nodes[i].children, branch);
			}
			
		}
		parentnode.append(stree);
	};

	var _toggleBranch = function(node){
		if(node.hasClass("closed")){
			_openBranch(node);
		}else if(node.hasClass("open")){
			_closeBranch(node);
		}else if(node.hasClass("leaf")){
			if($.isFunction(conf.leaf_ondblclick)){
				conf.leaf_ondblclick(node);
			}
		}
	};
	var _openBranch = function(node){
		if($("ul",node).length>0){
			$("ul:first",node).show();
		}else{
			_loadChildren(node);
		}
		if($.isFunction(conf.onopen)){
			conf.onopen(node);		
		}
		node.addClass("open");
		node.removeClass("closed");
	};
	var _closeBranch = function(node){
		if($("ul",node).length>0){
			$("ul:first",node).hide();
		}
		if($.isFunction(conf.onclose)){
			conf.onclose(node);		
		}
		node.addClass("closed");
		node.removeClass("open");
	};
	_initialize();
	return tree;
};

/**
**	JQUERY PLUGIN
**/
(function($) {	
	$.fn.minitree = function(options) {
		return this.each(function() {
			var element = $(this);
			if (element.data('minitree')) return;
			var w = new MiniTree(this, options);
			element.data('minitree', w);
		});
	};
	
})(jQuery);

$.fn.minitree.defaults = {
	method			: "POST",		// METHOD
	datatype		: "json",		// SOURCE DATATYPE
	url				: '/',			// AJAX URL
	action			: 'fetchTree',  // AJAX ACTION
	baseNodeID		: 0,			// BASENODEID
	showOpener		: true,			// SHOWOPENER PLUS/MINUS
	showIcon		: true,			// SHOW ICON
	leaf_onload		: false,
	leaf_ondblclick : false,		// DBLCLICK ACTION - NOT ON CONAINERS
	onselect		: false,
	onopen			: false,
	onclose			: false,
	onclick		 	: false,		// CLICK ACTION ON ITEMS
	rightclick 		: false			// RIGHTCLICK ACTION
};
