esme-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From d..@apache.org
Subject svn commit: r726084 [5/6] - in /incubator/esme/trunk/server: ./ src/ src/main/ src/main/resources/ src/main/resources/props/ src/main/scala/ src/main/scala/bootstrap/ src/main/scala/bootstrap/liftweb/ src/main/scala/us/ src/main/scala/us/esme/ src/main...
Date Fri, 12 Dec 2008 18:32:22 GMT
Added: incubator/esme/trunk/server/src/main/webapp/scripts/ui.mouse.js
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/scripts/ui.mouse.js?rev=726084&view=auto
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/scripts/ui.mouse.js (added)
+++ incubator/esme/trunk/server/src/main/webapp/scripts/ui.mouse.js Fri Dec 12 10:32:17 2008
@@ -0,0 +1,237 @@
+(function($) {
+	
+	//If the UI scope is not availalable, add it
+	$.ui = $.ui || {};
+	
+	//Add methods that are vital for all mouse interaction stuff (plugin registering)
+	$.extend($.ui, {
+		plugin: {
+			add: function(w, c, o, p) {
+				var a = $.ui[w].prototype; if(!a.plugins[c]) a.plugins[c] = [];
+				a.plugins[c].push([o,p]);
+			},
+			call: function(instance, name, arguments) {
+				var c = instance.plugins[name]; if(!c) return;
+				var o = instance.interaction ? instance.interaction.options : instance.options;
+				var e = instance.interaction ? instance.interaction.element : instance.element;
+				
+				for (var i = 0; i < c.length; i++) {
+					if (o[c[i][0]]) c[i][1].apply(e, arguments);
+				}	
+			}	
+		}
+	});
+	
+	$.fn.mouseInteractionDestroy = function() {
+		this.each(function() {
+			if($.data(this, "ui-mouse")) $.data(this, "ui-mouse").destroy(); 	
+		});
+	}
+	
+	$.ui.mouseInteraction = function(el,o) {
+	
+		if(!o) var o = {};
+		this.element = el;
+		$.data(this.element, "ui-mouse", this);
+		
+		this.options = {};
+		$.extend(this.options, o);
+		$.extend(this.options, {
+			handle : o.handle ? ($(o.handle, el)[0] ? $(o.handle, el) : $(el)) : $(el),
+			helper: o.helper || 'original',
+			preventionDistance: o.preventionDistance || 0,
+			dragPrevention: o.dragPrevention ? o.dragPrevention.toLowerCase().split(',') : ['input','textarea','button','select','option'],
+			cursorAt: { top: ((o.cursorAt && o.cursorAt.top) ? o.cursorAt.top : 0), left: ((o.cursorAt && o.cursorAt.left) ? o.cursorAt.left : 0), bottom: ((o.cursorAt && o.cursorAt.bottom) ? o.cursorAt.bottom : 0), right: ((o.cursorAt && o.cursorAt.right) ? o.cursorAt.right : 0) },
+			cursorAtIgnore: (!o.cursorAt) ? true : false, //Internal property
+			appendTo: o.appendTo || 'parent'			
+		})
+		o = this.options; //Just Lazyness
+		
+		if(!this.options.nonDestructive && (o.helper == 'clone' || o.helper == 'original')) {
+
+			// Let's save the margins for better reference
+			o.margins = {
+				top: parseInt($(el).css('marginTop')) || 0,
+				left: parseInt($(el).css('marginLeft')) || 0,
+				bottom: parseInt($(el).css('marginBottom')) || 0,
+				right: parseInt($(el).css('marginRight')) || 0
+			};
+
+			// We have to add margins to our cursorAt
+			if(o.cursorAt.top != 0) o.cursorAt.top = o.margins.top;
+			if(o.cursorAt.left != 0) o.cursorAt.left += o.margins.left;
+			if(o.cursorAt.bottom != 0) o.cursorAt.bottom += o.margins.bottom;
+			if(o.cursorAt.right != 0) o.cursorAt.right += o.margins.right;
+			
+			
+			if(o.helper == 'original')
+				o.wasPositioned = $(el).css('position');
+			
+		} else {
+			o.margins = { top: 0, left: 0, right: 0, bottom: 0 };
+		}
+		
+		var self = this;
+		this.mousedownfunc = function(e) { // Bind the mousedown event
+			return self.click.apply(self, [e]);	
+		}
+		o.handle.bind('mousedown', this.mousedownfunc);
+		
+		//Prevent selection of text when starting the drag in IE
+		if($.browser.msie) $(this.element).attr('unselectable', 'on');
+		
+	}
+	
+	$.extend($.ui.mouseInteraction.prototype, {
+		plugins: {},
+		currentTarget: null,
+		lastTarget: null,
+		timer: null,
+		slowMode: false,
+		init: false,
+		destroy: function() {
+			this.options.handle.unbind('mousedown', this.mousedownfunc);
+		},
+		trigger: function(e) {
+			return this.click.apply(this, arguments);
+		},
+		click: function(e) {
+
+			var o = this.options;
+			
+			window.focus();
+			if(e.which != 1) return true; //only left click starts dragging
+		
+			// Prevent execution on defined elements
+			var targetName = (e.target) ? e.target.nodeName.toLowerCase() : e.srcElement.nodeName.toLowerCase();
+			for(var i=0;i<o.dragPrevention.length;i++) {
+				if(targetName == o.dragPrevention[i]) return true;
+			}
+
+			//Prevent execution on condition
+			if(o.startCondition && !o.startCondition.apply(this, [e])) return true;
+
+			var self = this;
+			this.mouseup = function(e) { return self.stop.apply(self, [e]); }
+			this.mousemove = function(e) { return self.drag.apply(self, [e]); }
+
+			var initFunc = function() { //This function get's called at bottom or after timeout
+				$(document).bind('mouseup', self.mouseup);
+				$(document).bind('mousemove', self.mousemove);
+				self.opos = [e.pageX,e.pageY]; // Get the original mouse position
+			}
+			
+			if(o.preventionTimeout) { //use prevention timeout
+				if(this.timer) clearInterval(this.timer);
+				this.timer = setTimeout(function() { initFunc(); }, o.preventionTimeout);
+				return false;
+			}
+		
+			initFunc();
+			return false;
+			
+		},
+		start: function(e) {
+			
+			var o = this.options; var a = this.element;
+			o.co = $(a).offset(); //get the current offset
+				
+			this.helper = typeof o.helper == 'function' ? $(o.helper.apply(a, [e,this]))[0] : (o.helper == 'clone' ? $(a).clone()[0] : a);
+
+			if(o.appendTo == 'parent') { // Let's see if we have a positioned parent
+				var cp = a.parentNode;
+				while (cp) {
+					if(cp.style && ($(cp).css('position') == 'relative' || $(cp).css('position') == 'absolute')) {
+						o.pp = cp;
+						o.po = $(cp).offset();
+						o.ppOverflow = !!($(o.pp).css('overflow') == 'auto' || $(o.pp).css('overflow') == 'scroll'); //TODO!
+						break;	
+					}
+					cp = cp.parentNode ? cp.parentNode : null;
+				};
+				
+				if(!o.pp) o.po = { top: 0, left: 0 };
+			}
+			
+			this.pos = [this.opos[0],this.opos[1]]; //Use the relative position
+			this.rpos = [this.pos[0],this.pos[1]]; //Save the absolute position
+			
+			if(o.cursorAtIgnore) { // If we want to pick the element where we clicked, we borrow cursorAt and add margins
+				o.cursorAt.left = this.pos[0] - o.co.left + o.margins.left;
+				o.cursorAt.top = this.pos[1] - o.co.top + o.margins.top;
+			}
+
+
+
+			if(o.pp) { // If we have a positioned parent, we pick the draggable relative to it
+				this.pos[0] -= o.po.left;
+				this.pos[1] -= o.po.top;
+			}
+			
+			this.slowMode = (o.cursorAt && (o.cursorAt.top-o.margins.top > 0 || o.cursorAt.bottom-o.margins.bottom > 0) && (o.cursorAt.left-o.margins.left > 0 || o.cursorAt.right-o.margins.right > 0)) ? true : false; //If cursorAt is within the helper, set slowMode to true
+			
+			if(!o.nonDestructive) $(this.helper).css('position', 'absolute');
+			if(o.helper != 'original') $(this.helper).appendTo((o.appendTo == 'parent' ? a.parentNode : o.appendTo)).show();
+
+			// Remap right/bottom properties for cursorAt to left/top
+			if(o.cursorAt.right && !o.cursorAt.left) o.cursorAt.left = this.helper.offsetWidth+o.margins.right+o.margins.left - o.cursorAt.right;
+			if(o.cursorAt.bottom && !o.cursorAt.top) o.cursorAt.top = this.helper.offsetHeight+o.margins.top+o.margins.bottom - o.cursorAt.bottom;
+		
+			this.init = true;	
+
+			if(o._start) o._start.apply(a, [this.helper, this.pos, o.cursorAt, this, e]); // Trigger the start callback
+			this.helperSize = { width: $(this.helper).outerWidth(), height: $(this.helper).outerHeight() }; //Set helper size property
+			return false;
+						
+		},
+		stop: function(e) {			
+			
+			var o = this.options; var a = this.element; var self = this;
+
+			$(document).unbind('mouseup', self.mouseup);
+			$(document).unbind('mousemove', self.mousemove);
+
+			if(this.init == false) return this.opos = this.pos = null;
+			if(o._beforeStop) o._beforeStop.apply(a, [this.helper, this.pos, o.cursorAt, this, e]);
+
+			if(this.helper != a && !o.beQuietAtEnd) { // Remove helper, if it's not the original node
+				$(this.helper).remove(); this.helper = null;
+			}
+			
+			if(!o.beQuietAtEnd) {
+				//if(o.wasPositioned)	$(a).css('position', o.wasPositioned);
+				if(o._stop) o._stop.apply(a, [this.helper, this.pos, o.cursorAt, this, e]);
+			}
+
+			this.init = false;
+			this.opos = this.pos = null;
+			return false;
+			
+		},
+		drag: function(e) {
+
+			if (!this.opos || ($.browser.msie && !e.button)) return this.stop.apply(this, [e]); // check for IE mouseup when moving into the document again
+			var o = this.options;
+			
+			this.pos = [e.pageX,e.pageY]; //relative mouse position
+			if(this.rpos && this.rpos[0] == this.pos[0] && this.rpos[1] == this.pos[1]) return false;
+			this.rpos = [this.pos[0],this.pos[1]]; //absolute mouse position
+			
+			if(o.pp) { //If we have a positioned parent, use a relative position
+				this.pos[0] -= o.po.left;
+				this.pos[1] -= o.po.top;	
+			}
+			
+			if( (Math.abs(this.rpos[0]-this.opos[0]) > o.preventionDistance || Math.abs(this.rpos[1]-this.opos[1]) > o.preventionDistance) && this.init == false) //If position is more than x pixels from original position, start dragging
+				this.start.apply(this,[e]);			
+			else {
+				if(this.init == false) return false;
+			}
+		
+			if(o._drag) o._drag.apply(this.element, [this.helper, this.pos, o.cursorAt, this, e]);
+			return false;
+			
+		}
+	});
+
+ })(jQuery);

