server/src/main/webapp/static/js/thymol.js
author ymh <ymh.work@gmail.com>
Mon, 25 Mar 2013 19:27:26 +0100
changeset 123 daa99448319d
permissions -rw-r--r--
first step for site administration
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
123
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
/*-------------------- Thymol - the flavour of Thymeleaf --------------------*
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
   Thymol version 0.1.2 Copyright 2012 James J. Benson.
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
   jjbenson .AT. users.sf.net
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
   Licensed under the Apache License, Version 2.0 (the "License");
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
   you may not use this file except in compliance with the License.
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
   You may obtain a copy of the License at
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
       http://www.apache.org/licenses/LICENSE-2.0
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
   Unless required by applicable law or agreed to in writing, software
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
   distributed under the License is distributed on an "AS IS" basis,
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either expressed or implied.
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
   See the License for the specific language governing permissions and
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
   limitations under the License.
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
 *---------------------------------------------------------------------------*/
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
var thURL = "http://www.thymeleaf.org";
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
var thPrefix = "th";
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
var thProtocol = "file:///";
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
var thCache = new Object;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
$(function() {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
	thymol();
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
});
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
var thymol = function() {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
	
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
	var urlParams = {};
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
	(function() {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
		var e, a = /\+/g, r = /([^&=]+)=?([^&]*)/g, d = function(s) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
			return decodeURIComponent(s.replace(a, " "));
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
		}, f = function(s) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
			return new Param(d(s));
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
		}, q = window.location.search.substring(1);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
		while (e = r.exec(q)) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
			urlParams[d(e[1])] = f(e[2]);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
		}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
	})();
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
	var debug = getThParam("thDebug",true,false);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
	var root = getThParam("thRoot",false,true);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
	var path = getThParam("thPath",false,true);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
	$.ajaxSetup({
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
		async : false,
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
		isLocal : true
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
	});
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
	(function() {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
		var htmlTag = $("html")[0];
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
		$(htmlTag.attributes).each(function() {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
			if (thURL == this.value) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
				var nsspec = this.localName.split(":");
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
				if (nsspec.length > 0) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
					thPrefix = nsspec[nsspec.length - 1];
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
					return;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
				}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
			}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
		});
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
	})();
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
	var thIncl = new ThObj("include");
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
	var thSubs = new ThObj("substituteby");
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
	var thIf = new ThObj("if");
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
	var thUnless = new ThObj("unless");
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
	var thSwitch = new ThObj("switch");
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
	var thCase = new ThObj("case");
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
	var thFragEscp = "[" + thPrefix + "\\:fragment='";
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
	var base = new ThNode(document, false, null, null, null, document.nodeName, "::", false, document);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
	process(base);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
	return;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
	function process(base) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
		var n = base;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
		while (n.thDoc) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
			getChildren(n);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
			if (n.firstChild && n.firstChild.thDoc && !n.visited) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
				n.visited = true;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
				n = n.firstChild;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
			}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
			else {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
				doReplace(n.isNode, n.element, n.thDoc);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
				if (n.nextSibling && n.nextSibling.thDoc) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
					n = n.nextSibling;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
				}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
				else {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
					if (n == base)
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
						break;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
					else {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
						n = n.parentDoc;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
					}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
				}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
			}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
		}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
	}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
	function getChildren(base) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
		var thIfSpecs = $(thIf.escp, base.thDoc);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
		var thUnlessSpecs = $(thUnless.escp, base.thDoc);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
		var thSwitchSpecs = $(thSwitch.escp, base.thDoc);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
		var ths = $(thIfSpecs).add(thUnlessSpecs).add(thSwitchSpecs);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
		ths.each(function() {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
			var element = this;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
			$(element.attributes).each(function() {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
				var thAttr = this;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
				if (thIf.name == thAttr.name || thUnless.name == thAttr.name || thSwitch.name == thAttr.name) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
					processConditional(element, base, thAttr);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
				}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
			});
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
		});
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
		var thInclSpecs = $(thIncl.escp, base.thDoc);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
		var thSubsSpecs = $(thSubs.escp, base.thDoc);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
		ths = $(thInclSpecs).add(thSubsSpecs);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
		var count = 0;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
		var last = null;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
		ths.each(function() {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
			var element = this;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
			$(element.attributes).each(function() {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
				var thAttr = this;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
				if (thIncl.name == thAttr.name || thSubs.name == thAttr.name) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
					var child = processImport(element, base, thAttr);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
					if( child != null ) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
						if (count == 0) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
							base.firstChild = child;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
						}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
						else {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
							last.nextSibling = child;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
						}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
						last = child;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
						count++;						
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
					}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
				}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
			});
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
		});
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
	}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
	function processConditional(element, base, attr) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
		var args = attr.value.match(/[$\*#]{(!?.*)}/);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
		var processed = false;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
		if (args.length > 0) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
			var param = args[1];
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
			if (thSwitch.name == attr.name) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
				processed = processSwitch(element, base, attr, param);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
			}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
			else {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
				var negate = false;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
				if (args[1].charAt(0) == '!') {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
					negate = true;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
					param = args[1].substring(1);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
				}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
				if ((!negate && isTrue(param)) || (negate && !isTrue(param))) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
					if (thUnless.name == attr.name) { // true for "if" and
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
						// false for "unless"
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
						element.innerHTML = "";
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
					}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
					processed = true;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
				}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
				else {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
					if (thIf.name == attr.name) { // false for "if", true for
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
						// "unless"
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
						element.innerHTML = "";
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
					}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
					processed = true;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
				}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
			}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
		}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
		if (!processed && debug) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
			window.alert("thymol.processConditional cannot process: " + attr.name + "=\"" + attr.value + "\"\n" + element.innerHTML);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
		}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
		element.removeAttribute(attr.name);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
	}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
	function processSwitch(element, base, attr, param) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
		var matched = false;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
		var haveDefault = false;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
		var thCaseSpecs = $(thCase.escp, element);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
		thCaseSpecs.each(function() {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
			var caseClause = this;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
			var remove = true;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
			$(caseClause.attributes).each(function() {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
				var ccAttr = this;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
				if (thCase.name == ccAttr.name) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
					if (!matched) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
						var s = urlParams[param];
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
						if (ccAttr.value == "*" || (s && (s.getStringValue() == ccAttr.value))) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
							matched = true;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
							remove = false;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
						}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
					}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
					caseClause.removeAttribute(ccAttr.name);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
				}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
			});
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
			if (remove) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
				caseClause.innerHTML = "";
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
			}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
		});
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
		return matched;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
	}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
	function processImport(element, base, attr) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
		var importNode = null;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
		var filePart = null;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
		var fragmentPart = "::";
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
		if (attr.value.indexOf("::") < 0) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
			filePart = getFilePart(attr.value); 
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
		}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
		else {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
			var names = attr.value.split("::");
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
			filePart = getFilePart(names[0].trim());
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
			fragmentPart = substitute(names[1].trim());
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
		}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
		var isNode = (thSubs.name == attr.localName);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
		if (thCache[filePart] != null && thCache[filePart][fragmentPart] != null) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
			isNode = ((thSubs.name == attr.localName) || (fragmentPart == "::"));
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
			importNode = new ThNode(thCache[filePart][fragmentPart], false, base, null, null, filePart, fragmentPart, isNode, element);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
		}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
		else {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
			var fileName = filePart + ".html";
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
			$.get(fileName, function(content, status) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
				if ("success" == status) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
					if (thCache[filePart] == null) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
						thCache[filePart] = new Object;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
					}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
					if (fragmentPart == "::") {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
						var htmlContent = $("html", content)[0];
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
						thCache[filePart][fragmentPart] = htmlContent;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
					}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
					else {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
						var fragSpec = thFragEscp + fragmentPart + "']";
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
						var fragArray = $(fragSpec, content);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
						$(fragArray).each(function() {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
							thCache[filePart][fragmentPart] = this;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
						});
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
					}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
					importNode = new ThNode(thCache[filePart][fragmentPart], false, base, null, null, filePart, fragmentPart, isNode, element);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
				}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
				else if (debug) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
					window.alert("file read failed: " + filePart + " fragment: " + fragmentPart);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
				}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
	    	}, "xml");
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
			if (importNode == null && debug) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
				window.alert("fragment import failed: " + filePart + " fragment: " + fragmentPart);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
			}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
		}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
		element.removeAttribute(attr.name);		
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
		return importNode;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
	}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
	
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
	function getFilePart(part) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
		var result = substitute(part);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
		if( result.charAt(0) != '.' ) {	// Initial period character indicates a relative path
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
			if( result.indexOf('/') >= 0 ) {	// If it doesn't start with a '.', and there are no path separators, it's also treated as relative
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
				result = thProtocol + root + path + result;													
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
			}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
		}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
		return result;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
	}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
	function doReplace(isNode, element, content) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
		if (isNode) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
			element.parentNode.replaceChild(content.cloneNode(true), element);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
		}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
		else {			
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
			try {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
				element.innerHTML = content.innerHTML;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
			}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
			catch (err) { // Work-around for IE
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
				while (element.firstChild != null) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
					element.removeChild(element.firstChild);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
				}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
				for (i = 0; i < content.childNodes.length; i++) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
					element.appendChild(content.childNodes[i].cloneNode(true));
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
				}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
			}			
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
		}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
	}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
	function ThNode(thDoc, visited, parentDoc, firstChild, nextSibling, fileName, fragName, isNode, element) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
		this.thDoc = thDoc;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
		this.visited = visited;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
		this.parentDoc = parentDoc;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
		this.firstChild = firstChild;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
		this.nextSibling = nextSibling;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
		this.fileName = fileName;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
		this.fragName = fragName;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
		this.isNode = isNode;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
		this.element = element;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
	}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
	function ThObj(suffix) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
		this.name = thPrefix + ":" + suffix;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
		this.escp = "[" + thPrefix + "\\:" + suffix + "]";
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
	}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
	function Param(valueArg) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
		this.value = valueArg;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
		this.getBooleanValue = function() {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
			return !(this.value == "false" || this.value == "off" || this.value == "no");
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
		};
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
		this.getStringValue = function() {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
			return this.value;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
		};
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
		this.getNumericValue = function() {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
			return Number(this.value);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
		};
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
	}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
	function isTrue(arg) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
		var p = urlParams[arg];
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
		if (p) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
			return p.getBooleanValue();
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
		}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
		return false;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
	}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
	
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
	function substitute(argValue) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
		var result = argValue;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
		var args = argValue.match(/[$\*#]{(!?.*)}/);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
		if (args != null && args.length > 0) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
			var param = args[1];
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
			if(param) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
				var paramValue = urlParams[param];
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
				if (paramValue) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
					result = paramValue.value;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
				}					
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
			}		
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
		}			
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
		return result;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
	}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
	function getThParam(paramName,isBoolean,isPath) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
		var localValue;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
		if( isBoolean ) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
			localValue = false;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
		}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
		else {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
			localValue = "";			
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
		}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
		var theParam = urlParams[paramName];
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
		if (isBoolean && theParam) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
			localValue = theParam.getBooleanValue();
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
		}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
		else {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
			var paramValue;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
			try {			
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
				paramValue = eval(paramName);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
				if( !(typeof paramValue === "undefined") ) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
					if( paramValue != null ) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
						if ( isBoolean ) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
							localValue = (paramValue==true);
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
						}								
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
						else {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
							localValue = paramValue;							
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
						}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
					}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
				}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
			}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
			catch (err) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
				if (err instanceof ReferenceError) {					
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
				}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
				if (err instanceof EvalError) {					
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
				}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
			}				
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
		}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
		if( !isBoolean && isPath && localValue.length > 0 && localValue.charAt(localValue.length-1) != '/' ) {
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
			localValue = localValue + '/';
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
		}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
		return localValue;
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
	}
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
daa99448319d first step for site administration
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
};