~ big update from lift to Unfiltered FTW
authorAlexandre Bertails <bertails@gmail.com>
Tue, 30 Aug 2011 01:05:16 -0400
changeset 380 dee6bfc5b370
parent 379 111563c940f1
child 381 11040e4753f6
~ big update from lift to Unfiltered FTW
.hgignore
directmapping-webapp/src/main/resources/props/default.props
directmapping-webapp/src/main/resources/scripts/jquery.autocomplete.js
directmapping-webapp/src/main/resources/scripts/jquery.js
directmapping-webapp/src/main/resources/scripts/jquery.watermark.js
directmapping-webapp/src/main/resources/scripts/typewatch.js
directmapping-webapp/src/main/resources/styles/jquery.autocomplete.css
directmapping-webapp/src/main/resources/templates/index.ssp
directmapping-webapp/src/main/resources/toserve/jquery.watermark.js
directmapping-webapp/src/main/resources/toserve/typewatch.js
directmapping-webapp/src/main/scala/Main.scala
directmapping-webapp/src/main/scala/QueryManager.scala
directmapping-webapp/src/main/scala/Test.scala
directmapping-webapp/src/main/scala/Util.scala
directmapping-webapp/src/main/scala/bootstrap/liftweb/Boot.scala
directmapping-webapp/src/main/scala/code/comet/.keep
directmapping-webapp/src/main/scala/code/lib/DependencyFactory.scala
directmapping-webapp/src/main/scala/code/model/.keep
directmapping-webapp/src/main/scala/code/snippet/AutoComplete.scala
directmapping-webapp/src/main/scala/code/snippet/HelloWorld.scala
directmapping-webapp/src/main/scala/code/view/.keep
directmapping-webapp/src/main/webapp/WEB-INF/web.xml
directmapping-webapp/src/main/webapp/images/ajax-loader.gif
directmapping-webapp/src/main/webapp/index.html
directmapping-webapp/src/main/webapp/static/index.html
directmapping-webapp/src/main/webapp/templates-hidden/default.html
directmapping-webapp/src/main/webapp/templates-hidden/wizard-all.html
project/FeDeRateBuild.scala
project/plugins/build.sbt
--- a/.hgignore	Mon Aug 29 21:19:50 2011 -0400
+++ b/.hgignore	Tue Aug 30 01:05:16 2011 -0400
@@ -17,3 +17,4 @@
 ^\.emacs\.desktop$
 build.properties
 *egp*