Added: incubator/esme/trunk/server/src/main/webapp/scripts/ui.resizable.js
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/scripts/ui.resizable.js?rev=726084&view=auto
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/scripts/ui.resizable.js (added)
+++ incubator/esme/trunk/server/src/main/webapp/scripts/ui.resizable.js Fri Dec 12 10:32:17 2008
@@ -0,0 +1,332 @@
+(function($) {
+
+	//Make nodes selectable by expression
+	$.extend($.expr[':'], { resizable: "(' '+a.className+' ').indexOf(' ui-resizable ')" });
+	
+	$.fn.resizable = function(o) {
+		return this.each(function() {
+			if(!$(this).is(".ui-resizable")) new $.ui.resizable(this,o);	
+		});
+	}
+
+	//Macros for external methods that support chaining
+	var methods = "destroy,enable,disable".split(",");
+	for(var i=0;i<methods.length;i++) {
+		var cur = methods[i], f;
+		eval('f = function() { var a = arguments; return this.each(function() { if(jQuery(this).is(".ui-resizable")) jQuery.data(this, "ui-resizable")["'+cur+'"](a); if(jQuery(this.parentNode).is(".ui-resizable")) jQuery.data(this, "ui-resizable")["'+cur+'"](a); }); }');
+		$.fn["resizable"+cur.substr(0,1).toUpperCase()+cur.substr(1)] = f;
+	};
+	
+	//get instance method
+	$.fn.resizableInstance = function() {
+		if($(this[0]).is(".ui-resizable") || $(this[0].parentNode).is(".ui-resizable")) return $.data(this[0], "ui-resizable");
+		return false;
+	};
+	
+	$.ui.resizable = function(el,o) {
+		
+		var options = {}; o = o || {}; $.extend(options, o); //Extend and copy options
+		this.element = el; var self = this; //Do bindings
+		$.data(this.element, "ui-resizable", this);
+		
+		if(options.proxy) {
+			var helper = function(e,that) {
+				var helper = $('<div></div>').css({
+					width: $(this).width(),
+					height: $(this).height(),
+					position: 'absolute',
+					left: that.options.co.left,
+					top: that.options.co.top
+				}).addClass(that.options.proxy);
+				return helper;
+			}	
+		} else {
+			var helper = "original";	
+		}
+
+		//Prepare containment option
+		if(options.containment){ 
+			if(options.containment.left != undefined || options.containment.constructor == Array) return; 
+			if(options.containment == 'parent') options.containment = this.element.parentNode;
+			if(options.containment == 'document') { 
+				options.containment = [0,0,$(document).width(),($(document).height() || document.body.parentNode.scrollHeight)]; 
+			} else { //I'm a node, so compute top/left/right/bottom 
+				var ce = $(options.containment)[0]; 
+				var co = $(options.containment).offset({ border: false });
+				options.containment = [co.left, co.top, co.left+(ce.offsetWidth || ce.scrollWidth), co.top+(ce.offsetHeight || ce.scrollHeight)];
+			} 
+		} 
+		
+		//Destructive mode wraps the original element
+		if(el.nodeName.match(/textarea|input|select|button|img/i)) options.destructive = true;
+		if(options.destructive) {
+			
+			$(el).wrap('<div class="ui-wrapper"  style="position: relative; width: '+$(el).outerWidth()+'px; height: '+$(el).outerHeight()+';"></div>');
+			var oel = el;
+			el = el.parentNode; this.element = el;
+			
+			//Move margins to the wrapper
+			$(el).css({ marginLeft: $(oel).css("marginLeft"), marginTop: $(oel).css("marginTop"), marginRight: $(oel).css("marginRight"), marginBottom: $(oel).css("marginBottom")});
+			$(oel).css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
+			
+			o.proportionallyResize = o.proportionallyResize || [];
+			o.proportionallyResize.push(oel);
+			
+			var b = [parseInt($(oel).css('borderTopWidth')),parseInt($(oel).css('borderRightWidth')),parseInt($(oel).css('borderBottomWidth')),parseInt($(oel).css('borderLeftWidth'))];
+
+		} else {
+			var b = [0,0,0,0];	
+		}
+		
+		if(options.destructive || !$(".ui-resizable-handle",el).length) {
+			//Adding handles (disabled not so common ones)
+			var t = function(a,b) { $(el).append("<div class='ui-resizable-"+a+" ui-resizable-handle' style='"+b+"'></div>"); };
+			//t('n','top: '+b[0]+'px;');
+			t('e','right: '+b[1]+'px;'+(options.zIndex ? 'z-index: '+options.zIndex+';' : ''));
+			t('s','bottom: '+b[1]+'px;'+(options.zIndex ? 'z-index: '+options.zIndex+';' : ''));
+			//t('w','left: '+b[3]+'px;');
+			t('se','bottom: '+b[2]+'px; right: '+b[1]+'px;'+(options.zIndex ? 'z-index: '+options.zIndex+';' : ''));
+			//t('sw','bottom: '+b[2]+'px; left: '+b[3]+'px;');
+			//t('ne','top: '+b[0]+'px; right: '+b[1]+'px;');
+			//t('nw','top: '+b[0]+'px; left: '+b[3]+'px;');
+		}
+		
+		//If other elements should be modified, we have to copy that array
+		options.modifyThese = [];
+		if(o.proportionallyResize) {
+			options.proportionallyResize = o.proportionallyResize.slice(0);
+			var propRes = options.proportionallyResize;
+
+			for(var i in propRes) {
+				if(propRes[i].constructor == String)
+					propRes[i] = $(propRes[i], el);
+				
+				if(!$(propRes[i]).length) continue;
+				
+				var x = $(propRes[i]).width() - $(el).width();
+				var y = $(propRes[i]).height() - $(el).height();
+				options.modifyThese.push([$(propRes[i]),x,y]);
+			}
+
+		}
+		
+		//Deal with the handles
+		options.handles = {};
+		if(!o.handles) o.handles = { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' };
+		for(var i in o.handles) { options.handles[i] = o.handles[i]; } //Copying the object
+		for(var i in options.handles) {
+			
+			if(options.handles[i].constructor == String)
+				options.handles[i] = $(options.handles[i], el);
+			
+			if(!$(options.handles[i]).length) continue;
+				
+			$(options.handles[i]).bind('mousedown', function(e) {
+				self.interaction.options.axis = this.resizeAxis;
+			})[0].resizeAxis = i;
+			
+		}
+		
+		//If we want to auto hide the elements
+		if(o.autohide)
+			$(this.element).addClass("ui-resizable-autohide").hover(function() { $(this).removeClass("ui-resizable-autohide"); }, function() { if(self.interaction.options.autohide && !self.interaction.init) $(this).addClass("ui-resizable-autohide"); });
+
+		// If we want to conserve the aspect ratio, we store the original aspect ratio in the configuration 
+		if(o.aspectRatio && (o.aspectRatio == 'preserve' || o.aspectRatio === true))
+			options.aspectRatio = $(this.element).width()/$(this.element).height();
+
+		$.extend(options, {
+			helper: helper,
+			nonDestructive: true,
+			dragPrevention: 'input,button,select',
+			minHeight: options.minHeight || 50,
+			minWidth: options.minWidth || 100,
+			aspectRatio: options.aspectRatio || false,
+			startCondition: function(e) {
+				if(self.disabled) return false;
+				for(var i in options.handles) {
+					if($(options.handles[i])[0] == e.target) return true;
+				}
+				return false;
+			},
+			_start: function(h,p,c,t,e) {
+				self.start.apply(t, [self, e]); // Trigger the start callback				
+			},
+			_beforeStop: function(h,p,c,t,e) {
+				self.stop.apply(t, [self, e]); // Trigger the stop callback
+			},
+			_drag: function(h,p,c,t,e) {
+				self.drag.apply(t, [self, e]); // Trigger the start callback
+			}			
+		});
+		
+		//Initialize mouse interaction
+		this.interaction = new $.ui.mouseInteraction(el,options);
+		
+		//Add the class for themeing
+		$(this.element).addClass("ui-resizable");
+		
+	}
+	
+	$.extend($.ui.resizable.prototype, {
+		plugins: {},
+		prepareCallbackObj: function(self) {
+			return {
+				helper: self.helper,
+				resizable: self,
+				axis: self.options.axis,
+				options: self.options
+			}			
+		},
+		destroy: function() {
+			$(this.element).removeClass("ui-resizable").removeClass("ui-resizable-disabled");
+			this.interaction.destroy();
+		},
+		enable: function() {
+			$(this.element).removeClass("ui-resizable-disabled");
+			this.disabled = false;
+		},
+		disable: function() {
+			$(this.element).addClass("ui-resizable-disabled");
+			this.disabled = true;
+		},
+		start: function(that, e) {
+			this.options.originalSize = [$(this.element).width(),$(this.element).height()];
+			this.options.originalPosition = $(this.element).css("position");
+			this.options.originalPositionValues = $(this.element).position();
+
+			if(this.options.modifyThese.length == 0 || !this.options.modifyThese[this.options.modifyThese.length-1][0].is('.ui-resizable'))
+				this.options.modifyThese.push([$(this.helper),0,0]);
+			
+			$(that.element).triggerHandler("resizestart", [e, that.prepareCallbackObj(this)], this.options.start);			
+			return false;
+		},
+		stop: function(that, e) {			
+			
+			var o = this.options;
+			$(that.element).triggerHandler("resizestop", [e, that.prepareCallbackObj(this)], this.options.stop);	
+
+			if(o.proxy) {
+				$(this.element).css({ width: $(this.helper).width(), height: $(this.helper).height()});
+				if(o.originalPosition == "absolute" || o.originalPosition == "fixed")
+					$(this.element).css({ top: $(this.helper).css("top"), left: $(this.helper).css("left")});
+
+			}
+			
+			return false;
+		},
+		drag: function(that, e) {
+
+			//Prepare shortcuts and position
+			var o = this.options;
+			var rel = (o.originalPosition != "absolute" && o.originalPosition != "fixed");
+			var co = rel ? o.co : this.options.originalPositionValues;
+			var p = o.originalSize;
+			this.pos = rel ? [this.rpos[0]-o.cursorAt.left, this.rpos[1]-o.cursorAt.top] : [this.pos[0]-o.cursorAt.left, this.pos[1]-o.cursorAt.top];
+
+			//Calculate a rough new position
+			var nw = p[0] + (this.pos[0] - co.left);
+			var nh = p[1] + (this.pos[1] - co.top);
+			
+			// Conserve aspect ratio 
+			if(e.shiftKey && !o.aspectRatio) o.aspectRatio = p[0]/p[1];
+			
+			if(o.axis) {
+				switch(o.axis) {
+					case 'e':
+						nh = p[1];
+						break;
+					case 's':
+						nw = p[0];
+						break;
+					case 'n':
+					case 'ne':
+
+						if(!o.proxy && (o.originalPosition != "absolute" && o.originalPosition != "fixed")) return false;
+						
+						if(o.axis == 'n') nw = p[0];
+						var mod = (this.pos[1] - co.top); nh = nh - (mod*2);
+						mod = nh <= o.minHeight ? p[1] - o.minHeight : (nh >= o.maxHeight ? 0-(o.maxHeight-p[1]) : mod);
+						
+						if(o.containment && co.top + mod < o.containment[1] - o.po.top) { 
+							mod = (o.containment[1] - o.po.top) - co.top; 
+							nh = nh + this.pos[1] - (o.containment[1] - o.po.top); 
+						} 
+						
+						$(this.helper).css('top', co.top + mod);
+						break;
+						
+					case 'w':
+					case 'sw':
+
+						if(!o.proxy && (o.originalPosition != "absolute" && o.originalPosition != "fixed")) return false;
+						
+						if(o.axis == 'w') nh = p[1];
+						var mod = (this.pos[0] - co.left); nw = nw - (mod*2);
+						mod = nw <= o.minWidth ? p[0] - o.minWidth : (nw >= o.maxWidth ? 0-(o.maxWidth-p[0]) : mod);
+
+						if (o.containment && co.left + mod < o.containment[0] - o.po.left) { 
+							mod = (o.containment[0] - o.po.left) - co.left;
+							nw = nw + this.pos[0] - (o.containment[0] - o.po.left); 
+						} 
+
+						$(this.helper).css('left', co.left + mod);
+						break;
+						
+					case 'nw':
+						
+						if(!o.proxy && (o.originalPosition != "absolute" && o.originalPosition != "fixed")) return false;
+	
+						var modx = (this.pos[0] - co.left); nw = nw - (modx*2);
+						modx = nw <= o.minWidth ? p[0] - o.minWidth : (nw >= o.maxWidth ? 0-(o.maxWidth-p[0]) : modx);
+						
+						var mody = (this.pos[1] - co.top); nh = nh - (mody*2);
+						mody = nh <= o.minHeight ? p[1] - o.minHeight : (nh >= o.maxHeight ? 0-(o.maxHeight-p[1]) : mody);
+
+						if (o.containment && co.top + mody < o.containment[1] - o.po.top) { 
+							mody = (o.containment[1] - o.po.top) - co.top;
+							nh = nh + this.pos[1] - (o.containment[1] - o.po.top); 
+						} 
+						if (o.containment && co.left + modx < o.containment[0] - o.po.left) { 
+							modx = (o.containment[0] - o.po.left) - co.left; 
+							nw = nw + this.pos[0] - (o.containment[0] - o.po.left); 
+						}
+
+						$(this.helper).css({ left: co.left + modx, top: co.top + mody });
+						break;
+				}	
+			}
+
+			if(e.shiftKey) nh = nw * (1/o.aspectRatio);
+			
+			if(o.minWidth) nw = nw <= o.minWidth ? o.minWidth : nw;
+			if(o.minHeight) nh = nh <= o.minHeight ? o.minHeight : nh;
+			
+			if(o.maxWidth) nw = nw >= o.maxWidth ? o.maxWidth : nw;
+			if(o.maxHeight) nh = nh >= o.maxHeight ? o.maxHeight : nh;
+			
+			if(e.shiftKey) nh = nw * (1/o.aspectRatio);
+
+			var modifier = $(that.element).triggerHandler("resize", [e, that.prepareCallbackObj(this)], o.resize);
+			if(!modifier) modifier = {};
+
+			var left_handle_pos = co.left < this.pos[0] ? co.left : this.pos[0];
+			var top_handle_pos = co.top < this.pos[1] ? co.top : this.pos[1];
+			if(o.containment && left_handle_pos + nw > o.containment[2] - o.po.left)
+				nw = (o.containment[2] - o.po.left) - left_handle_pos;
+			if(o.containment && top_handle_pos + nh > o.containment[3] - o.po.top)
+				nh = (o.containment[3] - o.po.top) - top_handle_pos;
+			
+			for(var i in this.options.modifyThese) {
+				var c = this.options.modifyThese[i];
+				c[0].css({
+					width: modifier.width ? modifier.width+c[1] : nw+c[1],
+					height: modifier.height ? modifier.height+c[2] : nh+c[2]
+				});
+			}
+			return false;
+			
+		}
+	});
+
+})(jQuery);

Added: incubator/esme/trunk/server/src/main/webapp/scripts/ui.tabs.js
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/scripts/ui.tabs.js?rev=726084&view=auto
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/scripts/ui.tabs.js (added)
+++ incubator/esme/trunk/server/src/main/webapp/scripts/ui.tabs.js Fri Dec 12 10:32:17 2008
@@ -0,0 +1,529 @@
+/*
+ * Tabs 3 - New Wave Tabs
+ *
+ * Copyright (c) 2007 Klaus Hartl (stilbuero.de)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ */
+
+(function($) {
+
+    // if the UI scope is not availalable, add it
+    $.ui = $.ui || {};
+
+    // tabs initialization
+    $.fn.tabs = function(initial, options) {
+        if (initial && initial.constructor == Object) { // shift arguments
+            options = initial;
+            initial = null;
+        }
+        options = options || {};
+
+        initial = initial && initial.constructor == Number && --initial || 0;
+
+        return this.each(function() {
+            new $.ui.tabs(this, $.extend(options, { initial: initial }));
+        });
+    };
+
+    // other chainable tabs methods
+    $.each(['Add', 'Remove', 'Enable', 'Disable', 'Click', 'Load', 'Href'], function(i, method) {
+        $.fn['tabs' + method] = function() {
+            var args = arguments;
+            return this.each(function() {
+                var instance = $.ui.tabs.getInstance(this);
+                instance[method.toLowerCase()].apply(instance, args);
+            });
+        };
+    });
+    $.fn.tabsSelected = function() {
+        var selected = -1;
+        if (this[0]) {
+            var instance = $.ui.tabs.getInstance(this[0]),
+                $lis = $('li', this);
+            selected = $lis.index( $lis.filter('.' + instance.options.selectedClass)[0] );
+        }
+        return selected >= 0 ? ++selected : -1;
+    };
+
+    // tabs class
+    $.ui.tabs = function(el, options) {
+
+        this.source = el;
+
+        this.options = $.extend({
+
+            // basic setup
+            initial: 0,
+            event: 'click',
+            disabled: [],
+            cookie: null, // pass options object as expected by cookie plugin: { expires: 7, path: '/', domain: 'jquery.com', secure: true }
+            // TODO bookmarkable: $.ajaxHistory ? true : false,
+            unselected: false,
+            unselect: options.unselected ? true : false,
+
+            // Ajax
+            spinner: 'Loading&#8230;',
+            cache: false,
+            idPrefix: 'ui-tabs-',
+            ajaxOptions: {},
+
+            // animations
+            /*fxFade: null,
+            fxSlide: null,
+            fxShow: null,
+            fxHide: null,*/
+            fxSpeed: 'normal',
+            /*fxShowSpeed: null,
+            fxHideSpeed: null,*/
+
+            // callbacks
+            add: function() {},
+            remove: function() {},
+            enable: function() {},
+            disable: function() {},
+            click: function() {},
+            hide: function() {},
+            show: function() {},
+            load: function() {},
+            
+            // templates
+            tabTemplate: '<li><a href="#{href}"><span>#{text}</span></a></li>',
+            panelTemplate: '<div></div>',
+
+            // CSS classes
+            navClass: 'ui-tabs-nav',
+            selectedClass: 'ui-tabs-selected',
+            unselectClass: 'ui-tabs-unselect',
+            disabledClass: 'ui-tabs-disabled',
+            panelClass: 'ui-tabs-panel',
+            hideClass: 'ui-tabs-hide',
+            loadingClass: 'ui-tabs-loading'
+
+        }, options);
+
+        this.options.event += '.ui-tabs'; // namespace event
+        this.options.cookie = $.cookie && $.cookie.constructor == Function && this.options.cookie;
+
+        // save instance for later
+        $.data(el, $.ui.tabs.INSTANCE_KEY, this);
+        
+        // create tabs
+        this.tabify(true);
+    };
+
+    // static
+    $.ui.tabs.INSTANCE_KEY = 'ui_tabs_instance';
+    $.ui.tabs.getInstance = function(el) {
+        return $.data(el, $.ui.tabs.INSTANCE_KEY);
+    };
+
+    // instance methods
+    $.extend($.ui.tabs.prototype, {
+        tabId: function(a) {
+            return a.title ? a.title.replace(/\s/g, '_')
+                : this.options.idPrefix + $.data(a);
+        },
+        tabify: function(init) {
+
+            this.$lis = $('li:has(a[href])', this.source);
+            this.$tabs = this.$lis.map(function() { return $('a', this)[0] });
+            this.$panels = $([]);
+            
+            var self = this, o = this.options;
+            
+            this.$tabs.each(function(i, a) {
+                // inline tab
+                if (a.hash && a.hash.replace('#', '')) { // Safari 2 reports '#' for an empty hash
+                    self.$panels = self.$panels.add(a.hash);
+                }
+                // remote tab
+                else if ($(a).attr('href') != '#') { // prevent loading the page itself if href is just "#"
+                    $.data(a, 'href', a.href);
+                    var id = self.tabId(a);
+                    a.href = '#' + id;
+                    self.$panels = self.$panels.add(
+                        $('#' + id)[0] || $(o.panelTemplate).attr('id', id).addClass(o.panelClass)
+                            .insertAfter( self.$panels[i - 1] || self.source )
+                    );
+                }
+                // invalid tab href
+                else {
+                    o.disabled.push(i + 1);
+                }
+            });
+
+            if (init) {
+
+                // attach necessary classes for styling if not present
+                $(this.source).hasClass(o.navClass) || $(this.source).addClass(o.navClass);
+                this.$panels.each(function() {
+                    var $this = $(this);
+                    $this.hasClass(o.panelClass) || $this.addClass(o.panelClass);
+                });
+                
+                // disabled tabs
+                for (var i = 0, position; position = o.disabled[i]; i++) {
+                    this.disable(position);
+                }
+                
+                // Try to retrieve initial tab:
+                // 1. from fragment identifier in url if present
+                // 2. from cookie
+                // 3. from selected class attribute on <li>
+                // 4. otherwise use given initial argument
+                // 5. check if tab is disabled
+                this.$tabs.each(function(i, a) {
+                    if (location.hash) {
+                        if (a.hash == location.hash) {
+                            o.initial = i;
+                            // prevent page scroll to fragment
+                            //if (($.browser.msie || $.browser.opera) && !o.remote) {
+                            if ($.browser.msie || $.browser.opera) {
+                                var $toShow = $(location.hash), toShowId = $toShow.attr('id');
+                                $toShow.attr('id', '');
+                                setTimeout(function() {
+                                    $toShow.attr('id', toShowId); // restore id
+                                }, 500);
+                            }
+                            scrollTo(0, 0);
+                            return false; // break
+                        }
+                    } else if (o.cookie) {
+                        o.initial = parseInt($.cookie( $.ui.tabs.INSTANCE_KEY + $.data(self.source) )) || 0;
+                        return false; // break
+                    } else if ( self.$lis.eq(i).hasClass(o.selectedClass) ) {
+                        o.initial = i;
+                        return false; // break
+                    }
+                });
+                var n = this.$lis.length;
+                while (this.$lis.eq(o.initial).hasClass(o.disabledClass) && n) {
+                    o.initial = ++o.initial < this.$lis.length ? o.initial : 0;
+                    n--;
+                }
+                if (!n) { // all tabs disabled, set option unselected to true
+                    o.unselected = o.unselect = true;
+                }
+
+                // highlight selected tab
+                this.$panels.addClass(o.hideClass);
+                this.$lis.removeClass(o.selectedClass);
+                if (!o.unselected) {
+                    this.$panels.eq(o.initial).show().removeClass(o.hideClass); // use show and remove class to show in any case no matter how it has been hidden before
+                    this.$lis.eq(o.initial).addClass(o.selectedClass);
+                }
+
+                // load if remote tab
+                var href = !o.unselected && $.data(this.$tabs[o.initial], 'href');
+                if (href) {
+                    this.load(o.initial + 1, href);
+                }
+                
+                // disable click if event is configured to something else
+                if (!/^click/.test(o.event)) {
+                    this.$tabs.bind('click', function(e) { e.preventDefault(); });
+                }
+
+            }
+
+            // setup animations
+            var showAnim = {}, showSpeed = o.fxShowSpeed || o.fxSpeed,
+                hideAnim = {}, hideSpeed = o.fxHideSpeed || o.fxSpeed;
+            if (o.fxSlide || o.fxFade) {
+                if (o.fxSlide) {
+                    showAnim['height'] = 'show';
+                    hideAnim['height'] = 'hide';
+                }
+                if (o.fxFade) {
+                    showAnim['opacity'] = 'show';
+                    hideAnim['opacity'] = 'hide';
+                }
+            } else {
+                if (o.fxShow) {
+                    showAnim = o.fxShow;
+                } else { // use some kind of animation to prevent browser scrolling to the tab
+                    showAnim['min-width'] = 0; // avoid opacity, causes flicker in Firefox
+                    showSpeed = 1; // as little as 1 is sufficient
+                }
+                if (o.fxHide) {
+                    hideAnim = o.fxHide;
+                } else { // use some kind of animation to prevent browser scrolling to the tab
+                    hideAnim['min-width'] = 0; // avoid opacity, causes flicker in Firefox
+                    hideSpeed = 1; // as little as 1 is sufficient
+                }
+            }
+
+            // reset some styles to maintain print style sheets etc.
+            var resetCSS = { display: '', overflow: '', height: '' };
+            if (!$.browser.msie) { // not in IE to prevent ClearType font issue
+                resetCSS['opacity'] = '';
+            }
+
+            // Hide a tab, animation prevents browser scrolling to fragment,
+            // $show is optional.
+            function hideTab(clicked, $hide, $show) {
+                $hide.animate(hideAnim, hideSpeed, function() { //
+                    $hide.addClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc.
+                    if ($.browser.msie && hideAnim['opacity']) {
+                        $hide[0].style.filter = '';
+                    }
+                    o.hide(clicked, $hide[0], $show && $show[0] || null);
+                    if ($show) {
+                        showTab(clicked, $show, $hide);
+                    }
+                });
+            }
+
+            // Show a tab, animation prevents browser scrolling to fragment,
+            // $hide is optional
+            function showTab(clicked, $show, $hide) {
+                if (!(o.fxSlide || o.fxFade || o.fxShow)) {
+                    $show.css('display', 'block'); // prevent occasionally occuring flicker in Firefox cause by gap between showing and hiding the tab panels
+                }
+                $show.animate(showAnim, showSpeed, function() {
+                    $show.removeClass(o.hideClass).css(resetCSS); // maintain flexible height and accessibility in print etc.
+                    if ($.browser.msie && showAnim['opacity']) {
+                        $show[0].style.filter = '';
+                    }
+                    o.show(clicked, $show[0], $hide && $hide[0] || null);
+                });
+            }
+
+            // switch a tab
+            function switchTab(clicked, $li, $hide, $show) {
+                /*if (o.bookmarkable && trueClick) { // add to history only if true click occured, not a triggered click
+                    $.ajaxHistory.update(clicked.hash);
+                }*/
+                $li.addClass(o.selectedClass)
+                    .siblings().removeClass(o.selectedClass);
+                hideTab(clicked, $hide, $show);
+            }
+
+            // attach tab event handler, unbind to avoid duplicates from former tabifying...
+            this.$tabs.unbind(o.event).bind(o.event, function() {
+
+                //var trueClick = e.clientX; // add to history only if true click occured, not a triggered click
+                var $li = $(this).parents('li:eq(0)'),
+                    $hide = self.$panels.filter(':visible'),
+                    $show = $(this.hash);
+
+                // If tab is already selected and not unselectable or tab disabled or click callback returns false stop here.
+                // Check if click handler returns false last so that it is not executed for a disabled tab!
+                if (($li.hasClass(o.selectedClass) && !o.unselect) || $li.hasClass(o.disabledClass)
+                    || o.click(this, $show[0], $hide[0]) === false) {
+                    this.blur();
+                    return false;
+                }
+                
+                if (o.cookie) {
+                    $.cookie($.ui.tabs.INSTANCE_KEY + $.data(self.source), self.$tabs.index(this), o.cookie);
+                }
+                    
+                // if tab may be closed
+                if (o.unselect) {
+                    if ($li.hasClass(o.selectedClass)) {
+                        $li.removeClass(o.selectedClass);
+                        self.$panels.stop();
+                        hideTab(this, $hide);
+                        this.blur();
+                        return false;
+                    } else if (!$hide.length) {
+                        self.$panels.stop();
+                        if ($.data(this, 'href')) { // remote tab
+                            var a = this;
+                            self.load(self.$tabs.index(this) + 1, $.data(this, 'href'), function() {
+                                $li.addClass(o.selectedClass).addClass(o.unselectClass);
+                                showTab(a, $show);
+                            });
+                        } else {
+                            $li.addClass(o.selectedClass).addClass(o.unselectClass);
+                            showTab(this, $show);
+                        }
+                        this.blur();
+                        return false;
+                    }
+                }
+
+                // stop possibly running animations
+                self.$panels.stop();
+
+                // show new tab
+                if ($show.length) {
+
+                    // prevent scrollbar scrolling to 0 and than back in IE7, happens only if bookmarking/history is enabled
+                    /*if ($.browser.msie && o.bookmarkable) {
+                        var showId = this.hash.replace('#', '');
+                        $show.attr('id', '');
+                        setTimeout(function() {
+                            $show.attr('id', showId); // restore id
+                        }, 0);
+                    }*/
+
+                    if ($.data(this, 'href')) { // remote tab
+                        var a = this;
+                        self.load(self.$tabs.index(this) + 1, $.data(this, 'href'), function() {
+                            switchTab(a, $li, $hide, $show);
+                        });
+                    } else {
+                        switchTab(this, $li, $hide, $show);
+                    }
+
+                    // Set scrollbar to saved position - need to use timeout with 0 to prevent browser scroll to target of hash
+                    /*var scrollX = window.pageXOffset || document.documentElement && document.documentElement.scrollLeft || document.body.scrollLeft || 0;
+                    var scrollY = window.pageYOffset || document.documentElement && document.documentElement.scrollTop || document.body.scrollTop || 0;
+                    setTimeout(function() {
+                        scrollTo(scrollX, scrollY);
+                    }, 0);*/
+
+                } else {
+                    throw 'jQuery UI Tabs: Mismatching fragment identifier.';
+                }
+
+                // Prevent IE from keeping other link focussed when using the back button
+                // and remove dotted border from clicked link. This is controlled in modern
+                // browsers via CSS, also blur removes focus from address bar in Firefox
+                // which can become a usability and annoying problem with tabsRotate.
+                if ($.browser.msie) {
+                    this.blur(); 
+                }
+
+                //return o.bookmarkable && !!trueClick; // convert trueClick == undefined to Boolean required in IE
+                return false;
+
+            });
+
+        },
+        add: function(url, text, position) {
+            if (url && text) {
+                position = position || this.$tabs.length; // append by default  
+                
+                var o = this.options,
+                    $li = $(o.tabTemplate.replace(/#\{href\}/, url).replace(/#\{text\}/, text));
+                
+                var id = url.indexOf('#') == 0 ? url.replace('#', '') : this.tabId( $('a:first-child', $li)[0] );
+                
+                // try to find an existing element before creating a new one
+                var $panel = $('#' + id);
+                $panel = $panel.length && $panel
+                    || $(o.panelTemplate).attr('id', id).addClass(o.panelClass).addClass(o.hideClass);
+                if (position >= this.$lis.length) {
+                    $li.appendTo(this.source);
+                    $panel.appendTo(this.source.parentNode);
+                } else {
+                    $li.insertBefore(this.$lis[position - 1]);
+                    $panel.insertBefore(this.$panels[position - 1]);
+                }
+                
+                this.tabify();
+                
+                if (this.$tabs.length == 1) {
+                     $li.addClass(o.selectedClass);
+                     $panel.removeClass(o.hideClass);
+                     var href = $.data(this.$tabs[0], 'href');
+                     if (href) {
+                         this.load(position + 1, href);
+                     }
+                }
+                o.add(this.$tabs[position], this.$panels[position]); // callback
+            } else {
+                throw 'jQuery UI Tabs: Not enough arguments to add tab.';
+            }
+        },
+        remove: function(position) {
+            if (position && position.constructor == Number) {                
+                var o = this.options, $li = this.$lis.eq(position - 1).remove(),
+                    $panel = this.$panels.eq(position - 1).remove();
+                    
+                // If selected tab was removed focus tab to the right or
+                // tab to the left if last tab was removed.
+                if ($li.hasClass(o.selectedClass) && this.$tabs.length > 1) {
+                    this.click(position + (position < this.$tabs.length ? 1 : -1));
+                }
+                this.tabify();
+                o.remove($li.end()[0], $panel[0]); // callback
+            }
+        },
+        enable: function(position) {
+            var o = this.options, $li = this.$lis.eq(position - 1);
+            $li.removeClass(o.disabledClass);
+            if ($.browser.safari) { // fix disappearing tab (that used opacity indicating disabling) after enabling in Safari 2...
+                $li.css('display', 'inline-block');
+                setTimeout(function() {
+                    $li.css('display', 'block')
+                }, 0)
+            }
+            o.enable(this.$tabs[position - 1], this.$panels[position - 1]); // callback
+        },
+        disable: function(position) {
+            var o = this.options;      
+            this.$lis.eq(position - 1).addClass(o.disabledClass);
+            o.disable(this.$tabs[position - 1], this.$panels[position - 1]); // callback
+        },
+        click: function(position) {
+            this.$tabs.eq(position - 1).trigger(this.options.event);
+        },
+        load: function(position, url, callback) {
+            var self = this, o = this.options,
+                $a = this.$tabs.eq(position - 1), a = $a[0], $span = $('span', a);
+            
+            // shift arguments
+            if (url && url.constructor == Function) {
+                callback = url;
+                url = null;
+            }
+
+            // set new URL or get existing
+            if (url) {
+                $.data(a, 'href', url);
+            } else {
+                url = $.data(a, 'href');
+            }
+
+            // load
+            if (o.spinner) {
+                $.data(a, 'title', $span.html());
+                $span.html('<em>' + o.spinner + '</em>');
+            }
+            var finish = function() {
+                self.$tabs.filter('.' + o.loadingClass).each(function() {
+                    $(this).removeClass(o.loadingClass);
+                    if (o.spinner) {
+                        $('span', this).html( $.data(this, 'title') );
+                    }
+                });
+                self.xhr = null;
+            };
+            var ajaxOptions = $.extend(o.ajaxOptions, {
+                url: url,
+                success: function(r) {
+                    $(a.hash).html(r);
+                    finish();
+                    // This callback is required because the switch has to take 
+                    // place after loading has completed.
+                    if (callback && callback.constructor == Function) {
+                        callback();
+                    }
+                    if (o.cache) {
+                        $.removeData(a, 'href'); // if loaded once do not load them again
+                    }
+                    o.load(self.$tabs[position - 1], self.$panels[position - 1]); // callback
+                }
+            });
+            if (this.xhr) {
+                // terminate pending requests from other tabs and restore title
+                this.xhr.abort();
+                finish();
+            }
+            $a.addClass(o.loadingClass);
+            setTimeout(function() { // timeout is again required in IE, "wait" for id being restored
+                self.xhr = $.ajax(ajaxOptions);
+            }, 0);
+            
+        },
+        href: function(position, href) {
+            $.data(this.$tabs.eq(position - 1)[0], 'href', href);
+        }
+    });
+
+})(jQuery);

Added: incubator/esme/trunk/server/src/main/webapp/scripts/wz_tooltip.js
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/scripts/wz_tooltip.js?rev=726084&view=auto
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/scripts/wz_tooltip.js (added)
+++ incubator/esme/trunk/server/src/main/webapp/scripts/wz_tooltip.js Fri Dec 12 10:32:17 2008
@@ -0,0 +1,1150 @@
+/* This notice must be untouched at all times.
+
+wz_tooltip.js	 v. 4.12
+
+The latest version is available at
+http://www.walterzorn.com
+or http://www.devira.com
+or http://www.walterzorn.de
+
+Copyright (c) 2002-2007 Walter Zorn. All rights reserved.
+Created 1.12.2002 by Walter Zorn (Web: http://www.walterzorn.com )
+Last modified: 13.7.2007
+
+Easy-to-use cross-browser tooltips.
+Just include the script at the beginning of the <body> section, and invoke
+Tip('Tooltip text') from within the desired HTML onmouseover eventhandlers.
+No container DIV, no onmouseouts required.
+By default, width of tooltips is automatically adapted to content.
+Is even capable of dynamically converting arbitrary HTML elements to tooltips
+by calling TagToTip('ID_of_HTML_element_to_be_converted') instead of Tip(),
+which means you can put important, search-engine-relevant stuff into tooltips.
+Appearance of tooltips can be individually configured
+via commands passed to Tip() or TagToTip().
+
+Tab Width: 4
+LICENSE: LGPL
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License (LGPL) as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+For more details on the GNU Lesser General Public License,
+see http://www.gnu.org/copyleft/lesser.html
+*/
+
+var config = new Object();
+
+
+//===================  GLOBAL TOOPTIP CONFIGURATION  =========================//
+var  tt_Debug	= true		// false or true - recommended: false once you release your page to the public
+var  tt_Enabled	= true		// Allows to (temporarily) suppress tooltips, e.g. by providing the user with a button that sets this global variable to false
+var  TagsToTip	= true		// false or true - if true, the script is capable of converting HTML elements to tooltips
+
+// For each of the following config variables there exists a command, which is
+// just the variablename in uppercase, to be passed to Tip() or TagToTip() to
+// configure tooltips individually. Individual commands override global
+// configuration. Order of commands is arbitrary.
+// Example: onmouseover="Tip('Tooltip text', LEFT, true, BGCOLOR, '#FF9900', FADEIN, 400)"
+
+config. Above			= false 	// false or true - tooltip above mousepointer?
+config. BgColor 		= '#E4E7FF' // Background color
+config. BgImg			= ''		// Path to background image, none if empty string ''
+config. BorderColor 	= '#002299'
+config. BorderStyle 	= 'solid'	// Any permitted CSS value, but I recommend 'solid', 'dotted' or 'dashed'
+config. BorderWidth 	= 1
+config. CenterMouse 	= false 	// false or true - center the tip horizontally below (or above) the mousepointer
+config. ClickClose		= false 	// false or true - close tooltip if the user clicks somewhere
+config. CloseBtn		= false 	// false or true - closebutton in titlebar
+config. CloseBtnColors	= ['#990000', '#FFFFFF', '#DD3333', '#FFFFFF']	  // [Background, text, hovered background, hovered text] - use empty strings '' to inherit title colors
+config. CloseBtnText	= '&nbsp;X&nbsp;'	// Close button text (may also be an image tag)
+config. CopyContent		= true		// When converting a HTML element to a tooltip, copy only the element's content, rather than converting the element by its own
+config. Delay			= 400		// Time span in ms until tooltip shows up
+config. Duration		= 0 		// Time span in ms after which the tooltip disappears; 0 for infinite duration
+config. FadeIn			= 0 		// Fade-in duration in ms, e.g. 400; 0 for no animation
+config. FadeOut 		= 0
+config. FadeInterval	= 30		// Duration of each fade step in ms (recommended: 30) - shorter is smoother but causes more CPU-load
+config. Fix 			= null		// Fixated position - x- an y-oordinates in brackets, e.g. [210, 480], or null for no fixation
+config. FollowMouse		= true		// false or true - tooltip follows the mouse
+config. FontColor		= '#000044'
+config. FontFace		= 'Verdana,Geneva,sans-serif'
+config. FontSize		= '8pt' 	// E.g. '9pt' or '12px' - unit is mandatory
+config. FontWeight		= 'normal'	// 'normal' or 'bold';
+config. Left			= false 	// false or true - tooltip on the left of the mouse
+config. OffsetX 		= 14		// Horizontal offset of left-top corner from mousepointer
+config. OffsetY 		= 8 		// Vertical offset
+config. Opacity 		= 100		// Integer between 0 and 100 - opacity of tooltip in percent
+config. Padding 		= 3 		// Spacing between border and content
+config. Shadow			= false 	// false or true
+config. ShadowColor 	= '#C0C0C0'
+config. ShadowWidth 	= 5
+config. Sticky			= false 	// Do NOT hide tooltip on mouseout? false or true
+config. TextAlign		= 'left'	// 'left', 'right' or 'justify'
+config. Title			= ''		// Default title text applied to all tips (no default title: empty string '')
+config. TitleAlign		= 'left'	// 'left' or 'right' - text alignment inside the title bar
+config. TitleBgColor	= ''		// If empty string '', BorderColor will be used
+config. TitleFontColor	= '#ffffff'	// Color of title text - if '', BgColor (of tooltip body) will be used
+config. TitleFontFace	= ''		// If '' use FontFace (boldified)
+config. TitleFontSize	= ''		// If '' use FontSize
+config. Width			= 0 		// Tooltip width; 0 for automatic adaption to tooltip content
+//=======  END OF TOOLTIP CONFIG, DO NOT CHANGE ANYTHING BELOW  ==============//
+
+
+
+
+//======================  PUBLIC  ============================================//
+function Tip()
+{
+	tt_Tip(arguments, null);
+}
+function TagToTip()
+{
+	if(TagsToTip)
+	{
+		var t2t = tt_GetElt(arguments[0]);
+		if(t2t)
+			tt_Tip(arguments, t2t);
+	}
+}
+
+//==================  PUBLIC EXTENSION API	==================================//
+// Extension eventhandlers currently supported:
+// OnLoadConfig, OnCreateContentString, OnSubDivsCreated, OnShow, OnMoveBefore,
+// OnMoveAfter, OnHideInit, OnHide, OnKill
+
+var tt_aElt = new Array(10), // Container DIV, outer title & body DIVs, inner title & body TDs, closebutton SPAN, shadow DIVs, and IFRAME to cover windowed elements in IE
+tt_aV = new Array(),	// Caches and enumerates config data for currently active tooltip
+tt_sContent,			// Inner tooltip text or HTML
+tt_scrlX = 0, tt_scrlY = 0,
+tt_musX, tt_musY,
+tt_over,
+tt_x, tt_y, tt_w, tt_h; // Position, width and height of currently displayed tooltip
+
+function tt_Extension()
+{
+	tt_ExtCmdEnum();
+	tt_aExt[tt_aExt.length] = this;
+	return this;
+}
+function tt_SetTipPos(x, y)
+{
+	var css = tt_aElt[0].style;
+
+	tt_x = x;
+	tt_y = y;
+	css.left = x + "px";
+	css.top = y + "px";
+	if(tt_ie56)
+	{
+		var ifrm = tt_aElt[tt_aElt.length - 1];
+		if(ifrm)
+		{
+			ifrm.style.left = css.left;
+			ifrm.style.top = css.top;
+		}
+	}
+}
+function tt_Hide()
+{
+	if(tt_db && tt_iState)
+	{
+		if(tt_iState & 0x2)
+		{
+			tt_aElt[0].style.visibility = "hidden";
+			tt_ExtCallFncs(0, "Hide");
+		}
+		tt_tShow.EndTimer();
+		tt_tHide.EndTimer();
+		tt_tDurt.EndTimer();
+		tt_tFade.EndTimer();
+		if(!tt_op && !tt_ie)
+		{
+			tt_tWaitMov.EndTimer();
+			tt_bWait = false;
+		}
+		if(tt_aV[CLICKCLOSE])
+			tt_RemEvtFnc(document, "mouseup", tt_HideInit);
+		tt_AddRemOutFnc(false);
+		tt_ExtCallFncs(0, "Kill");
+		// In case of a TagToTip tooltip, hide converted DOM node and
+		// re-insert it into document
+		if(tt_t2t && !tt_aV[COPYCONTENT])
+		{
+			tt_t2t.style.display = "none";
+			tt_MovDomNode(tt_t2t, tt_aElt[6], tt_t2tDad);
+		}
+		tt_iState = 0;
+		tt_over = null;
+		tt_ResetMainDiv();
+		if(tt_aElt[tt_aElt.length - 1])
+			tt_aElt[tt_aElt.length - 1].style.display = "none";
+	}
+}
+function tt_GetElt(id)
+{
+	return(document.getElementById ? document.getElementById(id)
+			: document.all ? document.all[id]
+			: null);
+}
+function tt_GetDivW(el)
+{
+	return(el ? (el.offsetWidth || el.style.pixelWidth || 0) : 0);
+}
+function tt_GetDivH(el)
+{
+	return(el ? (el.offsetHeight || el.style.pixelHeight || 0) : 0);
+}
+function tt_GetScrollX()
+{
+	return(window.pageXOffset || (tt_db ? (tt_db.scrollLeft || 0) : 0));
+}
+function tt_GetScrollY()
+{
+	return(window.pageYOffset || (tt_db ? (tt_db.scrollTop || 0) : 0));
+}
+function tt_GetClientW()
+{
+	return(document.body && (typeof(document.body.clientWidth) != tt_u) ? document.body.clientWidth
+			: (typeof(window.innerWidth) != tt_u) ? window.innerWidth
+			: tt_db ? (tt_db.clientWidth || 0)
+			: 0);
+}
+function tt_GetClientH()
+{
+	// Exactly this order seems to yield correct values in all major browsers
+	return(document.body && (typeof(document.body.clientHeight) != tt_u) ? document.body.clientHeight
+			: (typeof(window.innerHeight) != tt_u) ? window.innerHeight
+			: tt_db ? (tt_db.clientHeight || 0)
+			: 0);
+}
+function tt_GetEvtX(e)
+{
+	return (e ? ((typeof(e.pageX) != tt_u) ? e.pageX : (e.clientX + tt_scrlX)) : 0);
+}
+function tt_GetEvtY(e)
+{
+	return (e ? ((typeof(e.pageY) != tt_u) ? e.pageY : (e.clientY + tt_scrlY)) : 0);
+}
+function tt_AddEvtFnc(el, sEvt, PFnc)
+{
+	if(el)
+	{
+		if(el.addEventListener)
+			el.addEventListener(sEvt, PFnc, false);
+		else
+			el.attachEvent("on" + sEvt, PFnc);
+	}
+}
+function tt_RemEvtFnc(el, sEvt, PFnc)
+{
+	if(el)
+	{
+		if(el.removeEventListener)
+			el.removeEventListener(sEvt, PFnc, false);
+		else
+			el.detachEvent("on" + sEvt, PFnc);
+	}
+}
+
+//======================  PRIVATE  ===========================================//
+var tt_aExt = new Array(),	// Array of extension objects
+
+tt_db, tt_op, tt_ie, tt_ie56, tt_bBoxOld,	// Browser flags
+tt_body,
+tt_flagOpa, 			// Opacity support: 1=IE, 2=Khtml, 3=KHTML, 4=Moz, 5=W3C
+tt_maxPosX, tt_maxPosY,
+tt_iState = 0,			// Tooltip active |= 1, shown |= 2, move with mouse |= 4
+tt_opa, 				// Currently applied opacity
+tt_bJmpVert,			// Tip above mouse (or ABOVE tip below mouse)
+tt_t2t, tt_t2tDad,		// Tag converted to tip, and its parent element in the document
+tt_elDeHref,			// The tag from which Opera has removed the href attribute
+// Timer
+tt_tShow = new Number(0), tt_tHide = new Number(0), tt_tDurt = new Number(0),
+tt_tFade = new Number(0), tt_tWaitMov = new Number(0),
+tt_bWait = false,
+tt_u = "undefined";
+
+
+function tt_Init()
+{
+	tt_MkCmdEnum();
+	// Send old browsers instantly to hell
+	if(!tt_Browser() || !tt_MkMainDiv())
+		return;
+	tt_IsW3cBox();
+	tt_OpaSupport();
+	tt_AddEvtFnc(document, "mousemove", tt_Move);
+	// In Debug mode we search for TagToTip() calls in order to notify
+	// the user if they've forgotten to set the TagsToTip config flag
+	if(TagsToTip || tt_Debug)
+		tt_SetOnloadFnc();
+	tt_AddEvtFnc(window, "scroll",
+		function()
+		{
+			tt_scrlX = tt_GetScrollX();
+			tt_scrlY = tt_GetScrollY();
+			if(tt_iState && !(tt_aV[STICKY] && (tt_iState & 2)))
+				tt_HideInit();
+		} );
+	// Ensure the tip be hidden when the page unloads
+	tt_AddEvtFnc(window, "unload", tt_Hide);
+	tt_Hide();
+}
+// Creates command names by translating config variable names to upper case
+function tt_MkCmdEnum()
+{
+	var n = 0;
+	for(var i in config)
+		eval("window." + i.toString().toUpperCase() + " = " + n++);
+	tt_aV.length = n;
+}
+function tt_Browser()
+{
+	var n, nv, n6, w3c;
+
+	n = navigator.userAgent.toLowerCase(),
+	nv = navigator.appVersion;
+	tt_op = (document.defaultView && typeof(eval("w" + "indow" + "." + "o" + "p" + "er" + "a")) != tt_u);
+	tt_ie = n.indexOf("msie") != -1 && document.all && !tt_op;
+	if(tt_ie)
+	{
+		var ieOld = (!document.compatMode || document.compatMode == "BackCompat");
+		tt_db = !ieOld ? document.documentElement : (document.body || null);
+		if(tt_db)
+			tt_ie56 = parseFloat(nv.substring(nv.indexOf("MSIE") + 5)) >= 5.5
+					&& typeof document.body.style.maxHeight == tt_u;
+	}
+	else
+	{
+		tt_db = document.documentElement || document.body ||
+				(document.getElementsByTagName ? document.getElementsByTagName("body")[0]
+				: null);
+		if(!tt_op)
+		{
+			n6 = document.defaultView && typeof document.defaultView.getComputedStyle != tt_u;
+			w3c = !n6 && document.getElementById;
+		}
+	}
+	tt_body = (document.getElementsByTagName ? document.getElementsByTagName("body")[0]
+				: (document.body || null));
+	if(tt_ie || n6 || tt_op || w3c)
+	{
+		if(tt_body && tt_db)
+		{
+			if(document.attachEvent || document.addEventListener)
+				return true;
+		}
+		else
+			tt_Err("wz_tooltip.js must be included INSIDE the body section,"
+					+ " immediately after the opening <body> tag.");
+	}
+	tt_db = null;
+	return false;
+}
+function tt_MkMainDiv()
+{
+	// Create the tooltip DIV
+	if(tt_body.insertAdjacentHTML)
+		tt_body.insertAdjacentHTML("afterBegin", tt_MkMainDivHtm());
+	else if(typeof tt_body.innerHTML != tt_u && document.createElement && tt_body.appendChild)
+		tt_body.appendChild(tt_MkMainDivDom());
+	// FireFox Alzheimer bug
+	if(window.tt_GetMainDivRefs && tt_GetMainDivRefs())
+		return true;
+	tt_db = null;
+	return false;
+}
+function tt_MkMainDivHtm()
+{
+	return('<div id="WzTtDiV"></div>' +
+			(tt_ie56 ? ('<iframe id="WzTtIfRm" src="javascript:false" scrolling="no" frameborder="0" style="filter:Alpha(opacity=0);position:absolute;top:0px;left:0px;display:none;"></iframe>')
+			: ''));
+}
+function tt_MkMainDivDom()
+{
+	var el = document.createElement("div");
+	if(el)
+		el.id = "WzTtDiV";
+	return el;
+}
+function tt_GetMainDivRefs()
+{
+	tt_aElt[0] = tt_GetElt("WzTtDiV");
+	if(tt_ie56 && tt_aElt[0])
+	{
+		tt_aElt[tt_aElt.length - 1] = tt_GetElt("WzTtIfRm");
+		if(!tt_aElt[tt_aElt.length - 1])
+			tt_aElt[0] = null;
+	}
+	if(tt_aElt[0])
+	{
+		var css = tt_aElt[0].style;
+
+		css.visibility = "hidden";
+		css.position = "absolute";
+		css.overflow = "hidden";
+		return true;
+	}
+	return false;
+}
+function tt_ResetMainDiv()
+{
+	var w = (window.screen && screen.width) ? screen.width : 10000;
+
+	tt_SetTipPos(-w, 0);
+	tt_aElt[0].innerHTML = "";
+	tt_aElt[0].style.width = (w - 1) + "px";
+}
+function tt_IsW3cBox()
+{
+	var css = tt_aElt[0].style;
+
+	css.padding = "10px";
+	css.width = "40px";
+	tt_bBoxOld = (tt_GetDivW(tt_aElt[0]) == 40);
+	css.padding = "0px";
+	tt_ResetMainDiv();
+}
+function tt_OpaSupport()
+{
+	var css = tt_body.style;
+
+	tt_flagOpa = (typeof(css.filter) != tt_u) ? 1
+				: (typeof(css.KhtmlOpacity) != tt_u) ? 2
+				: (typeof(css.KHTMLOpacity) != tt_u) ? 3
+				: (typeof(css.MozOpacity) != tt_u) ? 4
+				: (typeof(css.opacity) != tt_u) ? 5
+				: 0;
+}
+// Ported from http://dean.edwards.name/weblog/2006/06/again/
+// (Dean Edwards et al.)
+function tt_SetOnloadFnc()
+{
+	tt_AddEvtFnc(document, "DOMContentLoaded", tt_HideSrcTags);
+	tt_AddEvtFnc(window, "load", tt_HideSrcTags);
+	if(tt_body.attachEvent)
+		tt_body.attachEvent("onreadystatechange",
+			function() {
+				if(tt_body.readyState == "complete")
+					tt_HideSrcTags();
+			} );
+	if(/WebKit|KHTML/i.test(navigator.userAgent))
+	{
+		var t = setInterval(function() {
+					if(/loaded|complete/.test(document.readyState))
+					{
+						clearInterval(t);
+						tt_HideSrcTags();
+					}
+				}, 10);
+	}
+}
+function tt_HideSrcTags()
+{
+	if(!window.tt_HideSrcTags || window.tt_HideSrcTags.done)
+		return;
+	window.tt_HideSrcTags.done = true;
+	if(!tt_HideSrcTagsRecurs(tt_body))
+		tt_Err("To enable the capability to convert HTML elements to tooltips,"
+				+ " you must set TagsToTip in the global tooltip configuration"
+				+ " to true.");
+}
+function tt_HideSrcTagsRecurs(dad)
+{
+	var a, ovr, asT2t;
+
+	// Walk the DOM tree for tags that have an onmouseover attribute
+	// containing a TagToTip('...') call.
+	// (.childNodes first since .children is bugous in Safari)
+	a = dad.childNodes || dad.children || null;
+	for(var i = a ? a.length : 0; i;)
+	{--i;
+		if(!tt_HideSrcTagsRecurs(a[i]))
+			return false;
+		ovr = a[i].getAttribute ? a[i].getAttribute("onmouseover")
+				: (typeof a[i].onmouseover == "function") ? a[i].onmouseover
+				: null;
+		if(ovr)
+		{
+			asT2t = ovr.toString().match(/TagToTip\s*\(\s*'[^'.]+'\s*[\),]/);
+			if(asT2t && asT2t.length)
+			{
+				if(!tt_HideSrcTag(asT2t[0]))
+					return false;
+			}
+		}
+	}
+	return true;
+}
+function tt_HideSrcTag(sT2t)
+{
+	var id, el;
+
+	// The ID passed to the found TagToTip() call identifies an HTML element
+	// to be converted to a tooltip, so hide that element
+	id = sT2t.replace(/.+'([^'.]+)'.+/, "$1");
+	el = tt_GetElt(id);
+	if(el)
+	{
+		if(tt_Debug && !TagsToTip)
+			return false;
+		else
+			el.style.display = "none";
+	}
+	else
+		tt_Err("Invalid ID\n'" + id + "'\npassed to TagToTip()."
+				+ " There exists no HTML element with that ID.");
+	return true;
+}
+function tt_Tip(arg, t2t)
+{
+	if(!tt_db)
+		return;
+	if(tt_iState)
+		tt_Hide();
+	if(!tt_Enabled)
+		return;
+	tt_t2t = t2t;
+	if(!tt_ReadCmds(arg))
+		return;
+	tt_iState = 0x1 | 0x4;
+	tt_AdaptConfig1();
+	tt_MkTipContent(arg);
+	tt_MkTipSubDivs();
+	tt_FormatTip();
+	tt_bJmpVert = false;
+	tt_maxPosX = tt_GetClientW() + tt_scrlX - tt_w - 1;
+	tt_maxPosY = tt_GetClientH() + tt_scrlY - tt_h - 1;
+	tt_AdaptConfig2();
+	// We must fake the first mousemove in order to ensure the tip
+	// be immediately shown and positioned
+	tt_Move();
+	tt_ShowInit();
+}
+function tt_ReadCmds(a)
+{
+	var i;
+
+	// First load the global config values, to initialize also values
+	// for which no command has been passed
+	i = 0;
+	for(var j in config)
+		tt_aV[i++] = config[j];
+	// Then replace each cached config value for which a command has been
+	// passed (ensure the # of command args plus value args be even)
+	if(a.length & 1)
+	{
+		for(i = a.length - 1; i > 0; i -= 2)
+			tt_aV[a[i - 1]] = a[i];
+		return true;
+	}
+	tt_Err("Incorrect call of Tip() or TagToTip().\n"
+			+ "Each command must be followed by a value.");
+	return false;
+}
+function tt_AdaptConfig1()
+{
+	tt_ExtCallFncs(0, "LoadConfig");
+	// Inherit unspecified title formattings from body
+	if(!tt_aV[TITLEBGCOLOR].length)
+		tt_aV[TITLEBGCOLOR] = tt_aV[BORDERCOLOR];
+	if(!tt_aV[TITLEFONTCOLOR].length)
+		tt_aV[TITLEFONTCOLOR] = tt_aV[BGCOLOR];
+	if(!tt_aV[TITLEFONTFACE].length)
+		tt_aV[TITLEFONTFACE] = tt_aV[FONTFACE];
+	if(!tt_aV[TITLEFONTSIZE].length)
+		tt_aV[TITLEFONTSIZE] = tt_aV[FONTSIZE];
+	if(tt_aV[CLOSEBTN])
+	{
+		// Use title colors for non-specified closebutton colors
+		if(!tt_aV[CLOSEBTNCOLORS])
+			tt_aV[CLOSEBTNCOLORS] = new Array("", "", "", "");
+		for(var i = 4; i;)
+		{--i;
+			if(!tt_aV[CLOSEBTNCOLORS][i].length)
+				tt_aV[CLOSEBTNCOLORS][i] = (i & 1) ? tt_aV[TITLEFONTCOLOR] : tt_aV[TITLEBGCOLOR];
+		}
+		// Enforce titlebar be shown
+		if(!tt_aV[TITLE].length)
+			tt_aV[TITLE] = " ";
+	}
+	// Circumvents broken display of images and fade-in flicker in Geckos < 1.8
+	if(tt_aV[OPACITY] == 100 && typeof tt_aElt[0].style.MozOpacity != tt_u && !Array.every)
+		tt_aV[OPACITY] = 99;
+	// Smartly shorten the delay for fade-in tooltips
+	if(tt_aV[FADEIN] && tt_flagOpa && tt_aV[DELAY] > 100)
+		tt_aV[DELAY] = Math.max(tt_aV[DELAY] - tt_aV[FADEIN], 100);
+}
+function tt_AdaptConfig2()
+{
+	if(tt_aV[CENTERMOUSE])
+		tt_aV[OFFSETX] -= ((tt_w - (tt_aV[SHADOW] ? tt_aV[SHADOWWIDTH] : 0)) >> 1);
+}
+// Expose content globally so extensions can modify it
+function tt_MkTipContent(a)
+{
+	if(tt_t2t)
+	{
+		if(tt_aV[COPYCONTENT])
+			tt_sContent = tt_t2t.innerHTML;
+		else
+			tt_sContent = "";
+	}
+	else
+		tt_sContent = a[0];
+	tt_ExtCallFncs(0, "CreateContentString");
+}
+function tt_MkTipSubDivs()
+{
+	var sCss = 'position:relative;margin:0px;padding:0px;border-width:0px;left:0px;top:0px;line-height:normal;width:auto;',
+	sTbTrTd = ' cellspacing="0" cellpadding="0" border="0" style="' + sCss + '"><tbody style="' + sCss + '"><tr><td ';
+
+	var foo = 
+		(''
+		+ (tt_aV[TITLE].length ?
+			('<div id="WzTiTl" style="position:relative;z-index:1;">'
+			+ '<table id="WzTiTlTb"' + sTbTrTd + 'id="WzTiTlI" style="' + sCss + '">'
+			+ tt_aV[TITLE]
+			+ '</td>'
+			+ (tt_aV[CLOSEBTN] ?
+				('<td align="right" style="' + sCss
+				+ 'text-align:right;">'
+				+ '<span id="WzClOsE" style="padding-left:2px;padding-right:2px;'
+				+ 'cursor:' + (tt_ie ? 'hand' : 'pointer')
+				+ ';" onmouseover="tt_OnCloseBtnOver(1)" onmouseout="tt_OnCloseBtnOver(0)" onclick="tt_HideInit()">'
+				+ tt_aV[CLOSEBTNTEXT]
+				+ '</span></td>')
+				: '')
+			+ '</tr></tbody></table></div>')
+			: '')
+		+ '<div id="WzBoDy" style="position:relative;z-index:0;">'
+		+ '<table' + sTbTrTd + 'id="WzBoDyI" style="' + sCss + '">'
+		+ tt_sContent
+		+ '</td></tr></tbody></table></div>'
+		+ (tt_aV[SHADOW]
+			? ('<div id="WzTtShDwR" style="position:absolute;overflow:hidden;"></div>'
+				+ '<div id="WzTtShDwB" style="position:relative;overflow:hidden;"></div>')
+			: '')
+		);
+tt_aElt[0].innerHTML = foo;
+	tt_GetSubDivRefs();
+	// Convert DOM node to tip
+	if(tt_t2t && !tt_aV[COPYCONTENT])
+	{
+		// Store the tag's parent element so we can restore that DOM branch
+		// once the tooltip is hidden
+		tt_t2tDad = tt_t2t.parentNode || tt_t2t.parentElement || tt_t2t.offsetParent || null;
+		if(tt_t2tDad)
+		{
+			tt_MovDomNode(tt_t2t, tt_t2tDad, tt_aElt[6]);
+			tt_t2t.style.display = "block";
+		}
+	}
+	tt_ExtCallFncs(0, "SubDivsCreated");
+}
+function tt_GetSubDivRefs()
+{
+	var aId = new Array("WzTiTl", "WzTiTlTb", "WzTiTlI", "WzClOsE", "WzBoDy", "WzBoDyI", "WzTtShDwB", "WzTtShDwR");
+
+	for(var i = aId.length; i; --i)
+		tt_aElt[i] = tt_GetElt(aId[i - 1]);
+}
+function tt_FormatTip()
+{
+	var css, w, iOffY, iOffSh;
+
+	//--------- Title DIV ----------
+	if(tt_aV[TITLE].length)
+	{
+		css = tt_aElt[1].style;
+		css.background = tt_aV[TITLEBGCOLOR];
+		css.paddingTop = (tt_aV[CLOSEBTN] ? 2 : 0) + "px";
+		css.paddingBottom = "1px";
+		css.paddingLeft = css.paddingRight = tt_aV[PADDING] + "px";
+		css = tt_aElt[3].style;
+		css.color = tt_aV[TITLEFONTCOLOR];
+		css.fontFamily = tt_aV[TITLEFONTFACE];
+		css.fontSize = tt_aV[TITLEFONTSIZE];
+		css.fontWeight = "bold";
+		css.textAlign = tt_aV[TITLEALIGN];
+		// Close button DIV
+		if(tt_aElt[4])
+		{
+			css.paddingRight = (tt_aV[PADDING] << 1) + "px";
+			css = tt_aElt[4].style;
+			css.background = tt_aV[CLOSEBTNCOLORS][0];
+			css.color = tt_aV[CLOSEBTNCOLORS][1];
+			css.fontFamily = tt_aV[TITLEFONTFACE];
+			css.fontSize = tt_aV[TITLEFONTSIZE];
+			css.fontWeight = "bold";
+		}
+		if(tt_aV[WIDTH] > 0)
+			tt_w = tt_aV[WIDTH] + ((tt_aV[PADDING] + tt_aV[BORDERWIDTH]) << 1);
+		else
+		{
+			tt_w = tt_GetDivW(tt_aElt[3]) + tt_GetDivW(tt_aElt[4]);
+			// Some spacing between title DIV and closebutton
+			if(tt_aElt[4])
+				tt_w += tt_aV[PADDING];
+		}
+		// Ensure the top border of the body DIV be covered by the title DIV
+		iOffY = -tt_aV[BORDERWIDTH];
+	}
+	else
+	{
+		tt_w = 0;
+		iOffY = 0;
+	}
+
+	//-------- Body DIV ------------
+	css = tt_aElt[5].style;
+	css.top = iOffY + "px";
+	if(tt_aV[BORDERWIDTH])
+	{
+		css.borderColor = tt_aV[BORDERCOLOR];
+		css.borderStyle = tt_aV[BORDERSTYLE];
+		css.borderWidth = tt_aV[BORDERWIDTH] + "px";
+	}
+	if(tt_aV[BGCOLOR].length)
+		css.background = tt_aV[BGCOLOR];
+	if(tt_aV[BGIMG].length)
+		css.backgroundImage = "url(" + tt_aV[BGIMG] + ")";
+	css.padding = tt_aV[PADDING] + "px";
+	css.textAlign = tt_aV[TEXTALIGN];
+	// TD inside body DIV
+	css = tt_aElt[6].style;
+	css.color = tt_aV[FONTCOLOR];
+	css.fontFamily = tt_aV[FONTFACE];
+	css.fontSize = tt_aV[FONTSIZE];
+	css.fontWeight = tt_aV[FONTWEIGHT];
+	css.background = "";
+	css.textAlign = tt_aV[TEXTALIGN];
+	if(tt_aV[WIDTH] > 0)
+		w = tt_aV[WIDTH] + ((tt_aV[PADDING] + tt_aV[BORDERWIDTH]) << 1);
+	else
+		// We measure the width of the body's inner TD, because some browsers
+		// expand the width of the container and outer body DIV to 100%
+		w = tt_GetDivW(tt_aElt[6]) + ((tt_aV[PADDING] + tt_aV[BORDERWIDTH]) << 1);
+	if(w > tt_w)
+		tt_w = w;
+
+	//--------- Shadow DIVs ------------
+	if(tt_aV[SHADOW])
+	{
+		tt_w += tt_aV[SHADOWWIDTH];
+		iOffSh = Math.floor((tt_aV[SHADOWWIDTH] * 4) / 3);
+		// Bottom shadow
+		css = tt_aElt[7].style;
+		css.top = iOffY + "px";
+		css.left = iOffSh + "px";
+		css.width = (tt_w - iOffSh - tt_aV[SHADOWWIDTH]) + "px";
+		css.height = tt_aV[SHADOWWIDTH] + "px";
+		css.background = tt_aV[SHADOWCOLOR];
+		// Right shadow
+		css = tt_aElt[8].style;
+		css.top = iOffSh + "px";
+		css.left = (tt_w - tt_aV[SHADOWWIDTH]) + "px";
+		css.width = tt_aV[SHADOWWIDTH] + "px";
+		css.background = tt_aV[SHADOWCOLOR];
+	}
+	else
+		iOffSh = 0;
+
+	//-------- Container DIV -------
+	tt_SetTipOpa(tt_aV[FADEIN] ? 0 : tt_aV[OPACITY]);
+	tt_FixSize(iOffY, iOffSh);
+}
+// Fixate the size so it can't dynamically change while the tooltip is moving.
+function tt_FixSize(iOffY, iOffSh)
+{
+	var wIn, wOut, i;
+
+	tt_aElt[0].style.width = tt_w + "px";
+	tt_aElt[0].style.pixelWidth = tt_w;
+	wOut = tt_w - ((tt_aV[SHADOW]) ? tt_aV[SHADOWWIDTH] : 0);
+	// Body
+	wIn = wOut;
+	if(!tt_bBoxOld)
+		wIn -= ((tt_aV[PADDING] + tt_aV[BORDERWIDTH]) << 1);
+	tt_aElt[5].style.width = wIn + "px";
+	// Title
+	if(tt_aElt[1])
+	{
+		wIn = wOut - (tt_aV[PADDING] << 1);
+		if(!tt_bBoxOld)
+			wOut = wIn;
+		tt_aElt[1].style.width = wOut + "px";
+		tt_aElt[2].style.width = wIn + "px";
+	}
+	tt_h = tt_GetDivH(tt_aElt[0]) + iOffY;
+	// Right shadow
+	if(tt_aElt[8])
+		tt_aElt[8].style.height = (tt_h - iOffSh) + "px";
+	i = tt_aElt.length - 1;
+	if(tt_aElt[i])
+	{
+		tt_aElt[i].style.width = tt_w + "px";
+		tt_aElt[i].style.height = tt_h + "px";
+	}
+}
+function tt_DeAlt(el)
+{
+	var aKid;
+
+	if(el.alt)
+		el.alt = "";
+	if(el.title)
+		el.title = "";
+	aKid = el.childNodes || el.children || null;
+	if(aKid)
+	{
+		for(var i = aKid.length; i;)
+			tt_DeAlt(aKid[--i]);
+	}
+}
+// This hack removes the annoying native tooltips over links in Opera
+function tt_OpDeHref(el)
+{
+	if(!tt_op)
+		return;
+	if(tt_elDeHref)
+		tt_OpReHref();
+	while(el)
+	{
+		if(el.hasAttribute("href"))
+		{
+			el.t_href = el.getAttribute("href");
+			el.t_stats = window.status;
+			el.removeAttribute("href");
+			el.style.cursor = "hand";
+			tt_AddEvtFnc(el, "mousedown", tt_OpReHref);
+			window.status = el.t_href;
+			tt_elDeHref = el;
+			break;
+		}
+		el = el.parentElement;
+	}
+}
+function tt_ShowInit()
+{
+	tt_tShow.Timer("tt_Show()", tt_aV[DELAY], true);
+	if(tt_aV[CLICKCLOSE])
+		tt_AddEvtFnc(document, "mouseup", tt_HideInit);
+}
+function tt_OverInit(e)
+{
+	tt_over = e.target || e.srcElement;
+	tt_DeAlt(tt_over);
+	tt_OpDeHref(tt_over);
+	tt_AddRemOutFnc(true);
+}
+function tt_Show()
+{
+	var css = tt_aElt[0].style;
+
+	// Override the z-index of the topmost wz_dragdrop.js D&D item
+	css.zIndex = Math.max((window.dd && dd.z) ? (dd.z + 2) : 0, 1010);
+	if(tt_aV[STICKY] || !tt_aV[FOLLOWMOUSE])
+		tt_iState &= ~0x4;
+	if(tt_aV[DURATION] > 0)
+		tt_tDurt.Timer("tt_HideInit()", tt_aV[DURATION], true);
+	tt_ExtCallFncs(0, "Show")
+	css.visibility = "visible";
+	tt_iState |= 0x2;
+	if(tt_aV[FADEIN])
+		tt_Fade(0, 0, tt_aV[OPACITY], Math.round(tt_aV[FADEIN] / tt_aV[FADEINTERVAL]));
+	tt_ShowIfrm();
+}
+function tt_ShowIfrm()
+{
+	if(tt_ie56)
+	{
+		var ifrm = tt_aElt[tt_aElt.length - 1];
+		if(ifrm)
+		{
+			var css = ifrm.style;
+			css.zIndex = tt_aElt[0].style.zIndex - 1;
+			css.display = "block";
+		}
+	}
+}
+function tt_Move(e)
+{
+	e = window.event || e;
+	if(e)
+	{
+		tt_musX = tt_GetEvtX(e);
+		tt_musY = tt_GetEvtY(e);
+	}
+	if(tt_iState)
+	{
+		if(!tt_over && e)
+			tt_OverInit(e);
+		if(tt_iState & 0x4)
+		{
+			// Protect some browsers against jam of mousemove events
+			if(!tt_op && !tt_ie)
+			{
+				if(tt_bWait)
+					return;
+				tt_bWait = true;
+				tt_tWaitMov.Timer("tt_bWait = false;", 1, true);
+			}
+			if(tt_aV[FIX])
+			{
+				tt_iState &= ~0x4;
+				tt_SetTipPos(tt_aV[FIX][0], tt_aV[FIX][1]);
+			}
+			else if(!tt_ExtCallFncs(e, "MoveBefore"))
+				tt_SetTipPos(tt_PosX(), tt_PosY());
+			tt_ExtCallFncs([tt_musX, tt_musY], "MoveAfter")
+		}
+	}
+}
+function tt_PosX()
+{
+	var x;
+
+	x = tt_musX;
+	if(tt_aV[LEFT])
+		x -= tt_w + tt_aV[OFFSETX] - (tt_aV[SHADOW] ? tt_aV[SHADOWWIDTH] : 0);
+	else
+		x += tt_aV[OFFSETX];
+	// Prevent tip from extending past right/left clientarea boundary
+	if(x > tt_maxPosX)
+		x = tt_maxPosX;
+	return((x < tt_scrlX) ? tt_scrlX : x);
+}
+function tt_PosY()
+{
+	var y;
+
+	// Apply some hysteresis after the tip has snapped to the other side of the
+	// mouse. In case of insufficient space above and below the mouse, we place
+	// the tip below.
+	if(tt_aV[ABOVE] && (!tt_bJmpVert || tt_CalcPosYAbove() >= tt_scrlY + 16))
+		y = tt_DoPosYAbove();
+	else if(!tt_aV[ABOVE] && tt_bJmpVert && tt_CalcPosYBelow() > tt_maxPosY - 16)
+		y = tt_DoPosYAbove();
+	else
+		y = tt_DoPosYBelow();
+	// Snap to other side of mouse if tip would extend past window boundary
+	if(y > tt_maxPosY)
+		y = tt_DoPosYAbove();
+	if(y < tt_scrlY)
+		y = tt_DoPosYBelow();
+	return y;
+}
+function tt_DoPosYBelow()
+{
+	tt_bJmpVert = tt_aV[ABOVE];
+	return tt_CalcPosYBelow();
+}
+function tt_DoPosYAbove()
+{
+	tt_bJmpVert = !tt_aV[ABOVE];
+	return tt_CalcPosYAbove();
+}
+function tt_CalcPosYBelow()
+{
+	return(tt_musY + tt_aV[OFFSETY]);
+}
+function tt_CalcPosYAbove()
+{
+	var dy = tt_aV[OFFSETY] - (tt_aV[SHADOW] ? tt_aV[SHADOWWIDTH] : 0);
+	if(tt_aV[OFFSETY] > 0 && dy <= 0)
+		dy = 1;
+	return(tt_musY - tt_h - dy);
+}
+function tt_OnOut()
+{
+	tt_AddRemOutFnc(false);
+	if(!(tt_aV[STICKY] && (tt_iState & 0x2)))
+		tt_HideInit();
+}
+function tt_HideInit()
+{
+	tt_ExtCallFncs(0, "HideInit");
+	tt_iState &= ~0x4;
+	if(tt_flagOpa && tt_aV[FADEOUT])
+	{
+		tt_tFade.EndTimer();
+		if(tt_opa)
+		{
+			var n = Math.round(tt_aV[FADEOUT] / (tt_aV[FADEINTERVAL] * (tt_aV[OPACITY] / tt_opa)));
+			tt_Fade(tt_opa, tt_opa, 0, n);
+			return;
+		}
+	}
+	tt_tHide.Timer("tt_Hide();", 1, false);
+}
+function tt_OpReHref()
+{
+	if(tt_elDeHref)
+	{
+		tt_elDeHref.setAttribute("href", tt_elDeHref.t_href);
+		tt_RemEvtFnc(tt_elDeHref, "mousedown", tt_OpReHref);
+		window.status = tt_elDeHref.t_stats;
+		tt_elDeHref = null;
+	}
+}
+function tt_Fade(a, now, z, n)
+{
+	if(n)
+	{
+		now += Math.round((z - now) / n);
+		if((z > a) ? (now >= z) : (now <= z))
+			now = z;
+		else
+			tt_tFade.Timer("tt_Fade("
+							+ a + "," + now + "," + z + "," + (n - 1)
+							+ ")",
+							tt_aV[FADEINTERVAL],
+							true);
+	}
+	now ? tt_SetTipOpa(now) : tt_Hide();
+}
+// To circumvent the opacity nesting flaws of IE, we set the opacity
+// for each sub-DIV separately, rather than for the container DIV.
+function tt_SetTipOpa(opa)
+{
+	tt_SetOpa(tt_aElt[5].style, opa);
+	if(tt_aElt[1])
+		tt_SetOpa(tt_aElt[1].style, opa);
+	if(tt_aV[SHADOW])
+	{
+		opa = Math.round(opa * 0.8);
+		tt_SetOpa(tt_aElt[7].style, opa);
+		tt_SetOpa(tt_aElt[8].style, opa);
+	}
+}
+function tt_OnCloseBtnOver(iOver)
+{
+	var css = tt_aElt[4].style;
+
+	iOver <<= 1;
+	css.background = tt_aV[CLOSEBTNCOLORS][iOver];
+	css.color = tt_aV[CLOSEBTNCOLORS][iOver + 1];
+}
+function tt_Int(x)
+{
+	var y;
+
+	return(isNaN(y = parseInt(x)) ? 0 : y);
+}
+// Adds or removes the document.mousemove or HoveredElem.mouseout handler
+// conveniently. Keeps track of those handlers to prevent them from being
+// set or removed redundantly.
+function tt_AddRemOutFnc(bAdd)
+{
+	var PSet = bAdd ? tt_AddEvtFnc : tt_RemEvtFnc;
+
+	if(bAdd != tt_AddRemOutFnc.bOn)
+	{
+		PSet(tt_over, "mouseout", tt_OnOut);
+		tt_AddRemOutFnc.bOn = bAdd;
+		if(!bAdd)
+			tt_OpReHref();
+	}
+}
+tt_AddRemOutFnc.bOn = false;
+Number.prototype.Timer = function(s, iT, bUrge)
+{
+	if(!this.value || bUrge)
+		this.value = window.setTimeout(s, iT);
+}
+Number.prototype.EndTimer = function()
+{
+	if(this.value)
+	{
+		window.clearTimeout(this.value);
+		this.value = 0;
+	}
+}
+function tt_SetOpa(css, opa)
+{
+	tt_opa = opa;
+	if(tt_flagOpa == 1)
+	{
+		// Hack for bugs of IE:
+		// A DIV cannot be made visible in a single step if an opacity < 100
+		// has been applied while the DIV was hidden.
+		// Moreover, in IE6, applying an opacity < 100 has no effect if the
+		// concerned element has no layout (position, size, zoom, ...).
+		if(opa < 100)
+		{
+			var bVis = css.visibility != "hidden";
+			css.zoom = "100%";
+			if(!bVis)
+				css.visibility = "visible";
+			css.filter = "alpha(opacity=" + opa + ")";
+			if(!bVis)
+				css.visibility = "hidden";
+		}
+		else
+			css.filter = "";
+	}
+	else
+	{
+		opa /= 100.0;
+		switch(tt_flagOpa)
+		{
+		case 2:
+			css.KhtmlOpacity = opa; break;
+		case 3:
+			css.KHTMLOpacity = opa; break;
+		case 4:
+			css.MozOpacity = opa; break;
+		case 5:
+			css.opacity = opa; break;
+		}
+	}
+}
+function tt_MovDomNode(el, dadFrom, dadTo)
+{
+	if(dadFrom)
+		dadFrom.removeChild(el);
+	if(dadTo)
+		dadTo.appendChild(el);
+}
+function tt_Err(sErr)
+{
+	if(tt_Debug)
+		alert("Tooltip Script Error Message:\n\n" + sErr);
+}
+
+//===========  DEALING WITH EXTENSIONS	==============//
+function tt_ExtCmdEnum()
+{
+	var s;
+
+	// Add new command(s) to the commands enum
+	for(var i in config)
+	{
+		s = "window." + i.toString().toUpperCase();
+		if(eval("typeof(" + s + ") == tt_u"))
+		{
+			eval(s + " = " + tt_aV.length);
+			tt_aV[tt_aV.length] = null;
+		}
+	}
+}
+function tt_ExtCallFncs(arg, sFnc)
+{
+	var b = false;
+	for(var i = tt_aExt.length; i;)
+	{--i;
+		var fnc = tt_aExt[i]["On" + sFnc];
+		// Call the method the extension has defined for this event
+		if(fnc && fnc(arg))
+			b = true;
+	}
+	return b;
+}
+
+tt_Init();

Added: incubator/esme/trunk/server/src/main/webapp/static/about.html
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/static/about.html?rev=726084&view=auto
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/static/about.html (added)
+++ incubator/esme/trunk/server/src/main/webapp/static/about.html Fri Dec 12 10:32:17 2008
@@ -0,0 +1,19 @@
+<lift:surround with="default" at="content">
+  <p>
+    ESME (Enterprise Social Messaging Experiment) is a social tool that
+    takes the immediacy of messaging and applies it to real time business
+    process problem solving. Taking the concepts embodied in social
+    networks such as tags and groups, ESME provides the business
+    communications framework that allows for the fastest and most reliable
+    way of discovering the best solution to everyday problems for people
+    working in peer and extended networks. It reduces the risk of applying
+    suboptimal solutions by surfacing the right people at the right time
+    who can apply expertise to a given situation, allows the participation
+    of mobile workers, integrates to existing systems and provides for
+    contextually appropriate document attachments.
+  </p>
+  
+  <p>Read more at the <a href="http://blog.esme.us">ESME Blog</a>.</p>
+  
+  <p>Email us at <a href="mailto:feedback@esme.us">feedback@esme.us</a></p>
+</lift:surround>

Added: incubator/esme/trunk/server/src/main/webapp/style/b-back.css
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/style/b-back.css?rev=726084&view=auto
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/style/b-back.css (added)
+++ incubator/esme/trunk/server/src/main/webapp/style/b-back.css Fri Dec 12 10:32:17 2008
@@ -0,0 +1,18 @@
+/* Back link (begin) */ /**/
+    .b-back
+    {
+        padding: 8px 0;
+
+        background: #fff;
+    }
+
+    .b-back a
+    {
+        text-decoration: none;
+    }
+
+    .b-back a:hover
+    {
+        font-weight: bold;
+    }
+/* Back link (end) */ /**/
\ No newline at end of file

Added: incubator/esme/trunk/server/src/main/webapp/style/b-content.css
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/style/b-content.css?rev=726084&view=auto
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/style/b-content.css (added)
+++ incubator/esme/trunk/server/src/main/webapp/style/b-content.css Fri Dec 12 10:32:17 2008
@@ -0,0 +1,38 @@
+/* Content page (begin) */ /**/
+   .b-cloud {
+      margin-top: 30px;
+            background: #233e5e; /* url(../images/sh-r.png) repeat-y 100% 0; */
+	    text-align: center;
+   }
+
+   #tag-para, #word-para {
+   font-size: 1.7em;
+text-decoration: underline;
+   font-style: italic;
+   }
+
+    .b-content
+    {
+        margin-top: 30px;
+    }
+
+    .b-content .title
+    {
+        margin-left: 5px;
+
+        color: #fff;
+    }
+
+    .b-content .text
+    {
+        margin: 5px 5px 8px 5px;
+        padding: 10px;
+
+        background: #fff;
+    }
+
+    .b-content p
+    {
+        margin-top: 8px;
+    }
+/* Content page (end) */ /**/
\ No newline at end of file

Added: incubator/esme/trunk/server/src/main/webapp/style/b-edit.css
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/style/b-edit.css?rev=726084&view=auto
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/style/b-edit.css (added)
+++ incubator/esme/trunk/server/src/main/webapp/style/b-edit.css Fri Dec 12 10:32:17 2008
@@ -0,0 +1,19 @@
+.b-edit .name
+{
+    font-size: 90%;
+
+    margin-left: 0.45em;
+
+    color: #fa801f;
+}
+
+
+.b-edit .bugs
+{
+    margin-top: 20px;
+}
+
+.b-edit .bugs p
+{
+    margin-top: 8px;
+}
\ No newline at end of file

Added: incubator/esme/trunk/server/src/main/webapp/style/b-list-ie.css
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/style/b-list-ie.css?rev=726084&view=auto
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/style/b-list-ie.css (added)
+++ incubator/esme/trunk/server/src/main/webapp/style/b-list-ie.css Fri Dec 12 10:32:17 2008
@@ -0,0 +1,23 @@
+/*  List messages (begin) */ /**/
+    .b-list .message .outer
+    {
+        min-height: 55px;
+        height: auto !important;
+        height: 55px;
+    }
+
+    .b-list .message .inner
+    {
+        min-height: 33px;
+        height: auto !important;
+        height: 33px;
+    }
+/*  List messages (end) */ /**/
+
+/* Images (begin) */ /**/
+    * html .b-list .image .shadow i
+    {
+        background: none;
+        filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=../images/bg-i.png);
+    }
+/* Images (end) */ /**/
\ No newline at end of file

Added: incubator/esme/trunk/server/src/main/webapp/style/b-list.css
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/style/b-list.css?rev=726084&view=auto
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/style/b-list.css (added)
+++ incubator/esme/trunk/server/src/main/webapp/style/b-list.css Fri Dec 12 10:32:17 2008
@@ -0,0 +1,105 @@
+/* List messages (begin) */ /**/
+    .b-list
+    {
+        font-size: 90%;
+
+        border-bottom: 6px solid #fff;
+        border-left: 1px solid #fff;
+        border-right: 1px solid #fff;
+    }
+
+    .b-list tr
+    {
+        vertical-align: top;
+
+        background: #c9d8ea url(../images/bg-left.png) repeat-x;
+        border-bottom: 1px solid #fff;
+    }
+
+    /* Images (begin) */ /**/
+        .b-list .image
+        {
+            width: 60px;
+            padding: 5px 0 5px 6px;
+
+        }
+
+        .b-list .image .shadow
+        {
+            position: absolute;
+
+            width: 58px;
+            height: 58px;
+        }
+
+        .b-list .image .shadow i
+        {
+            position: absolute;
+            left: -3px;
+            top: -3px;
+
+            width: 58px;
+            height: 58px;
+
+            background: url(../images/bg-i.png) no-repeat;
+        }
+
+        .b-list .image img
+        {
+            position: relative;
+
+            width: 48px;
+            height: 48px;
+        }
+    /* Images (end) */ /**/
+
+    /* Messages (begin) */ /**/
+        .b-list .message
+        {
+            width: 307px;
+            padding: 5px;
+        }
+
+        .b-list .message .outer
+        {
+            min-height: 50px;
+        }
+
+        .b-list .message .inner
+        {
+            min-height: 33px;
+            padding-bottom: 0.4em;
+        }
+
+        .b-list .mail
+        {
+            display: block;
+
+            float: right;
+
+            margin-left: 5px;
+        }
+
+        .b-list .text
+        {
+            padding-bottom: 0.2em;
+            color: #233e5e;
+        }
+                .b-list .date
+        {
+            padding-bottom: 0.2em;
+            color: #233e5e;
+        }
+    /* Messages (end) */ /**/
+
+    .b-list .tag
+    {
+        font-weight: bold;
+
+        width: 143px;
+        padding: 5px;
+
+        color: #fff;
+        background: #233e5e url(../images/bg-right1.png) repeat-x;
+    }
+/* List messages (end) */ /**/
\ No newline at end of file

Added: incubator/esme/trunk/server/src/main/webapp/style/b-menu.css
URL: http://svn.apache.org/viewvc/incubator/esme/trunk/server/src/main/webapp/style/b-menu.css?rev=726084&view=auto
==============================================================================
--- incubator/esme/trunk/server/src/main/webapp/style/b-menu.css (added)
+++ incubator/esme/trunk/server/src/main/webapp/style/b-menu.css Fri Dec 12 10:32:17 2008
@@ -0,0 +1,36 @@
+/* Menu (begin) */ /**/
+    .b-menu
+    {
+        margin-top: 4px;
+
+        color: #233e5e;
+        border-top: 1px solid #fff;
+    }
+
+    .b-menu li
+    {
+        padding: 0.5em 0.2em 0.5em 0.8em;
+
+        border-bottom: 1px solid #fff;
+    }
+
+    .b-menu li:hover
+    {
+        background: #fff;
+        border-bottom: 1px solid #c9d8ea;
+    }
+
+    .b-menu .current
+    {
+        background: #fff;
+        border-bottom: 1px solid #c9d8ea;
+    }
+
+    .b-menu a
+    {
+        text-decoration: none;
+
+        color: #233e5e;
+    }
+    
+/* Menu (end) */ /**/
\ No newline at end of file



Mime
View raw message