server/java/renkan-web/src/main/webapp/static/js/thymol.js
changeset 316 242510015401
parent 309 0c3e6e66881f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/js/thymol.js	Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,376 @@
+/*-------------------- Thymol - the flavour of Thymeleaf --------------------*
+
+   Thymol version 0.1.2 Copyright 2012 James J. Benson.
+   jjbenson .AT. users.sf.net
+
+   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 expressed or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+ *---------------------------------------------------------------------------*/
+
+var thURL = "http://www.thymeleaf.org";
+var thPrefix = "th";
+var thProtocol = "file:///";
+var thCache = new Object;
+
+$(function() {
+	thymol();
+});
+
+var thymol = function() {
+	
+	var urlParams = {};
+	(function() {
+		var e, a = /\+/g, r = /([^&=]+)=?([^&]*)/g, d = function(s) {
+			return decodeURIComponent(s.replace(a, " "));
+		}, f = function(s) {
+			return new Param(d(s));
+		}, q = window.location.search.substring(1);
+		while (e = r.exec(q)) {
+			urlParams[d(e[1])] = f(e[2]);
+		}
+	})();
+
+	var debug = getThParam("thDebug",true,false);
+	var root = getThParam("thRoot",false,true);
+	var path = getThParam("thPath",false,true);
+
+	$.ajaxSetup({
+		async : false,
+		isLocal : true
+	});
+
+	(function() {
+		var htmlTag = $("html")[0];
+		$(htmlTag.attributes).each(function() {
+			if (thURL == this.value) {
+				var nsspec = this.localName.split(":");
+				if (nsspec.length > 0) {
+					thPrefix = nsspec[nsspec.length - 1];
+					return;
+				}
+			}
+		});
+	})();
+
+	var thIncl = new ThObj("include");
+	var thSubs = new ThObj("substituteby");
+	var thIf = new ThObj("if");
+	var thUnless = new ThObj("unless");
+	var thSwitch = new ThObj("switch");
+	var thCase = new ThObj("case");
+
+	var thFragEscp = "[" + thPrefix + "\\:fragment='";
+	var base = new ThNode(document, false, null, null, null, document.nodeName, "::", false, document);
+	process(base);
+	return;
+
+	function process(base) {
+		var n = base;
+		while (n.thDoc) {
+			getChildren(n);
+			if (n.firstChild && n.firstChild.thDoc && !n.visited) {
+				n.visited = true;
+				n = n.firstChild;
+			}
+			else {
+				doReplace(n.isNode, n.element, n.thDoc);
+				if (n.nextSibling && n.nextSibling.thDoc) {
+					n = n.nextSibling;
+				}
+				else {
+					if (n == base)
+						break;
+					else {
+						n = n.parentDoc;
+					}
+				}
+			}
+		}
+	}
+
+	function getChildren(base) {
+		var thIfSpecs = $(thIf.escp, base.thDoc);
+		var thUnlessSpecs = $(thUnless.escp, base.thDoc);
+		var thSwitchSpecs = $(thSwitch.escp, base.thDoc);
+		var ths = $(thIfSpecs).add(thUnlessSpecs).add(thSwitchSpecs);
+		ths.each(function() {
+			var element = this;
+			$(element.attributes).each(function() {
+				var thAttr = this;
+				if (thIf.name == thAttr.name || thUnless.name == thAttr.name || thSwitch.name == thAttr.name) {
+					processConditional(element, base, thAttr);
+				}
+			});
+		});
+		var thInclSpecs = $(thIncl.escp, base.thDoc);
+		var thSubsSpecs = $(thSubs.escp, base.thDoc);
+		ths = $(thInclSpecs).add(thSubsSpecs);
+		var count = 0;
+		var last = null;
+		ths.each(function() {
+			var element = this;
+			$(element.attributes).each(function() {
+				var thAttr = this;
+				if (thIncl.name == thAttr.name || thSubs.name == thAttr.name) {
+					var child = processImport(element, base, thAttr);
+					if( child != null ) {
+						if (count == 0) {
+							base.firstChild = child;
+						}
+						else {
+							last.nextSibling = child;
+						}
+						last = child;
+						count++;						
+					}
+				}
+			});
+		});
+	}
+
+	function processConditional(element, base, attr) {
+		var args = attr.value.match(/[$\*#]{(!?.*)}/);
+		var processed = false;
+		if (args.length > 0) {
+			var param = args[1];
+			if (thSwitch.name == attr.name) {
+				processed = processSwitch(element, base, attr, param);
+			}
+			else {
+				var negate = false;
+				if (args[1].charAt(0) == '!') {
+					negate = true;
+					param = args[1].substring(1);
+				}
+				if ((!negate && isTrue(param)) || (negate && !isTrue(param))) {
+					if (thUnless.name == attr.name) { // true for "if" and
+						// false for "unless"
+						element.innerHTML = "";
+					}
+					processed = true;
+				}
+				else {
+					if (thIf.name == attr.name) { // false for "if", true for
+						// "unless"
+						element.innerHTML = "";
+					}
+					processed = true;
+				}
+
+			}
+		}
+		if (!processed && debug) {
+			window.alert("thymol.processConditional cannot process: " + attr.name + "=\"" + attr.value + "\"\n" + element.innerHTML);
+		}
+		element.removeAttribute(attr.name);
+	}
+
+	function processSwitch(element, base, attr, param) {
+		var matched = false;
+		var haveDefault = false;
+		var thCaseSpecs = $(thCase.escp, element);
+		thCaseSpecs.each(function() {
+			var caseClause = this;
+			var remove = true;
+			$(caseClause.attributes).each(function() {
+				var ccAttr = this;
+				if (thCase.name == ccAttr.name) {
+					if (!matched) {
+						var s = urlParams[param];
+						if (ccAttr.value == "*" || (s && (s.getStringValue() == ccAttr.value))) {
+							matched = true;
+							remove = false;
+						}
+					}
+					caseClause.removeAttribute(ccAttr.name);
+				}
+			});
+			if (remove) {
+				caseClause.innerHTML = "";
+			}
+		});
+		return matched;
+	}
+
+	function processImport(element, base, attr) {
+		var importNode = null;
+		var filePart = null;
+		var fragmentPart = "::";
+		if (attr.value.indexOf("::") < 0) {
+			filePart = getFilePart(attr.value); 
+		}
+		else {
+			var names = attr.value.split("::");
+			filePart = getFilePart(names[0].trim());
+			fragmentPart = substitute(names[1].trim());
+		}
+		var isNode = (thSubs.name == attr.localName);
+		if (thCache[filePart] != null && thCache[filePart][fragmentPart] != null) {
+			isNode = ((thSubs.name == attr.localName) || (fragmentPart == "::"));
+			importNode = new ThNode(thCache[filePart][fragmentPart], false, base, null, null, filePart, fragmentPart, isNode, element);
+		}
+		else {
+			var fileName = filePart + ".html";
+			$.get(fileName, function(content, status) {
+				if ("success" == status) {
+					if (thCache[filePart] == null) {
+						thCache[filePart] = new Object;
+					}
+					if (fragmentPart == "::") {
+						var htmlContent = $("html", content)[0];
+						thCache[filePart][fragmentPart] = htmlContent;
+					}
+					else {
+						var fragSpec = thFragEscp + fragmentPart + "']";
+						var fragArray = $(fragSpec, content);
+						$(fragArray).each(function() {
+							thCache[filePart][fragmentPart] = this;
+						});
+					}
+					importNode = new ThNode(thCache[filePart][fragmentPart], false, base, null, null, filePart, fragmentPart, isNode, element);
+				}
+				else if (debug) {
+					window.alert("file read failed: " + filePart + " fragment: " + fragmentPart);
+				}
+	    	}, "xml");
+			if (importNode == null && debug) {
+				window.alert("fragment import failed: " + filePart + " fragment: " + fragmentPart);
+			}
+		}
+		element.removeAttribute(attr.name);		
+		return importNode;
+	}
+	
+	function getFilePart(part) {
+		var result = substitute(part);
+		if( result.charAt(0) != '.' ) {	// Initial period character indicates a relative path
+			if( result.indexOf('/') >= 0 ) {	// If it doesn't start with a '.', and there are no path separators, it's also treated as relative
+				result = thProtocol + root + path + result;													
+			}
+		}
+		return result;
+	}
+
+	function doReplace(isNode, element, content) {
+		if (isNode) {
+			element.parentNode.replaceChild(content.cloneNode(true), element);
+		}
+		else {			
+			try {
+				element.innerHTML = content.innerHTML;
+			}
+			catch (err) { // Work-around for IE
+				while (element.firstChild != null) {
+					element.removeChild(element.firstChild);
+				}
+				for (i = 0; i < content.childNodes.length; i++) {
+					element.appendChild(content.childNodes[i].cloneNode(true));
+				}
+			}			
+		}
+	}
+
+	function ThNode(thDoc, visited, parentDoc, firstChild, nextSibling, fileName, fragName, isNode, element) {
+		this.thDoc = thDoc;
+		this.visited = visited;
+		this.parentDoc = parentDoc;
+		this.firstChild = firstChild;
+		this.nextSibling = nextSibling;
+		this.fileName = fileName;
+		this.fragName = fragName;
+		this.isNode = isNode;
+		this.element = element;
+	}
+
+	function ThObj(suffix) {
+		this.name = thPrefix + ":" + suffix;
+		this.escp = "[" + thPrefix + "\\:" + suffix + "]";
+	}
+
+	function Param(valueArg) {
+		this.value = valueArg;
+		this.getBooleanValue = function() {
+			return !(this.value == "false" || this.value == "off" || this.value == "no");
+		};
+		this.getStringValue = function() {
+			return this.value;
+		};
+		this.getNumericValue = function() {
+			return Number(this.value);
+		};
+	}
+
+	function isTrue(arg) {
+		var p = urlParams[arg];
+		if (p) {
+			return p.getBooleanValue();
+		}
+		return false;
+	}
+	
+	function substitute(argValue) {
+		var result = argValue;
+		var args = argValue.match(/[$\*#]{(!?.*)}/);
+		if (args != null && args.length > 0) {
+			var param = args[1];
+			if(param) {
+				var paramValue = urlParams[param];
+				if (paramValue) {
+					result = paramValue.value;
+				}					
+			}		
+		}			
+		return result;
+	}
+
+	function getThParam(paramName,isBoolean,isPath) {
+		var localValue;
+		if( isBoolean ) {
+			localValue = false;
+		}
+		else {
+			localValue = "";			
+		}
+		var theParam = urlParams[paramName];
+		if (isBoolean && theParam) {
+			localValue = theParam.getBooleanValue();
+		}
+		else {
+			var paramValue;
+			try {			
+				paramValue = eval(paramName);
+				if( !(typeof paramValue === "undefined") ) {
+					if( paramValue != null ) {
+						if ( isBoolean ) {
+							localValue = (paramValue==true);
+						}								
+						else {
+							localValue = paramValue;							
+						}
+					}
+				}
+			}
+			catch (err) {
+				if (err instanceof ReferenceError) {					
+				}
+				if (err instanceof EvalError) {					
+				}
+			}				
+		}
+		if( !isBoolean && isPath && localValue.length > 0 && localValue.charAt(localValue.length-1) != '/' ) {
+			localValue = localValue + '/';
+		}
+		return localValue;
+	}
+
+};
\ No newline at end of file