+*.jar
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/directmapping-webapp/src/main/resources/scripts/jquery.autocomplete.js	Tue Aug 30 01:05:16 2011 -0400
@@ -0,0 +1,762 @@
+/*
+ * Autocomplete - jQuery plugin 1.1pre
+ *
+ * Copyright (c) 2007 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, Jörn Zaefferer
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id: jquery.autocomplete.js 5785 2008-07-12 10:37:33Z joern.zaefferer $
+ *
+ */
+
+;(function($) {
+	
+$.fn.extend({
+	autocomplete: function(urlOrData, options) {
+		var isUrl = typeof urlOrData == "string";
+		options = $.extend({}, $.Autocompleter.defaults, {
+			url: isUrl ? urlOrData : null,
+			data: isUrl ? null : urlOrData,
+			delay: isUrl ? $.Autocompleter.defaults.delay : 10,
+			max: options && !options.scroll ? 10 : 150
+		}, options);
+		
+		// if highlight is set to false, replace it with a do-nothing function
+		options.highlight = options.highlight || function(value) { return value; };
+		
+		// if the formatMatch option is not specified, then use formatItem for backwards compatibility
+		options.formatMatch = options.formatMatch || options.formatItem;
+		
+		return this.each(function() {
+			new $.Autocompleter(this, options);
+		});
+	},
+	result: function(handler) {
+		return this.bind("result", handler);
+	},
+	search: function(handler) {
+		return this.trigger("search", [handler]);
+	},
+	flushCache: function() {
+		return this.trigger("flushCache");
+	},
+	setOptions: function(options){
+		return this.trigger("setOptions", [options]);
+	},
+	unautocomplete: function() {
+		return this.trigger("unautocomplete");
+	}
+});
+
+$.Autocompleter = function(input, options) {
+
+	var KEY = {
+		UP: 38,
+		DOWN: 40,
+		DEL: 46,
+		TAB: 9,
+		RETURN: 13,
+		ESC: 27,
+		COMMA: 188,
+		PAGEUP: 33,
+		PAGEDOWN: 34,
+		BACKSPACE: 8
+	};
+
+	// Create $ object for input element
+	var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass);
+
+	var timeout;
+	var previousValue = "";
+	var cache = $.Autocompleter.Cache(options);
+	var hasFocus = 0;
+	var lastKeyPressCode;
+	var config = {
+		mouseDownOnSelect: false
+	};
+	var select = $.Autocompleter.Select(options, input, selectCurrent, config);
+	
+	var blockSubmit;
+	
+	// prevent form submit in opera when selecting with return key
+	$.browser.opera && $(input.form).bind("submit.autocomplete", function() {
+		if (blockSubmit) {
+			blockSubmit = false;
+			return false;
+		}
+	});
+	
+	// only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all
+	$input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) {
+		// track last key pressed
+		lastKeyPressCode = event.keyCode;
+		switch(event.keyCode) {
+		
+			case KEY.UP:
+				event.preventDefault();
+				if ( select.visible() ) {
+					select.prev();
+				} else {
+					onChange(0, true);
+				}
+				break;
+				
+			case KEY.DOWN:
+				event.preventDefault();
+				if ( select.visible() ) {
+					select.next();
+				} else {
+					onChange(0, true);
+				}
+				break;
+				
+			case KEY.PAGEUP:
+				event.preventDefault();
+				if ( select.visible() ) {
+					select.pageUp();
+				} else {
+					onChange(0, true);
+				}
+				break;
+				
+			case KEY.PAGEDOWN:
+				event.preventDefault();
+				if ( select.visible() ) {
+					select.pageDown();
+				} else {
+					onChange(0, true);
+				}
+				break;
+			
+			// matches also semicolon
+			case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA:
+			case KEY.TAB:
+			case KEY.RETURN:
+				if( selectCurrent() ) {
+					// stop default to prevent a form submit, Opera needs special handling
+					event.preventDefault();
+					blockSubmit = true;
+					return false;
+				}
+				break;
+				
+			case KEY.ESC:
+				select.hide();
+				break;
+				
+			default:
+				clearTimeout(timeout);
+				timeout = setTimeout(onChange, options.delay);
+				break;
+		}
+	}).focus(function(){
+		// track whether the field has focus, we shouldn't process any
+		// results if the field no longer has focus
+		hasFocus++;
+	}).blur(function() {
+		hasFocus = 0;
+		if (!config.mouseDownOnSelect) {
+			hideResults();
+		}
+	}).click(function() {
+		// show select when clicking in a focused field
+		if ( hasFocus++ > 1 && !select.visible() ) {
+			onChange(0, true);
+		}
+	}).bind("search", function() {
+		// TODO why not just specifying both arguments?
+		var fn = (arguments.length > 1) ? arguments[1] : null;
+		function findValueCallback(q, data) {
+			var result;
+			if( data && data.length ) {
+				for (var i=0; i < data.length; i++) {
+					if( data[i].result.toLowerCase() == q.toLowerCase() ) {
+						result = data[i];
+						break;
+					}
+				}
+			}
+			if( typeof fn == "function" ) fn(result);
+			else $input.trigger("result", result && [result.data, result.value]);
+		}
+		$.each(trimWords($input.val()), function(i, value) {
+			request(value, findValueCallback, findValueCallback);
+		});
+	}).bind("flushCache", function() {
+		cache.flush();
+	}).bind("setOptions", function() {
+		$.extend(options, arguments[1]);
+		// if we've updated the data, repopulate
+		if ( "data" in arguments[1] )
+			cache.populate();
+	}).bind("unautocomplete", function() {
+		select.unbind();
+		$input.unbind();
+		$(input.form).unbind(".autocomplete");
+	});
+	
+	
+	function selectCurrent() {
+		var selected = select.selected();
+		if( !selected )
+			return false;
+		
+		var v = selected.result;
+		previousValue = v;
+		
+		if ( options.multiple ) {
+			var words = trimWords($input.val());
+			if ( words.length > 1 ) {
+				v = words.slice(0, words.length - 1).join( options.multipleSeparator ) + options.multipleSeparator + v;
+			}
+			v += options.multipleSeparator;
+		}
+		
+		$input.val(v);
+		hideResultsNow();
+		$input.trigger("result", [selected.data, selected.value]);
+		return true;
+	}
+	
+	function onChange(crap, skipPrevCheck) {
+		if( lastKeyPressCode == KEY.DEL ) {
+			select.hide();
+			return;
+		}
+		
+		var currentValue = $input.val();
+		
+		if ( !skipPrevCheck && currentValue == previousValue )
+			return;
+		
+		previousValue = currentValue;
+		
+		currentValue = lastWord(currentValue);
+		if ( currentValue.length >= options.minChars) {
+			$input.addClass(options.loadingClass);
+			if (!options.matchCase)
+				currentValue = currentValue.toLowerCase();
+			request(currentValue, receiveData, hideResultsNow);
+		} else {
+			stopLoading();
+			select.hide();
+		}
+	};
+	
+	function trimWords(value) {
+		if ( !value ) {
+			return [""];
+		}
+		var words = value.split( options.multipleSeparator );
+		var result = [];
+		$.each(words, function(i, value) {
+			if ( $.trim(value) )
+				result[i] = $.trim(value);
+		});
+		return result;
+	}
+	
+	function lastWord(value) {
+		if ( !options.multiple )
+			return value;
+		var words = trimWords(value);
+		return words[words.length - 1];
+	}
+	
+	// fills in the input box w/the first match (assumed to be the best match)
+	// q: the term entered
+	// sValue: the first matching result
+	function autoFill(q, sValue){
+		// autofill in the complete box w/the first match as long as the user hasn't entered in more data
+		// if the last user key pressed was backspace, don't autofill
+		if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) {
+			// fill in the value (keep the case the user has typed)
+			$input.val($input.val() + sValue.substring(lastWord(previousValue).length));
+			// select the portion of the value not typed by the user (so the next character will erase)
+			$.Autocompleter.Selection(input, previousValue.length, previousValue.length + sValue.length);
+		}
+	};
+
+	function hideResults() {
+		clearTimeout(timeout);
+		timeout = setTimeout(hideResultsNow, 200);
+	};
+
+	function hideResultsNow() {
+		var wasVisible = select.visible();
+		select.hide();
+		clearTimeout(timeout);
+		stopLoading();
+		if (options.mustMatch) {
+			// call search and run callback
+			$input.search(
+				function (result){
+					// if no value found, clear the input box
+					if( !result ) {
+						if (options.multiple) {
+							var words = trimWords($input.val()).slice(0, -1);
+							$input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") );
+						}
+						else
+							$input.val( "" );
+					}
+				}
+			);
+		}
+		if (wasVisible)
+			// position cursor at end of input field
+			$.Autocompleter.Selection(input, input.value.length, input.value.length);
+	};
+
+	function receiveData(q, data) {
+		if ( data && data.length && hasFocus ) {
+			stopLoading();
+			select.display(data, q);
+			autoFill(q, data[0].value);
+			select.show();
+		} else {
+			hideResultsNow();
+		}
+	};
+
+	function request(term, success, failure) {
+		if (!options.matchCase)
+			term = term.toLowerCase();
+		var data = cache.load(term);
+		// recieve the cached data
+		if (data && data.length) {
+			success(term, data);
+		// if an AJAX url has been supplied, try loading the data now
+		} else if( (typeof options.url == "string") && (options.url.length > 0) ){
+			
+			var extraParams = {
+				timestamp: +new Date()
+			};
+			$.each(options.extraParams, function(key, param) {
+				extraParams[key] = typeof param == "function" ? param() : param;
+			});
+			
+			$.ajax({
+				// try to leverage ajaxQueue plugin to abort previous requests
+				mode: "abort",
+				// limit abortion to this input
+				port: "autocomplete" + input.name,
+				dataType: options.dataType,
+				url: options.url,
+				data: $.extend({
+					q: lastWord(term),
+					limit: options.max
+				}, extraParams),
+				success: function(data) {
+					var parsed = options.parse && options.parse(data) || parse(data);
+					cache.add(term, parsed);
+					success(term, parsed);
+				}
+			});
+		} else {
+			// if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match
+			select.emptyList();
+			failure(term);
+		}
+	};
+	
+	function parse(data) {
+		var parsed = [];
+		var rows = data.split("\n");
+		for (var i=0; i < rows.length; i++) {
+			var row = $.trim(rows[i]);
+			if (row) {
+				row = row.split("|");
+				parsed[parsed.length] = {
+					data: row,
+					value: row[0],
+					result: options.formatResult && options.formatResult(row, row[0]) || row[0]
+				};
+			}
+		}
+		return parsed;
+	};
+
+	function stopLoading() {
+		$input.removeClass(options.loadingClass);
+	};
+
+};
+
+$.Autocompleter.defaults = {
+	inputClass: "ac_input",
+	resultsClass: "ac_results",
+	loadingClass: "ac_loading",
+	minChars: 1,
+	delay: 400,
+	matchCase: false,
+	matchSubset: true,
+	matchContains: false,
+	cacheLength: 10,
+	max: 100,
+	mustMatch: false,
+	extraParams: {},
+	selectFirst: true,
+	formatItem: function(row) { return row[0]; },
+	formatMatch: null,
+	autoFill: false,
+	width: 0,
+	multiple: false,
+	multipleSeparator: ", ",
+	highlight: function(value, term) {
+		return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
+	},
+    scroll: true,
+    scrollHeight: 180
+};
+
+$.Autocompleter.Cache = function(options) {
+
+	var data = {};
+	var length = 0;
+	
+	function matchSubset(s, sub) {
+		if (!options.matchCase) 
+			s = s.toLowerCase();
+		var i = s.indexOf(sub);
+		if (options.matchContains == "word"){
+			i = s.toLowerCase().search("\\b" + sub.toLowerCase());
+		}
+		if (i == -1) return false;
+		return i == 0 || options.matchContains;
+	};
+	
+	function add(q, value) {
+		if (length > options.cacheLength){
+			flush();
+		}
+		if (!data[q]){ 
+			length++;
+		}
+		data[q] = value;
+	}
+	
+	function populate(){
+		if( !options.data ) return false;
+		// track the matches
+		var stMatchSets = {},
+			nullData = 0;
+
+		// no url was specified, we need to adjust the cache length to make sure it fits the local data store
+		if( !options.url ) options.cacheLength = 1;
+		
+		// track all options for minChars = 0
+		stMatchSets[""] = [];
+		
+		// loop through the array and create a lookup structure
+		for ( var i = 0, ol = options.data.length; i < ol; i++ ) {
+			var rawValue = options.data[i];
+			// if rawValue is a string, make an array otherwise just reference the array
+			rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue;
+			
+			var value = options.formatMatch(rawValue, i+1, options.data.length);
+			if ( value === false )
+				continue;
+				
+			var firstChar = value.charAt(0).toLowerCase();
+			// if no lookup array for this character exists, look it up now
+			if( !stMatchSets[firstChar] ) 
+				stMatchSets[firstChar] = [];
+
+			// if the match is a string
+			var row = {
+				value: value,
+				data: rawValue,
+				result: options.formatResult && options.formatResult(rawValue) || value
+			};
+			
+			// push the current match into the set list
+			stMatchSets[firstChar].push(row);
+
+			// keep track of minChars zero items
+			if ( nullData++ < options.max ) {
+				stMatchSets[""].push(row);
+			}
+		};
+
+		// add the data items to the cache
+		$.each(stMatchSets, function(i, value) {
+			// increase the cache size
+			options.cacheLength++;
+			// add to the cache
+			add(i, value);
+		});
+	}
+	
+	// populate any existing data
+	setTimeout(populate, 25);
+	
+	function flush(){
+		data = {};
+		length = 0;
+	}
+	
+	return {
+		flush: flush,
+		add: add,
+		populate: populate,
+		load: function(q) {
+			if (!options.cacheLength || !length)
+				return null;
+			/* 
+			 * if dealing w/local data and matchContains than we must make sure
+			 * to loop through all the data collections looking for matches
+			 */
+			if( !options.url && options.matchContains ){
+				// track all matches
+				var csub = [];
+				// loop through all the data grids for matches
+				for( var k in data ){
+					// don't search through the stMatchSets[""] (minChars: 0) cache
+					// this prevents duplicates
+					if( k.length > 0 ){
+						var c = data[k];
+						$.each(c, function(i, x) {
+							// if we've got a match, add it to the array
+							if (matchSubset(x.value, q)) {
+								csub.push(x);
+							}
+						});
+					}
+				}				
+				return csub;
+			} else 
+			// if the exact item exists, use it
+			if (data[q]){
+				return data[q];
+			} else
+			if (options.matchSubset) {
+				for (var i = q.length - 1; i >= options.minChars; i--) {
+					var c = data[q.substr(0, i)];
+					if (c) {
+						var csub = [];
+						$.each(c, function(i, x) {
+							if (matchSubset(x.value, q)) {
+								csub[csub.length] = x;
+							}
+						});
+						return csub;
+					}
+				}
+			}
+			return null;
+		}
+	};
+};
+
+$.Autocompleter.Select = function (options, input, select, config) {
+	var CLASSES = {
+		ACTIVE: "ac_over"
+	};
+	
+	var listItems,
+		active = -1,
+		data,
+		term = "",
+		needsInit = true,
+		element,
+		list;
+	
+	// Create results
+	function init() {
+		if (!needsInit)
+			return;
+		element = $("<div/>")
+		.hide()
+		.addClass(options.resultsClass)
+		.css("position", "absolute")
+		.appendTo(document.body);
+	
+		list = $("<ul/>").appendTo(element).mouseover( function(event) {
+			if(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') {
+	            active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event));
+			    $(target(event)).addClass(CLASSES.ACTIVE);            
+	        }
+		}).click(function(event) {
+			$(target(event)).addClass(CLASSES.ACTIVE);
+			select();
+			// TODO provide option to avoid setting focus again after selection? useful for cleanup-on-focus
+			input.focus();
+			return false;
+		}).mousedown(function() {
+			config.mouseDownOnSelect = true;
+		}).mouseup(function() {
+			config.mouseDownOnSelect = false;
+		});
+		
+		if( options.width > 0 )
+			element.css("width", options.width);
+			
+		needsInit = false;
+	} 
+	
+	function target(event) {
+		var element = event.target;
+		while(element && element.tagName != "LI")
+			element = element.parentNode;
+		// more fun with IE, sometimes event.target is empty, just ignore it then
+		if(!element)
+			return [];
+		return element;
+	}
+
+	function moveSelect(step) {
+		listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE);
+		movePosition(step);
+        var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE);
+        if(options.scroll) {
+            var offset = 0;
+            listItems.slice(0, active).each(function() {
+				offset += this.offsetHeight;
+			});
+            if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) {
+                list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight());
+            } else if(offset < list.scrollTop()) {
+                list.scrollTop(offset);
+            }
+        }
+	};
+	
+	function movePosition(step) {
+		active += step;
+		if (active < 0) {
+			active = listItems.size() - 1;
+		} else if (active >= listItems.size()) {
+			active = 0;
+		}
+	}
+	
+	function limitNumberOfItems(available) {
+		return options.max && options.max < available
+			? options.max
+			: available;
+	}
+	
+	function fillList() {
+		list.empty();
+		var max = limitNumberOfItems(data.length);
+		for (var i=0; i < max; i++) {
+			if (!data[i])
+				continue;
+			var formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term);
+			if ( formatted === false )
+				continue;
+			var li = $("<li/>").html( options.highlight(formatted, term) ).addClass(i%2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0];
+			$.data(li, "ac_data", data[i]);
+		}
+		listItems = list.find("li");
+		if ( options.selectFirst ) {
+			listItems.slice(0, 1).addClass(CLASSES.ACTIVE);
+			active = 0;
+		}
+		// apply bgiframe if available
+		if ( $.fn.bgiframe )
+			list.bgiframe();
+	}
+	
+	return {
+		display: function(d, q) {
+			init();
+			data = d;
+			term = q;
+			fillList();
+		},
+		next: function() {
+			moveSelect(1);
+		},
+		prev: function() {
+			moveSelect(-1);
+		},
+		pageUp: function() {
+			if (active != 0 && active - 8 < 0) {
+				moveSelect( -active );
+			} else {
+				moveSelect(-8);
+			}
+		},
+		pageDown: function() {
+			if (active != listItems.size() - 1 && active + 8 > listItems.size()) {
+				moveSelect( listItems.size() - 1 - active );
+			} else {
+				moveSelect(8);
+			}
+		},
+		hide: function() {
+			element && element.hide();
+			listItems && listItems.removeClass(CLASSES.ACTIVE);
+			active = -1;
+		},
+		visible : function() {
+			return element && element.is(":visible");
+		},
+		current: function() {
+			return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]);
+		},
+		show: function() {
+			var offset = $(input).offset();
+			element.css({
+				width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(),
+				top: offset.top + input.offsetHeight,
+				left: offset.left
+			}).show();
+            if(options.scroll) {
+                list.scrollTop(0);
+                list.css({
+					maxHeight: options.scrollHeight,
+					overflow: 'auto'
+				});
+				
+                if($.browser.msie && typeof document.body.style.maxHeight === "undefined") {
+					var listHeight = 0;
+					listItems.each(function() {
+						listHeight += this.offsetHeight;
+					});
+					var scrollbarsVisible = listHeight > options.scrollHeight;
+                    list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight );
+					if (!scrollbarsVisible) {
+						// IE doesn't recalculate width when scrollbar disappears
+						listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) );
+					}
+                }
+                
+            }
+		},
+		selected: function() {
+			var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);
+			return selected && selected.length && $.data(selected[0], "ac_data");
+		},
+		emptyList: function (){
+			list && list.empty();
+		},
+		unbind: function() {
+			element && element.remove();
+		}
+	};
+};
+
+$.Autocompleter.Selection = function(field, start, end) {
+	if( field.createTextRange ){
+		var selRange = field.createTextRange();
+		selRange.collapse(true);
+		selRange.moveStart("character", start);
+		selRange.moveEnd("character", end);
+		selRange.select();
+	} else if( field.setSelectionRange ){
+		field.setSelectionRange(start, end);
+	} else {
+		if( field.selectionStart ){
+			field.selectionStart = start;
+			field.selectionEnd = end;
+		}
+	}
+	field.focus();
+};
+
+})(jQuery);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/directmapping-webapp/src/main/resources/scripts/jquery.js	Tue Aug 30 01:05:16 2011 -0400
@@ -0,0 +1,18 @@
+/*!
+ * jQuery JavaScript Library v1.6.2
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Jun 30 14:16:56 2011 -0400
+ */
+(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bZ(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bY(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bC.test(a)?d(a,e):bY(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)bY(a+"["+e+"]",b[e],c,d);else d(a,b)}function bX(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bR,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bX(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bX(a,c,d,e,"*",g));return l}function bW(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bN),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bA(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bv:bw;if(d>0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)f.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function bg(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function W(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(R.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;i<s.length;i++)g=s[i],g.origType.replace(x,"")===a.type?q.push(g.selector):s.splice(i--,1);e=f(a.target).closest(q,a.currentTarget);for(j=0,k=e.length;j<k;j++){m=e[j];for(i=0;i<s.length;i++){g=s[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,d=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,d=f(a.relatedTarget).closest(g.selector)[0],d&&f.contains(h,d)&&(d=h);(!d||d!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){e=p[j];if(c&&e.level>c)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b){if(H)return H.call(b,a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=s.exec(a)||t.exec(a)||u.exec(a)||a.indexOf("compatible")<0&&v.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g="done fail isResolved isRejected promise then always pipe".split(" "),h=[].slice;f.extend({_Deferred:function(){var a=[],b,c,d,e={done:function(){if(!d){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=f.type(i),j==="array"?e.done.apply(e,i):j==="function"&&a.push(i);k&&e.resolveWith(k[0],k[1])}return this},resolveWith:function(e,f){if(!d&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(e,f)}finally{b=[e,f],c=0}}return this},resolve:function(){e.resolveWith(this,arguments);return this},isResolved:function(){return!!c||!!b},cancel:function(){d=1,a=[];return this}};return e},Deferred:function(a){var b=f._Deferred(),c=f._Deferred(),d;f.extend(b,{then:function(a,c){b.done(a).fail(c);return this},always:function(){return b.done.apply(b,arguments).fail.apply(this,arguments)},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,pipe:function(a,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[c,"reject"]},function(a,c){var e=c[0],g=c[1],h;f.isFunction(e)?b[a](function(){h=e.apply(this,arguments),h&&f.isFunction(h.promise)?h.promise().then(d.resolve,d.reject):d[g](h)}):b[a](d[g])})}).promise()},promise:function(a){if(a==null){if(d)return d;d=a={}}var c=g.length;while(c--)a[g[c]]=b[g[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c<d;c++)b[c]&&f.isFunction(b[c].promise)?b[c].promise().then(i(c),g.reject):--e;e||g.resolveWith(g,b)}else g!==a&&g.resolveWith(g,d?[a]:[]);return g.promise()}}),f.support=function(){var a=c.createElement("div"),b=c.documentElement,d,e,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;a.setAttribute("className","t"),a.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h<i;h++)g=e[h].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),k(this[0],g,d[g]))}}return d}if(typeof a=="object")return this.each(function(){f.data(this,a)});var j=a.split(".");j[1]=j[1]?"."+j[1]:"";if(c===b){d=this.triggerHandler("getData"+j[1]+"!",[j[0]]),d===b&&this.length&&(d=f.data(this[0],a),d=k(this[0],a,d));return d===b&&j[1]?this.data(j[0]):d}return this.each(function(){var b=f(this),d=[j[0],c];b.triggerHandler("setData"+j[1]+"!",d),f.data(this,a,c),b.triggerHandler("changeData"+j[1]+"!",d)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,c){a&&(c=(c||"fx")+"mark",f.data(a,c,(f.data(a,c,b,!0)||0)+1,!0))},_unmark:function(a,c,d){a!==!0&&(d=c,c=a,a=!1);if(c){d=d||"fx";var e=d+"mark",g=a?0:(f.data(c,e,b,!0)||1)-1;g?f.data(c,e,g,!0):(f.removeData(c,e,!0),m(c,d,"mark"))}},queue:function(a,c,d){if(a){c=(c||"fx")+"queue";var e=f.data(a,c,b,!0);d&&(!e||f.isArray(d)?e=f.data(a,c,f.makeArray(d),!0):e.push(d));return e||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e;d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),d.call(a,function(){f.dequeue(a,b)})),c.length||(f.removeData(a,b+"queue",!0),m(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){f.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f._Deferred(),!0))h++,l.done(m);m();return d.promise()}});var n=/[\n\t\r]/g,o=/\s+/,p=/\r/g,q=/^(?:button|input)$/i,r=/^(?:button|input|object|select|textarea)$/i,s=/^a(?:rea)?$/i,t=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,u=/\:|^on/,v,w;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(o);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(o);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(n," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(o);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(n," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h<i;h++){var j=e[h];if(j.selected&&(f.support.optDisabled?!j.disabled:j.getAttribute("disabled")===null)&&(!j.parentNode.disabled||!f.nodeName(j.parentNode,"optgroup"))){b=f(j).val();if(g)return b;d.push(b)}}if(g&&!d.length&&e.length)return f(e[c]).val();return d},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))f.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=f.event.special[h]||{};for(j=e||0;j<p.length;j++){q=p[j];if(d.guid===q.guid){if(l||n.test(q.namespace))e==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(e!=null)break}}if(p.length===0||e!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&f.removeEvent(a,h,s.handle),g=null,delete t[h]}if(f.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,f.isEmptyObject(s)&&f.removeData(a,b,!0)}}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){var h=c.type||c,i=[],j;h.indexOf("!")>=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.
+shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h<i;h++){var j=d[h];if(e||c.namespace_re.test(j.namespace)){c.handler=j.handler,c.data=j.data,c.handleObj=j;var k=j.handler.apply(this,g);k!==b&&(c.result=k,k===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[f.expando])return a;var d=a;a=f.Event(d);for(var e=this.props.length,g;e;)g=this.props[--e],a[g]=d[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=a.target.ownerDocument||c,i=h.documentElement,j=h.body;a.pageX=a.clientX+(i&&i.scrollLeft||j&&j.scrollLeft||0)-(i&&i.clientLeft||j&&j.clientLeft||0),a.pageY=a.clientY+(i&&i.scrollTop||j&&j.scrollTop||0)-(i&&i.clientTop||j&&j.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:f.proxy,special:{ready:{setup:f.bindReady,teardown:f.noop},live:{add:function(a){f.event.add(this,N(a.origType,a.selector),f.extend({},a,{handler:M,guid:a.handler.guid}))},remove:function(a){f.event.remove(this,N(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!this.preventDefault)return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?E:D):this.type=a,b&&f.extend(this,b),this.timeStamp=f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=E;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=E;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=E,this.stopPropagation()},isDefaultPrevented:D,isPropagationStopped:D,isImmediatePropagationStopped:D};var F=function(a){var b=a.relatedTarget,c=!1,d=a.type;a.type=a.data,b!==this&&(b&&(c=f.contains(this,b)),c||(f.event.handle.apply(this,arguments),a.type=d))},G=function(a){a.type=a.data,f.event.handle.apply(this,arguments)};f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={setup:function(c){f.event.add(this,b,c&&c.selector?G:F,a)},teardown:function(a){f.event.remove(this,b,a&&a.selector?G:F)}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(a,b){if(!f.nodeName(this,"form"))f.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&f(b).closest("form").length&&K("submit",this,arguments)}),f.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&f(b).closest("form").length&&a.keyCode===13&&K("submit",this,arguments)});else return!1},teardown:function(a){f.event.remove(this,".specialSubmit")}});if(!f.support.changeBubbles){var H,I=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i<j;i++)f.event.add(this[i],a,g,d);return this}}),f.fn.extend({unbind:function(a,b){if(typeof a=="object"&&!a.preventDefault)for(var c in a)this.unbind(c,a[c]);else for(var d=0,e=this.length;d<e;d++)f.event.remove(this[d],a,b);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f.data(this,"lastToggle"+a.guid)||0)%d;f.data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var L={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};f.each(["live","die"],function(a,c){f.fn[c]=function(a,d,e,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:f(this.context);if(typeof a=="object"&&!a.preventDefault){for(var o in a)n[c](o,d,a[o],m);return this}if(c==="die"&&!a&&g&&g.charAt(0)==="."){n.unbind(g);return this}if(d===!1||f.isFunction(d))e=d||D,d=b;a=(a||"").split(" ");while((h=a[i++])!=null){j=x.exec(h),k="",j&&(k=j[0],h=h.replace(x,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,L[h]?(a.push(L[h]+k),h=h+k):h=(L[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)f.event.add(n[p],"live."+N(h,m),{data:d,selector:m,handler:e,origType:h,origHandler:e,preType:l});else n.unbind("live."+N(h,m),e)}return this}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(!f)g=o=!0;else if(f===!0)continue}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("parentNode",b,f,a,e,c)},"~":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("previousSibling",b,f,a,e,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c<f;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){if(a===b){g=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};f.find=k,f.expr=k.selectors,f.expr[":"]=f.expr.filters,f.unique=k.uniqueSort,f.text=k.getText,f.isXMLDoc=k.isXML,f.contains=k.contains}();var O=/Until$/,P=/^(?:parents|prevUntil|prevAll)/,Q=/,/,R=/^.[^:#\[\.,]*$/,S=Array.prototype.slice,T=f.expr.match.POS,U={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(W(this,a,!1),"not",a)},filter:function(a){return this.pushStack(W(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d<e;d++)i=a[d],j[i]||(j[i]=T.test(i)?f(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(l?l.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/<tbody/i,ba=/<|&#?\w+;/,bb=/<(?:script|object|embed|option|style)/i,bc=/checked\s*(?:[^=]|=\s*.checked.)/i,bd=/\/(java|ecma)script/i,be=/^\s*<!(?:\[CDATA\[|\-\-)/,bf={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bc.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bg(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bm)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i;b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof a[0]=="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!bb.test(a[0])&&(f.support.checkClone||!bc.test(a[0]))&&(g=!0,h=f.fragments[a[0]],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[a[0]]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j
+)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1></$2>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bl(k[i]);else bl(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||bd.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.expando,g=f.event.special,h=f.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&f.noData[j.nodeName.toLowerCase()])continue;c=j[f.expando];if(c){b=d[c]&&d[c][e];if(b&&b.events){for(var k in b.events)g[k]?f.event.remove(j,k):f.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[f.expando]:j.removeAttribute&&j.removeAttribute(f.expando),delete d[c]}}}});var bn=/alpha\([^)]*\)/i,bo=/opacity=([^)]*)/,bp=/([A-Z]|^ms)/g,bq=/^-?\d+(?:px)?$/i,br=/^-?\d/,bs=/^[+\-]=/,bt=/[^+\-\.\de]+/g,bu={position:"absolute",visibility:"hidden",display:"block"},bv=["Left","Right"],bw=["Top","Bottom"],bx,by,bz;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bx(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d;if(h==="number"&&isNaN(d)||d==null)return;h==="string"&&bs.test(d)&&(d=+d.replace(bt,"")+parseFloat(f.css(a,c)),h="number"),h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bx)return bx(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bA(a,b,d);f.swap(a,bu,function(){e=bA(a,b,d)});return e}},set:function(a,b){if(!bq.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cs(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cr("hide",3),a,b,c);for(var d=0,e=this.length;d<e;d++)if(this[d].style){var g=f.css(this[d],"display");g!=="none"&&!f._data(this[d],"olddisplay")&&f._data(this[d],"olddisplay",g)}for(d=0;d<e;d++)this[d].style&&(this[d].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cr("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return this[e.queue===!1?"each":"queue"](function(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(f.support.inlineBlockNeedsLayout?(j=cs(this.nodeName),j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)):this.style.display="inline-block"))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)k=new f.fx(this,b,i),h=a[i],cj.test(h)?k[h==="toggle"?d?"show":"hide":h]():(l=ck.exec(h),m=k.cur(),l?(n=parseFloat(l[2]),o=l[3]||(f.cssNumber[i]?"":"px"),o!=="px"&&(f.style(this,i,(n||1)+o),m=(n||1)/k.cur()*m,f.style(this,i,m+o)),l[1]&&(n=(l[1]==="-="?-1:1)*n+m),k.custom(m,n,o)):k.custom(m,h,""));return!0})},stop:function(a,b){a&&this.queue([]),this.each(function(){var a=f.timers,c=a.length;b||f._unmark(!0,this);while(c--)a[c].elem===this&&(b&&a[c](!0),a.splice(c,1))}),b||this.dequeue();return this}}),f.each({slideDown:cr("show",1),slideUp:cr("hide",1),slideToggle:cr("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default,d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue!==!1?f.dequeue(this):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function h(a){return d.step(a)}var d=this,e=f.fx,g;this.startTime=cn||cp(),this.start=a,this.end=b,this.unit=c||this.unit||(f.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,h.elem=this.elem,h()&&f.timers.push(h)&&!cl&&(co?(cl=!0,g=function(){cl&&(co(g),e.tick())},co(g)):cl=setInterval(e.tick,e.interval))},show:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=cn||cp(),c=!0,d=this.elem,e=this.options,g,h;if(a||b>=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b<a.length;++b)a[b]()||a.splice(b--,1);a.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cl),cl=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var ct=/^t(?:able|d|h)$/i,cu=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cv(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);f.offset.initialize();var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.offset.doesNotAddBorder&&(!f.offset.doesAddBorderForTableAndCells||!ct.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={initialize:function(){var a=c.body,b=c.createElement("div"),d,e,g,h,i=parseFloat(f.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/directmapping-webapp/src/main/resources/scripts/jquery.watermark.js	Tue Aug 30 01:05:16 2011 -0400
@@ -0,0 +1,563 @@
+/*	
+	Watermark plugin for jQuery
+	Version: 3.1.3
+	http://jquery-watermark.googlecode.com/
+
+	Copyright (c) 2009-2011 Todd Northrop
+	http://www.speednet.biz/
+	
+	March 22, 2011
+
+	Requires:  jQuery 1.2.3+
+	
+	Dual licensed under the MIT or GPL Version 2 licenses.
+	See mit-license.txt and gpl2-license.txt in the project root for details.
+------------------------------------------------------*/
+
+(function ($, window, undefined) {
+
+var
+	// String constants for data names
+	dataFlag = "watermark",
+	dataClass = "watermarkClass",
+	dataFocus = "watermarkFocus",
+	dataFormSubmit = "watermarkSubmit",
+	dataMaxLen = "watermarkMaxLength",
+	dataPassword = "watermarkPassword",
+	dataText = "watermarkText",
+	
+	// Copy of native jQuery regex use to strip return characters from element value
+	rreturn = /\r/g,
+
+	// Includes only elements with watermark defined
+	selWatermarkDefined = "input:data(" + dataFlag + "),textarea:data(" + dataFlag + ")",
+
+	// Includes only elements capable of having watermark
+	selWatermarkAble = "input:text,input:password,input[type=search],input:not([type]),textarea",
+	
+	// triggerFns:
+	// Array of function names to look for in the global namespace.
+	// Any such functions found will be hijacked to trigger a call to
+	// hideAll() any time they are called.  The default value is the
+	// ASP.NET function that validates the controls on the page
+	// prior to a postback.
+	// 
+	// Am I missing other important trigger function(s) to look for?
+	// Please leave me feedback:
+	// http://code.google.com/p/jquery-watermark/issues/list
+	triggerFns = [
+		"Page_ClientValidate"
+	],
+	
+	// Holds a value of true if a watermark was displayed since the last
+	// hideAll() was executed. Avoids repeatedly calling hideAll().
+	pageDirty = false,
+	
+	// Detects if the browser can handle native placeholders
+	hasNativePlaceholder = ("placeholder" in document.createElement("input"));
+
+// Best practice: this plugin adds only one method to the jQuery object.
+// Also ensures that the watermark code is only added once.
+$.watermark = $.watermark || {
+
+	// Current version number of the plugin
+	version: "3.1.3",
+		
+	runOnce: true,
+	
+	// Default options used when watermarks are instantiated.
+	// Can be changed to affect the default behavior for all
+	// new or updated watermarks.
+	options: {
+		
+		// Default class name for all watermarks
+		className: "watermark",
+		
+		// If true, plugin will detect and use native browser support for
+		// watermarks, if available. (e.g., WebKit's placeholder attribute.)
+		useNative: true,
+		
+		// If true, all watermarks will be hidden during the window's
+		// beforeunload event. This is done mainly because WebKit
+		// browsers remember the watermark text during navigation
+		// and try to restore the watermark text after the user clicks
+		// the Back button. We can avoid this by hiding the text before
+		// the browser has a chance to save it. The regular unload event
+		// was tried, but it seems the browser saves the text before
+		// that event kicks off, because it didn't work.
+		hideBeforeUnload: true
+	},
+	
+	// Hide one or more watermarks by specifying any selector type
+	// i.e., DOM element, string selector, jQuery matched set, etc.
+	hide: function (selector) {
+		$(selector).filter(selWatermarkDefined).each(
+			function () {
+				$.watermark._hide($(this));
+			}
+		);
+	},
+	
+	// Internal use only.
+	_hide: function ($input, focus) {
+		var elem = $input[0],
+			inputVal = (elem.value || "").replace(rreturn, ""),
+			inputWm = $input.data(dataText) || "",
+			maxLen = $input.data(dataMaxLen) || 0,
+			className = $input.data(dataClass);
+	
+		if ((inputWm.length) && (inputVal == inputWm)) {
+			elem.value = "";
+			
+			// Password type?
+			if ($input.data(dataPassword)) {
+				
+				if (($input.attr("type") || "") === "text") {
+					var $pwd = $input.data(dataPassword) || [], 
+						$wrap = $input.parent() || [];
+						
+					if (($pwd.length) && ($wrap.length)) {
+						$wrap[0].removeChild($input[0]); // Can't use jQuery methods, because they destroy data
+						$wrap[0].appendChild($pwd[0]);
+						$input = $pwd;
+					}
+				}
+			}
+			
+			if (maxLen) {
+				$input.attr("maxLength", maxLen);
+				$input.removeData(dataMaxLen);
+			}
+		
+			if (focus) {
+				$input.attr("autocomplete", "off");  // Avoid NS_ERROR_XPC_JS_THREW_STRING error in Firefox
+				
+				window.setTimeout(
+					function () {
+						$input.select();  // Fix missing cursor in IE
+					}
+				, 1);
+			}
+		}
+		
+		className && $input.removeClass(className);
+	},
+	
+	// Display one or more watermarks by specifying any selector type
+	// i.e., DOM element, string selector, jQuery matched set, etc.
+	// If conditions are not right for displaying a watermark, ensures that watermark is not shown.
+	show: function (selector) {
+		$(selector).filter(selWatermarkDefined).each(
+			function () {
+				$.watermark._show($(this));
+			}
+		);
+	},
+	
+	// Internal use only.
+	_show: function ($input) {
+		var elem = $input[0],
+			val = (elem.value || "").replace(rreturn, ""),
+			text = $input.data(dataText) || "",
+			type = $input.attr("type") || "",
+			className = $input.data(dataClass);
+
+		if (((val.length == 0) || (val == text)) && (!$input.data(dataFocus))) {
+			pageDirty = true;
+		
+			// Password type?
+			if ($input.data(dataPassword)) {
+				
+				if (type === "password") {
+					var $pwd = $input.data(dataPassword) || [],
+						$wrap = $input.parent() || [];
+						
+					if (($pwd.length) && ($wrap.length)) {
+						$wrap[0].removeChild($input[0]); // Can't use jQuery methods, because they destroy data
+						$wrap[0].appendChild($pwd[0]);
+						$input = $pwd;
+						$input.attr("maxLength", text.length);
+						elem = $input[0];
+					}
+				}
+			}
+		
+			// Ensure maxLength big enough to hold watermark (input of type="text" or type="search" only)
+			if ((type === "text") || (type === "search")) {
+				var maxLen = $input.attr("maxLength") || 0;
+				
+				if ((maxLen > 0) && (text.length > maxLen)) {
+					$input.data(dataMaxLen, maxLen);
+					$input.attr("maxLength", text.length);
+				}
+			}
+            
+			className && $input.addClass(className);
+			elem.value = text;
+		}
+		else {
+			$.watermark._hide($input);
+		}
+	},
+	
+	// Hides all watermarks on the current page.
+	hideAll: function () {
+		if (pageDirty) {
+			$.watermark.hide(selWatermarkAble);
+			pageDirty = false;
+		}
+	},
+	
+	// Displays all watermarks on the current page.
+	showAll: function () {
+		$.watermark.show(selWatermarkAble);
+	}
+};
+
+$.fn.watermark = $.fn.watermark || function (text, options) {
+	///	<summary>
+	///		Set watermark text and class name on all input elements of type="text/password/search" and
+	/// 	textareas within the matched set. If className is not specified in options, the default is
+	/// 	"watermark". Within the matched set, only input elements with type="text/password/search"
+	/// 	and textareas are affected; all other elements are ignored.
+	///	</summary>
+	///	<returns type="jQuery">
+	///		Returns the original jQuery matched set (not just the input and texarea elements).
+	/// </returns>
+	///	<param name="text" type="String">
+	///		Text to display as a watermark when the input or textarea element has an empty value and does not
+	/// 	have focus. The first time watermark() is called on an element, if this argument is empty (or not
+	/// 	a String type), then the watermark will have the net effect of only changing the class name when
+	/// 	the input or textarea element's value is empty and it does not have focus.
+	///	</param>
+	///	<param name="options" type="Object" optional="true">
+	///		Provides the ability to override the default watermark options ($.watermark.options). For backward
+	/// 	compatibility, if a string value is supplied, it is used as the class name that overrides the class
+	/// 	name in $.watermark.options.className. Properties include:
+	/// 		className: When the watermark is visible, the element will be styled using this class name.
+	/// 		useNative (Boolean or Function): Specifies if native browser support for watermarks will supersede
+	/// 			plugin functionality. If useNative is a function, the return value from the function will
+	/// 			determine if native support is used. The function is passed one argument -- a jQuery object
+	/// 			containing the element being tested as the only element in its matched set -- and the DOM
+	/// 			element being tested is the object on which the function is invoked (the value of "this").
+	///	</param>
+	/// <remarks>
+	///		The effect of changing the text and class name on an input element is called a watermark because
+	///		typically light gray text is used to provide a hint as to what type of input is required. However,
+	///		the appearance of the watermark can be something completely different: simply change the CSS style
+	///		pertaining to the supplied class name.
+	///		
+	///		The first time watermark() is called on an element, the watermark text and class name are initialized,
+	///		and the focus and blur events are hooked in order to control the display of the watermark.  Also, as
+	/// 	of version 3.0, drag and drop events are hooked to guard against dropped text being appended to the
+	/// 	watermark.  If native watermark support is provided by the browser, it is detected and used, unless
+	/// 	the useNative option is set to false.
+	///		
+	///		Subsequently, watermark() can be called again on an element in order to change the watermark text
+	///		and/or class name, and it can also be called without any arguments in order to refresh the display.
+	///		
+	///		For example, after changing the value of the input or textarea element programmatically, watermark()
+	/// 	should be called without any arguments to refresh the display, because the change event is only
+	/// 	triggered by user actions, not by programmatic changes to an input or textarea element's value.
+	/// 	
+	/// 	The one exception to programmatic updates is for password input elements:  you are strongly cautioned
+	/// 	against changing the value of a password input element programmatically (after the page loads).
+	/// 	The reason is that some fairly hairy code is required behind the scenes to make the watermarks bypass
+	/// 	IE security and switch back and forth between clear text (for watermarks) and obscured text (for
+	/// 	passwords).  It is *possible* to make programmatic changes, but it must be done in a certain way, and
+	/// 	overall it is not recommended.
+	/// </remarks>
+	
+	if (!this.length) {
+		return this;
+	}
+	
+	var hasClass = false,
+		hasText = (typeof(text) === "string");
+	
+	if (hasText) {
+		text = text.replace(rreturn, "");
+	}
+	
+	if (typeof(options) === "object") {
+		hasClass = (typeof(options.className) === "string");
+		options = $.extend({}, $.watermark.options, options);
+	}
+	else if (typeof(options) === "string") {
+		hasClass = true;
+		options = $.extend({}, $.watermark.options, {className: options});
+	}
+	else {
+		options = $.watermark.options;
+	}
+	
+	if (typeof(options.useNative) !== "function") {
+		options.useNative = options.useNative? function () { return true; } : function () { return false; };
+	}
+	
+	return this.each(
+		function () {
+			var $input = $(this);
+			
+			if (!$input.is(selWatermarkAble)) {
+				return;
+			}
+			
+			// Watermark already initialized?
+			if ($input.data(dataFlag)) {
+			
+				// If re-defining text or class, first remove existing watermark, then make changes
+				if (hasText || hasClass) {
+					$.watermark._hide($input);
+			
+					if (hasText) {
+						$input.data(dataText, text);
+					}
+					
+					if (hasClass) {
+						$input.data(dataClass, options.className);
+					}
+				}
+			}
+			else {
+			
+				// Detect and use native browser support, if enabled in options
+				if (
+					(hasNativePlaceholder)
+					&& (options.useNative.call(this, $input))
+					&& (($input.attr("tagName") || "") !== "TEXTAREA")
+				) {
+					// className is not set because current placeholder standard doesn't
+					// have a separate class name property for placeholders (watermarks).
+					if (hasText) {
+						$input.attr("placeholder", text);
+					}
+					
+					// Only set data flag for non-native watermarks
+					// [purposely commented-out] -> $input.data(dataFlag, 1);
+					return;
+				}
+				
+				$input.data(dataText, hasText? text : "");
+				$input.data(dataClass, options.className);
+				$input.data(dataFlag, 1); // Flag indicates watermark was initialized
+				
+				// Special processing for password type
+				if (($input.attr("type") || "") === "password") {
+					var $wrap = $input.wrap("<span>").parent(),
+						$wm = $($wrap.html().replace(/type=["']?password["']?/i, 'type="text"'));
+					
+					$wm.data(dataText, $input.data(dataText));
+					$wm.data(dataClass, $input.data(dataClass));
+					$wm.data(dataFlag, 1);
+					$wm.attr("maxLength", text.length);
+					
+					$wm.focus(
+						function () {
+							$.watermark._hide($wm, true);
+						}
+					).bind("dragenter",
+						function () {
+							$.watermark._hide($wm);
+						}
+					).bind("dragend",
+						function () {
+							window.setTimeout(function () { $wm.blur(); }, 1);
+						}
+					);
+					$input.blur(
+						function () {
+							$.watermark._show($input);
+						}
+					).bind("dragleave",
+						function () {
+							$.watermark._show($input);
+						}
+					);
+					
+					$wm.data(dataPassword, $input);
+					$input.data(dataPassword, $wm);
+				}
+				else {
+					
+					$input.focus(
+						function () {
+							$input.data(dataFocus, 1);
+							$.watermark._hide($input, true);
+						}
+					).blur(
+						function () {
+							$input.data(dataFocus, 0);
+							$.watermark._show($input);
+						}
+					).bind("dragenter",
+						function () {
+							$.watermark._hide($input);
+						}
+					).bind("dragleave",
+						function () {
+							$.watermark._show($input);
+						}
+					).bind("dragend",
+						function () {
+							window.setTimeout(function () { $.watermark._show($input); }, 1);
+						}
+					).bind("drop",
+						// Firefox makes this lovely function necessary because the dropped text
+						// is merged with the watermark before the drop event is called.
+						function (evt) {
+							var elem = $input[0],
+								dropText = evt.originalEvent.dataTransfer.getData("Text");
+							
+							if ((elem.value || "").replace(rreturn, "").replace(dropText, "") === $input.data(dataText)) {
+								elem.value = dropText;
+							}
+							
+							$input.focus();
+						}
+					);
+				}
+				
+				// In order to reliably clear all watermarks before form submission,
+				// we need to replace the form's submit function with our own
+				// function.  Otherwise watermarks won't be cleared when the form
+				// is submitted programmatically.
+				if (this.form) {
+					var form = this.form,
+						$form = $(form);
+					
+					if (!$form.data(dataFormSubmit)) {
+						$form.submit($.watermark.hideAll);
+						
+						// form.submit exists for all browsers except Google Chrome
+						// (see "else" below for explanation)
+						if (form.submit) {
+							$form.data(dataFormSubmit, form.submit);
+							
+							form.submit = (function (f, $f) {
+								return function () {
+									var nativeSubmit = $f.data(dataFormSubmit);
+									
+									$.watermark.hideAll();
+									
+									if (nativeSubmit.apply) {
+										nativeSubmit.apply(f, Array.prototype.slice.call(arguments));
+									}
+									else {
+										nativeSubmit();
+									}
+								};
+							})(form, $form);
+						}
+						else {
+							$form.data(dataFormSubmit, 1);
+							
+							// This strangeness is due to the fact that Google Chrome's
+							// form.submit function is not visible to JavaScript (identifies
+							// as "undefined").  I had to invent a solution here because hours
+							// of Googling (ironically) for an answer did not turn up anything
+							// useful.  Within my own form.submit function I delete the form's
+							// submit function, and then call the non-existent function --
+							// which, in the world of Google Chrome, still exists.
+							form.submit = (function (f) {
+								return function () {
+									$.watermark.hideAll();
+									delete f.submit;
+									f.submit();
+								};
+							})(form);
+						}
+					}
+				}
+			}
+			
+			$.watermark._show($input);
+		}
+	);
+};
+
+// The code included within the following if structure is guaranteed to only run once,
+// even if the watermark script file is included multiple times in the page.
+if ($.watermark.runOnce) {
+	$.watermark.runOnce = false;
+
+	$.extend($.expr[":"], {
+
+		// Extends jQuery with a custom selector - ":data(...)"
+		// :data(<name>)  Includes elements that have a specific name defined in the jQuery data
+		// collection. (Only the existence of the name is checked; the value is ignored.)
+		// A more sophisticated version of the :data() custom selector originally part of this plugin
+		// was removed for compatibility with jQuery UI. The original code can be found in the SVN
+		// source listing in the file, "jquery.data.js".
+		data: function( elem, i, match ) {
+			return !!$.data( elem, match[ 3 ] );
+		}
+	});
+
+	// Overloads the jQuery .val() function to return the underlying input value on
+	// watermarked input elements.  When .val() is being used to set values, this
+	// function ensures watermarks are properly set/removed after the values are set.
+	// Uses self-executing function to override the default jQuery function.
+	(function (valOld) {
+
+		$.fn.val = function () {
+			
+			// Best practice: return immediately if empty matched set
+			if ( !this.length ) {
+				return arguments.length? this : undefined;
+			}
+
+			// If no args, then we're getting the value of the first element;
+			// otherwise we're setting values for all elements in matched set
+			if ( !arguments.length ) {
+
+				// If element is watermarked, get the underlying value;
+				// otherwise use native jQuery .val()
+				if ( this.data(dataFlag) ) {
+					var v = (this[0].value || "").replace(rreturn, "");
+					return (v === (this.data(dataText) || ""))? "" : v;
+				}
+				else {
+					return valOld.apply( this, arguments );
+				}
+			}
+			else {
+				valOld.apply( this, arguments );
+				$.watermark.show(this);
+				return this;
+			}
+		};
+
+	})($.fn.val);
+	
+	// Hijack any functions found in the triggerFns list
+	if (triggerFns.length) {
+
+		// Wait until DOM is ready before searching
+		$(function () {
+			var i, name, fn;
+		
+			for (i=triggerFns.length-1; i>=0; i--) {
+				name = triggerFns[i];
+				fn = window[name];
+				
+				if (typeof(fn) === "function") {
+					window[name] = (function (origFn) {
+						return function () {
+							$.watermark.hideAll();
+							return origFn.apply(null, Array.prototype.slice.call(arguments));
+						};
+					})(fn);
+				}
+			}
+		});
+	}
+
+	$(window).bind("beforeunload", function () {
+		if ($.watermark.options.hideBeforeUnload) {
+			$.watermark.hideAll();
+		}
+	});
+}
+
+})(jQuery, window);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/directmapping-webapp/src/main/resources/scripts/typewatch.js	Tue Aug 30 01:05:16 2011 -0400
@@ -0,0 +1,90 @@
+/*
+ *	TypeWatch 3.0
+ *	
+ *	Original by Denny Ferrassoli
+ *	Refactored by Charles Christolini
+ *	Revised by Kai Schlamp
+ *
+ *	Examples/Docs: www.dennydotnet.com
+ *	
+ *  Copyright(c) 2007 Denny Ferrassoli - DennyDotNet.com
+ *  Copyright(c) 2008 Charles Christolini - BinaryPie.com
+ *  Copyright(c) 2010 Kai Schlamp - medihack.org
+ *  
+ *  Dual licensed under the MIT and GPL licenses:
+ *  http://www.opensource.org/licenses/mit-license.php
+ *  http://www.gnu.org/licenses/gpl.html
+*/
+
+(function(jQuery) {
+	jQuery.fn.typeWatch = function(o){
+		// Options
+		var options = jQuery.extend({
+			wait : 500,
+			callback : function() { },
+			highlight : true,
+			captureLength : 2
+		}, o);
+		
+		function checkElement(timer, override) {
+			var elTxt = jQuery(timer.el).val();
+		
+			if ((elTxt.length >= options.captureLength && elTxt.toUpperCase() != timer.text)
+			|| (override && elTxt.length >= options.captureLength)) {
+				timer.text = elTxt.toUpperCase();
+				timer.cb(elTxt);
+			}
+		}
+		
+		function watchElement(elem) {			
+			// Must be text or textarea
+			if (elem.type.toUpperCase() == "TEXT" || elem.nodeName.toUpperCase() == "TEXTAREA") {
+
+				// Allocate timer element
+				var timer = {
+					timer : null, 
+					text : jQuery(elem).val().toUpperCase(),
+					cb : options.callback, 
+					el : elem, 
+					wait : options.wait
+				};
+
+				// Set focus action (highlight)
+				if (options.highlight) {
+					jQuery(elem).focus(
+						function() {
+							this.select();
+						});
+				}
+
+				// Key watcher / clear and reset the timer
+				var startWatch = function(evt) {
+					var timerWait = timer.wait;
+					var overrideBool = false;
+
+                    // If enter is pressed then diretly execute the callback
+					if (evt.keyCode == 13 && this.type.toUpperCase() == "TEXT") {
+						timerWait = 1;
+						overrideBool = true;
+					}
+					
+					var timerCallbackFx = function()
+					{
+						checkElement(timer, overrideBool)
+					}
+					
+					// Clear timer					
+					clearTimeout(timer.timer);
+					timer.timer = setTimeout(timerCallbackFx, timerWait);									
+				};
+				
+				jQuery(elem).keyup(startWatch);
+			}
+		}
+		
+		// Watch Each Element
+		return this.each(function(index){
+			watchElement(this);
+		});
+	};
+})(jQuery);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/directmapping-webapp/src/main/resources/styles/jquery.autocomplete.css	Tue Aug 30 01:05:16 2011 -0400
@@ -0,0 +1,48 @@
+.ac_results {
+	padding: 0px;
+	border: 1px solid black;
+	background-color: white;
+	overflow: hidden;
+	z-index: 99999;
+}
+
+.ac_results ul {
+	width: 100%;
+	list-style-position: outside;
+	list-style: none;
+	padding: 0;
+	margin: 0;
+}
+
+.ac_results li {
+	margin: 0px;
+	padding: 2px 5px;
+	cursor: default;
+	display: block;
+	/* 
+	if width will be 100% horizontal scrollbar will apear 
+	when scroll mode will be used
+	*/
+	/*width: 100%;*/
+	font: menu;
+	font-size: 12px;
+	/* 
+	it is very important, if line-height not setted or setted 
+	in relative units scroll will be broken in firefox
+	*/
+	line-height: 16px;
+	overflow: hidden;
+}
+
+.ac_loading {
+	background: white url('indicator.gif') right center no-repeat;
+}
+
+.ac_odd {
+	background-color: #eee;
+}
+
+.ac_over {
+	background-color: #0A246A;
+	color: white;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/directmapping-webapp/src/main/resources/templates/index.ssp	Tue Aug 30 01:05:16 2011 -0400
@@ -0,0 +1,151 @@
+<%@ val ddlName: String %>
+<%@ val ddl: String %>
+<%@ val ddlMessage: String %>
+<%@ val constructName: String %>
+<%@ val construct: String %>
+<%@ val constructMessage: String %>
+<%@ val result: String %>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
+    <title>Direct Mapping Demo</title>
+    <script type="text/javascript" src="/scripts/jquery.js"></script>
+    <script type="text/javascript" src="/scripts/jquery.autocomplete.js"></script>
+    <link rel="stylesheet" href="/styles/jquery.autocomplete.css" type="text/css" />
+    <script type="text/javascript" src="/scripts/typewatch.js"></script>
+    <script type="text/javascript" src="/scripts/jquery.watermark.js"></script>
+    <style type="text/css" media="print, screen and (min-width: 481px)">
+    div.area {position:relative; min-width:600px; zoom:0}
+    textarea.query {display:block; width:60%; height:150px; min-height:150px; resize:vertical}
+    .interaction-area {position:absolute; top:0; right:0; width:39%; height:100%}
+    .query-box input[type=text] {width:100%; margin:0; padding:2px}
+    div.message {width:100%; position:absolute; top:1.6em; bottom:6px}
+    div.message textarea {width:100%; height:100%; resize:none; margin:0; padding:2px; color:black}
+    div.message textarea.error {color:red}
+    .error {color:red}
+    </style>
+
+<script type="text/javascript">
+// <![CDATA[
+jQuery(document).ready(function() {
+
+  var dmThenConstruct = function() {
+    var ddl = $("#ddl").val();
+    var construct = $("#construct").val();
+    jQuery.ajax({type: "POST",
+                 url: '/dm-then-construct',
+                 data: 'ddl='+ddl+'&construct='+construct,
+                 success: function(data) { jQuery("#result").removeClass("error"); jQuery("#result").val(data); },
+                 error: function(xhr) { jQuery("#result").addClass("error"); jQuery("#result").val(xhr.responseText); }
+                })
+  }
+
+  // jQuery("#ddl").watermark(jQuery("#ddl").val());
+
+  jQuery("#ddl-name").autocomplete("/ddls", {minChars:0,matchContains:true}).result(function(event, dt, ddlname) {
+    jQuery("#ddl-name").val(ddlname);
+    jQuery.ajax({url: '/ddl/'+ddlname,
+                 success: function(data) { jQuery("#ddl").val(data); jQuery("#ddl-message").val("DDL successfully loaded"); dmThenConstruct(); }
+                });
+  });
+
+  jQuery("#construct-name").autocomplete("/constructs", {minChars:0,matchContains:true}).result(function(event, dt, constructname) {
+    jQuery("#construct-name").val(constructname);
+    jQuery.ajax({url: '/construct/'+constructname,
+                 success: function(data) { jQuery("#construct").val(data); jQuery("#construct-message").val("CONSTRUCT successfully loaded"); dmThenConstruct(); }
+                });
+  });
+
+  jQuery("#ddl").typeWatch({
+    callback: function() {
+      jQuery.ajax({type: "POST",
+                   url: '/parse-ddl',
+                   data: 'ddl='+$('#ddl').val(),
+                   success: function(data) { jQuery("#ddl-message").removeClass("error"); jQuery("#ddl-message").val(data); dmThenConstruct(); },
+                   error: function(xhr) { jQuery("#ddl-message").addClass("error"); jQuery("#ddl-message").val(xhr.responseText); }
+                  })
+    },
+    wait: 1000,
+    highlight: false,
+    captureLength: 1
+  });
+
+  jQuery("#construct").typeWatch({
+    callback: function() {
+      jQuery.ajax({type: "POST",
+                   url: '/parse-construct',
+                   data: 'construct='+$('#construct').val(),
+                   success: function(data) { jQuery("#construct-message").removeClass("error"); jQuery("#construct-message").val(data); dmThenConstruct(); },
+                   error: function(xhr) { jQuery("#construct-message").addClass("error"); jQuery("#construct-message").val(xhr.responseText); }
+                  })
+    },
+    wait: 1000,
+    highlight: false,
+    captureLength: 1
+  });
+
+});;
+// ]]>
+</script>
+
+  </head>
+  <body>
+
+<div class="lift:DirectMappingDemo">
+    <h1>Direct Mapping Demo</h1>
+    <p>This webapp lets you play with the Direct Mapping: give it some
+    DDL/SQL, tweak the
+    resulting <a href="http://www.w3.org/2001/sw/rdb2rdf/directMapping/">Direct
+    Graph</a> using SPARQL and observe the result.</p>
+    <p>Please send bug reports to <a
+    href="mailto:public-rdb2rdf-comments@w3.org">public-rdb2rdf-comments@w3.org</a>.</p>
+    
+    <h2>DDL/SQL</h2>
+
+    <div class="area">
+      <textarea rows="15" cols="80" id="ddl" class="query">${ddl}</textarea>
+      <div class="interaction-area">
+        <div class="query-management">
+          <div class="query-box" >
+            <input type="text" value="${ddlName}" id="ddl-name" class="ac_input"/>
+          </div>
+          <div class="message">
+            <textarea id="ddl-message" rows="5" cols="40" disabled="disabled">${ddlMessage}</textarea>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <h2>SPARQL CONSTRUCTs</h2>
+
+    If empty or non-valid SPARQL CONSTRUCT, this will be ignored.
+
+    <div class="area">
+      <textarea rows="15" cols="80" id="construct" class="query">${construct}</textarea>
+      <div class="interaction-area">
+        <div class="query-management">
+          <div class="query-box" >
+            <input type="text" value="${constructName}" id="construct-name" class="ac_input"/>
+          </div>
+          <div class="message">
+            <textarea id="construct-message" rows="5" cols="40" disabled="disabled">${constructMessage}</textarea>
+          </div>
+        </div>
+      </div>
+    </div>
+    
+    <h2>Direct Mapping + SPARQL</h2>
+
+    <div class="area">
+      <textarea id="result" rows="15" cols="80" class="result">${result}</textarea>
+    </div>
+
+    <hr ></hr>
+    <address>
+      <a href="http://www.w3.org/People/Eric/">Eric Prud'hommeaux</a>, <a href="http://www.w3.org/People/Bertails/">Alexandre Bertails</a>, May 2011<br />
+      Contributors: <a href="mailto:bvillazon@fi.upm.es">Boris Villazon-Terrazas</a>, <a href="mailto:tgambet@w3.org">Thomas Gambet</a>
+    </address>
+</div>
+  </body>
+</html>
--- a/directmapping-webapp/src/main/resources/toserve/jquery.watermark.js	Mon Aug 29 21:19:50 2011 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,563 +0,0 @@
-/*	
-	Watermark plugin for jQuery
-	Version: 3.1.3
-	http://jquery-watermark.googlecode.com/
-
-	Copyright (c) 2009-2011 Todd Northrop
-	http://www.speednet.biz/
-	
-	March 22, 2011
-
-	Requires:  jQuery 1.2.3+
-	
-	Dual licensed under the MIT or GPL Version 2 licenses.
-	See mit-license.txt and gpl2-license.txt in the project root for details.
-------------------------------------------------------*/
-
-(function ($, window, undefined) {
-
-var
-	// String constants for data names
-	dataFlag = "watermark",
-	dataClass = "watermarkClass",
-	dataFocus = "watermarkFocus",
-	dataFormSubmit = "watermarkSubmit",
-	dataMaxLen = "watermarkMaxLength",
-	dataPassword = "watermarkPassword",
-	dataText = "watermarkText",
-	
-	// Copy of native jQuery regex use to strip return characters from element value
-	rreturn = /\r/g,
-
-	// Includes only elements with watermark defined
-	selWatermarkDefined = "input:data(" + dataFlag + "),textarea:data(" + dataFlag + ")",
-
-	// Includes only elements capable of having watermark
-	selWatermarkAble = "input:text,input:password,input[type=search],input:not([type]),textarea",
-	
-	// triggerFns:
-	// Array of function names to look for in the global namespace.
-	// Any such functions found will be hijacked to trigger a call to
-	// hideAll() any time they are called.  The default value is the
-	// ASP.NET function that validates the controls on the page
-	// prior to a postback.
-	// 
-	// Am I missing other important trigger function(s) to look for?
-	// Please leave me feedback:
-	// http://code.google.com/p/jquery-watermark/issues/list
-	triggerFns = [
-		"Page_ClientValidate"
-	],
-	
-	// Holds a value of true if a watermark was displayed since the last
-	// hideAll() was executed. Avoids repeatedly calling hideAll().
-	pageDirty = false,
-	
-	// Detects if the browser can handle native placeholders
-	hasNativePlaceholder = ("placeholder" in document.createElement("input"));
-
-// Best practice: this plugin adds only one method to the jQuery object.
-// Also ensures that the watermark code is only added once.
-$.watermark = $.watermark || {
-
-	// Current version number of the plugin
-	version: "3.1.3",
-		
-	runOnce: true,
-	
-	// Default options used when watermarks are instantiated.
-	// Can be changed to affect the default behavior for all
-	// new or updated watermarks.
-	options: {
-		
-		// Default class name for all watermarks
-		className: "watermark",
-		
-		// If true, plugin will detect and use native browser support for
-		// watermarks, if available. (e.g., WebKit's placeholder attribute.)
-		useNative: true,
-		
-		// If true, all watermarks will be hidden during the window's
-		// beforeunload event. This is done mainly because WebKit
-		// browsers remember the watermark text during navigation
-		// and try to restore the watermark text after the user clicks
-		// the Back button. We can avoid this by hiding the text before
-		// the browser has a chance to save it. The regular unload event
-		// was tried, but it seems the browser saves the text before
-		// that event kicks off, because it didn't work.
-		hideBeforeUnload: true
-	},
-	
-	// Hide one or more watermarks by specifying any selector type
-	// i.e., DOM element, string selector, jQuery matched set, etc.
-	hide: function (selector) {
-		$(selector).filter(selWatermarkDefined).each(
-			function () {
-				$.watermark._hide($(this));
-			}
-		);
-	},
-	
-	// Internal use only.
-	_hide: function ($input, focus) {
-		var elem = $input[0],
-			inputVal = (elem.value || "").replace(rreturn, ""),
-			inputWm = $input.data(dataText) || "",
-			maxLen = $input.data(dataMaxLen) || 0,
-			className = $input.data(dataClass);
-	
-		if ((inputWm.length) && (inputVal == inputWm)) {
-			elem.value = "";
-			
-			// Password type?
-			if ($input.data(dataPassword)) {
-				
-				if (($input.attr("type") || "") === "text") {
-					var $pwd = $input.data(dataPassword) || [], 
-						$wrap = $input.parent() || [];
-						
-					if (($pwd.length) && ($wrap.length)) {
-						$wrap[0].removeChild($input[0]); // Can't use jQuery methods, because they destroy data
-						$wrap[0].appendChild($pwd[0]);
-						$input = $pwd;
-					}
-				}
-			}
-			
-			if (maxLen) {
-				$input.attr("maxLength", maxLen);
-				$input.removeData(dataMaxLen);
-			}
-		
-			if (focus) {
-				$input.attr("autocomplete", "off");  // Avoid NS_ERROR_XPC_JS_THREW_STRING error in Firefox
-				
-				window.setTimeout(
-					function () {
-						$input.select();  // Fix missing cursor in IE
-					}
-				, 1);
-			}
-		}
-		
-		className && $input.removeClass(className);
-	},
-	
-	// Display one or more watermarks by specifying any selector type
-	// i.e., DOM element, string selector, jQuery matched set, etc.
-	// If conditions are not right for displaying a watermark, ensures that watermark is not shown.
-	show: function (selector) {
-		$(selector).filter(selWatermarkDefined).each(
-			function () {
-				$.watermark._show($(this));
-			}
-		);
-	},
-	
-	// Internal use only.
-	_show: function ($input) {
-		var elem = $input[0],
-			val = (elem.value || "").replace(rreturn, ""),
-			text = $input.data(dataText) || "",
-			type = $input.attr("type") || "",
-			className = $input.data(dataClass);
-
-		if (((val.length == 0) || (val == text)) && (!$input.data(dataFocus))) {
-			pageDirty = true;
-		
-			// Password type?
-			if ($input.data(dataPassword)) {
-				
-				if (type === "password") {
-					var $pwd = $input.data(dataPassword) || [],
-						$wrap = $input.parent() || [];
-						
-					if (($pwd.length) && ($wrap.length)) {
-						$wrap[0].removeChild($input[0]); // Can't use jQuery methods, because they destroy data
-						$wrap[0].appendChild($pwd[0]);
-						$input = $pwd;
-						$input.attr("maxLength", text.length);
-						elem = $input[0];
-					}
-				}
-			}
-		
-			// Ensure maxLength big enough to hold watermark (input of type="text" or type="search" only)
-			if ((type === "text") || (type === "search")) {
-				var maxLen = $input.attr("maxLength") || 0;
-				
-				if ((maxLen > 0) && (text.length > maxLen)) {
-					$input.data(dataMaxLen, maxLen);
-					$input.attr("maxLength", text.length);
-				}
-			}
-            
-			className && $input.addClass(className);
-			elem.value = text;
-		}
-		else {
-			$.watermark._hide($input);
-		}
-	},
-	
-	// Hides all watermarks on the current page.
-	hideAll: function () {
-		if (pageDirty) {
-			$.watermark.hide(selWatermarkAble);
-			pageDirty = false;
-		}
-	},
-	
-	// Displays all watermarks on the current page.
-	showAll: function () {
-		$.watermark.show(selWatermarkAble);
-	}
-};
-
-$.fn.watermark = $.fn.watermark || function (text, options) {
-	///	<summary>
-	///		Set watermark text and class name on all input elements of type="text/password/search" and
-	/// 	textareas within the matched set. If className is not specified in options, the default is
-	/// 	"watermark". Within the matched set, only input elements with type="text/password/search"
-	/// 	and textareas are affected; all other elements are ignored.
-	///	</summary>
-	///	<returns type="jQuery">
-	///		Returns the original jQuery matched set (not just the input and texarea elements).
-	/// </returns>
-	///	<param name="text" type="String">
-	///		Text to display as a watermark when the input or textarea element has an empty value and does not
-	/// 	have focus. The first time watermark() is called on an element, if this argument is empty (or not
-	/// 	a String type), then the watermark will have the net effect of only changing the class name when
-	/// 	the input or textarea element's value is empty and it does not have focus.
-	///	</param>
-	///	<param name="options" type="Object" optional="true">
-	///		Provides the ability to override the default watermark options ($.watermark.options). For backward
-	/// 	compatibility, if a string value is supplied, it is used as the class name that overrides the class
-	/// 	name in $.watermark.options.className. Properties include:
-	/// 		className: When the watermark is visible, the element will be styled using this class name.
-	/// 		useNative (Boolean or Function): Specifies if native browser support for watermarks will supersede
-	/// 			plugin functionality. If useNative is a function, the return value from the function will
-	/// 			determine if native support is used. The function is passed one argument -- a jQuery object
-	/// 			containing the element being tested as the only element in its matched set -- and the DOM
-	/// 			element being tested is the object on which the function is invoked (the value of "this").
-	///	</param>
-	/// <remarks>
-	///		The effect of changing the text and class name on an input element is called a watermark because
-	///		typically light gray text is used to provide a hint as to what type of input is required. However,
-	///		the appearance of the watermark can be something completely different: simply change the CSS style
-	///		pertaining to the supplied class name.
-	///		
-	///		The first time watermark() is called on an element, the watermark text and class name are initialized,
-	///		and the focus and blur events are hooked in order to control the display of the watermark.  Also, as
-	/// 	of version 3.0, drag and drop events are hooked to guard against dropped text being appended to the
-	/// 	watermark.  If native watermark support is provided by the browser, it is detected and used, unless
-	/// 	the useNative option is set to false.
-	///		
-	///		Subsequently, watermark() can be called again on an element in order to change the watermark text
-	///		and/or class name, and it can also be called without any arguments in order to refresh the display.
-	///		
-	///		For example, after changing the value of the input or textarea element programmatically, watermark()
-	/// 	should be called without any arguments to refresh the display, because the change event is only
-	/// 	triggered by user actions, not by programmatic changes to an input or textarea element's value.
-	/// 	
-	/// 	The one exception to programmatic updates is for password input elements:  you are strongly cautioned
-	/// 	against changing the value of a password input element programmatically (after the page loads).
-	/// 	The reason is that some fairly hairy code is required behind the scenes to make the watermarks bypass
-	/// 	IE security and switch back and forth between clear text (for watermarks) and obscured text (for
-	/// 	passwords).  It is *possible* to make programmatic changes, but it must be done in a certain way, and
-	/// 	overall it is not recommended.
-	/// </remarks>
-	
-	if (!this.length) {
-		return this;
-	}
-	
-	var hasClass = false,
-		hasText = (typeof(text) === "string");
-	
-	if (hasText) {
-		text = text.replace(rreturn, "");
-	}
-	
-	if (typeof(options) === "object") {
-		hasClass = (typeof(options.className) === "string");
-		options = $.extend({}, $.watermark.options, options);
-	}
-	else if (typeof(options) === "string") {
-		hasClass = true;
-		options = $.extend({}, $.watermark.options, {className: options});
-	}
-	else {
-		options = $.watermark.options;
-	}
-	
-	if (typeof(options.useNative) !== "function") {
-		options.useNative = options.useNative? function () { return true; } : function () { return false; };
-	}
-	
-	return this.each(
-		function () {
-			var $input = $(this);
-			
-			if (!$input.is(selWatermarkAble)) {
-				return;
-			}
-			
-			// Watermark already initialized?
-			if ($input.data(dataFlag)) {
-			
-				// If re-defining text or class, first remove existing watermark, then make changes
-				if (hasText || hasClass) {
-					$.watermark._hide($input);
-			
-					if (hasText) {
-						$input.data(dataText, text);
-					}
-					
-					if (hasClass) {
-						$input.data(dataClass, options.className);
-					}
-				}
-			}
-			else {
-			
-				// Detect and use native browser support, if enabled in options
-				if (
-					(hasNativePlaceholder)
-					&& (options.useNative.call(this, $input))
-					&& (($input.attr("tagName") || "") !== "TEXTAREA")
-				) {
-					// className is not set because current placeholder standard doesn't
-					// have a separate class name property for placeholders (watermarks).
-					if (hasText) {
-						$input.attr("placeholder", text);
-					}
-					
-					// Only set data flag for non-native watermarks
-					// [purposely commented-out] -> $input.data(dataFlag, 1);
-					return;
-				}
-				
-				$input.data(dataText, hasText? text : "");
-				$input.data(dataClass, options.className);
-				$input.data(dataFlag, 1); // Flag indicates watermark was initialized
-				
-				// Special processing for password type
-				if (($input.attr("type") || "") === "password") {
-					var $wrap = $input.wrap("<span>").parent(),
-						$wm = $($wrap.html().replace(/type=["']?password["']?/i, 'type="text"'));
-					
-					$wm.data(dataText, $input.data(dataText));
-					$wm.data(dataClass, $input.data(dataClass));
-					$wm.data(dataFlag, 1);
-					$wm.attr("maxLength", text.length);
-					
-					$wm.focus(
-						function () {
-							$.watermark._hide($wm, true);
-						}
-					).bind("dragenter",
-						function () {
-							$.watermark._hide($wm);
-						}
-					).bind("dragend",
-						function () {
-							window.setTimeout(function () { $wm.blur(); }, 1);
-						}
-					);
-					$input.blur(
-						function () {
-							$.watermark._show($input);
-						}
-					).bind("dragleave",
-						function () {
-							$.watermark._show($input);
-						}
-					);
-					
-					$wm.data(dataPassword, $input);
-					$input.data(dataPassword, $wm);
-				}
-				else {
-					
-					$input.focus(
-						function () {
-							$input.data(dataFocus, 1);
-							$.watermark._hide($input, true);
-						}
-					).blur(
-						function () {
-							$input.data(dataFocus, 0);
-							$.watermark._show($input);
-						}
-					).bind("dragenter",
-						function () {
-							$.watermark._hide($input);
-						}
-					).bind("dragleave",
-						function () {
-							$.watermark._show($input);
-						}
-					).bind("dragend",
-						function () {
-							window.setTimeout(function () { $.watermark._show($input); }, 1);
-						}
-					).bind("drop",
-						// Firefox makes this lovely function necessary because the dropped text
-						// is merged with the watermark before the drop event is called.
-						function (evt) {
-							var elem = $input[0],
-								dropText = evt.originalEvent.dataTransfer.getData("Text");
-							
-							if ((elem.value || "").replace(rreturn, "").replace(dropText, "") === $input.data(dataText)) {
-								elem.value = dropText;
-							}
-							
-							$input.focus();
-						}
-					);
-				}
-				
-				// In order to reliably clear all watermarks before form submission,
-				// we need to replace the form's submit function with our own
-				// function.  Otherwise watermarks won't be cleared when the form
-				// is submitted programmatically.
-				if (this.form) {
-					var form = this.form,
-						$form = $(form);
-					
-					if (!$form.data(dataFormSubmit)) {
-						$form.submit($.watermark.hideAll);
-						
-						// form.submit exists for all browsers except Google Chrome
-						// (see "else" below for explanation)
-						if (form.submit) {
-							$form.data(dataFormSubmit, form.submit);
-							
-							form.submit = (function (f, $f) {
-								return function () {
-									var nativeSubmit = $f.data(dataFormSubmit);
-									
-									$.watermark.hideAll();
-									
-									if (nativeSubmit.apply) {
-										nativeSubmit.apply(f, Array.prototype.slice.call(arguments));
-									}
-									else {
-										nativeSubmit();
-									}
-								};
-							})(form, $form);
-						}
-						else {
-							$form.data(dataFormSubmit, 1);
-							
-							// This strangeness is due to the fact that Google Chrome's
-							// form.submit function is not visible to JavaScript (identifies
-							// as "undefined").  I had to invent a solution here because hours
-							// of Googling (ironically) for an answer did not turn up anything
-							// useful.  Within my own form.submit function I delete the form's
-							// submit function, and then call the non-existent function --
-							// which, in the world of Google Chrome, still exists.
-							form.submit = (function (f) {
-								return function () {
-									$.watermark.hideAll();
-									delete f.submit;
-									f.submit();
-								};
-							})(form);
-						}
-					}
-				}
-			}
-			
-			$.watermark._show($input);
-		}
-	);
-};
-
-// The code included within the following if structure is guaranteed to only run once,
-// even if the watermark script file is included multiple times in the page.
-if ($.watermark.runOnce) {
-	$.watermark.runOnce = false;
-
-	$.extend($.expr[":"], {
-
-		// Extends jQuery with a custom selector - ":data(...)"
-		// :data(<name>)  Includes elements that have a specific name defined in the jQuery data
-		// collection. (Only the existence of the name is checked; the value is ignored.)
-		// A more sophisticated version of the :data() custom selector originally part of this plugin
-		// was removed for compatibility with jQuery UI. The original code can be found in the SVN
-		// source listing in the file, "jquery.data.js".
-		data: function( elem, i, match ) {
-			return !!$.data( elem, match[ 3 ] );
-		}
-	});
-
-	// Overloads the jQuery .val() function to return the underlying input value on
-	// watermarked input elements.  When .val() is being used to set values, this
-	// function ensures watermarks are properly set/removed after the values are set.
-	// Uses self-executing function to override the default jQuery function.
-	(function (valOld) {
-
-		$.fn.val = function () {
-			
-			// Best practice: return immediately if empty matched set
-			if ( !this.length ) {
-				return arguments.length? this : undefined;
-			}
-
-			// If no args, then we're getting the value of the first element;
-			// otherwise we're setting values for all elements in matched set
-			if ( !arguments.length ) {
-
-				// If element is watermarked, get the underlying value;
-				// otherwise use native jQuery .val()
-				if ( this.data(dataFlag) ) {
-					var v = (this[0].value || "").replace(rreturn, "");
-					return (v === (this.data(dataText) || ""))? "" : v;
-				}
-				else {
-					return valOld.apply( this, arguments );
-				}
-			}
-			else {
-				valOld.apply( this, arguments );
-				$.watermark.show(this);
-				return this;
-			}
-		};
-
-	})($.fn.val);
-	
-	// Hijack any functions found in the triggerFns list
-	if (triggerFns.length) {
-
-		// Wait until DOM is ready before searching
-		$(function () {
-			var i, name, fn;
-		
-			for (i=triggerFns.length-1; i>=0; i--) {
-				name = triggerFns[i];
-				fn = window[name];
-				
-				if (typeof(fn) === "function") {
-					window[name] = (function (origFn) {
-						return function () {
-							$.watermark.hideAll();
-							return origFn.apply(null, Array.prototype.slice.call(arguments));
-						};
-					})(fn);
-				}
-			}
-		});
-	}
-
-	$(window).bind("beforeunload", function () {
-		if ($.watermark.options.hideBeforeUnload) {
-			$.watermark.hideAll();
-		}
-	});
-}
-
-})(jQuery, window);
--- a/directmapping-webapp/src/main/resources/toserve/typewatch.js	Mon Aug 29 21:19:50 2011 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-/*
- *	TypeWatch 3.0
- *	
- *	Original by Denny Ferrassoli
- *	Refactored by Charles Christolini
- *	Revised by Kai Schlamp
- *
- *	Examples/Docs: www.dennydotnet.com
- *	
- *  Copyright(c) 2007 Denny Ferrassoli - DennyDotNet.com
- *  Copyright(c) 2008 Charles Christolini - BinaryPie.com
- *  Copyright(c) 2010 Kai Schlamp - medihack.org
- *  
- *  Dual licensed under the MIT and GPL licenses:
- *  http://www.opensource.org/licenses/mit-license.php
- *  http://www.gnu.org/licenses/gpl.html
-*/
-
-(function(jQuery) {
-	jQuery.fn.typeWatch = function(o){
-		// Options
-		var options = jQuery.extend({
-			wait : 500,
-			callback : function() { },
-			highlight : true,
-			captureLength : 2
-		}, o);
-		
-		function checkElement(timer, override) {
-			var elTxt = jQuery(timer.el).val();
-		
-			if ((elTxt.length >= options.captureLength && elTxt.toUpperCase() != timer.text)
-			|| (override && elTxt.length >= options.captureLength)) {
-				timer.text = elTxt.toUpperCase();
-				timer.cb(elTxt);
-			}
-		}
-		
-		function watchElement(elem) {			
-			// Must be text or textarea
-			if (elem.type.toUpperCase() == "TEXT" || elem.nodeName.toUpperCase() == "TEXTAREA") {
-
-				// Allocate timer element
-				var timer = {
-					timer : null, 
-					text : jQuery(elem).val().toUpperCase(),
-					cb : options.callback, 
-					el : elem, 
-					wait : options.wait
-				};
-
-				// Set focus action (highlight)
-				if (options.highlight) {
-					jQuery(elem).focus(
-						function() {
-							this.select();
-						});
-				}
-
-				// Key watcher / clear and reset the timer
-				var startWatch = function(evt) {
-					var timerWait = timer.wait;
-					var overrideBool = false;
-
-                    // If enter is pressed then diretly execute the callback
-					if (evt.keyCode == 13 && this.type.toUpperCase() == "TEXT") {
-						timerWait = 1;
-						overrideBool = true;
-					}
-					
-					var timerCallbackFx = function()
-					{
-						checkElement(timer, overrideBool)
-					}
-					
-					// Clear timer					
-					clearTimeout(timer.timer);
-					timer.timer = setTimeout(timerCallbackFx, timerWait);									
-				};
-				
-				jQuery(elem).keyup(startWatch);
-			}
-		}
-		
-		// Watch Each Element
-		return this.each(function(index){
-			watchElement(this);
-		});
-	};
-})(jQuery);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/directmapping-webapp/src/main/scala/Main.scala	Tue Aug 30 01:05:16 2011 -0400
@@ -0,0 +1,169 @@
+package org.w3.yourapp
+
+import org.w3.yourapp.util.ResourceManager.fromClasspath
+
+import javax.servlet._
+import javax.servlet.http._
+import unfiltered.request._
+import unfiltered.response._
+import unfiltered.scalate._
+import unfiltered.jetty._
+
+import org.fusesource.scalate.TemplateEngine
+import org.slf4j.{Logger, LoggerFactory}
+
+import org.w3.rdf._
+import org.w3.rdb.RDB._
+import org.w3.sql
+import org.w3.rdf.turtle.TurtleModule
+import org.w3.directmapping.DirectMappingModule
+import org.w3.rdf.jena._
+
+import org.w3.rdf2rdf._
+
+// holds some Unfiltered plans
+object YourProjectApp extends JenaModel with RDF2RDFModule with DirectMappingModule {
+  
+  val engine = {
+    val templates = fromClasspath("templates/")
+    println("Template directory extracted at " + templates.getAbsolutePath)
+    val templateDirs = List(templates)
+    val scalateMode = "development"
+    new TemplateEngine(templateDirs, scalateMode)
+  }
+
+  val services = unfiltered.filter.Planify {
+    case Path(Seg("ddl" :: ddl :: Nil)) & GET(_) =>
+      try {
+        Ok ~> ContentType("application/json") ~> ResponseString(QueryManager.embeddedDDLs(ddl))
+      } catch {
+        case e:Throwable =>  Ok ~> PlainTextContent ~> ResponseString(e.getMessage)
+      }
+    case Path(Seg("ddls" :: Nil)) & Params(params) =>
+      try {
+        val current = params("q").headOption getOrElse ""
+        val limit = params("limit").headOption map (_.toInt) getOrElse 10
+        Ok ~> PlainTextContent ~> ResponseString(QueryManager.embeddedDDLs.keys filter { _ contains current } take limit map (s => s+"|"+s) mkString "\n")
+      } catch {
+        case e:Throwable =>  Ok ~> PlainTextContent ~> ResponseString(e.getMessage)
+      }
+    case Path(Seg("construct" :: construct :: Nil)) & GET(_) =>
+      try {
+        Ok ~> ContentType("application/json") ~> ResponseString(QueryManager.embeddedCONSTRUCTs(construct))
+      } catch {
+        case e:Throwable =>  Ok ~> PlainTextContent ~> ResponseString(e.getMessage)
+      }
+    case Path(Seg("constructs" :: Nil)) & Params(params) & GET(_) =>
+      try {
+        val current = params("q").headOption getOrElse ""
+        val limit = params("limit").headOption map (_.toInt) getOrElse 10
+        Ok ~> PlainTextContent ~> ResponseString(QueryManager.embeddedCONSTRUCTs.keys filter { _ contains current } take limit map (s => s+"|"+s) mkString "\n")
+      } catch {
+        case e:Throwable =>  Ok ~> PlainTextContent ~> ResponseString(e.getMessage)
+      }
+    case Path(Seg("parse-ddl" :: Nil)) & Params(params) & POST(_) =>
+      try {
+        val SQLParser = sql.SqlParser()
+        val db = SQLParser.toDB(params("ddl").headOption getOrElse "")
+        Ok ~> PlainTextContent ~> ResponseString("DDL successfully parsed")
+      } catch {
+        case e:Throwable =>  Ok ~> PlainTextContent ~> ResponseString(e.getMessage)
+      }
+    case Path(Seg("parse-construct" :: Nil)) & Params(params) & POST(_) =>
+      try {
+        val constructs = Construct.extractAll(params("construct").headOption getOrElse "")
+        Ok ~> PlainTextContent ~> ResponseString("SPARQL CONSTRUCT successfully parsed")
+      } catch {
+        case e:Throwable =>  Ok ~> PlainTextContent ~> ResponseString(e.getMessage)
+      }
+    case Path(Seg("dm-then-construct" :: Nil)) & Params(params) & POST(_) =>
+      try {
+        val ddl = params("ddl").headOption getOrElse ""
+        val construct = params("construct").headOption getOrElse ""
+        Ok ~> PlainTextContent ~> ResponseString(dmThenConstruct(ddl, construct))
+      } catch {
+        case e:Throwable =>  Ok ~> PlainTextContent ~> ResponseString(e.getMessage)
+      }
+  }
+    
+  private def dmThenConstruct(ddl:String, constructs:String):String = {
+    import DirectMapping._
+    val SQLParser = sql.SqlParser()
+    val db = SQLParser.toDB(ddl)
+    DirectMapping.MinEncode = false
+    val computedGraph:Graph = databaseSemantics(db)
+    val allConstructs:List[Construct] = Construct.extractAll(constructs)
+    val resultGraph = RDF2RDF(computedGraph) | allConstructs
+    this.toString(resultGraph)
+  }
+
+
+  val index = unfiltered.filter.Planify {
+    case req @ Path(Seg(Nil)) & Params(params) => {
+      import DirectMapping._
+      val SQLParser = sql.SqlParser()
+      val defaultDDL = "emp_addr"
+      val defaultCONSTRUCTs = "emp_addr2FOAF"
+      val (ddlName, ddl, ddlMessage) = params("ddl").headOption match {
+        case Some(name) if QueryManager.embeddedDDLs contains name => {
+          (name, QueryManager.embeddedDDLs(name), "DDL successfully loaded")
+        }
+        case Some(name) => {
+          (defaultDDL, QueryManager.embeddedDDLs(defaultDDL), name + "not found: default DDL used instead")
+        }
+        case None =>  {
+          (defaultDDL, QueryManager.embeddedDDLs(defaultDDL), "Default DDL used")
+        }
+      }
+
+      val (constructName, constructs, constructMessage) = params("construct").headOption match {
+        case Some(name) if QueryManager.embeddedCONSTRUCTs contains name => {
+          (name, QueryManager.embeddedCONSTRUCTs(name), "SPARQL CONSTRUCT successfully loaded")
+        }
+        case Some(name) => {
+          (defaultCONSTRUCTs, QueryManager.embeddedCONSTRUCTs(defaultCONSTRUCTs), name + "not found: default SPARQL CONSTRUCT used instead")
+        }
+        case None =>  {
+          (defaultCONSTRUCTs, QueryManager.embeddedCONSTRUCTs(defaultCONSTRUCTs), "Default SPARQL CONSTRUCT used")
+        }
+      }
+
+      Ok ~> Scalate(req, "index.ssp",
+                    "ddlName" -> "",
+                    "ddl" -> ddl,
+                    "ddlMessage" -> ddlMessage,
+                    "constructName" -> "",
+                    "construct" -> constructs,
+                    "constructMessage" -> constructMessage,
+                    "result" -> dmThenConstruct(ddl, constructs))(engine)
+    }
+  }
+
+}
+
+import YourProjectApp._
+
+object VirtualTrainerAppMain {
+
+  val logger:Logger = LoggerFactory.getLogger(this.getClass)
+
+  // regular Java main
+  def main(args: Array[String]) {
+    
+    // can provide the port as first argument
+    // default to 2719
+    val port = args.toList.headOption map { _.toInt } getOrElse 2719
+    
+    // configures and launches a Jetty server
+    unfiltered.jetty.Http(port)
+    // serves static files
+    .context("/scripts"){ ctx:ContextBuilder =>
+      ctx.resources(fromClasspath("scripts/").toURI.toURL)
+    }.context("/styles"){ ctx:ContextBuilder =>
+      ctx.resources(fromClasspath("styles/").toURI.toURL)
+    // Unfiltered filters
+    }.filter(services).filter(index).run()
+    
+  }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/directmapping-webapp/src/main/scala/QueryManager.scala	Tue Aug 30 01:05:16 2011 -0400
@@ -0,0 +1,58 @@
+package org.w3.yourapp
+
+
+object QueryManager {
+
+  import java.net._
+  import java.io._
+  import java.util.jar._
+  import scala.collection.JavaConversions._
+  import scala.io.Source
+
+  val clazz:Class[_] = this.getClass
+  val classloader = this.getClass.getClassLoader
+
+  /** http://www.uofr.net/~greg/java/get-resource-listing.html */
+  def getResourceListing(path:String):List[String] = {
+    var dirURL:URL = classloader.getResource(path)
+    if (dirURL != null && dirURL.getProtocol == "file") {
+      /* A file path: easy enough */
+      new File(dirURL.toURI).list.toList
+    } else {
+      if (dirURL == null) {
+        val me = clazz.getName().replace(".", "/")+".class"
+        dirURL = classloader.getResource(me)
+      }
+      if (dirURL.getProtocol == "jar") {
+        val jarPath = dirURL.getPath.substring(5, dirURL.getPath().indexOf("!"))
+        val jar:JarFile = new JarFile(URLDecoder.decode(jarPath, "UTF-8"))
+        val entries = jar.entries filter { _.getName startsWith path } map { e => {
+          var entry = e.getName substring path.length
+          val checkSubdir = entry indexOf "/"
+          if (checkSubdir >= 0) entry = entry.substring(0, checkSubdir)
+          entry
+        } }
+        
+        entries
+      }    
+      sys.error("Cannot list files for URL "+dirURL);
+    }
+  }
+
+  import scala.collection.mutable.LinkedHashMap
+
+  def embeddedFiles(extension:String):LinkedHashMap[String, String] = {
+    val pattern = extension.replaceAll("\\.", "\\.") + "$"
+    val files = getResourceListing("queries/") filter { _.endsWith(extension) }
+    val queries = files map { file => {
+      val url = classloader.getResource("queries/" + file)
+      val query = Source.fromURL(url, "UTF-8").getLines.mkString("\n")
+      (file.replaceAll(pattern, ""), query)
+    } }
+    LinkedHashMap[String, String]() ++ queries
+  }
+
+  lazy val embeddedDDLs = embeddedFiles(".ddl")
+  lazy val embeddedCONSTRUCTs = embeddedFiles(".construct")
+
+}
--- a/directmapping-webapp/src/main/scala/Test.scala	Mon Aug 29 21:19:50 2011 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-case class Movie(val name: String, val director: String)
-
-trait MovieFinderComponent {
-
-  def movieFinder:MovieFinder
-
-  trait MovieFinder {
-    def findAll: List[Movie]
-  }
-}
-
-trait MovieLister {
-  self: MovieFinderComponent =>
-
-  def moviesDirectedBy(director: String): List[Movie] = {
-    movieFinder.findAll.filter(movie => movie.director == director)
-  }
-}
-
-trait MyMovieFinderComponent extends MovieFinderComponent {
-  // finds movies from a file
-  val filename: String
-
-  val movieFinder = new ColonDelimitedMovieFinder
-
-  class ColonDelimitedMovieFinder extends MovieFinder {
-    def findAll = {
-      println("Pretending to read movies from file: " + filename)
-      List(Movie("Sicko", "Michael Moore"), Movie("Inception", "Christopher Nolan"),
-           Movie("Memento", "Christopher Nolan"), Movie("The Prestige", "Christopher Nolan"));
-    }
-  }
-}
-
-
-
-object Cake extends Application {
-// wiring:
-  object MyMovieLister extends MovieLister with MyMovieFinderComponent {
-    val filename = "movies1.txt"
-  }
-
-  MyMovieLister.moviesDirectedBy("Christopher Nolan").foreach(movie => println(movie))
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/directmapping-webapp/src/main/scala/Util.scala	Tue Aug 30 01:05:16 2011 -0400
@@ -0,0 +1,62 @@
+package org.w3.yourapp.util
+
+import java.io.{File, FileWriter}
+import java.util.jar._
+import scala.collection.JavaConversions._
+import scala.io.Source
+import java.net.{URL, URLDecoder}
+import org.slf4j.{Logger, LoggerFactory}
+
+/** usefull stuff to read resources from the classpath */
+object ResourceManager {
+  
+  val logger:Logger = LoggerFactory.getLogger(this.getClass)
+
+  val clazz:Class[_] = this.getClass
+  val classloader = this.getClass.getClassLoader
+  
+  /** http://www.uofr.net/~greg/java/get-resource-listing.html
+   */
+  def getResourceListing(path:String):List[String] = {
+    var dirURL:URL = classloader.getResource(path)
+    if (dirURL != null && dirURL.getProtocol == "file") {
+      /* A file path: easy enough */
+      new File(dirURL.toURI).list.toList
+    } else {
+      if (dirURL == null) {
+        val me = clazz.getName().replace(".", "/")+".class"
+        dirURL = classloader.getResource(me)
+      }
+      if (dirURL.getProtocol == "jar") {
+        val jarPath = dirURL.getPath.substring(5, dirURL.getPath().indexOf("!"))
+        val jar:JarFile = new JarFile(URLDecoder.decode(jarPath, "UTF-8"))
+        val entries = jar.entries filter { _.getName startsWith path } map { e => {
+          var entry = e.getName substring path.length
+          val checkSubdir = entry indexOf "/"
+          if (checkSubdir >= 0) entry = entry.substring(0, checkSubdir)
+          entry
+        } }
+        entries filterNot { _.isEmpty } toList
+      } else
+        sys.error("Cannot list files for URL "+dirURL);
+    }
+  }
+  
+  /** extract a path found in the classpath
+   * 
+   *  @return the file on disk
+   */
+  def fromClasspath(path:String):File = {
+    val dir = new File("/tmp", "federate-" + scala.util.Random.nextInt(10000).toString)
+    if (! dir.mkdir()) logger.error("Couldn't extract %s from jar to %s" format (path, dir.getAbsolutePath))
+    val entries = getResourceListing(path) foreach { entry =>
+      val url = classloader.getResource(path + entry)
+      val content = Source.fromURL(url, "UTF-8").getLines.mkString("\n")
+      val writer = new FileWriter(new File(dir, entry))
+      writer.write(content)
+      writer.close()
+    }
+    dir
+  }
+  
+}
--- a/directmapping-webapp/src/main/scala/bootstrap/liftweb/Boot.scala	Mon Aug 29 21:19:50 2011 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-package bootstrap.liftweb
-
-import net.liftweb._
-import util._
-import Helpers._
-
-import common._
-import http._
-import sitemap._
-import Loc._
-
-import net.liftweb.http.js.jquery.JQuery14Artifacts
-import net.liftweb.widgets.autocomplete.AutoComplete
-
-
-/**
- * A class that's instantiated early and run.  It allows the application
- * to modify lift's environment
- */
-class Boot {
-  def boot {
-    // where to search snippet
-    LiftRules.addToPackages("code")
-
-    // Build SiteMap
-    val entries = List(
-      Menu.i("Home") / "index", // the simple way to declare a menu
-
-      // more complex because this menu allows anything in the
-      // /static path to be visible
-      Menu(Loc("Static", Link(List("static"), true, "/static/index"), 
-	       "Static Content")))
-
-    AutoComplete.init
-
-    // set the sitemap.  Note if you don't want access control for
-    // each page, just comment this line out.
-    LiftRules.setSiteMap(SiteMap(entries:_*))
-
-    //Show the spinny image when an Ajax call starts
-    LiftRules.ajaxStart =
-      Full(() => LiftRules.jsArtifacts.show("ajax-loader").cmd)
-    
-    // Make the spinny image go away when it ends
-    LiftRules.ajaxEnd =
-      Full(() => LiftRules.jsArtifacts.hide("ajax-loader").cmd)
-
-    // Force the request to be UTF-8
-    LiftRules.early.append(_.setCharacterEncoding("UTF-8"))
-
-    LiftRules.statelessDispatchTable.append(code.snippet.Services)
-
-    import net.liftweb.http.ResourceServer
-    ResourceServer.allow {
-      case "typewatch.js" :: Nil => true
-      case "jquery.watermark.js" :: Nil => true
-      case "autocomplete" :: _ => true
-    }
-
-
-  }
-}
--- a/directmapping-webapp/src/main/scala/code/lib/DependencyFactory.scala	Mon Aug 29 21:19:50 2011 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-package code {
-package lib {
-
-import net.liftweb._
-import http._
-import util._
-import common._
-import _root_.java.util.Date
-
-/**
- * A factory for generating new instances of Date.  You can create
- * factories for each kind of thing you want to vend in your application.
- * An example is a payment gateway.  You can change the default implementation,
- * or override the default implementation on a session, request or current call
- * stack basis.
- */
-object DependencyFactory extends Factory {
-  implicit object time extends FactoryMaker(Helpers.now _)
-
-  /**
-   * objects in Scala are lazily created.  The init()
-   * method creates a List of all the objects.  This
-   * results in all the objects getting initialized and
-   * registering their types with the dependency injector
-   */
-  private def init() {
-    List(time)
-  }
-  init()
-}
-
-/*
-/**
- * Examples of changing the implementation
- */
-sealed abstract class Changer {
-  def changeDefaultImplementation() {
-    DependencyFactory.time.default.set(() => new Date())
-  }
-
-  def changeSessionImplementation() {
-    DependencyFactory.time.session.set(() => new Date())
-  }
-
-  def changeRequestImplementation() {
-    DependencyFactory.time.request.set(() => new Date())
-  }
-
-  def changeJustForCall(d: Date) {
-    DependencyFactory.time.doWith(d) {
-      // perform some calculations here
-    }
-  }
-}
-*/
-}
-}
--- a/directmapping-webapp/src/main/scala/code/snippet/AutoComplete.scala	Mon Aug 29 21:19:50 2011 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,116 +0,0 @@
-/*
- * Copyright 2007-2010 WorldWide Conferencing, LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.w3 {
-
-package net.liftweb {
-package widgets {
-package autocomplete {
-
-import _root_.scala.xml.{NodeSeq, Node, Elem, PCData, Text}
-import _root_.net.liftweb.common._
-import _root_.net.liftweb.util._
-import _root_.net.liftweb.http._
-import _root_.net.liftweb.http.js._
-import JsCmds._
-import JE._
-import S._
-import SHtml._
-import Helpers._
-
-object AutoComplete {
-  
-  def apply(start: String, 
-            options: (String, Int) => Seq[String],
-            jsCmd: JsCmd,
-            attrs: (String, String)*) = new AutoComplete().render(start, options, jsCmd, attrs:_*)    
-    
-  /**
-   * register the resources with lift (typically in boot)
-   */
-  def init() {
-    import _root_.net.liftweb.http.ResourceServer
-
-    ResourceServer.allow({
-        case "autocomplete" :: _ => true
-     })
-  }
-
-}
-
-class AutoComplete {
-  
-  /**
-   * Render a text field with Ajax autocomplete support
-   * 
-   * @param start - the initial input string
-   * @param option - the function to be called when user is typing text. The text and th options limit is provided to this functions
-   * @param attrs - the attributes that can be added to the input text field 
-   * @param jsonOptions - a list of pairs that will be send along to the jQuery().AutoComplete call (for customization purposes)
-   */
-   def render(start: String, 
-              options: (String, Int) => Seq[String], 
-              jsCmd: JsCmd, 
-              attrs: (String, String)*): Elem = {
-    
-    val f = (ignore: String) => {
-      val q = S.param("q").openOr("")
-      val limit = S.param("limit").flatMap(asInt).openOr(10)
-      PlainTextResponse(options(q, limit).map(s => s+"|"+s).mkString("\n"))
-    }
-
-
-    fmapFunc(SFuncHolder(f)){ func =>
-      val what: String = encodeURL(S.contextPath + "/" + LiftRules.ajaxPath+"?"+func+"=foo")
-
-      val id = Helpers.nextFuncName
-
-     /* merge the options that the user wants */
-      val jqOptions =  ("minChars","0") ::
-                       ("matchContains","true") ::
-                       Nil
-      val json = jqOptions.map(t => t._1 + ":" + t._2).mkString("{", ",", "}")
-      val autocompleteOptions = JsRaw(json)
-    
-      val onLoad = JsRaw("""
-      jQuery(document).ready(function(){
-        var data = """+what.encJs+""";
-        jQuery("#"""+id+"""").autocomplete(data, """+autocompleteOptions.toJsCmd+""").result(function(event, dt, formatted) {
-          jQuery("#"""+id+"""").val(formatted);
-      """+jsCmd.toJsCmd+"""
-        });
-      });""")
-
-      <span>
-        <head>
-          <link rel="stylesheet" href={"/" + LiftRules.resourceServerPath +"/autocomplete/jquery.autocomplete.css"} type="text/css" />
-          <script type="text/javascript" src={"/" + LiftRules.resourceServerPath +"/autocomplete/jquery.autocomplete.js"} />
-          {Script(onLoad)}
-        </head>
-        {
-          <input type="text" id={id} value={start} />
-        }
-      </span>
-
-   }
-  }
-}
-
-}
-}
-}
-
-}
--- a/directmapping-webapp/src/main/scala/code/snippet/HelloWorld.scala	Mon Aug 29 21:19:50 2011 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,194 +0,0 @@
-package code {
-package snippet {
-
-import _root_.scala.xml.{NodeSeq, Text}
-import _root_.net.liftweb.util._
-import _root_.net.liftweb.common._
-import _root_.java.util.Date
-import code.lib._
-import Helpers._
-import _root_.net.liftweb.http._
-import net.liftweb.json.JsonAST._
-import net.liftweb.http.js.JsCmds._
-import net.liftweb.http.js.JE.{JsRaw, AnonFunc}
-
-import _root_.org.w3.net.liftweb.widgets.autocomplete._
-
-//import org.w3.directmapping.servlet._
-
-
-
-import org.w3.rdf._
-import org.w3.rdb.RDB._
-import org.w3.sql
-import org.w3.rdf.turtle.TurtleModule
-import org.w3.directmapping.DirectMappingModule
-import org.w3.rdf.jena._
-
-import org.w3.rdf2rdf._
-
-import net.liftweb.http.rest.RestHelper
-
-object Services extends RestHelper with RDF2RDFModule with DirectMappingModule {
-  serve {
-    case "ddl" :: ddl :: Nil Get _ => JsonResponse(JsRaw(QueryManager.embeddedDDLs(ddl)))
-    case "ddls" :: Nil Get _ => {
-      val current = S.param("q").openOr("")
-      val limit = S.param("limit").flatMap(asInt).openOr(10)
-      PlainTextResponse(QueryManager.embeddedDDLs.keys filter { _ contains current } take limit map (s => s+"|"+s) mkString "\n")
-    }
-    case "construct" :: construct :: Nil Get _ => JsonResponse(JsRaw(QueryManager.embeddedCONSTRUCTs(construct)))
-    case "constructs" :: Nil Get _ => {
-      val current = S.param("q").openOr("")
-      val limit = S.param("limit").flatMap(asInt).openOr(10)
-      PlainTextResponse(QueryManager.embeddedCONSTRUCTs.keys filter { _ contains current } take limit map (s => s+"|"+s) mkString "\n")
-    }
-    case "parse-ddl" :: Nil Post _ => {
-      try {
-        val SQLParser = sql.SqlParser()
-        val db = SQLParser.toDB(S.param("ddl").openOr(""))
-        PlainTextResponse("DDL successfully parsed")
-      } catch {
-        case e => PlainTextResponse(e.getMessage, 500)
-      }
-    }
-    case "parse-construct" :: Nil Post _ => {
-      try {
-        val constructs = Construct.extractAll(S.param("construct").openOr(""))
-        PlainTextResponse("SPARQL CONSTRUCT successfully parsed")
-      } catch {
-        case e => PlainTextResponse(e.getMessage, 500)
-      }
-    }
-    case "dm-then-construct" :: Nil Post _ => {
-      try {
-        val ddl = S.param("ddl").openOr("")
-        val constructs = S.param("construct").openOr("")
-        PlainTextResponse(dmThenConstruct(ddl, constructs))
-      } catch {
-        case e => PlainTextResponse(e.getMessage, 500)
-      }
-    }
-  }
-
-  def dmThenConstruct(ddl:String, constructs:String):String = {
-    import DirectMapping._
-    val SQLParser = sql.SqlParser()
-    val db = SQLParser.toDB(ddl)
-    DirectMapping.MinEncode = false
-    val computedGraph:Graph = databaseSemantics(db)
-    val allConstructs:List[Construct] = Construct.extractAll(constructs)
-    val resultGraph = RDF2RDF(computedGraph) | allConstructs
-    this.toString(resultGraph)
-  }
-
-}
-
-
-class DirectMappingDemo extends JenaModel with RDF2RDFModule with DirectMappingModule {
-
-  import DirectMapping._
-
-  val SQLParser = sql.SqlParser()
-
-  val defaultDDL = "emp_addr"
-  val defaultCONSTRUCTs = "emp_addr2FOAF"
-
-  def render = {
-    val (ddlName, ddl, ddlMessage) = S.param("ddl") match {
-      case Full(name) if QueryManager.embeddedDDLs contains name => {
-        (name, QueryManager.embeddedDDLs(name), "DDL successfully loaded")
-      }
-      case Full(name) => {
-        (defaultDDL, QueryManager.embeddedDDLs(defaultDDL), name + "not found: default DDL used instead")
-      }
-      case _ =>  {
-        (defaultDDL, QueryManager.embeddedDDLs(defaultDDL), "Default DDL used")
-      }
-    }
-
-    val (constructName, constructs, constructMessage) = S.param("construct") match {
-      case Full(name) if QueryManager.embeddedCONSTRUCTs contains name => {
-        (name, QueryManager.embeddedCONSTRUCTs(name), "SPARQL CONSTRUCT successfully loaded")
-      }
-      case Full(name) => {
-        (defaultCONSTRUCTs, QueryManager.embeddedCONSTRUCTs(defaultCONSTRUCTs), name + "not found: default SPARQL CONSTRUCT used instead")
-      }
-      case _ =>  {
-        (defaultCONSTRUCTs, QueryManager.embeddedCONSTRUCTs(defaultCONSTRUCTs), "Default SPARQL CONSTRUCT used")
-      }
-    }
-
-    "#ddl-name [value]" #> "" &
-    "#ddl *" #> ddl &
-    "#ddl-message *" #> ddlMessage &
-    "#construct-name [value]" #> "" &
-    "#construct *" #> constructs &
-    "#construct-message *" #> constructMessage &
-    "#result *" #> Services.dmThenConstruct(ddl, constructs)
-
-  }
-
-}
-
-object QueryManager {
-
-  import java.net._
-  import java.io._
-  import java.util.jar._
-  import scala.collection.JavaConversions._
-  import scala.io.Source
-
-  val clazz:Class[_] = this.getClass
-  val classloader = this.getClass.getClassLoader
-
-  /** http://www.uofr.net/~greg/java/get-resource-listing.html */
-  def getResourceListing(path:String):List[String] = {
-    var dirURL:URL = classloader.getResource(path)
-    if (dirURL != null && dirURL.getProtocol == "file") {
-      /* A file path: easy enough */
-      new File(dirURL.toURI).list.toList
-    } else {
-      if (dirURL == null) {
-        val me = clazz.getName().replace(".", "/")+".class"
-        dirURL = classloader.getResource(me)
-      }
-      if (dirURL.getProtocol == "jar") {
-        val jarPath = dirURL.getPath.substring(5, dirURL.getPath().indexOf("!"))
-        val jar:JarFile = new JarFile(URLDecoder.decode(jarPath, "UTF-8"))
-        val entries = jar.entries filter { _.getName startsWith path } map { e => {
-          var entry = e.getName substring path.length
-          val checkSubdir = entry indexOf "/"
-          if (checkSubdir >= 0) entry = entry.substring(0, checkSubdir)
-          entry
-        } }
-        
-        entries
-      }    
-      error("Cannot list files for URL "+dirURL);
-    }
-  }
-
-  import scala.collection.mutable.LinkedHashMap
-
-  def embeddedFiles(extension:String):LinkedHashMap[String, String] = {
-    val pattern = extension.replaceAll("\\.", "\\.") + "$"
-    val files = getResourceListing("queries/") filter { _.endsWith(extension) }
-    val queries = files map { file => {
-      val url = classloader.getResource("queries/" + file)
-      val query = Source.fromURL(url, "UTF-8").getLines.mkString("\n")
-      (file.replaceAll(pattern, ""), query)
-    } }
-    LinkedHashMap[String, String]() ++ queries
-  }
-
-  lazy val embeddedDDLs = embeddedFiles(".ddl")
-  lazy val embeddedCONSTRUCTs = embeddedFiles(".construct")
-
-}
-
-
-
-}
-
-}
--- a/directmapping-webapp/src/main/webapp/WEB-INF/web.xml	Mon Aug 29 21:19:50 2011 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<!DOCTYPE web-app
-PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
-"http://java.sun.com/dtd/web-app_2_3.dtd">
-
-<web-app>
-<filter>
-  <filter-name>LiftFilter</filter-name>
-  <display-name>Lift Filter</display-name>
-  <description>The Filter that intercepts lift calls</description>
-  <filter-class>net.liftweb.http.LiftFilter</filter-class>
-</filter>
-  	
-
-<filter-mapping>
-  <filter-name>LiftFilter</filter-name>
-  <url-pattern>/*</url-pattern>
-</filter-mapping>
-
-</web-app>
Binary file directmapping-webapp/src/main/webapp/images/ajax-loader.gif has changed
--- a/directmapping-webapp/src/main/webapp/index.html	Mon Aug 29 21:19:50 2011 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,148 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-    <title>Direct Mapping Demo</title>
-    <script type="text/javascript" src="/classpath/jquery.js"></script>
-    <script type="text/javascript" src="/classpath/autocomplete/jquery.autocomplete.js"></script>
-    <link rel="stylesheet" href="/classpath/autocomplete/jquery.autocomplete.css" type="text/css" />
-    <script type="text/javascript" src="/classpath/typewatch.js"></script>
-    <script type="text/javascript" src="/classpath/jquery.watermark.js"></script>
-    <style type="text/css" media="print, screen and (min-width: 481px)">
-    div.area {position:relative; min-width:600px; zoom:0}
-    textarea.query {display:block; width:60%; height:150px; min-height:150px; resize:vertical}
-    .interaction-area {position:absolute; top:0; right:0; width:39%; height:100%}
-    .query-box input[type=text] {width:100%; margin:0; padding:2px}
-    div.message {width:100%; position:absolute; top:1.6em; bottom:6px}
-    div.message textarea {width:100%; height:100%; resize:none; margin:0; padding:2px; color:black}
-    div.message textarea.error {color:red}
-    .error {color:red}
-    </style>
-
-<script type="text/javascript">
-// <![CDATA[
-jQuery(document).ready(function() {
-
-  var dmThenConstruct = function() {
-    var ddl = $("#ddl").val();
-    var construct = $("#construct").val();
-    jQuery.ajax({type: "POST",
-                 url: '/dm-then-construct',
-                 data: 'ddl='+ddl+'&construct='+construct,
-                 success: function(data) { jQuery("#result").removeClass("error"); jQuery("#result").val(data); },
-                 error: function(xhr) { jQuery("#result").addClass("error"); jQuery("#result").val(xhr.responseText); }
-                })
-  }
-
-  // jQuery("#ddl").watermark(jQuery("#ddl").val());
-
-  jQuery("#ddl-name").autocomplete("/ddls", {minChars:0,matchContains:true}).result(function(event, dt, ddlname) {
-    jQuery("#ddl-name").val(ddlname);
-    jQuery.ajax({url: '/ddl/'+ddlname,
-                 success: function(data) { jQuery("#ddl").val(data); jQuery("#ddl-message").val("DDL successfully loaded"); dmThenConstruct(); }
-                });
-  });
-
-  jQuery("#construct-name").autocomplete("/constructs", {minChars:0,matchContains:true}).result(function(event, dt, constructname) {
-    jQuery("#construct-name").val(constructname);
-    jQuery.ajax({url: '/construct/'+constructname,
-                 success: function(data) { jQuery("#construct").val(data); jQuery("#construct-message").val("CONSTRUCT successfully loaded"); dmThenConstruct(); }
-                });
-  });
-
-  jQuery("#ddl").typeWatch({
-    callback: function() {
-      jQuery.ajax({type: "POST",
-                   url: '/parse-ddl',
-                   data: 'ddl='+$('#ddl').val(),
-                   success: function(data) { jQuery("#ddl-message").removeClass("error"); jQuery("#ddl-message").val(data); dmThenConstruct(); },
-                   error: function(xhr) { jQuery("#ddl-message").addClass("error"); jQuery("#ddl-message").val(xhr.responseText); }
-                  })
-    },
-    wait: 1000,
-    highlight: false,
-    captureLength: 1
-  });
-
-  jQuery("#construct").typeWatch({
-    callback: function() {
-      jQuery.ajax({type: "POST",
-                   url: '/parse-construct',
-                   data: 'construct='+$('#construct').val(),
-                   success: function(data) { jQuery("#construct-message").removeClass("error"); jQuery("#construct-message").val(data); dmThenConstruct(); },
-                   error: function(xhr) { jQuery("#construct-message").addClass("error"); jQuery("#construct-message").val(xhr.responseText); }
-                  })
-    },
-    wait: 1000,
-    highlight: false,
-    captureLength: 1
-  });
-
-});;
-// ]]>
-</script>
-
-  </head>
-  <body>
-
-<div class="lift:DirectMappingDemo">
-    <h1>Direct Mapping Demo</h1>
-    <p>This webapp lets you play with the Direct Mapping: give it some
-    DDL/SQL, tweak the
-    resulting <a href="http://www.w3.org/2001/sw/rdb2rdf/directMapping/">Direct
-    Graph</a> using SPARQL and observe the result.</p>
-    <p>Please send bug reports to <a
-    href="mailto:public-rdb2rdf-comments@w3.org">public-rdb2rdf-comments@w3.org</a>.</p>
-    
-    <h2>DDL/SQL</h2>
-
-    <div class="area">
-      <textarea rows="15" cols="80" id="ddl" class="query">Here goes the DDL</textarea>
-      <div class="interaction-area">
-        <div class="query-management">
-          <div class="query-box" >
-            <input type="text" value="" id="ddl-name" class="ac_input"/>
-          </div>
-          <div class="message">
-            <textarea id="ddl-message" rows="5" cols="40" disabled="disabled"></textarea>
-          </div>
-        </div>
-      </div>
-    </div>
-
-    <h2>SPARQL CONSTRUCTs</h2>
-
-    If empty or non-valid SPARQL CONSTRUCT, this will be ignored.
-
-    <div class="area">
-      <textarea rows="15" cols="80" id="construct" class="query">CONSTRUCT {
-  ?s ?p ?o .
-} WHERE {
-  ?s ?p ?o .
-}</textarea>
-      <div class="interaction-area">
-        <div class="query-management">
-          <div class="query-box" >
-            <input type="text" value="" id="construct-name" class="ac_input"/>
-          </div>
-          <div class="message">
-            <textarea id="construct-message" rows="5" cols="40" disabled="disabled"></textarea>
-          </div>
-        </div>
-      </div>
-    </div>
-    
-    <h2>Direct Mapping + SPARQL</h2>
-
-    <div class="area">
-      <textarea id="result" rows="15" cols="80" class="result"></textarea>
-    </div>
-
-    <hr ></hr>
-    <address>
-      <a href="http://www.w3.org/People/Eric/">Eric Prud'hommeaux</a>, <a href="http://www.w3.org/People/Bertails/">Alexandre Bertails</a>, May 2011<br />
-      Contributors: <a href="mailto:bvillazon@fi.upm.es">Boris Villazon-Terrazas</a>, <a href="mailto:tgambet@w3.org">Thomas Gambet</a>
-    </address>
-</div>
-  </body>
-</html>
--- a/directmapping-webapp/src/main/webapp/static/index.html	Mon Aug 29 21:19:50 2011 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head><meta content="text/html; charset=UTF-8" http-equiv="content-type" /><title>Home</title></head>
-  <body class="lift:content_id=main">
-    <div id="main" class="lift:surround?with=default;at=content">
-      Static content... everything you put in the /static
-      directory will be served without additions to SiteMap
-    </div>
-  </body>
-</html>
-
--- a/directmapping-webapp/src/main/webapp/templates-hidden/default.html	Mon Aug 29 21:19:50 2011 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:lift="http://liftweb.net/">
-  <head>
-    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
-    <meta name="description" content="" />
-    <meta name="keywords" content="" />
-    <title><span class="lift:Menu.title">code:app:0.1-SNAPSHOT</span></title>
-    <script id="jquery" src="/classpath/jquery.js" type="text/javascript"/>
-  </head>
-  <body>
-    <div class="lift:Menu.builder"/>
-    <div class="lift:Msgs?showAll=true"/>
-
-    <lift:bind name="content" />
-
-    <hr />
-    <h4>
-      <a href="http://www.liftweb.net"><i>Lift</i></a> 
-      is Copyright 2007-2010 WorldWide Conferencing, LLC.
-      Distributed under an Apache 2.0 License.
-    </h4>
-  </body>
-</html>
--- a/directmapping-webapp/src/main/webapp/templates-hidden/wizard-all.html	Mon Aug 29 21:19:50 2011 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-<div>
-  <wizard:screen_info><div>Page <wizard:screen_number/> of <wizard:total_screens/></div></wizard:screen_info>
-  <wizard:wizard_top> <div> <wizard:bind/> </div> </wizard:wizard_top>
-  <wizard:screen_top> <div> <wizard:bind/> </div> </wizard:screen_top>
-  <wizard:errors> <div> <ul> <wizard:item> <li> <wizard:bind/> </li> </wizard:item> </ul> </div> </wizard:errors>
-  <div> <wizard:fields>
-      <table>
-        <wizard:line>
-          <tr>
-            <td>
-              <wizard:label><label wizard:for=""><wizard:bind/></label></wizard:label>
-	      <wizard:help><span><wizard:bind/></span></wizard:help>
-	      <wizard:field_errors> <ul> <wizard:error> <li> <wizard:bind/> </li> </wizard:error> </ul> </wizard:field_errors>
-          </td>
-          <td> <wizard:form/> </td>
-          </tr>
-        </wizard:line>
-      </table>
-    </wizard:fields> </div>
-  <div> <table> <tr> <td> <wizard:prev/> </td> <td> <wizard:cancel/> </td> <td> <wizard:next/> </td> </tr> </table> </div>
-  <wizard:screen_bottom> <div> <wizard:bind/> </div> </wizard:screen_bottom>
-  <wizard:wizard_bottom> <div> <wizard:bind/> </div> </wizard:wizard_bottom>
-</div>
--- a/project/FeDeRateBuild.scala	Mon Aug 29 21:19:50 2011 -0400
+++ b/project/FeDeRateBuild.scala	Tue Aug 30 01:05:16 2011 -0400
@@ -10,18 +10,23 @@
 
 object Dependencies {
   val scalatest = "org.scalatest" % "scalatest_2.9.0" % "1.6.1"
-  val jena = "com.hp.hpl.jena" % "jena" % "2.6.4"
-  val jena_iri = "com.hp.hpl.jena" % "iri" % "0.8" from "http://openjena.org/repo/com/hp/hpl/jena/iri/0.8/iri-0.8.jar"
-  val arq = "com.hp.hpl.jena" % "arq" % "2.8.7"
   val liftweb = "net.liftweb" %% "lift-webkit" % "2.3" % "compile"
   val jetty = "org.eclipse.jetty" % "jetty-webapp" % "7.3.0.v20110203" % "jetty"
   val logback = "ch.qos.logback" % "logback-classic" % "0.9.26"
+  val specs = "org.scala-tools.testing" % "specs_2.9.0-1" % "1.6.8" % "test"
+  val dispatch = "net.databinder" %% "dispatch-http" % "0.8.4" % "test"
+  val unfiltered_filter = "net.databinder" %% "unfiltered-filter" % "0.4.1"
+  val unfiltered_jetty = "net.databinder" %% "unfiltered-jetty" % "0.4.1"
+  val unfiltered_spec = "net.databinder" %% "unfiltered-spec" % "0.4.1" % "test"
+  val unfiltered_scalate = "net.databinder" %% "unfiltered-scalate" % "0.4.1"
+  val unfiltered_json = "net.databinder" %% "unfiltered-json" % "0.4.1"
+  val slf4jSimple = "org.slf4j" % "slf4j-simple" % "1.6.1"
+  val antiXML = "com.codecommit" %% "anti-xml" % "0.3-SNAPSHOT" % "test"
+  val jena = "com.hp.hpl.jena" % "jena" % "2.6.4"
+  val arq = "com.hp.hpl.jena" % "arq" % "2.8.8"
+  val grizzled = "org.clapper" %% "grizzled-scala" % "1.0.7" % "test"
 }
 
-
-//  override def compileOptions = super.compileOptions ++ Seq(Unchecked, Deprecation, ExplainTypes)
-//  override def defaultExcludes = super.defaultExcludes || "*~"
-
 object BuildSettings {
 
   val buildOrganization = "org.w3"
@@ -44,6 +49,24 @@
   import Resolvers._
   import Dependencies._
   import BuildSettings._
+  import sbtassembly.Plugin._
+
+  val ivyExclude =
+    <dependencies>
+      <dependency org="com.hp.hpl.jena" name="jena" rev="2.6.4">
+        <exclude org="org.slf4j" module="slf4j-log4j12"/>
+      </dependency>
+      <dependency org="com.hp.hpl.jena" name="arq" rev="2.8.8">
+        <exclude org="org.slf4j" module="slf4j-log4j12"/>
+      </dependency>
+    </dependencies> 
+
+      // <dependency org="" name="" rev="">
+      //   <exclude org="" module=""/>
+      // </dependency>
+      // <dependency org="" name="" rev="">
+      //   <exclude org="" module=""/>
+      // </dependency>
 
   val testSuiteSettings = Seq(
     libraryDependencies += scalatest
@@ -54,17 +77,46 @@
   )
 
   val jenaSettings = Seq(
-    libraryDependencies += Dependencies.jena,
-    libraryDependencies += jena_iri
+    ivyXML := ivyExclude
+    // libraryDependencies += Dependencies.jena,
+    // libraryDependencies += arq
   )
 
+  val webappSettings = Seq(
+//    libraryDependencies += specs,
+    libraryDependencies += unfiltered_spec,
+//    libraryDependencies += dispatch,
+    libraryDependencies += unfiltered_filter,
+    libraryDependencies += unfiltered_jetty,
+    libraryDependencies += unfiltered_json,
+    libraryDependencies += unfiltered_scalate,
+    libraryDependencies += slf4jSimple
+//      libraryDependencies += slf4jSimple,
+  )
 
   lazy val federate = Project(
     id = "federate",
     base = file("."),
-    settings = buildSettings,
-    aggregate = Seq(isomorphic, rdb, sql, rdf, rdfdsl, turtle , rdfmodel_test, turtle, turtle_test, rdfxml, rdfxml_test, jena)
-//    aggregate = Seq(directmapping, isomorphic, project, rdf2rdf, rdfxml, sharedtestdata, sparql2sparql2sql, sql, turtle, directmapping-test, jena, rdb, rdfdsl, rdfxml-test, sparql, sparql2sql, sql2sql, turtle-test, directmapping-webapp, jena-test, rdf, rdfmodel-test, sparql2sparql, sparql2sqlendpoint)
+    settings = buildSettings ++ assemblySettings ++ Seq(
+      jarName in Assembly := "read-write-web.jar"
+      ),
+    aggregate = Seq(isomorphic,
+                    rdb,
+                    sql,
+                    rdf,
+                    rdfdsl,
+                    turtle,
+                    rdfmodel_test,
+                    turtle,
+                    turtle_test,
+                    rdfxml,
+                    rdfxml_test,
+                    jena,
+                    shared_test_data,
+                    direct_mapping,
+                    direct_mapping_test,
+                    rdf2rdf,
+                    direct_mapping_webapp)
   )
 
   lazy val isomorphic = Project(
@@ -133,6 +185,37 @@
     settings = buildSettings ++ jenaSettings
   ) dependsOn (rdf)
 
+  lazy val shared_test_data = Project(
+    id = "sharedtestdata",
+    base = file("sharedtestdata"),
+    settings = buildSettings ++ jenaSettings
+  ) dependsOn (rdb, rdf, sql, turtle)
+  
+  
+  lazy val direct_mapping = Project(
+    id = "directmapping",
+    base = file("directmapping"),
+    settings = buildSettings
+  ) dependsOn (rdb, rdf, sql, shared_test_data)
+  
+  lazy val direct_mapping_test = Project(
+    id = "directmapping-test",
+    base = file("directmapping-test"),
+    settings = buildSettings ++ jenaSettings ++ testSuiteSettings
+  ) dependsOn (direct_mapping, jena)
+
+  lazy val rdf2rdf = Project(
+    id = "rdf2rdf",
+    base = file("rdf2rdf"),
+    settings = buildSettings ++ jenaSettings ++ testSettings
+  ) dependsOn (direct_mapping, jena)
+
+  lazy val direct_mapping_webapp = Project(
+    id = "directmapping-webapp",
+    base = file("directmapping-webapp"),
+    settings = buildSettings ++ jenaSettings ++ webappSettings
+  ) dependsOn (direct_mapping, jena, rdf2rdf)
+
 //  lazy val jenaTest = project("jena-test", "jena-test", new JenaTest(_), jena, rdfmodelTest, directmappingTest, turtleTest, rdfxmlTest)
 //  lazy val jena_test = Project(
 //    id = "jena-test",
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/project/plugins/build.sbt	Tue Aug 30 01:05:16 2011 -0400
@@ -0,0 +1,11 @@
+libraryDependencies <+= (sbtVersion) { sv => "com.eed3si9n" %% "sbt-assembly" % ("sbt" + sv + "_0.4") }
+
+resolvers += {
+  val typesafeRepoUrl = new java.net.URL("http://repo.typesafe.com/typesafe/releases")
+  val pattern = Patterns(false, "[organisation]/[module]/[sbtversion]/[revision]/[type]s/[module](-[classifier])-[revision].[ext]")
+  Resolver.url("Typesafe Repository", typesafeRepoUrl)(pattern)
+}
+
+libraryDependencies <<= (libraryDependencies, sbtVersion) { (deps, version) => 
+  deps :+ ("com.typesafe.sbteclipse" %% "sbteclipse" % "1.3-RC3" extra("sbtversion" -> version))
+}