added jsdoc support, and a script to generate the docs. jsdoc
authorhamidouk
Fri, 23 Dec 2011 11:38:47 +0100
branchjsdoc
changeset 520 fe008e95a716
parent 519 46e21d060650
child 521 df716b99c5bb
child 522 2b1a07f1d797
added jsdoc support, and a script to generate the docs. Also added sample documentation for the IriSP.widget base class.
.hgignore
sbin/build/gendoc.bat
sbin/build/gendoc.sh
sbin/res/app/frame.js
sbin/res/app/frame/Chain.js
sbin/res/app/frame/Dumper.js
sbin/res/app/frame/Hash.js
sbin/res/app/frame/Link.js
sbin/res/app/frame/Namespace.js
sbin/res/app/frame/Opt.js
sbin/res/app/frame/Reflection.js
sbin/res/app/frame/String.js
sbin/res/app/frame/Testrun.js
sbin/res/app/handlers/FOODOC.js
sbin/res/app/handlers/XMLDOC.js
sbin/res/app/handlers/XMLDOC/DomReader.js
sbin/res/app/handlers/XMLDOC/XMLDoc.js
sbin/res/app/handlers/XMLDOC/XMLParse.js
sbin/res/app/lib/JSDOC.js
sbin/res/app/lib/JSDOC/DocComment.js
sbin/res/app/lib/JSDOC/DocTag.js
sbin/res/app/lib/JSDOC/JsDoc.js
sbin/res/app/lib/JSDOC/JsPlate.js
sbin/res/app/lib/JSDOC/Lang.js
sbin/res/app/lib/JSDOC/Parser.js
sbin/res/app/lib/JSDOC/PluginManager.js
sbin/res/app/lib/JSDOC/Symbol.js
sbin/res/app/lib/JSDOC/SymbolSet.js
sbin/res/app/lib/JSDOC/TextStream.js
sbin/res/app/lib/JSDOC/Token.js
sbin/res/app/lib/JSDOC/TokenReader.js
sbin/res/app/lib/JSDOC/TokenStream.js
sbin/res/app/lib/JSDOC/Util.js
sbin/res/app/lib/JSDOC/Walker.js
sbin/res/app/main.js
sbin/res/app/plugins/commentSrcJson.js
sbin/res/app/plugins/frameworkPrototype.js
sbin/res/app/plugins/functionCall.js
sbin/res/app/plugins/publishSrcHilite.js
sbin/res/app/plugins/symbolLink.js
sbin/res/app/plugins/tagParamConfig.js
sbin/res/app/plugins/tagSynonyms.js
sbin/res/app/run.js
sbin/res/app/t/TestDoc.js
sbin/res/app/t/runner.js
sbin/res/app/test.js
sbin/res/app/test/addon.js
sbin/res/app/test/anon_inner.js
sbin/res/app/test/augments.js
sbin/res/app/test/augments2.js
sbin/res/app/test/borrows.js
sbin/res/app/test/borrows2.js
sbin/res/app/test/config.js
sbin/res/app/test/constructs.js
sbin/res/app/test/encoding.js
sbin/res/app/test/encoding_other.js
sbin/res/app/test/event.js
sbin/res/app/test/exports.js
sbin/res/app/test/functions_anon.js
sbin/res/app/test/functions_nested.js
sbin/res/app/test/global.js
sbin/res/app/test/globals.js
sbin/res/app/test/ignore.js
sbin/res/app/test/inner.js
sbin/res/app/test/jsdoc_test.js
sbin/res/app/test/lend.js
sbin/res/app/test/memberof.js
sbin/res/app/test/memberof2.js
sbin/res/app/test/memberof3.js
sbin/res/app/test/memberof_constructor.js
sbin/res/app/test/module.js
sbin/res/app/test/multi_methods.js
sbin/res/app/test/name.js
sbin/res/app/test/namespace_nested.js
sbin/res/app/test/nocode.js
sbin/res/app/test/oblit_anon.js
sbin/res/app/test/overview.js
sbin/res/app/test/param_inline.js
sbin/res/app/test/params_optional.js
sbin/res/app/test/prototype.js
sbin/res/app/test/prototype_nested.js
sbin/res/app/test/prototype_oblit.js
sbin/res/app/test/prototype_oblit_constructor.js
sbin/res/app/test/public.js
sbin/res/app/test/scripts/code.js
sbin/res/app/test/scripts/notcode.txt
sbin/res/app/test/shared.js
sbin/res/app/test/shared2.js
sbin/res/app/test/shortcuts.js
sbin/res/app/test/static_this.js
sbin/res/app/test/synonyms.js
sbin/res/app/test/tosource.js
sbin/res/app/test/variable_redefine.js
sbin/res/jsdoc/LdtPlayer-release.js
sbin/res/jsdoc/README.txt
sbin/res/jsdoc/app/frame.js
sbin/res/jsdoc/app/frame/Chain.js
sbin/res/jsdoc/app/frame/Dumper.js
sbin/res/jsdoc/app/frame/Hash.js
sbin/res/jsdoc/app/frame/Link.js
sbin/res/jsdoc/app/frame/Namespace.js
sbin/res/jsdoc/app/frame/Opt.js
sbin/res/jsdoc/app/frame/Reflection.js
sbin/res/jsdoc/app/frame/String.js
sbin/res/jsdoc/app/frame/Testrun.js
sbin/res/jsdoc/app/handlers/FOODOC.js
sbin/res/jsdoc/app/handlers/XMLDOC.js
sbin/res/jsdoc/app/handlers/XMLDOC/DomReader.js
sbin/res/jsdoc/app/handlers/XMLDOC/XMLDoc.js
sbin/res/jsdoc/app/handlers/XMLDOC/XMLParse.js
sbin/res/jsdoc/app/lib/JSDOC.js
sbin/res/jsdoc/app/lib/JSDOC/DocComment.js
sbin/res/jsdoc/app/lib/JSDOC/DocTag.js
sbin/res/jsdoc/app/lib/JSDOC/JsDoc.js
sbin/res/jsdoc/app/lib/JSDOC/JsPlate.js
sbin/res/jsdoc/app/lib/JSDOC/Lang.js
sbin/res/jsdoc/app/lib/JSDOC/Parser.js
sbin/res/jsdoc/app/lib/JSDOC/PluginManager.js
sbin/res/jsdoc/app/lib/JSDOC/Symbol.js
sbin/res/jsdoc/app/lib/JSDOC/SymbolSet.js
sbin/res/jsdoc/app/lib/JSDOC/TextStream.js
sbin/res/jsdoc/app/lib/JSDOC/Token.js
sbin/res/jsdoc/app/lib/JSDOC/TokenReader.js
sbin/res/jsdoc/app/lib/JSDOC/TokenStream.js
sbin/res/jsdoc/app/lib/JSDOC/Util.js
sbin/res/jsdoc/app/lib/JSDOC/Walker.js
sbin/res/jsdoc/app/main.js
sbin/res/jsdoc/app/plugins/commentSrcJson.js
sbin/res/jsdoc/app/plugins/frameworkPrototype.js
sbin/res/jsdoc/app/plugins/functionCall.js
sbin/res/jsdoc/app/plugins/publishSrcHilite.js
sbin/res/jsdoc/app/plugins/symbolLink.js
sbin/res/jsdoc/app/plugins/tagParamConfig.js
sbin/res/jsdoc/app/plugins/tagSynonyms.js
sbin/res/jsdoc/app/run.js
sbin/res/jsdoc/app/t/TestDoc.js
sbin/res/jsdoc/app/t/runner.js
sbin/res/jsdoc/app/test.js
sbin/res/jsdoc/app/test/addon.js
sbin/res/jsdoc/app/test/anon_inner.js
sbin/res/jsdoc/app/test/augments.js
sbin/res/jsdoc/app/test/augments2.js
sbin/res/jsdoc/app/test/borrows.js
sbin/res/jsdoc/app/test/borrows2.js
sbin/res/jsdoc/app/test/config.js
sbin/res/jsdoc/app/test/constructs.js
sbin/res/jsdoc/app/test/encoding.js
sbin/res/jsdoc/app/test/encoding_other.js
sbin/res/jsdoc/app/test/event.js
sbin/res/jsdoc/app/test/exports.js
sbin/res/jsdoc/app/test/functions_anon.js
sbin/res/jsdoc/app/test/functions_nested.js
sbin/res/jsdoc/app/test/global.js
sbin/res/jsdoc/app/test/globals.js
sbin/res/jsdoc/app/test/ignore.js
sbin/res/jsdoc/app/test/inner.js
sbin/res/jsdoc/app/test/jsdoc_test.js
sbin/res/jsdoc/app/test/lend.js
sbin/res/jsdoc/app/test/memberof.js
sbin/res/jsdoc/app/test/memberof2.js
sbin/res/jsdoc/app/test/memberof3.js
sbin/res/jsdoc/app/test/memberof_constructor.js
sbin/res/jsdoc/app/test/module.js
sbin/res/jsdoc/app/test/multi_methods.js
sbin/res/jsdoc/app/test/name.js
sbin/res/jsdoc/app/test/namespace_nested.js
sbin/res/jsdoc/app/test/nocode.js
sbin/res/jsdoc/app/test/oblit_anon.js
sbin/res/jsdoc/app/test/overview.js
sbin/res/jsdoc/app/test/param_inline.js
sbin/res/jsdoc/app/test/params_optional.js
sbin/res/jsdoc/app/test/prototype.js
sbin/res/jsdoc/app/test/prototype_nested.js
sbin/res/jsdoc/app/test/prototype_oblit.js
sbin/res/jsdoc/app/test/prototype_oblit_constructor.js
sbin/res/jsdoc/app/test/public.js
sbin/res/jsdoc/app/test/scripts/code.js
sbin/res/jsdoc/app/test/scripts/notcode.txt
sbin/res/jsdoc/app/test/shared.js
sbin/res/jsdoc/app/test/shared2.js
sbin/res/jsdoc/app/test/shortcuts.js
sbin/res/jsdoc/app/test/static_this.js
sbin/res/jsdoc/app/test/synonyms.js
sbin/res/jsdoc/app/test/tosource.js
sbin/res/jsdoc/app/test/variable_redefine.js
sbin/res/jsdoc/changes.txt
sbin/res/jsdoc/conf/sample.conf
sbin/res/jsdoc/java/build.xml
sbin/res/jsdoc/java/build_1.4.xml
sbin/res/jsdoc/java/classes/js.jar
sbin/res/jsdoc/java/src/JsDebugRun.java
sbin/res/jsdoc/java/src/JsRun.java
sbin/res/jsdoc/jsdebug.jar
sbin/res/jsdoc/jsrun.jar
sbin/res/jsdoc/jsrun.sh
sbin/res/jsdoc/out/jsdoc/files.html
sbin/res/jsdoc/out/jsdoc/index.html
sbin/res/jsdoc/out/jsdoc/symbols/_global_.html
sbin/res/jsdoc/out/jsdoc/symbols/src/LdtPlayer-release.js.html
sbin/res/jsdoc/templates/jsdoc/allclasses.tmpl
sbin/res/jsdoc/templates/jsdoc/allfiles.tmpl
sbin/res/jsdoc/templates/jsdoc/class.tmpl
sbin/res/jsdoc/templates/jsdoc/index.tmpl
sbin/res/jsdoc/templates/jsdoc/publish.js
sbin/res/jsdoc/templates/jsdoc/static/default.css
sbin/res/jsdoc/templates/jsdoc/static/header.html
sbin/res/jsdoc/templates/jsdoc/static/index.html
sbin/res/jsdoc/templates/jsdoc/symbol.tmpl
sbin/res/jsrun.jar
sbin/res/templates/jsdoc/allclasses.tmpl
sbin/res/templates/jsdoc/allfiles.tmpl
sbin/res/templates/jsdoc/class.tmpl
sbin/res/templates/jsdoc/index.tmpl
sbin/res/templates/jsdoc/publish.js
sbin/res/templates/jsdoc/static/default.css
sbin/res/templates/jsdoc/static/header.html
sbin/res/templates/jsdoc/static/index.html
sbin/res/templates/jsdoc/symbol.tmpl
src/js/main.js
src/js/widgets.js
--- a/.hgignore	Fri Dec 23 10:59:23 2011 +0100
+++ b/.hgignore	Fri Dec 23 11:38:47 2011 +0100
@@ -7,3 +7,4 @@
 *.swp
 *.orig
 src/js/site.js
+doc/jsdoc/*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/build/gendoc.bat	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,1 @@
+java -jar ../res/jsdoc/jsrun.jar ../res/jsdoc/app/run.js -a -t=../res/jsdoc/templates/jsdoc/ ../../build/LdtPlayer-release.js -d=../../doc/jsdoc/
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/build/gendoc.sh	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,2 @@
+#!/bin/sh
+java -jar ../res/jsdoc/jsrun.jar ../res/jsdoc/app/run.js -a -t=../res/jsdoc/templates/jsdoc/ ../../build/LdtPlayer-release.js -d=../../doc/jsdoc/
\ No newline at end of file
--- a/sbin/res/app/frame.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-IO.include("frame/Opt.js");
-IO.include("frame/Chain.js");
-IO.include("frame/Link.js");
-IO.include("frame/String.js");
-IO.include("frame/Hash.js");
-IO.include("frame/Namespace.js");
-//IO.include("frame/Reflection.js");
-
-/** A few helper functions to make life a little easier. */
-
-function defined(o) {
-	return (o !== undefined);
-}
-
-function copy(o) { // todo check for circular refs
-	if (o == null || typeof(o) != 'object') return o;
-	var c = new o.constructor();
-	for(var p in o)	c[p] = copy(o[p]);
-	return c;
-}
-
-function isUnique(arr) {
-	var l = arr.length;
-	for(var i = 0; i < l; i++ ) {
-		if (arr.lastIndexOf(arr[i]) > i) return false;
-	}
-	return true;
-}
-
-/** Returns the given string with all regex meta characters backslashed. */
-RegExp.escapeMeta = function(str) {
-	return str.replace(/([$^\\\/()|?+*\[\]{}.-])/g, "\\$1");
-}
--- a/sbin/res/app/frame/Chain.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-/**@constructor*/
-function ChainNode(object, link) {
-	this.value = object;
-	this.link = link; // describes this node's relationship to the previous node
-}
-
-/**@constructor*/
-function Chain(valueLinks) {
-	this.nodes = [];
-	this.cursor = -1;
-	
-	if (valueLinks && valueLinks.length > 0) {
-		this.push(valueLinks[0], "//");
-		for (var i = 1, l = valueLinks.length; i < l; i+=2) {
-			this.push(valueLinks[i+1], valueLinks[i]);
-		}
-	}
-}
-
-Chain.prototype.push = function(o, link) {
-	if (this.nodes.length > 0 && link) this.nodes.push(new ChainNode(o, link));
-	else this.nodes.push(new ChainNode(o));
-}
-
-Chain.prototype.unshift = function(o, link) {
-	if (this.nodes.length > 0 && link) this.nodes[0].link = link;
-	this.nodes.unshift(new ChainNode(o));
-	this.cursor++;
-}
-
-Chain.prototype.get = function() {
-	if (this.cursor < 0 || this.cursor > this.nodes.length-1) return null;
-	return this.nodes[this.cursor];
-}
-
-Chain.prototype.first = function() {
-	this.cursor = 0;
-	return this.get();
-}
-
-Chain.prototype.last = function() {
-	this.cursor = this.nodes.length-1;
-	return this.get();
-}
-
-Chain.prototype.next = function() {
-	this.cursor++;
-	return this.get();
-}
-
-Chain.prototype.prev = function() {
-	this.cursor--;
-	return this.get();
-}
-
-Chain.prototype.toString = function() {
-	var string = "";
-	for (var i = 0, l = this.nodes.length; i < l; i++) {
-		if (this.nodes[i].link) string += " -("+this.nodes[i].link+")-> ";
-		string += this.nodes[i].value.toString();
-	}
-	return string;
-}
-
-Chain.prototype.joinLeft = function() {
-	var result = "";
-	for (var i = 0, l = this.cursor; i < l; i++) {
-		if (result && this.nodes[i].link) result += this.nodes[i].link;
-		result += this.nodes[i].value.toString();
-	}
-	return result;
-}
-
-
-/* USAGE:
-
-var path = "one/two/three.four/five-six";
-var pathChain = new Chain(path.split(/([\/.-])/));
-print(pathChain);
-
-var lineage = new Chain();
-lineage.push("Port");
-lineage.push("Les", "son");
-lineage.push("Dawn", "daughter");
-lineage.unshift("Purdie", "son");
-
-print(lineage);
-
-// walk left
-for (var node = lineage.last(); node !== null; node = lineage.prev()) {
-	print("< "+node.value);
-}
-
-// walk right
-var node = lineage.first()
-while (node !== null) {
-	print(node.value);
-	node = lineage.next();
-	if (node && node.link) print("had a "+node.link+" named");
-}
-
-*/
\ No newline at end of file
--- a/sbin/res/app/frame/Dumper.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,144 +0,0 @@
-/**
- * @class
-<pre>
-This is a lightly modified version of Kevin Jones' JavaScript
-library Data.Dump. To download the original visit:
-    <a href="http://openjsan.org/doc/k/ke/kevinj/Data/Dump/">http://openjsan.org/doc/k/ke/kevinj/Data/Dump/</a>
-
-AUTHORS
-
-The Data.Dump JavaScript module is written by Kevin Jones 
-(kevinj@cpan.org), based on Data::Dump by Gisle Aas (gisle@aas.no),
-based on Data::Dumper by Gurusamy Sarathy (gsar@umich.edu).
-
-COPYRIGHT
-
-Copyright 2007 Kevin Jones. Copyright 1998-2000,2003-2004 Gisle Aas.
-Copyright 1996-1998 Gurusamy Sarathy.
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the Perl Artistic License
-
-See http://www.perl.com/perl/misc/Artistic.html
-</pre>
- * @static
- */
-Dumper = {
-	/** @param [...] The objects to dump. */
-	dump: function () {
-	    if (arguments.length > 1)
-	        return this._dump(arguments);
-	    else if (arguments.length == 1)
-	        return this._dump(arguments[0]);
-	    else
-	        return "()";
-	},
-	
-	_dump: function (obj) {
-		if (typeof obj == 'undefined') return 'undefined';
-		var out;
-		if (obj.serialize) { return obj.serialize(); }
-		var type = this._typeof(obj);
-		if (obj.circularReference) obj.circularReference++;
-		switch (type) {
-			case 'circular':
-				out = "{ //circularReference\n}";
-				break;
-			case 'object':
-				var pairs = new Array;
-				
-				for (var prop in obj) {
-					if (prop != "circularReference" && obj.hasOwnProperty(prop)) { //hide inherited properties
-						pairs.push(prop + ': ' + this._dump(obj[prop]));
-					}
-				}
-	
-				out = '{' + this._format_list(pairs) + '}';
-				break;
-	
-			case 'string':
-				for (var prop in Dumper.ESC) {
-					if (Dumper.ESC.hasOwnProperty(prop)) {
-						obj = obj.replace(prop, Dumper.ESC[prop]);
-					}
-				}
-	
-			// Escape UTF-8 Strings
-				if (obj.match(/^[\x00-\x7f]*$/)) {
-					out = '"' + obj.replace(/\"/g, "\\\"").replace(/([\n\r]+)/g, "\\$1") + '"';
-				}
-				else {
-					out = "unescape('"+escape(obj)+"')";
-				}
-				break;
-	
-			case 'array':
-				var elems = new Array;
-	
-				for (var i=0; i<obj.length; i++) {
-					elems.push( this._dump(obj[i]) );
-				}
-	
-				out = '[' + this._format_list(elems) + ']';
-				break;
-	
-			case 'date':
-			// firefox returns GMT strings from toUTCString()...
-			var utc_string = obj.toUTCString().replace(/GMT/,'UTC');
-				out = 'new Date("' + utc_string + '")';
-				break;
-	
-			case 'element':
-				// DOM element
-				out = this._dump_dom(obj);
-				break;
-		
-				default:
-					out = obj;
-		}
-	
-		out = String(out).replace(/\n/g, '\n    ');
-		out = out.replace(/\n    (.*)$/,"\n$1");
-	
-		return out;
-	},
-	
-	_format_list: function (list) {
-		if (!list.length) return '';
-		var nl = list.toString().length > 60 ? '\n' : ' ';
-		return nl + list.join(',' + nl) + nl;
-    },
-    
-    _typeof: function (obj) {
-    	if (obj && obj.circularReference && obj.circularReference > 1) return 'circular';
-		if (Array.prototype.isPrototypeOf(obj)) return 'array';
-		if (Date.prototype.isPrototypeOf(obj)) return 'date';
-		if (typeof obj.nodeType != 'undefined') return 'element';
-		return typeof(obj);
-	},
-	
-	_dump_dom: function (obj) {
-		return '"' + Dumper.nodeTypes[obj.nodeType] + '"';
-	}
-};
-
-Dumper.ESC = {
-    "\t": "\\t",
-    "\n": "\\n",
-    "\f": "\\f"
-};
-
-Dumper.nodeTypes = {
-    1: "ELEMENT_NODE",
-    2: "ATTRIBUTE_NODE",
-    3: "TEXT_NODE",
-    4: "CDATA_SECTION_NODE",
-    5: "ENTITY_REFERENCE_NODE",
-    6: "ENTITY_NODE",
-    7: "PROCESSING_INSTRUCTION_NODE",
-    8: "COMMENT_NODE",
-    9: "DOCUMENT_NODE",
-    10: "DOCUMENT_TYPE_NODE",
-    11: "DOCUMENT_FRAGMENT_NODE",
-    12: "NOTATION_NODE"
-};
\ No newline at end of file
--- a/sbin/res/app/frame/Hash.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,84 +0,0 @@
-/**
-	@constructor
-	@example
-	var _index = new Hash();
-	_index.set("a", "apple");
-	_index.set("b", "blue");
-	_index.set("c", "coffee");
-
-	for (var p = _index.first(); p; p = _index.next()) {
-		print(p.key+" is for "+p.value);
-	}
-	
- */
-var Hash = function() {
-	this._map = {};
-	this._keys = [];
-	this._vals = [];
-	this.reset();
-}
-
-Hash.prototype.set = function(k, v) {
-	if (k != "") {
-		this._keys.push(k);
-		this._map["="+k] = this._vals.length;
-		this._vals.push(v);
-	}
-}
-
-Hash.prototype.replace = function(k, k2, v) {
-	if (k == k2) return;
-
-	var offset = this._map["="+k];
-	this._keys[offset] = k2;
-	if (typeof v != "undefined") this._vals[offset] = v;
-	this._map["="+k2] = offset;
-	delete(this._map["="+k]);
-}
-
-Hash.prototype.drop = function(k) {
-	if (k != "") {
-		var offset = this._map["="+k];
-		this._keys.splice(offset, 1);
-		this._vals.splice(offset, 1);
-		delete(this._map["="+k]);
-		for (var p in this._map) {
-			if (this._map[p] >= offset) this._map[p]--;
-		}
-		if (this._cursor >= offset && this._cursor > 0) this._cursor--;
-	}
-}
-
-Hash.prototype.get = function(k) {
-	if (k != "") {
-		return this._vals[this._map["="+k]];
-	}
-}
-
-Hash.prototype.keys = function() {
-	return this._keys;
-}
-
-Hash.prototype.hasKey = function(k) {
-	if (k != "") {
-		return (typeof this._map["="+k] != "undefined");
-	}
-}
-
-Hash.prototype.values = function() {
-	return this._vals;
-}
-
-Hash.prototype.reset = function() {
-	this._cursor = 0;
-}
-
-Hash.prototype.first = function() {
-	this.reset();
-	return this.next();
-}
-
-Hash.prototype.next = function() {
-	if (this._cursor++ < this._keys.length)
-		return {key: this._keys[this._cursor-1], value: this._vals[this._cursor-1]};
-}
\ No newline at end of file
--- a/sbin/res/app/frame/Link.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,173 +0,0 @@
-/** Handle the creation of HTML links to documented symbols.
-	@constructor
-*/
-function Link() {
-	this.alias = "";
-	this.src = "";
-	this.file = "";
-	this.text = "";
-	this.innerName = "";
-	this.classLink = false;
-	this.targetName = "";
-	
-	this.target = function(targetName) {
-		if (defined(targetName)) this.targetName = targetName;
-		return this;
-	}
-	this.inner = function(inner) {
-		if (defined(inner)) this.innerName = inner;
-		return this;
-	}
-	this.withText = function(text) {
-		if (defined(text)) this.text = text;
-		return this;
-	}
-	this.toSrc = function(filename) {
-		if (defined(filename)) this.src = filename;
-		return this;
-	}
-	this.toSymbol = function(alias) {
-		if (defined(alias)) this.alias = new String(alias);
-		return this;
-	}
-	this.toClass = function(alias) {
-		this.classLink = true;
-		return this.toSymbol(alias);
-	}
-	this.toFile = function(file) {
-		if (defined(file)) this.file = file;
-		return this;
-	}
-	
-	this.toString = function() {
-		var linkString;
-		var thisLink = this;
-
-		if (this.alias) {
-			linkString = this.alias.replace(/(^|[^a-z$0-9_#.:^-])([|a-z$0-9_#.:^-]+)($|[^a-z$0-9_#.:^-])/i,
-				function(match, prematch, symbolName, postmatch) {
-					var symbolNames = symbolName.split("|");
-					var links = [];
-					for (var i = 0, l = symbolNames.length; i < l; i++) {
-						thisLink.alias = symbolNames[i];
-						links.push(thisLink._makeSymbolLink(symbolNames[i]));
-					}
-					return prematch+links.join("|")+postmatch;
-				}
-			);
-		}
-		else if (this.src) {
-			linkString = thisLink._makeSrcLink(this.src);
-		}
-		else if (this.file) {
-			linkString = thisLink._makeFileLink(this.file);
-		}
-
-		return linkString;
-	}
-}
-
-/** prefixed for hashes */
-Link.hashPrefix = "";
-
-/** Appended to the front of relative link paths. */
-Link.base = "";
-
-Link.symbolNameToLinkName = function(symbol) {
-	var linker = "",
-		ns = "";
-	
-	if (symbol.isStatic) linker = ".";
-	else if (symbol.isInner) linker = "-";
-	
-	if (symbol.isEvent && !/^event:/.test(symbol.name)) {
-		ns = "event:";
-	}
-	return Link.hashPrefix+linker+ns+symbol.name;
-}
-
-Link.getSymbol= function(alias) {
-    var symbol= Link.symbolSet.getSymbol(alias);
-    
-    if (symbol)
-        return symbol;
-        
-    if ('#'!==alias.charAt(0) || !Link.currentSymbol)
-        return null;
-    
-    //  resolve relative name
-    var container= Link.currentSymbol;
-    
-    while (container)
-    {
-        symbol= Link.symbolSet.getSymbol(container.alias + alias);
-        if (symbol)
-            return symbol;
-        
-        //  No superclass
-        if (!container.augments.length)
-            return null;
-        
-        container= Link.symbolSet.getSymbol(container.augments[0].desc);
-    }
-    
-    return null;
-}
-
-/** Create a link to another symbol. */
-Link.prototype._makeSymbolLink = function(alias) {
-	var linkBase = Link.base+publish.conf.symbolsDir;
-	var linkTo = Link.getSymbol(alias);
-	var linkPath;
-	var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
-
-	// if there is no symbol by that name just return the name unaltered
-	if (!linkTo)
-	    return this.text || alias;
-	
-	// it's a symbol in another file
-	else {
-		if (!linkTo.is("CONSTRUCTOR") && !linkTo.isNamespace) { // it's a method or property
-			linkPath= (Link.filemap) ? Link.filemap[linkTo.memberOf] :
-				      escape(linkTo.memberOf) || "_global_";
-				linkPath += publish.conf.ext + "#" + Link.symbolNameToLinkName(linkTo);
-		}
-		else {
-			linkPath = (Link.filemap)? Link.filemap[linkTo.alias] : escape(linkTo.alias);
-			linkPath += publish.conf.ext;// + (this.classLink? "":"#" + Link.hashPrefix + "constructor");
-		}
-		linkPath = linkBase + linkPath
-	}
-        
-	var linkText= this.text || alias;
-    
-	var link = {linkPath: linkPath, linkText: linkText, linkInner: (this.innerName? "#"+this.innerName : "")};
-	
-	if (typeof JSDOC.PluginManager != "undefined") {
-		JSDOC.PluginManager.run("onSymbolLink", link);
-	}
-	
-	return "<a href=\""+link.linkPath+link.linkInner+"\""+target+">"+link.linkText+"</a>";
-}
-
-/** Create a link to a source file. */
-Link.prototype._makeSrcLink = function(srcFilePath) {
-	var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
-		
-	// transform filepath into a filename
-	var srcFile = srcFilePath.replace(/\.\.?[\\\/]/g, "").replace(/[:\\\/]/g, "_");
-	var outFilePath = Link.base + publish.conf.srcDir + srcFile + publish.conf.ext;
-
-	if (!this.text) this.text = FilePath.fileName(srcFilePath);
-	return "<a href=\""+outFilePath+"\""+target+">"+this.text+"</a>";
-}
-
-/** Create a link to a source file. */
-Link.prototype._makeFileLink = function(filePath) {
-	var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
-		
-	var outFilePath =  Link.base + filePath;
-
-	if (!this.text) this.text = filePath;
-	return "<a href=\""+outFilePath+"\""+target+">"+this.text+"</a>";
-}
\ No newline at end of file
--- a/sbin/res/app/frame/Namespace.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-_global_ = this;
-
-function Namespace(name, f) {
-	var n = name.split(".");
-	for (var o = _global_, i = 0, l = n.length; i < l; i++) {
-		o = o[n[i]] = o[n[i]] || {};
-	}
-	
-	if (f) f();
-}
\ No newline at end of file
--- a/sbin/res/app/frame/Opt.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,134 +0,0 @@
-/** @namespace */
-Opt = {
-	/**
-	 * Get commandline option values.
-	 * @param {Array} args Commandline arguments. Like ["-a=xml", "-b", "--class=new", "--debug"]
-	 * @param {object} optNames Map short names to long names. Like {a:"accept", b:"backtrace", c:"class", d:"debug"}.
-	 * @return {object} Short names and values. Like {a:"xml", b:true, c:"new", d:true}
-	 */
-	get: function(args, optNames) {
-		var opt = {"_": []}; // the unnamed option allows multiple values
-		for (var i = 0; i < args.length; i++) {
-			var arg = new String(args[i]);
-			var name;
-			var value;
-			if (arg.charAt(0) == "-") {
-				if (arg.charAt(1) == "-") { // it's a longname like --foo
-					arg = arg.substring(2);
-					var m = arg.split("=");
-					name = m.shift();
-					value = m.shift();
-					if (typeof value == "undefined") value = true;
-					
-					for (var n in optNames) { // convert it to a shortname
-						if (name == optNames[n]) {
-							name = n;
-						}
-					}
-				}
-				else { // it's a shortname like -f
-					arg = arg.substring(1);
-					var m = arg.split("=");
-					name = m.shift();
-					value = m.shift();
-					if (typeof value == "undefined") value = true;
-					
-					for (var n in optNames) { // find the matching key
-						if (name == n || name+'[]' == n) {
-							name = n;
-							break;
-						}
-					}
-				}
-				if (name.match(/(.+)\[\]$/)) { // it's an array type like n[]
-					name = RegExp.$1;
-					if (!opt[name]) opt[name] = [];
-				}
-				
-				if (opt[name] && opt[name].push) {
-					opt[name].push(value);
-				}
-				else {
-					opt[name] = value;
-				}
-			}
-			else { // not associated with any optname
-				opt._.push(args[i]);
-			}
-		}
-		return opt;
-	}
-}
-
-/*t:
-	plan(11, "Testing Opt.");
-	
-	is(
-		typeof Opt,
-		"object",
-		"Opt is an object."
-	);
-	
-	is(
-		typeof Opt.get,
-		"function",
-		"Opt.get is a function."
-	);
-	
-	var optNames = {a:"accept", b:"backtrace", c:"class", d:"debug", "e[]":"exceptions"};
-	var t_options = Opt.get(["-a=xml", "-b", "--class=new", "--debug", "-e=one", "-e=two", "foo", "bar"], optNames);
-	
-	is(
-		t_options.a,
-		"xml",
-		"an option defined with a short name can be accessed by its short name."
-	);
-	
-	is(
-		t_options.b,
-		true,
-		"an option defined with a short name and no value are true."
-	);
-	
-	is(
-		t_options.c,
-		"new",
-		"an option defined with a long name can be accessed by its short name."
-	);
-	
-	is(
-		t_options.d,
-		true,
-		"an option defined with a long name and no value are true."
-	);
-	
-	is(
-		typeof t_options.e,
-		"object",
-		"an option that can accept multiple values is defined."
-	);
-	
-	is(
-		t_options.e.length,
-		2,
-		"an option that can accept multiple values can have more than one value."
-	);
-	
-	is(
-		t_options.e[1],
-		"two",
-		"an option that can accept multiple values can be accessed as an array."
-	);
-	
-	is(
-		typeof t_options._,
-		"object",
-		"the property '_' is defined for unnamed options."
-	);
-	
-	is(
-		t_options._[0],
-		"foo",
-		"the property '_' can be accessed as an array."
-	);
- */
\ No newline at end of file
--- a/sbin/res/app/frame/Reflection.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/**@constructor*/
-function Reflection(obj) {
-	this.obj = obj;
-}
-
-Reflection.prototype.getConstructorName = function() {
-	if (this.obj.constructor.name) return this.obj.constructor.name;
-	var src = this.obj.constructor.toSource();
-	var name = src.substring(name.indexOf("function")+8, src.indexOf('(')).replace(/ /g,'');
-	return name;
-}
-
-Reflection.prototype.getMethod = function(name) {
-	for (var p in this.obj) {
-		if (p == name && typeof(this.obj[p]) == "function") return this.obj[p];
-	}
-	return null;
-}
-
-Reflection.prototype.getParameterNames = function() {
-	var src = this.obj.toSource();
-	src = src.substring(
-		src.indexOf("(", 8)+1, src.indexOf(")")
-	);
-	return src.split(/, ?/);
-}
--- a/sbin/res/app/frame/String.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-/**
-	@name String
-	@class Additions to the core string object.
-*/
-
-/** @author Steven Levithan, released as public domain. */
-String.prototype.trim = function() {
-	var str = this.replace(/^\s+/, '');
-	for (var i = str.length - 1; i >= 0; i--) {
-		if (/\S/.test(str.charAt(i))) {
-			str = str.substring(0, i + 1);
-			break;
-		}
-	}
-	return str;
-}
-/*t:
-	plan(6, "Testing String.prototype.trim.");
-	
-	var s = "   a bc   ".trim();
-	is(s, "a bc", "multiple spaces front and back are trimmed.");
-
-	s = "a bc\n\n".trim();
-	is(s, "a bc", "newlines only in back are trimmed.");
-	
-	s = "\ta bc".trim();
-	is(s, "a bc", "tabs only in front are trimmed.");
-	
-	s = "\n \t".trim();
-	is(s, "", "an all-space string is trimmed to empty.");
-	
-	s = "a b\nc".trim();
-	is(s, "a b\nc", "a string with no spaces in front or back is trimmed to itself.");
-	
-	s = "".trim();
-	is(s, "", "an empty string is trimmed to empty.");
-
-*/
-
-String.prototype.balance = function(open, close) {
-	var i = 0;
-	while (this.charAt(i) != open) {
-		if (i == this.length) return [-1, -1];
-		i++;
-	}
-	
-	var j = i+1;
-	var balance = 1;
-	while (j < this.length) {
-		if (this.charAt(j) == open) balance++;
-		if (this.charAt(j) == close) balance--;
-		if (balance == 0) break;
-		j++;
-		if (j == this.length) return [-1, -1];
-	}
-	
-	return [i, j];
-}
-/*t:
-	plan(16, "Testing String.prototype.balance.");
-	
-	var s = "{abc}".balance("{","}");
-	is(s[0], 0, "opener in first is found.");
-	is(s[1], 4, "closer in last is found.");
-	
-	s = "ab{c}de".balance("{","}");
-	is(s[0], 2, "opener in middle is found.");
-	is(s[1], 4, "closer in middle is found.");
-	
-	s = "a{b{c}de}f".balance("{","}");
-	is(s[0], 1, "nested opener is found.");
-	is(s[1], 8, "nested closer is found.");
-	
-	s = "{}".balance("{","}");
-	is(s[0], 0, "opener with no content is found.");
-	is(s[1], 1, "closer with no content is found.");
-	
-	s = "".balance("{","}");
-	is(s[0], -1, "empty string opener is -1.");
-	is(s[1], -1, "empty string closer is -1.");
-	
-	s = "{abc".balance("{","}");
-	is(s[0], -1, "opener with no closer returns -1.");
-	is(s[1], -1, "no closer returns -1.");
-	
-	s = "abc".balance("{","}");
-	is(s[0], -1, "no opener or closer returns -1 for opener.");
-	is(s[1], -1, "no opener or closer returns -1 for closer.");
-	
-	s = "a<bc}de".balance("<","}");
-	is(s[0], 1, "unmatching opener is found.");
-	is(s[1], 4, "unmatching closer is found.");
-*/
\ No newline at end of file
--- a/sbin/res/app/frame/Testrun.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,129 +0,0 @@
-/**
- * @fileOverview
- * @name JsTestrun
- * @author Michael Mathews micmath@gmail.com
- * @url $HeadURL: https://jsdoc-toolkit.googlecode.com/svn/tags/jsdoc_toolkit-2.4.0/jsdoc-toolkit/app/frame/Testrun.js $
- * @revision $Id: Testrun.js 418 2008-01-15 21:40:33Z micmath $
- * @license <a href="http://en.wikipedia.org/wiki/MIT_License">X11/MIT License</a>
- *          (See the accompanying README file for full details.)
- */
- 
-/**
-	Yet another unit testing tool for JavaScript.
-	@author Michael Mathews <a href="mailto:micmath@gmail.com">micmath@gmail.com</a>
-	@param {object} testCases Properties are testcase names, values are functions to execute as tests.
-*/
-function testrun(testCases) {
-	var ran = 0;
-	for (t in testCases) {
-		var result = testCases[t]();
-		ran++;
-	}
-	
-	return testrun.reportOut+"-------------------------------\n"+((testrun.fails>0)? ":( Failed "+testrun.fails+"/" : ":) Passed all ")+testrun.count+" test"+((testrun.count == 1)? "":"s")+".\n";
-}
-
-
-testrun.count = 0;
-testrun.current = null;
-testrun.passes = 0;
-testrun.fails = 0;
-testrun.reportOut = "";
-
-/** @private */
-testrun.report = function(text) {
-	testrun.reportOut += text+"\n";
-}
-
-/**
-	Check if test evaluates to true.
-	@param {string} test To be evaluated.
-	@param {string} message Optional. To be displayed in the report.
-	@return {boolean} True if the string test evaluates to true.
-*/
-ok = function(test, message) {
-	testrun.count++;
-	
-	var result;
-	try {
-		result = eval(test);
-		
-		if (result) {
-			testrun.passes++;
-			testrun.report("    OK "+testrun.count+" - "+((message != null)? message : ""));
-		}
-		else {
-			testrun.fails++;
-			testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
-		}
-	}
-	catch(e) {
-		testrun.fails++
-		testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
-
-	}
-}
-
-/**
-	Check if test is same as expected.
-	@param {string} test To be evaluated.
-	@param {string} expected
-	@param {string} message Optional. To be displayed in the report. 
-	@return {boolean} True if (test == expected). Note that the comparison is not a strict equality check.
-*/
-is = function(test, expected, message) {
-	testrun.count++;
-	
-	var result;
-	try {
-		result = eval(test);
-		
-		if (result == expected) {
-			testrun.passes++
-			testrun.report("    OK "+testrun.count+" - "+((message != null)? message : ""));
-		}
-		else {
-			testrun.fails++
-			testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
-			testrun.report("expected: "+expected);
-			testrun.report("     got: "+result);
-		}
-	}
-	catch(e) {
-		testrun.fails++
-		testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
-		testrun.report("expected: "+expected);
-		testrun.report("     got: "+result);}
-}
-
-/**
-	Check if test matches pattern.
-	@param {string} test To be evaluated.
-	@param {string} pattern Used to create a RegExp.
-	@param {string} message Optional. To be displayed in the report.
-	@return {boolean} True if test matches pattern.
-*/
-like = function(test, pattern, message) {
-	testrun.count++;
-
-	var result;
-	try {
-		result = eval(test);
-		var rgx = new RegExp(pattern);
-		
-		if (rgx.test(result)) {
-			testrun.passes++
-			testrun.report("    OK "+testrun.count+" - "+((message != null)? message : ""));
-		}
-		else {
-			testrun.fails++
-			testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
-			testrun.report("       this: "+result);
-			testrun.report("is not like: "+pattern);
-		}
-	}
-	catch(e) {
-		testrun.fails++
-		testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
-	}
-}
\ No newline at end of file
--- a/sbin/res/app/handlers/FOODOC.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/**
-   This is the main container for the FOODOC handler.
-   @namespace
-*/
-FOODOC = {
-};
-
-/** The current version string of this application. */
-FOODOC.VERSION = "1.0";
-
-FOODOC.handle = function(srcFile, src) {
-	LOG.inform("Handling file '" + srcFile + "'");
-	
-	return [
-		new JSDOC.Symbol(
-			"foo",
-			[],
-			"VIRTUAL",
-			new JSDOC.DocComment("/** This is a foo. */")
-		)
-	];
-};
-
-FOODOC.publish = function(symbolgroup) {
-	LOG.inform("Publishing symbolgroup.");
-};
--- a/sbin/res/app/handlers/XMLDOC.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/**
- * This is the main container for the XMLDOC handler.
- * @namespace
- * @author Brett Fattori (bfattori@fry.com)
- * @version $Revision: 498 $
- */
-XMLDOC = {
-	
-};
-
-/** The current version string of this application. */
-XMLDOC.VERSION = "1.0";
-
-/** Include the library necessary to handle XML files */
-IO.includeDir("handlers/XMLDOC/");
-
-/**
- * @type Symbol[]
- */
-XMLDOC.handle = function(srcFile, src) {
-	
-};
-
-XMLDOC.publish = function(symbolgroup) {
-	
-}
\ No newline at end of file
--- a/sbin/res/app/handlers/XMLDOC/DomReader.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,159 +0,0 @@
-LOG.inform("XMLDOC.DomReader loaded");
-
-XMLDOC.DomReader = function(root) {
-
-   this.dom = root;
-
-   /**
-    * The current node the reader is on
-    */
-   this.node = root;
-
-   /**
-    * Get the current node the reader is on
-    * @type XMLDOC.Parser.node
-    */
-   XMLDOC.DomReader.prototype.getNode = function() {
-      return this.node;
-   };
-
-   /**
-    * Set the node the reader should be positioned on.
-    * @param node {XMLDOC.Parser.node}
-    */
-   XMLDOC.DomReader.prototype.setNode = function(node) {
-      this.node = node;
-   };
-
-   /**
-    * A helper method to make sure the current node will
-    * never return null, unless null is passed as the root.
-    * @param step {String} An expression to evaluate - should return a node or null
-    */
-   XMLDOC.DomReader.prototype.navigate = function(step) {
-      var n;
-      if ((n = step) != null)
-      {
-         this.node = n;
-         return this.node;
-      }
-      return null;
-   };
-
-   /**
-    * Get the root node of the current node's document.
-    */
-   XMLDOC.DomReader.prototype.root = function() {
-      this.navigate(this.dom);
-   };
-
-   /**
-    * Get the parent of the current node.
-    */
-   XMLDOC.DomReader.prototype.parent = function() {
-      return this.navigate(this.node.parentNode());
-   };
-
-   /**
-    * Get the first child of the current node.
-    */
-   XMLDOC.DomReader.prototype.firstChild = function() {
-      return this.navigate(this.node.firstChild());
-   };
-
-   /**
-    * Get the last child of the current node.
-    */
-   XMLDOC.DomReader.prototype.lastChild = function() {
-      return this.navigate(this.node.lastChild());
-   };
-
-   /**
-    * Get the next sibling of the current node.
-    */
-   XMLDOC.DomReader.prototype.nextSibling = function() {
-      return this.navigate(this.node.nextSibling());
-   };
-
-   /**
-    * Get the previous sibling of the current node.
-    */
-   XMLDOC.DomReader.prototype.prevSibling = function() {
-      return this.navigate(this.node.prevSibling());
-   };
-
-   //===============================================================================================
-   // Support methods
-
-   /**
-    * Walk the tree starting with the current node, calling the plug-in for
-    * each node visited.  Each time the plug-in is called, the DomReader
-    * is passed as the only parameter.  Use the {@link XMLDOC.DomReader#getNode} method
-    * to access the current node.   <i>This method uses a depth first traversal pattern.</i>
-    *
-    * @param srcFile {String} The source file being evaluated
-    */
-   XMLDOC.DomReader.prototype.getSymbols = function(srcFile)
-   {
-      XMLDOC.DomReader.symbols = [];
-      XMLDOC.DomReader.currentFile = srcFile;
-      JSDOC.Symbol.srcFile = (srcFile || "");
-
-      if (defined(JSDOC.PluginManager)) {
-         JSDOC.PluginManager.run("onDomGetSymbols", this);
-      }
-
-      return XMLDOC.DomReader.symbols;
-   };
-
-   /**
-    * Find the node with the given name using a depth first traversal.
-    * Does not modify the DomReader's current node.
-    *
-    * @param name {String} The name of the node to find
-    * @return the node that was found, or null if not found
-    */
-   XMLDOC.DomReader.prototype.findNode = function(name)
-   {
-      var findNode = null;
-
-      // Start at the current node and move into the subtree,
-      // looking for the node with the given name
-      function deeper(node, find)
-      {
-         var look = null;
-
-         if (node) {
-            if (node.name == find)
-            {
-               return node;
-            }
-
-            if (node.firstChild())
-            {
-               look = deeper(node.firstChild(), find);
-            }
-
-            if (!look && node.nextSibling())
-            {
-               look = deeper(node.nextSibling(), find);
-            }
-         }
-
-         return look;
-      }
-
-      return deeper(this.getNode().firstChild(), name);
-   };
-
-   /**
-    * Find the next node with the given name using a depth first traversal.
-    *
-    * @param name {String} The name of the node to find
-    */
-   XMLDOC.DomReader.prototype.findPreviousNode = function(name)
-   {
-   };
-
-};
-
--- a/sbin/res/app/handlers/XMLDOC/XMLDoc.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-LOG.inform("XMLDOC.symbolize loaded");
-
-/**
- * Convert the source file to a set of symbols
- */
-XMLDOC.symbolize = function(srcFile, src) {
-
-   LOG.inform("Symbolizing file '" + srcFile + "'");
-
-   // XML files already have a defined structure, so we don't need to
-   // do anything but parse them.  The DOM reader can create a symbol
-   // table from the parsed XML.
-   var dr = new XMLDOC.DomReader(XMLDOC.Parser.parse(src));
-   return dr.getSymbols(srcFile);
-
-};
--- a/sbin/res/app/handlers/XMLDOC/XMLParse.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,292 +0,0 @@
-LOG.inform("XMLDOC.Parser loaded");
-
-/**
- * XML Parser object.  Returns an {@link #XMLDOC.Parser.node} which is
- * the root element of the parsed document.
- * <p/>
- * By default, this parser will only handle well formed XML.  To
- * allow the parser to handle HTML, set the <tt>XMLDOC.Parser.strictMode</tt>
- * variable to <tt>false</tt> before calling <tt>XMLDOC.Parser.parse()</tt>.
- * <p/>
- * <i>Note: If you pass poorly formed XML, it will cause the parser to throw
- * an exception.</i>
- *
- * @author Brett Fattori (bfattori@fry.com)
- * @author $Author: micmath $
- * @version $Revision: 497 $
- */
-XMLDOC.Parser = {};
-
-/**
- * Strict mode setting.  Setting this to false allows HTML-style source to
- * be parsed.  Normally, well formed XML has defined end tags, or empty tags
- * are properly formed.  Default: <tt>true</tt>
- * @type Boolean
- */
-XMLDOC.Parser.strictMode = true;
-
-/**
- * A node in an XML Document.  Node types are ROOT, ELEMENT, COMMENT, PI, and TEXT.
- * @param parent {XMLDOC.Parser.node} The parent node
- * @param name {String} The node name
- * @param type {String} One of the types
- */
-XMLDOC.Parser.node = function(parent, name, type)
-{
-   this.name = name;
-   this.type = type || "ELEMENT";
-   this.parent = parent;
-   this.charData = "";
-   this.attrs = {};
-   this.nodes = [];
-   this.cPtr = 0;
-
-   XMLDOC.Parser.node.prototype.getAttributeNames = function() {
-      var a = [];
-      for (var o in this.attrs)
-      {
-         a.push(o);
-      }
-
-      return a;
-   };
-
-   XMLDOC.Parser.node.prototype.getAttribute = function(attr) {
-      return this.attrs[attr];
-   };
-
-   XMLDOC.Parser.node.prototype.setAttribute = function(attr, val) {
-      this.attrs[attr] = val;
-   };
-
-   XMLDOC.Parser.node.prototype.getChild = function(idx) {
-      return this.nodes[idx];
-   };
-
-   XMLDOC.Parser.node.prototype.parentNode = function() {
-      return this.parent;
-   };
-
-   XMLDOC.Parser.node.prototype.firstChild = function() {
-      return this.nodes[0];
-   };
-
-   XMLDOC.Parser.node.prototype.lastChild = function() {
-      return this.nodes[this.nodes.length - 1];
-   };
-
-   XMLDOC.Parser.node.prototype.nextSibling = function() {
-      var p = this.parent;
-      if (p && (p.nodes.indexOf(this) + 1 != p.nodes.length))
-      {
-         return p.getChild(p.nodes.indexOf(this) + 1);
-      }
-      return null;
-   };
-
-   XMLDOC.Parser.node.prototype.prevSibling = function() {
-      var p = this.parent;
-      if (p && (p.nodes.indexOf(this) - 1 >= 0))
-      {
-         return p.getChild(p.nodes.indexOf(this) - 1);
-      }
-      return null;
-   };
-};
-
-/**
- * Parse an XML Document from the specified source.  The XML should be
- * well formed, unless strict mode is disabled, then the parser will
- * handle HTML-style XML documents.
- * @param src {String} The source to parse
- */
-XMLDOC.Parser.parse = function(src)
-{
-   var A = [];
-
-   // Normailize whitespace
-   A = src.split("\r\n");
-   src = A.join("\n");
-   A = src.split("\r");
-   src = A.join("\n");
-
-   // Remove XML and DOCTYPE specifier
-   src.replace(/<\?XML .*\?>/i, "");
-   src.replace(/<!DOCTYPE .*\>/i, "");
-
-   // The document is the root node and cannot be modified or removed
-   var doc = new XMLDOC.Parser.node(null, "ROOT", "DOCUMENT");
-
-   // Let's break it down
-   XMLDOC.Parser.eat(doc, src);
-
-   return doc;
-};
-
-/**
- * The XML fragment processing routine.  This method is private and should not be called
- * directly.
- * @param parentNode {XMLDOC.Parser.node} The node which is the parent of this fragment
- * @param src {String} The source within the fragment to process
- * @private
- */
-XMLDOC.Parser.eat = function(parentNode, src)
-{
-   // A simple tag def
-   var reTag = new RegExp("<(!|)(\\?|--|)((.|\\s)*?)\\2>","g");
-
-   // Special tag types
-   var reCommentTag = /<!--((.|\s)*?)-->/;
-   var rePITag = /<\?((.|\s)*?)\?>/;
-
-   // A start tag (with potential empty marker)
-   var reStartTag = /<(.*?)( +([\w_\-]*)=(\"|')(.*)\4)*(\/)?>/;
-
-   // An empty HTML style tag (not proper XML, but we'll accept it so we can process HTML)
-   var reHTMLEmptyTag = /<(.*?)( +([\w_\-]*)=(\"|')(.*)\4)*>/;
-
-   // Fully enclosing tag with nested tags
-   var reEnclosingTag = /<(.*?)( +([\w_\-]*)=(\"|')(.*?)\4)*>((.|\s)*?)<\/\1>/;
-
-   // Breaks down attributes
-   var reAttributes = new RegExp(" +([\\w_\\-]*)=(\"|')(.*?)\\2","g");
-
-   // Find us a tag
-   var tag;
-   while ((tag = reTag.exec(src)) != null)
-   {
-      if (tag.index > 0)
-      {
-         // The next tag has some text before it
-         var text = src.substring(0, tag.index).replace(/^[ \t\n]+((.|\n)*?)[ \t\n]+$/, "$1");
-
-         if (text.length > 0 && (text != "\n"))
-         {
-            var txtnode = new XMLDOC.Parser.node(parentNode, "", "TEXT");
-            txtnode.charData = text;
-
-            // Append the new text node
-            parentNode.nodes.push(txtnode);
-         }
-
-         // Reset the lastIndex of reTag
-         reTag.lastIndex -= src.substring(0, tag.index).length;
-
-         // Eat the text
-         src = src.substring(tag.index);
-      }
-
-      if (reCommentTag.test(tag[0]))
-      {
-         // Is this a comment?
-         var comment = new XMLDOC.Parser.node(parentNode, "", "COMMENT");
-         comment.charData = reCommentTag.exec(tag[0])[1];
-
-         // Append the comment
-         parentNode.nodes.push(comment);
-
-         // Move the lastIndex of reTag
-         reTag.lastIndex -= tag[0].length;
-
-         // Eat the tag
-         src = src.replace(reCommentTag, "");
-      }
-      else if (rePITag.test(tag[0]))
-      {
-         // Is this a processing instruction?
-         var pi = new XMLDOC.Parser.node(parentNode, "", "PI");
-         pi.charData = rePITag.exec(tag[0])[1];
-
-         // Append the processing instruction
-         parentNode.nodes.push(pi);
-
-         // Move the lastIndex of reTag
-         reTag.lastIndex -= tag[0].length;
-
-         // Eat the tag
-         src = src.replace(rePITag, "");
-      }
-      else if (reStartTag.test(tag[0]))
-      {
-         // Break it down
-         var e = reStartTag.exec(tag[0]);
-         var elem = new XMLDOC.Parser.node(parentNode, e[1], "ELEMENT");
-
-         // Get attributes from the tag
-         var a;
-         while ((a = reAttributes.exec(e[2])) != null )
-         {
-            elem.attrs[a[1]] = a[3];
-         }
-
-         // Is this an empty XML-style tag?
-         if (e[6] == "/")
-         {
-            // Append the empty element
-            parentNode.nodes.push(elem);
-
-            // Move the lastIndex of reTag (include the start tag length)
-            reTag.lastIndex -= e[0].length;
-
-            // Eat the tag
-            src = src.replace(reStartTag, "");
-         }
-         else
-         {
-            // Check for malformed XML tags
-            var htmlParsed = false;
-            var htmlStartTag = reHTMLEmptyTag.exec(src);
-
-            // See if there isn't an end tag within this block
-            var reHTMLEndTag = new RegExp("</" + htmlStartTag[1] + ">");
-            var htmlEndTag = reHTMLEndTag.exec(src);
-
-            if (XMLDOC.Parser.strictMode && htmlEndTag == null)
-            {
-               // Poorly formed XML fails in strict mode
-               var err = new Error("Malformed XML passed to XMLDOC.Parser... Error contains malformed 'src'");
-               err.src = src;
-               throw err;
-            }
-            else if (htmlEndTag == null)
-            {
-               // This is an HTML-style empty tag, store the element for it in non-strict mode
-               parentNode.nodes.push(elem);
-
-               // Eat the tag
-               src = src.replace(reHTMLEmptyTag, "");
-               htmlParsed = true;
-            }
-
-            // If we didn't parse HTML-style, it must be an enclosing tag
-            if (!htmlParsed)
-            {
-               var enc = reEnclosingTag.exec(src);
-
-               // Go deeper into the document
-               XMLDOC.Parser.eat(elem, enc[6]);
-
-               // Append the new element node
-               parentNode.nodes.push(elem);
-
-               // Eat the tag
-               src = src.replace(reEnclosingTag, "");
-            }
-         }
-
-         // Reset the lastIndex of reTag
-         reTag.lastIndex = 0;
-      }
-   }
-
-   // No tag was found... append the text if there is any
-   src = src.replace(/^[ \t\n]+((.|\n)*?)[ \t\n]+$/, "$1");
-   if (src.length > 0 && (src != "\n"))
-   {
-      var txtNode = new XMLDOC.Parser.node(parentNode, "", "TEXT");
-      txtNode.charData = src;
-
-      // Append the new text node
-      parentNode.nodes.push(txtNode);
-   }
-};
--- a/sbin/res/app/lib/JSDOC.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,106 +0,0 @@
-/**
-	@overview
-	@date $Date: 2010-06-13 22:02:44 +0100 (Sun, 13 Jun 2010) $
-	@version $Revision: 837 $ 
-	@location $HeadURL: https://jsdoc-toolkit.googlecode.com/svn/tags/jsdoc_toolkit-2.4.0/jsdoc-toolkit/app/lib/JSDOC.js $
-	@name JSDOC.js
- */
-
-/**
-	This is the main container for the JSDOC application.
-	@namespace
-*/
-JSDOC = {
-};
-
-/**
-	@requires Opt
- */
-if (typeof arguments == "undefined") arguments = [];
-JSDOC.opt = Opt.get(
-	arguments, 
-	{
-		a: "allfunctions", 
-		c: "conf",
-		d: "directory",
-		"D[]": "define",
-		e: "encoding",
-		"E[]": "exclude",
-		h: "help",
-		m: "multiple",
-		n: "nocode",
-		o: "out",
-		p: "private",
-		q: "quiet",
-		r: "recurse",
-		S: "securemodules",
-		s: "suppress",
-		t: "template",
-		T: "testmode",
-		u: "unique",
-		v: "verbose",
-		x: "ext"
-	}
-);
-
-/** The current version string of this application. */
-JSDOC.VERSION = "2.4.0";
-
-/** Print out usage information and quit. */
-JSDOC.usage = function() {
-	print("USAGE: java -jar jsrun.jar app/run.js [OPTIONS] <SRC_DIR> <SRC_FILE> ...");
-	print("");
-	print("OPTIONS:");
-	print("  -a or --allfunctions\n          Include all functions, even undocumented ones.\n");
-	print("  -c or --conf\n          Load a configuration file.\n");
-	print("  -d=<PATH> or --directory=<PATH>\n          Output to this directory (defaults to \"out\").\n");
-	print("  -D=\"myVar:My value\" or --define=\"myVar:My value\"\n          Multiple. Define a variable, available in JsDoc as JSDOC.opt.D.myVar.\n");
-	print("  -e=<ENCODING> or --encoding=<ENCODING>\n          Use this encoding to read and write files.\n");
-	print("  -E=\"REGEX\" or --exclude=\"REGEX\"\n          Multiple. Exclude files based on the supplied regex.\n");
-	print("  -h or --help\n          Show this message and exit.\n");
-	print("  -m or --multiples\n          Don't warn about symbols being documented more than once.\n");
-	print("  -n or --nocode\n          Ignore all code, only document comments with @name tags.\n");
-	print("  -o=<PATH> or --out=<PATH>\n          Print log messages to a file (defaults to stdout).\n");
-	print("  -p or --private\n          Include symbols tagged as private, underscored and inner symbols.\n");
-	print("  -q or --quiet\n          Do not output any messages, not even warnings.\n");
-	print("  -r=<DEPTH> or --recurse=<DEPTH>\n          Descend into src directories.\n");
-	print("  -s or --suppress\n          Suppress source code output.\n");
-	print("  -S or --securemodules\n          Use Secure Modules mode to parse source code.\n");
-	print("  -t=<PATH> or --template=<PATH>\n          Required. Use this template to format the output.\n");
-	print("  -T or --test\n          Run all unit tests and exit.\n");
-	print("  -u or --unique\n          Force file names to be unique, but not based on symbol names.\n");
-	print("  -v or --verbose\n          Provide verbose feedback about what is happening.\n");
-	print("  -x=<EXT>[,EXT]... or --ext=<EXT>[,EXT]...\n          Scan source files with the given extension/s (defaults to js).\n");
-	
-	quit();
-}
-
-/*t:
-	plan(4, "Testing JSDOC namespace.");
-	
-	is(
-		typeof JSDOC,
-		"object",
-		"JSDOC.usage is a function."
-	);
-	
-	is(
-		typeof JSDOC.VERSION,
-		"string",
-		"JSDOC.VERSION is a string."
-	);
-	
-	is(
-		typeof JSDOC.usage,
-		"function",
-		"JSDOC.usage is a function."
-	);
-	
-	is(
-		typeof JSDOC.opt,
-		"object",
-		"JSDOC.opt is a object."
-	);
- */
-
-if (this.IO) IO.includeDir("lib/JSDOC/");
--- a/sbin/res/app/lib/JSDOC/DocComment.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,204 +0,0 @@
-if (typeof JSDOC == "undefined") JSDOC = {};
-
-/**
-	Create a new DocComment. This takes a raw documentation comment,
-	and wraps it in useful accessors.
-	@class Represents a documentation comment object.
- */ 
-JSDOC.DocComment = function(/**String*/comment) {
-	this.init();
-	if (typeof comment != "undefined") {
-		this.parse(comment);
-	}
-}
-
-JSDOC.DocComment.prototype.init = function() {
-	this.isUserComment = true;
-	this.src           = "";
-	this.meta          = "";
-	this.tagTexts      = [];
-	this.tags          = [];
-}
-
-/**
-	@requires JSDOC.DocTag
- */
-JSDOC.DocComment.prototype.parse = function(/**String*/comment) {
-	if (comment == "") {
-		comment = "/** @desc */";
-		this.isUserComment = false;
-	}
-	
-	this.src = JSDOC.DocComment.unwrapComment(comment);
-	
-	this.meta = "";
-	if (this.src.indexOf("#") == 0) {
-		this.src.match(/#(.+[+-])([\s\S]*)$/);
-		if (RegExp.$1) this.meta = RegExp.$1;
-		if (RegExp.$2) this.src = RegExp.$2;
-	}
-	
-	if (typeof JSDOC.PluginManager != "undefined") {
-		JSDOC.PluginManager.run("onDocCommentSrc", this);
-	}
-	
-	this.fixDesc();
-
-	this.src = JSDOC.DocComment.shared+"\n"+this.src;
-	
-	this.tagTexts = 
-		this.src
-		.split(/(^|[\r\n])\s*@/)
-		.filter(function($){return $.match(/\S/)});
-	
-	/**
-		The tags found in the comment.
-		@type JSDOC.DocTag[]
-	 */
-	this.tags = this.tagTexts.map(function($){return new JSDOC.DocTag($)});
-	
-	if (typeof JSDOC.PluginManager != "undefined") {
-		JSDOC.PluginManager.run("onDocCommentTags", this);
-	}
-}
-
-/*t:
-	plan(5, "testing JSDOC.DocComment");
-	requires("../frame/String.js");
-	requires("../lib/JSDOC/DocTag.js");
-	
-	var com = new JSDOC.DocComment("/**@foo some\n* comment here*"+"/");
-	is(com.tagTexts[0], "foo some\ncomment here", "first tag text is found.");
-	is(com.tags[0].title, "foo", "the title is found in a comment with one tag.");
-	
-	var com = new JSDOC.DocComment("/** @foo first\n* @bar second*"+"/");
-	is(com.getTag("bar").length, 1, "getTag() returns one tag by that title.");
-	
-	JSDOC.DocComment.shared = "@author John Smith";
-	var com = new JSDOC.DocComment("/**@foo some\n* comment here*"+"/");
-	is(com.tags[0].title, "author", "shared comment is added.");
-	is(com.tags[1].title, "foo", "shared comment is added to existing tag.");
-*/
-
-/**
-	If no @desc tag is provided, this function will add it.
- */
-JSDOC.DocComment.prototype.fixDesc = function() {
-	if (this.meta && this.meta != "@+") return;
-	if (/^\s*[^@\s]/.test(this.src)) {				
-		this.src = "@desc "+this.src;
-	}
-}
-
-/*t:
-	plan(5, "testing JSDOC.DocComment#fixDesc");
-	
-	var com = new JSDOC.DocComment();
-	
-	com.src = "this is a desc\n@author foo";
-	com.fixDesc();
-	is(com.src, "@desc this is a desc\n@author foo", "if no @desc tag is provided one is added.");
-
-	com.src = "x";
-	com.fixDesc();
-	is(com.src, "@desc x", "if no @desc tag is provided one is added to a single character.");
-
-	com.src = "\nx";
-	com.fixDesc();
-	is(com.src, "@desc \nx", "if no @desc tag is provided one is added to return and character.");
-	
-	com.src = " ";
-	com.fixDesc();
-	is(com.src, " ", "if no @desc tag is provided one is not added to just whitespace.");
-
-	com.src = "";
-	com.fixDesc();
-	is(com.src, "", "if no @desc tag is provided one is not added to empty.");
-*/
-
-/**
-	Remove slash-star comment wrapper from a raw comment string.
-	@type String
- */
-JSDOC.DocComment.unwrapComment = function(/**String*/comment) {
-	if (!comment) return "";
-	var unwrapped = comment.replace(/(^\/\*\*|\*\/$)/g, "").replace(/^\s*\* ?/gm, "");
-	return unwrapped;
-}
-
-/*t:
-	plan(5, "testing JSDOC.DocComment.unwrapComment");
-	
-	var com = "/**x*"+"/";
-	var unwrapped = JSDOC.DocComment.unwrapComment(com);
-	is(unwrapped, "x", "a single character jsdoc is found.");
-	
-	com = "/***x*"+"/";
-	unwrapped = JSDOC.DocComment.unwrapComment(com);
-	is(unwrapped, "x", "three stars are allowed in the opener.");
-	
-	com = "/****x*"+"/";
-	unwrapped = JSDOC.DocComment.unwrapComment(com);
-	is(unwrapped, "*x", "fourth star in the opener is kept.");
-	
-	com = "/**x\n * y\n*"+"/";
-	unwrapped = JSDOC.DocComment.unwrapComment(com);
-	is(unwrapped, "x\ny\n", "leading stars and spaces are trimmed.");
-	
-	com = "/**x\n *   y\n*"+"/";
-	unwrapped = JSDOC.DocComment.unwrapComment(com);
-	is(unwrapped, "x\n  y\n", "only first space after leading stars are trimmed.");
-*/
-
-/**
-	Provides a printable version of the comment.
-	@type String
- */
-JSDOC.DocComment.prototype.toString = function() {
-	return this.src;
-}
-
-/*t:
-	plan(1, "testing JSDOC.DocComment#fixDesc");
-	var com = new JSDOC.DocComment();
-	com.src = "foo";
-	is(""+com, "foo", "stringifying a comment returns the unwrapped src.");
-*/
-
-/**
-	Given the title of a tag, returns all tags that have that title.
-	@type JSDOC.DocTag[]
- */
-JSDOC.DocComment.prototype.getTag = function(/**String*/tagTitle) {
-	return this.tags.filter(function($){return $.title == tagTitle});
-}
-
-JSDOC.DocComment.prototype.deleteTag = function(/**String*/tagTitle) {
-	this.tags = this.tags.filter(function($){return $.title != tagTitle})
-}
-
-/*t:
-	plan(1, "testing JSDOC.DocComment#getTag");
-	requires("../frame/String.js");
-	requires("../lib/JSDOC/DocTag.js");
-	
-	var com = new JSDOC.DocComment("/**@foo some\n* @bar\n* @bar*"+"/");
-	is(com.getTag("bar").length, 2, "getTag returns expected number of tags.");
-*/
-
-/**
-	Used to store the currently shared tag text.
-*/
-JSDOC.DocComment.shared = "";
-
-/*t:
-	plan(2, "testing JSDOC.DocComment.shared");
-	requires("../frame/String.js");
-	requires("../lib/JSDOC/DocTag.js");
-	
-	JSDOC.DocComment.shared = "@author Michael";
-	
-	var com = new JSDOC.DocComment("/**@foo\n* @foo*"+"/");
-	is(com.getTag("author").length, 1, "getTag returns shared tag.");
-	is(com.getTag("foo").length, 2, "getTag returns unshared tags too.");
-*/
\ No newline at end of file
--- a/sbin/res/app/lib/JSDOC/DocTag.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,294 +0,0 @@
-if (typeof JSDOC == "undefined") JSDOC = {};
-
-/**
-	@constructor
- */
-JSDOC.DocTag = function(src) {
-	this.init();
-	if (typeof src != "undefined") {
-		this.parse(src);
-	}
-}
-
-/**
-	Create and initialize the properties of this.
- */
-JSDOC.DocTag.prototype.init = function() {
-	this.title        = "";
-	this.type         = "";
-	this.name         = "";
-	this.isOptional   = false;
-	this.defaultValue = "";
-	this.desc         = "";
-	
-	return this;
-}
-
-/**
-	Populate the properties of this from the given tag src.
-	@param {string} src
- */
-JSDOC.DocTag.prototype.parse = function(src) {
-	if (typeof src != "string") throw "src must be a string not "+(typeof src);
-
-	try {
-		src = this.nibbleTitle(src);
-		if (JSDOC.PluginManager) {
-			JSDOC.PluginManager.run("onDocTagSynonym", this);
-		}
-		
-		src = this.nibbleType(src);
-		
-		// only some tags are allowed to have names.
-		if (this.title == "param" || this.title == "property" || this.title == "config") { // @config is deprecated
-			src = this.nibbleName(src);
-		}
-	}
-	catch(e) {
-		if (LOG) LOG.warn(e);
-		else throw e;
-	}
-	this.desc = src; // whatever is left
-	
-	// example tags need to have whitespace preserved
-	if (this.title != "example") this.desc = this.desc.trim();
-	
-	if (JSDOC.PluginManager) {
-		JSDOC.PluginManager.run("onDocTag", this);
-	}
-}
-
-/**
-	Automatically called when this is stringified.
- */
-JSDOC.DocTag.prototype.toString = function() {
-	return this.desc;
-}
-
-/*t:
-	plan(1, "testing JSDOC.DocTag#toString");
-	
-	var tag = new JSDOC.DocTag("param {object} date A valid date.");
-	is(""+tag, "A valid date.", "stringifying a tag returns the desc.");
- */
-
-/**
-	Find and shift off the title of a tag.
-	@param {string} src
-	@return src
- */
-JSDOC.DocTag.prototype.nibbleTitle = function(src) {
-	if (typeof src != "string") throw "src must be a string not "+(typeof src);
-	
-	var parts = src.match(/^\s*(\S+)(?:\s([\s\S]*))?$/);
-
-	if (parts && parts[1]) this.title = parts[1];
-	if (parts && parts[2]) src = parts[2];
-	else src = "";
-	
-	return src;
-}
-
-/*t:
-	plan(8, "testing JSDOC.DocTag#nibbleTitle");
-	
-	var tag = new JSDOC.DocTag();
-	
-	tag.init().nibbleTitle("aTitleGoesHere");
-	is(tag.title, "aTitleGoesHere", "a title can be found in a single-word string.");
-	
-	var src = tag.init().nibbleTitle("aTitleGoesHere and the rest");
-	is(tag.title, "aTitleGoesHere", "a title can be found in a multi-word string.");
-	is(src, "and the rest", "the rest is returned when the title is nibbled off.");
-	
-	src = tag.init().nibbleTitle("");
-	is(tag.title, "", "given an empty string the title is empty.");
-	is(src, "", "the rest is empty when the tag is empty.");
-
-	var src = tag.init().nibbleTitle(" aTitleGoesHere\n  a description");
-	is(tag.title, "aTitleGoesHere", "leading and trailing spaces are not part of the title.");
-	is(src, "  a description", "leading spaces (less one) are part of the description.");
-
-	tag.init().nibbleTitle("a.Title::Goes_Here foo");
-	is(tag.title, "a.Title::Goes_Here", "titles with punctuation are allowed.");
- */
-
-/**
-	Find and shift off the type of a tag.
-	@requires frame/String.js
-	@param {string} src
-	@return src
- */
-JSDOC.DocTag.prototype.nibbleType = function(src) {
-	if (typeof src != "string") throw "src must be a string not "+(typeof src);
-	
-	if (src.match(/^\s*\{/)) {
-		var typeRange = src.balance("{", "}");
-		if (typeRange[1] == -1) {
-			throw "Malformed comment tag ignored. Tag type requires an opening { and a closing }: "+src;
-		}
-		this.type = src.substring(typeRange[0]+1, typeRange[1]).trim();
-		this.type = this.type.replace(/\s*,\s*/g, "|"); // multiples can be separated by , or |
-		src = src.substring(typeRange[1]+1);
-	}
-	
-	return src;
-}
-
-/*t:
-	plan(5, "testing JSDOC.DocTag.parser.nibbleType");
-	requires("../frame/String.js");
-	
-	var tag = new JSDOC.DocTag();
-	
-	tag.init().nibbleType("{String[]} aliases");
-	is(tag.type, "String[]", "type can have non-alpha characters.");
-	
-	tag.init().nibbleType("{ aTypeGoesHere  } etc etc");
-	is(tag.type, "aTypeGoesHere", "type is trimmed.");
-	
-	tag.init().nibbleType("{ oneType, twoType ,\n threeType  } etc etc");
-	is(tag.type, "oneType|twoType|threeType", "multiple types can be separated by commas.");
-	
-	var error;
-	try { tag.init().nibbleType("{widget foo"); }
-	catch(e) { error = e; }
-	is(typeof error, "string", "malformed tag type throws error.");
-	isnt(error.indexOf("Malformed"), -1, "error message tells tag is malformed.");
- */
-
-/**
-	Find and shift off the name of a tag.
-	@requires frame/String.js
-	@param {string} src
-	@return src
- */
-JSDOC.DocTag.prototype.nibbleName = function(src) {
-	if (typeof src != "string") throw "src must be a string not "+(typeof src);
-	
-	src = src.trim();
-	
-	// is optional?
-	if (src.charAt(0) == "[") {
-		var nameRange = src.balance("[", "]");
-		if (nameRange[1] == -1) {
-			throw "Malformed comment tag ignored. Tag optional name requires an opening [ and a closing ]: "+src;
-		}
-		this.name = src.substring(nameRange[0]+1, nameRange[1]).trim();
-		this.isOptional = true;
-		
-		src = src.substring(nameRange[1]+1);
-		
-		// has default value?
-		var nameAndValue = this.name.split("=");
-		if (nameAndValue.length) {
-			this.name = nameAndValue.shift().trim();
-			this.defaultValue = nameAndValue.join("=");
-		}
-	}
-	else {
-		var parts = src.match(/^(\S+)(?:\s([\s\S]*))?$/);
-		if (parts) {
-			if (parts[1]) this.name = parts[1];
-			if (parts[2]) src = parts[2].trim();
-			else src = "";
-		}
-	}	
-
-	return src;
-}
-
-/*t:
-	requires("../frame/String.js");
-	plan(9, "testing JSDOC.DocTag.parser.nibbleName");
-	
-	var tag = new JSDOC.DocTag();
-	
-	tag.init().nibbleName("[foo] This is a description.");
-	is(tag.isOptional, true, "isOptional syntax is detected.");
-	is(tag.name, "foo", "optional param name is found.");
- 	
-	tag.init().nibbleName("[foo] This is a description.");
-	is(tag.isOptional, true, "isOptional syntax is detected when no type.");
-	is(tag.name, "foo", "optional param name is found when no type.");
-	
-	tag.init().nibbleName("[foo=7] This is a description.");
- 	is(tag.name, "foo", "optional param name is found when default value.");
- 	is(tag.defaultValue, 7, "optional param default value is found when default value.");
- 	
- 	//tag.init().nibbleName("[foo= a value] This is a description.");
- 	//is(tag.defaultValue, " a value", "optional param default value is found when default value has spaces (issue #112).");
- 	
- 	tag.init().nibbleName("[foo=[]] This is a description.");
- 	is(tag.defaultValue, "[]", "optional param default value is found when default value is [] (issue #95).");
- 	
- 	tag.init().nibbleName("[foo=a=b] This is a description.");
- 	is(tag.name, "foo", "optional param name is found when default value is a=b.");
- 	is(tag.defaultValue, "a=b", "optional param default value is found when default value is a=b.")
- */
-
-/*t:
-	plan(32, "Testing JSDOC.DocTag.parser.");
-	requires("../frame/String.js");
-	
- 	var tag = new JSDOC.DocTag();
- 	
- 	is(typeof tag, "object", "JSDOC.DocTag.parser with an empty string returns an object.");
- 	is(typeof tag.title, "string", "returned object has a string property 'title'.");
- 	is(typeof tag.type, "string", "returned object has a string property 'type'.");
- 	is(typeof tag.name, "string", "returned object has a string property 'name'.");
- 	is(typeof tag.defaultValue, "string", "returned object has a string property 'defaultValue'.");
- 	is(typeof tag.isOptional, "boolean", "returned object has a boolean property 'isOptional'.");
- 	is(typeof tag.desc, "string", "returned object has a string property 'desc'.");
-  
-  	tag = new JSDOC.DocTag("param {widget} foo");
-  	is(tag.title, "param", "param title is found.");
-  	is(tag.name, "foo", "param name is found when desc is missing.");
- 	is(tag.desc, "", "param desc is empty when missing.");
- 	
- 	tag = new JSDOC.DocTag("param {object} date A valid date.");
- 	is(tag.name, "date", "param name is found with a type.");
- 	is(tag.type, "object", "param type is found.");
- 	is(tag.desc, "A valid date.", "param desc is found with a type.");
- 	
-  	tag = new JSDOC.DocTag("param aName a description goes\n    here.");
-	is(tag.name, "aName", "param name is found without a type.");
- 	is(tag.desc, "a description goes\n    here.", "param desc is found without a type.");
- 	
- 	tag = new JSDOC.DocTag("param {widget}");
- 	is(tag.name, "", "param name is empty when it is not given.");
-	
-	tag = new JSDOC.DocTag("param {widget} [foo] This is a description.");
-	is(tag.name, "foo", "optional param name is found.");
-	
-	tag = new JSDOC.DocTag("return {aType} This is a description.");
-	is(tag.type, "aType", "when return tag has no name, type is found.");
-	is(tag.desc, "This is a description.", "when return tag has no name, desc is found.");
-	
-	tag = new JSDOC.DocTag("author Joe Coder <jcoder@example.com>");
-	is(tag.title, "author", "author tag has a title.");
-	is(tag.type, "", "the author tag has no type.");
-	is(tag.name, "", "the author tag has no name.");
-	is(tag.desc, "Joe Coder <jcoder@example.com>", "author tag has desc.");
-	
-	tag = new JSDOC.DocTag("private \t\n  ");
-	is(tag.title, "private", "private tag has a title.");
-	is(tag.type, "", "the private tag has no type.");
-	is(tag.name, "", "the private tag has no name.");
-	is(tag.desc, "", "private tag has no desc.");
-
-	tag = new JSDOC.DocTag("example\n   example(code);\n   more();");
-	is(tag.desc, "   example(code);\n   more();", "leading whitespace (less one) in examples code is preserved.");
-	
-	tag = new JSDOC.DocTag("param theName  \n");
-	is(tag.name, "theName", "name only is found.");
-	
-	tag = new JSDOC.DocTag("type theDesc  \n");
-	is(tag.desc, "theDesc", "desc only is found.");
-	
-	tag = new JSDOC.DocTag("type {theType} \n");
-	is(tag.type, "theType", "type only is found.");
-	
-	tag = new JSDOC.DocTag("");
-	is(tag.title, "", "title is empty when tag is empty.");
- */
\ No newline at end of file
--- a/sbin/res/app/lib/JSDOC/JsDoc.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,140 +0,0 @@
-/**
-	@constructor
-	@param [opt] Used to override the commandline options. Useful for testing.
-	@version $Id: JsDoc.js 831 2010-03-09 14:24:56Z micmath $
-*/
-JSDOC.JsDoc = function(/**object*/ opt) {
-	if (opt) {
-		JSDOC.opt = opt;
-	}
-	
-	if (JSDOC.opt.h) {
-		JSDOC.usage();
-		quit();
-	}
-	
-	// defend against options that are not sane 
-	if (JSDOC.opt._.length == 0) {
-		LOG.warn("No source files to work on. Nothing to do.");
-		quit();
-	}
-	if (JSDOC.opt.t === true || JSDOC.opt.d === true) {
-		JSDOC.usage();
-	}
-	
-	if (typeof JSDOC.opt.d == "string") {
-		if (!JSDOC.opt.d.charAt(JSDOC.opt.d.length-1).match(/[\\\/]/)) {
-			JSDOC.opt.d = JSDOC.opt.d+"/";
-		}
-		LOG.inform("Output directory set to '"+JSDOC.opt.d+"'.");
-		IO.mkPath(JSDOC.opt.d);
-	}
-	if (JSDOC.opt.e) IO.setEncoding(JSDOC.opt.e);
-	
-	// the -r option: scan source directories recursively
-	if (typeof JSDOC.opt.r == "boolean") JSDOC.opt.r = 10;
-	else if (!isNaN(parseInt(JSDOC.opt.r))) JSDOC.opt.r = parseInt(JSDOC.opt.r);
-	else JSDOC.opt.r = 1;
-	
-	// the -D option: define user variables
-	var D = {};
-	if (JSDOC.opt.D) {
-		for (var i = 0; i < JSDOC.opt.D.length; i++) {
-			var param = JSDOC.opt.D[i];
-			// remove first and last character if both == "
-			if ( 
-				param.length > 1
-				&& param.charAt(0) == '"'
-				&& param.charAt(param.length-1) == '"'
-			) {
-				param = param.substr(1, param.length-2);
-			}
-			var defineParts = param.split(":");
-			if (defineParts && defineParts.length > 1) {
-				for ( var dpIdx = 2; dpIdx < defineParts.length; dpIdx++ ) {
-					defineParts[1] += ':' + defineParts[dpIdx];
-				}
-				D[defineParts[0]] = defineParts[1];
-			}
-		}
-	}
-	JSDOC.opt.D = D;
-	// combine any conf file D options with the commandline D options
-	if (defined(JSDOC.conf)) for (var c in JSDOC.conf.D) {
- 		if (!defined(JSDOC.opt.D[c])) {
- 			JSDOC.opt.D[c] = JSDOC.conf.D[c];
- 		}
- 	}
-	
-	// Give plugins a chance to initialize
-	if (defined(JSDOC.PluginManager)) {
-		JSDOC.PluginManager.run("onInit", JSDOC.opt);
-	}
-
-	JSDOC.opt.srcFiles = JSDOC.JsDoc._getSrcFiles();
-	JSDOC.JsDoc._parseSrcFiles();
-	JSDOC.JsDoc.symbolSet = JSDOC.Parser.symbols;
-}
-
-/**
-	Retrieve source file list.
-	@returns {String[]} The pathnames of the files to be parsed.
- */
-JSDOC.JsDoc._getSrcFiles = function() {
-	JSDOC.JsDoc.srcFiles = [];
-	
-	var ext = ["js"];
-	if (JSDOC.opt.x) {
-		ext = JSDOC.opt.x.split(",").map(function($) {return $.toLowerCase()});
-	}
-	
-	for (var i = 0; i < JSDOC.opt._.length; i++) {
-		JSDOC.JsDoc.srcFiles = JSDOC.JsDoc.srcFiles.concat(
-			IO.ls(JSDOC.opt._[i], JSDOC.opt.r).filter(
-				function($) {
-					var thisExt = $.split(".").pop().toLowerCase();
-					
-					if (JSDOC.opt.E) {
-						for(var n = 0; n < JSDOC.opt.E.length; n++) {
-							if ($.match(new RegExp(JSDOC.opt.E[n]))) {
-								LOG.inform("Excluding " + $);
-								return false; // if the file matches the regex then it's excluded.
-							}
-						}
-					}
-					
-					return (ext.indexOf(thisExt) > -1); // we're only interested in files with certain extensions
-				}
-			)
-		);
-	}
-	
-	return JSDOC.JsDoc.srcFiles;
-}
-
-JSDOC.JsDoc._parseSrcFiles = function() {
-	JSDOC.Parser.init();
-	for (var i = 0, l = JSDOC.JsDoc.srcFiles.length; i < l; i++) {
-		var srcFile = JSDOC.JsDoc.srcFiles[i];
-		
-		if (JSDOC.opt.v) LOG.inform("Parsing file: " + srcFile);
-		
-		try {
-			var src = IO.readFile(srcFile);
-		}
-		catch(e) {
-			LOG.warn("Can't read source file '"+srcFile+"': "+e.message);
-		}
-
-		var tr = new JSDOC.TokenReader();
-		var ts = new JSDOC.TokenStream(tr.tokenize(new JSDOC.TextStream(src)));
-
-		JSDOC.Parser.parse(ts, srcFile);
-
-	}
-	JSDOC.Parser.finish();
-
-	if (JSDOC.PluginManager) {
-		JSDOC.PluginManager.run("onFinishedParsing", JSDOC.Parser.symbols);
-	}
-}
--- a/sbin/res/app/lib/JSDOC/JsPlate.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-/**
-	@constructor
-*/
-JSDOC.JsPlate = function(templateFile) {
-	if (templateFile) this.template = IO.readFile(templateFile);
-	
-	this.templateFile = templateFile;
-	this.code = "";
-	this.parse();
-}
-
-JSDOC.JsPlate.prototype.parse = function() {
-	this.template = this.template.replace(/\{#[\s\S]+?#\}/gi, "");
-	this.code = "var output=\u001e"+this.template;
-
-	this.code = this.code.replace(
-		/<for +each="(.+?)" +in="(.+?)" *>/gi, 
-		function (match, eachName, inName) {
-			return "\u001e;\rvar $"+eachName+"_keys = keys("+inName+");\rfor(var $"+eachName+"_i = 0; $"+eachName+"_i < $"+eachName+"_keys.length; $"+eachName+"_i++) {\rvar $"+eachName+"_last = ($"+eachName+"_i == $"+eachName+"_keys.length-1);\rvar $"+eachName+"_key = $"+eachName+"_keys[$"+eachName+"_i];\rvar "+eachName+" = "+inName+"[$"+eachName+"_key];\routput+=\u001e";
-		}
-	);	
-	this.code = this.code.replace(/<if test="(.+?)">/g, "\u001e;\rif ($1) { output+=\u001e");
-	this.code = this.code.replace(/<elseif test="(.+?)"\s*\/>/g, "\u001e;}\relse if ($1) { output+=\u001e");
-	this.code = this.code.replace(/<else\s*\/>/g, "\u001e;}\relse { output+=\u001e");
-	this.code = this.code.replace(/<\/(if|for)>/g, "\u001e;\r};\routput+=\u001e");
-	this.code = this.code.replace(
-		/\{\+\s*([\s\S]+?)\s*\+\}/gi,
-		function (match, code) {
-			code = code.replace(/"/g, "\u001e"); // prevent qoute-escaping of inline code
-			code = code.replace(/(\r?\n)/g, " ");
-			return "\u001e+ ("+code+") +\u001e";
-		}
-	);
-	this.code = this.code.replace(
-		/\{!\s*([\s\S]+?)\s*!\}/gi,
-		function (match, code) {
-			code = code.replace(/"/g, "\u001e"); // prevent qoute-escaping of inline code
-			code = code.replace(/(\n)/g, " ");
-			return "\u001e; "+code+";\routput+=\u001e";
-		}
-	);
-	this.code = this.code+"\u001e;";
-
-	this.code = this.code.replace(/(\r?\n)/g, "\\n");
-	this.code = this.code.replace(/"/g, "\\\"");
-	this.code = this.code.replace(/\u001e/g, "\"");
-}
-
-JSDOC.JsPlate.prototype.toCode = function() {
-	return this.code;
-}
-
-JSDOC.JsPlate.keys = function(obj) {
-	var keys = [];
-	if (obj.constructor.toString().indexOf("Array") > -1) {
-		for (var i = 0; i < obj.length; i++) {
-			keys.push(i);
-		}
-	}
-	else {
-		for (var i in obj) {
-			keys.push(i);
-		}
-	}
-	return keys;
-};
-
-JSDOC.JsPlate.values = function(obj) {
-	var values = [];
-	if (obj.constructor.toString().indexOf("Array") > -1) {
-		for (var i = 0; i < obj.length; i++) {
-			values.push(obj[i]);
-		}
-	}
-	else {
-		for (var i in obj) {
-			values.push(obj[i]);
-		}
-	}
-	return values;
-};
-
-JSDOC.JsPlate.prototype.process = function(data, compact) {
-	var keys = JSDOC.JsPlate.keys;
-	var values = JSDOC.JsPlate.values;
-	
-	try {
-		eval(this.code);
-	}
-	catch (e) {
-		print(">> There was an error evaluating the compiled code from template: "+this.templateFile);
-		print("   The error was on line "+e.lineNumber+" "+e.name+": "+e.message);
-		var lines = this.code.split("\r");
-		if (e.lineNumber-2 >= 0) print("line "+(e.lineNumber-1)+": "+lines[e.lineNumber-2]);
-		print("line "+e.lineNumber+": "+lines[e.lineNumber-1]);
-		print("");
-	}
-	
-	if (compact) { // patch by mcbain.asm
- 		// Remove lines that contain only space-characters, usually left by lines in the template
- 		// which originally only contained JSPlate tags or code. This makes it easier to write
- 		// non-tricky templates which still put out nice code (not bloated with extra lines).
- 		// Lines purposely left blank (just a line ending) are left alone.
- 		output = output.replace(/\s+?(\r?)\n/g, "$1\n");
- 	}
- 	
-	/*debug*///print(this.code);
-	return output;
-}
\ No newline at end of file
--- a/sbin/res/app/lib/JSDOC/Lang.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,144 +0,0 @@
-/**
-	@namespace
-*/
-JSDOC.Lang = {
-}
-
-JSDOC.Lang.isBuiltin = function(name) {
-	return (JSDOC.Lang.isBuiltin.coreObjects.indexOf(name) > -1);
-}
-JSDOC.Lang.isBuiltin.coreObjects = ['_global_', 'Array', 'Boolean', 'Date', 'Error', 'Function', 'Math', 'Number', 'Object', 'RegExp', 'String'];
-
-JSDOC.Lang.whitespace = function(ch) {
-	return JSDOC.Lang.whitespace.names[ch];
-}
-JSDOC.Lang.whitespace.names = {
-	" ":      "SPACE",
-	"\f":     "FORMFEED",
-	"\t":     "TAB",
-	"\u0009": "UNICODE_TAB",
-	"\u000A": "UNICODE_NBR",
-	"\u0008": "VERTICAL_TAB"
-};
-
-JSDOC.Lang.newline = function(ch) {
-	return JSDOC.Lang.newline.names[ch];
-}
-JSDOC.Lang.newline.names = {
-	"\n":     "NEWLINE",
-	"\r":     "RETURN",
-	"\u000A": "UNICODE_LF",
-	"\u000D": "UNICODE_CR",
-	"\u2029": "UNICODE_PS",
-	"\u2028": "UNICODE_LS"
-};
-
-JSDOC.Lang.keyword = function(word) {
-	return JSDOC.Lang.keyword.names["="+word];
-}
-JSDOC.Lang.keyword.names = {
-	"=break":      "BREAK",
-	"=case":       "CASE",
-	"=catch":      "CATCH",
-	"=const":      "VAR",
-	"=continue":   "CONTINUE",
-	"=default":    "DEFAULT",
-	"=delete":     "DELETE",
-	"=do":         "DO",
-	"=else":       "ELSE",
-	"=false":      "FALSE",
-	"=finally":    "FINALLY",
-	"=for":        "FOR",
-	"=function":   "FUNCTION",
-	"=if":         "IF",
-	"=in":         "IN",
-	"=instanceof": "INSTANCEOF",
-	"=new":        "NEW",
-	"=null":       "NULL",
-	"=return":     "RETURN",
-	"=switch":     "SWITCH",
-	"=this":       "THIS",
-	"=throw":      "THROW",
-	"=true":       "TRUE",
-	"=try":        "TRY",
-	"=typeof":     "TYPEOF",
-	"=void":       "VOID",
-	"=while":      "WHILE",
-	"=with":       "WITH",
-	"=var":        "VAR"
-};
-
-JSDOC.Lang.punc = function(ch) {
-	return JSDOC.Lang.punc.names[ch];
-}
-JSDOC.Lang.punc.names = {
-	";":   "SEMICOLON",
-	",":   "COMMA",
-	"?":   "HOOK",
-	":":   "COLON",
-	"||":  "OR", 
-	"&&":  "AND",
-	"|":   "BITWISE_OR",
-	"^":   "BITWISE_XOR",
-	"&":   "BITWISE_AND",
-	"===": "STRICT_EQ", 
-	"==":  "EQ",
-	"=":   "ASSIGN",
-	"!==": "STRICT_NE",
-	"!=":  "NE",
-	"<<":  "LSH",
-	"<=":  "LE", 
-	"<":   "LT",
-	">>>": "URSH",
-	">>":  "RSH",
-	">=":  "GE",
-	">":   "GT", 
-	"++":  "INCREMENT",
-	"--":  "DECREMENT",
-	"+":   "PLUS",
-	"-":   "MINUS",
-	"*":   "MUL",
-	"/":   "DIV", 
-	"%":   "MOD",
-	"!":   "NOT",
-	"~":   "BITWISE_NOT",
-	".":   "DOT",
-	"[":   "LEFT_BRACKET",
-	"]":   "RIGHT_BRACKET",
-	"{":   "LEFT_CURLY",
-	"}":   "RIGHT_CURLY",
-	"(":   "LEFT_PAREN",
-	")":   "RIGHT_PAREN"
-};
-
-JSDOC.Lang.matching = function(name) {
-	return JSDOC.Lang.matching.names[name];
-}
-JSDOC.Lang.matching.names = {
-	"LEFT_PAREN": "RIGHT_PAREN",
-	"RIGHT_PAREN": "LEFT_PAREN",
-	"LEFT_CURLY": "RIGHT_CURLY",
-	"RIGHT_CURLY": "LEFT_CURLY",
-	"LEFT_BRACE": "RIGHT_BRACE",
-	"RIGHT_BRACE": "LEFT_BRACE"
-}
-
-JSDOC.Lang.isNumber = function(str) {
-	return /^(\.[0-9]|[0-9]+\.|[0-9])[0-9]*([eE][+-][0-9]+)?$/i.test(str);
-}
-
-JSDOC.Lang.isHexDec = function(str) {
-	return /^0x[0-9A-F]+$/i.test(str);
-}
-
-JSDOC.Lang.isWordChar = function(str) {
-	return /^[a-zA-Z0-9$_.]+$/.test(str);
-}
-
-JSDOC.Lang.isSpace = function(str) {
-	return (typeof JSDOC.Lang.whitespace(str) != "undefined");
-}
-
-JSDOC.Lang.isNewline = function(str) {
-	return (typeof JSDOC.Lang.newline(str) != "undefined");
-}
\ No newline at end of file
--- a/sbin/res/app/lib/JSDOC/Parser.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-if (typeof JSDOC == "undefined") JSDOC = {};
-
-/**
-	@namespace
-	@requires JSDOC.Walker
-	@requires JSDOC.Symbol
-	@requires JSDOC.DocComment
-*/
-JSDOC.Parser = {
-	conf: {
-		ignoreCode:               JSDOC.opt.n,
-		ignoreAnonymous:           true, // factory: true
-		treatUnderscoredAsPrivate: true, // factory: true
-		explain:                   false // factory: false
-	},
-	
-	addSymbol: function(symbol) {
-
-		if (JSDOC.Parser.rename) {
-			for (var n in JSDOC.Parser.rename) {
-				if (symbol.alias.indexOf(n) == 0) {
-					if (symbol.name == symbol.alias) {
-						symbol.name = symbol.name.replace(n, JSDOC.Parser.rename[n]);
-					}
-					symbol.alias = symbol.alias.replace(n, JSDOC.Parser.rename[n]);
-				}
-			}
-		}
-		
-		if (JSDOC.opt.S) {
-			if (typeof JSDOC.Parser.secureModules == "undefined") JSDOC.Parser.secureModules = {};
-			if (/^exports\./.test(symbol.alias)) {
-				symbol.srcFile.match(/(^|[\\\/])([^\\\/]+)\.js/i);
-				var fileNS = RegExp.$2;
-				
-				// need to create the namespace associated with this file first
-				if (!JSDOC.Parser.secureModules[fileNS]) {
-					JSDOC.Parser.secureModules[fileNS] = 1;
-					var nsSymbol = new JSDOC.Symbol(fileNS, [], "GLOBAL", new JSDOC.DocComment(""));
-					nsSymbol.isNamespace = true;
-					nsSymbol.srcFile = "";
-					nsSymbol.isPrivate = false;
-					nsSymbol.srcFile = symbol.srcFile;
-					nsSymbol.desc = (JSDOC.Parser.symbols.getSymbol(symbol.srcFile) || {desc: ""}).desc;
-					JSDOC.Parser.addSymbol(nsSymbol);
-				}
-				
-				symbol.alias = symbol.alias.replace(/^exports\./, fileNS + '.');
-				symbol.name = symbol.name.replace(/^exports\./, '');
-				symbol.memberOf = fileNS;
-				symbol.isStatic = true;
-			}
-		}
-
-		// if a symbol alias is documented more than once the first one with the user docs wins
-		if (JSDOC.Parser.symbols.hasSymbol(symbol.alias)) {
- 			var oldSymbol = JSDOC.Parser.symbols.getSymbol(symbol.alias);
-			if (oldSymbol.comment.isUserComment) {
-				if (JSDOC.opt.m) return;
-				if (symbol.comment.isUserComment) { // old and new are both documented
-					LOG.warn("The symbol '"+symbol.alias+"' is documented more than once.");
-					return;
-				}
-				else { // old is documented but new isn't
-					return;
-				}
-			}
-		}
-		
-		// we don't document anonymous things
-		if (JSDOC.Parser.conf.ignoreAnonymous && symbol.name.match(/\$anonymous\b/)) return;
-
-		// uderscored things may be treated as if they were marked private, this cascades
-		if (JSDOC.Parser.conf.treatUnderscoredAsPrivate && symbol.name.match(/[.#-]_[^.#-]+$/)) {
-			if (!symbol.comment.getTag("public").length > 0) symbol.isPrivate = true;
-		}
-		
-		// -p flag is required to document private things
-		if (!JSDOC.opt.p && symbol.isPrivate) return; // issue #161 fixed by mcbain.asm
-		
-		// ignored things are not documented, this doesn't cascade
-		if (symbol.isIgnored) return;
-		JSDOC.Parser.symbols.addSymbol(symbol);
-	},
-	
-	addBuiltin: function(name) {
-		var builtin = new JSDOC.Symbol(name, [], "CONSTRUCTOR", new JSDOC.DocComment(""));
-		builtin.isNamespace = true;
-		builtin.srcFile = "";
-		builtin.isPrivate = false;
-		JSDOC.Parser.addSymbol(builtin);
-		return builtin;
-	},
-	
-	init: function() {
-		JSDOC.Parser.symbols = new JSDOC.SymbolSet();
-		JSDOC.Parser.walker = new JSDOC.Walker();
-	},
-	
-	finish: function() {
-		JSDOC.Parser.symbols.relate();		
-		
-		// make a litle report about what was found
-		if (JSDOC.Parser.conf.explain) {
-			var symbols = JSDOC.Parser.symbols.toArray();
-			var srcFile = "";
-			for (var i = 0, l = symbols.length; i < l; i++) {
-				var symbol = symbols[i];
-				if (srcFile != symbol.srcFile) {
-					srcFile = symbol.srcFile;
-					print("\n"+srcFile+"\n-------------------");
-				}
-				print(i+":\n  alias => "+symbol.alias + "\n  name => "+symbol.name+ "\n  isa => "+symbol.isa + "\n  memberOf => " + symbol.memberOf + "\n  isStatic => " + symbol.isStatic + ",  isInner => " + symbol.isInner+ ",  isPrivate => " + symbol.isPrivate);
-			}
-			print("-------------------\n");
-		}
-	}
-}
-
-JSDOC.Parser.parse = function(/**JSDOC.TokenStream*/ts, /**String*/srcFile) {
-	JSDOC.Symbol.srcFile = (srcFile || "");
-	JSDOC.DocComment.shared = ""; // shared comments don't cross file boundaries
-	
-	if (!JSDOC.Parser.walker) JSDOC.Parser.init();
-	JSDOC.Parser.walker.walk(ts); // adds to our symbols
-	
-	// filter symbols by option
-	for (var p = JSDOC.Parser.symbols._index.first(); p; p = JSDOC.Parser.symbols._index.next()) {
-		var symbol = p.value;
-		
-		if (!symbol) continue;
-		
-		if (symbol.is("FILE") || symbol.is("GLOBAL")) {
-			continue;
-		}
-		else if (!JSDOC.opt.a && !symbol.comment.isUserComment) {
-			JSDOC.Parser.symbols.deleteSymbol(symbol.alias);
-		}
-		
-		if (/#$/.test(symbol.alias)) { // we don't document prototypes
-			JSDOC.Parser.symbols.deleteSymbol(symbol.alias);
-		}
-	}
-	
-	return JSDOC.Parser.symbols.toArray();
-}
--- a/sbin/res/app/lib/JSDOC/PluginManager.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/**
-	@namespace Holds functionality related to running plugins.
-*/
-JSDOC.PluginManager = {
-}
-
-/**
-	@param name A unique name that identifies that plugin.
-	@param handlers A collection of named functions. The names correspond to hooks in the core code.
-*/
-JSDOC.PluginManager.registerPlugin = function(/**String*/name, /**Object*/handlers) {
-	if (!defined(JSDOC.PluginManager.plugins))
-		/** The collection of all plugins. Requires a unique name for each.
-		*/
-		JSDOC.PluginManager.plugins = {};
-	
-	
-	JSDOC.PluginManager.plugins[name] = handlers;
-}
-
-/**
-	@param hook The name of the hook that is being caught.
-	@param target Any object. This will be passed as the only argument to the handler whose
-	name matches the hook name. Handlers cannot return a value, so must modify the target
-	object to have an effect.
-*/
-JSDOC.PluginManager.run = function(/**String*/hook, /**Mixed*/target) {
-	for (var name in JSDOC.PluginManager.plugins) {
-		if (defined(JSDOC.PluginManager.plugins[name][hook])) {
-			JSDOC.PluginManager.plugins[name][hook](target);
-		}
-	}
-}
--- a/sbin/res/app/lib/JSDOC/Symbol.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,644 +0,0 @@
-if (typeof JSDOC == "undefined") JSDOC = {};
-
-/**
-	Create a new Symbol.
-	@class Represents a symbol in the source code.
- */
-JSDOC.Symbol = function() {
-	this.init();
-	if (arguments.length) this.populate.apply(this, arguments);
-}
-
-JSDOC.Symbol.count = 0;
-
-JSDOC.Symbol.prototype.init = function() {
-	this._name = "";
-	this._params = [];
-	this.$args = [];
-	this.addOn = "";
-	this.alias = "";
-	this.augments = [];
-	this.author = "";
-	this.classDesc = "";
-	this.comment = {};
-	this.defaultValue = undefined;
-	this.deprecated = "";
-	this.desc = "";
-	this.example = [];
-	this.exceptions = [];
-	this.fires = [];
-	this.id = JSDOC.Symbol.count++;
-	this.inherits = [];
-	this.inheritsFrom = [];
-	this.isa = "OBJECT";
-	this.isConstant = false;
-	this.isEvent = false;
-	this.isIgnored = false;
-	this.isInner = false;
-	this.isNamespace = false;
-	this.isPrivate = false;
-	this.isStatic = false;
-	this.memberOf = "";
-	this.methods = [];
-	this.properties = [];
-	this.requires = [];
-	this.returns = [];
-	this.see = [];
-	this.since = "";
-	this.srcFile = {};
-	this.type = "";
-	this.version = "";
-}
-
-JSDOC.Symbol.prototype.serialize = function() {
-	var keys = [];
-	for (var p in this) {
-		keys.push (p);
-	}
-	keys = keys.sort();
-	
-	var out = "";
-	for (var i in keys) {
-		if (typeof this[keys[i]] == "function") continue;
-		out += keys[i]+" => "+Dumper.dump(this[keys[i]])+",\n";
-	}
-	return "\n{\n" + out + "}\n";
-}
-
-JSDOC.Symbol.prototype.clone = function() {
-	var clone = new JSDOC.Symbol();
-	clone.populate.apply(clone, this.$args); // repopulate using the original arguments
-	clone.srcFile = this.srcFile; // not the current srcFile, the one when the original was made
-	return clone;
-}
-
-JSDOC.Symbol.prototype.__defineSetter__("name",
-	function(n) { n = n.replace(/^_global_[.#-]/, ""); n = n.replace(/\.prototype\.?/g, '#'); this._name = n; }
-);
-JSDOC.Symbol.prototype.__defineGetter__("name",
-	function() { return this._name; }
-);
-JSDOC.Symbol.prototype.__defineSetter__("params", 
-	function(v) {
-		for (var i = 0, l = v.length; i < l; i++) {
-			if (v[i].constructor != JSDOC.DocTag) { // may be a generic object parsed from signature, like {type:..., name:...}
-				this._params[i] = new JSDOC.DocTag("param"+((v[i].type)?" {"+v[i].type+"}":"")+" "+v[i].name);
-			}
-			else {
-				this._params[i] = v[i];
-			}
-		}
-	}
-);
-JSDOC.Symbol.prototype.__defineGetter__("params",
-	function() { return this._params; }
-);
-
-JSDOC.Symbol.prototype.getEvents = function() {
-	var events = [];
-	for (var i = 0, l = this.methods.length; i < l; i++) {
-		if (this.methods[i].isEvent) {
-			this.methods[i].name = this.methods[i].name.replace("event:", "");
-			events.push(this.methods[i]);
-		}
-	}
-	return events;
-}
-
-JSDOC.Symbol.prototype.getMethods = function() {
-	var nonEvents = [];
-	for (var i = 0, l = this.methods.length; i < l; i++) {
-		if (!this.methods[i].isEvent) {
-			nonEvents.push(this.methods[i]);
-		}
-	}
-	return nonEvents;
-}
-
-
-JSDOC.Symbol.prototype.populate = function(
-		/** String */ name,
-		/** Object[] */ params,
-		/** String */ isa,
-		/** JSDOC.DocComment */ comment
-) {
-	this.$args = arguments;
-	
-	this.name = name;
-	this.alias = this.name;
-	
-	this.params = params;
-	this.isa = (isa == "VIRTUAL")? "OBJECT":isa;
-	this.comment = comment || new JSDOC.DocComment("");
-	this.srcFile = JSDOC.Symbol.srcFile;
-	
-	if (this.is("FILE") && !this.alias) this.alias = this.srcFile;
-
-	this.setTags();
-	
-	if (typeof JSDOC.PluginManager != "undefined") {
-		JSDOC.PluginManager.run("onSymbol", this);
-	}
-}
-
-JSDOC.Symbol.prototype.setTags = function() {
-	// @author
-	var authors = this.comment.getTag("author");
-	if (authors.length) {
-		this.author = authors.map(function($){return $.desc;}).join(", ");
-	}
-	
-	/*t:
-		plan(34, "testing JSDOC.Symbol");
-		
-		requires("../lib/JSDOC/DocComment.js");
-		requires("../frame/String.js");
-		requires("../lib/JSDOC/DocTag.js");
-
-		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@author Joe Smith*"+"/"));
-		is(sym.author, "Joe Smith", "@author tag, author is found.");
-	*/
-	
-	// @desc
-	var descs = this.comment.getTag("desc");
-	if (descs.length) {
-		this.desc = descs.map(function($){return $.desc;}).join("\n"); // multiple descriptions are concatenated into one
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@desc This is a description.*"+"/"));
-		is(sym.desc, "This is a description.", "@desc tag, description is found.");
-	*/
-	
-	// @overview
-	if (this.is("FILE")) {
-		if (!this.alias) this.alias = this.srcFile;
-		
-		var overviews = this.comment.getTag("overview");
-		if (overviews.length) {
-			this.desc = [this.desc].concat(overviews.map(function($){return $.desc;})).join("\n");
-		}
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@overview This is an overview.*"+"/"));
-		is(sym.desc, "\nThis is an overview.", "@overview tag, description is found.");
-	*/
-	
-	// @since
-	var sinces = this.comment.getTag("since");
-	if (sinces.length) {
-		this.since = sinces.map(function($){return $.desc;}).join(", ");
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@since 1.01*"+"/"));
-		is(sym.since, "1.01", "@since tag, description is found.");
-	*/
-	
-	// @constant
-	if (this.comment.getTag("constant").length) {
-		this.isConstant = true;
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@constant*"+"/"));
-		is(sym.isConstant, true, "@constant tag, isConstant set.");
-	*/
-	
-	// @version
-	var versions = this.comment.getTag("version");
-	if (versions.length) {
-		this.version = versions.map(function($){return $.desc;}).join(", ");
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@version 2.0x*"+"/"));
-		is(sym.version, "2.0x", "@version tag, version is found.");
-	*/
-	
-	// @deprecated
-	var deprecateds = this.comment.getTag("deprecated");
-	if (deprecateds.length) {
-		this.deprecated = deprecateds.map(function($){return $.desc;}).join("\n");
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@deprecated Use other method.*"+"/"));
-		is(sym.deprecated, "Use other method.", "@deprecated tag, desc is found.");
-	*/
-	
-	// @example
-	var examples = this.comment.getTag("example");
-	if (examples.length) {
-		this.example = examples.map(
-			// trim trailing whitespace
-			function($) {
-				$.desc = $.desc.replace(/\s+$/, "");
-				return $;
-			}
-		);
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@example This\n  is an example. \n*"+"/"));
-		isnt(typeof sym.example[0], "undefined", "@example tag, creates sym.example array.");
-		is(sym.example[0], "This\n  is an example.", "@example tag, desc is found.");
-	*/
-	
-	// @see
-	var sees = this.comment.getTag("see");
-	if (sees.length) {
-		var thisSee = this.see;
-		sees.map(function($){thisSee.push($.desc);});
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@see The other thing.*"+"/"));
-		is(sym.see, "The other thing.", "@see tag, desc is found.");
-	*/
-	
-	// @class
-	var classes = this.comment.getTag("class");
-	if (classes.length) {
-		this.isa = "CONSTRUCTOR";
-		this.classDesc = classes[0].desc; // desc can't apply to the constructor as there is none.
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@class This describes the class.*"+"/"));
-		is(sym.isa, "CONSTRUCTOR", "@class tag, makes symbol a constructor.");
-		is(sym.classDesc, "This describes the class.", "@class tag, class description is found.");
-	*/
-	
-	// @namespace
-	var namespaces = this.comment.getTag("namespace");
-	if (namespaces.length) {
-		this.classDesc = namespaces[0].desc;
-		this.isNamespace = true;
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@namespace This describes the namespace.*"+"/"));
-		is(sym.classDesc, "This describes the namespace.", "@namespace tag, class description is found.");
-	*/
-	
-	// @param
-	var params = this.comment.getTag("param");
-	if (params.length) {
-		// user-defined params overwrite those with same name defined by the parser
-		var thisParams = this.params;
-
-		if (thisParams.length == 0) { // none exist yet, so just bung all these user-defined params straight in
-			this.params = params;
-		}
-		else { // need to overlay these user-defined params on to existing parser-defined params
-			for (var i = 0, l = params.length; i < l; i++) {
-				if (thisParams[i]) {
-					if (params[i].type) thisParams[i].type = params[i].type;
-					thisParams[i].name = params[i].name;
-					thisParams[i].desc = params[i].desc;
-					thisParams[i].isOptional = params[i].isOptional;
-					thisParams[i].defaultValue = params[i].defaultValue;
-				}
-				else thisParams[i] = params[i];
-			}
-		}
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [{type: "array", name: "pages"}], "FUNCTION", new JSDOC.DocComment("/**Description.*"+"/"));
-		is(sym.params.length, 1, "parser defined param is found.");
-		
-		sym = new JSDOC.Symbol("foo", [], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {array} pages*"+"/"));
-		is(sym.params.length, 1, "user defined param is found.");
-		is(sym.params[0].type, "array", "user defined param type is found.");
-		is(sym.params[0].name, "pages", "user defined param name is found.");
-		
-		sym = new JSDOC.Symbol("foo", [{type: "array", name: "pages"}], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {string} uid*"+"/"));
-		is(sym.params.length, 1, "user defined param overwrites parser defined param.");
-		is(sym.params[0].type, "string", "user defined param type overwrites parser defined param type.");
-		is(sym.params[0].name, "uid", "user defined param name overwrites parser defined param name.");
-	
-		sym = new JSDOC.Symbol("foo", [{type: "array", name: "pages"}, {type: "number", name: "count"}], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {string} uid*"+"/"));
-		is(sym.params.length, 2, "user defined params  overlay parser defined params.");
-		is(sym.params[1].type, "number", "user defined param type overlays parser defined param type.");
-		is(sym.params[1].name, "count", "user defined param name overlays parser defined param name.");
-
-		sym = new JSDOC.Symbol("foo", [], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {array} pages The pages description.*"+"/"));
-		is(sym.params.length, 1, "user defined param with description is found.");
-		is(sym.params[0].desc, "The pages description.", "user defined param description is found.");
-	*/
-	
-	// @constructor
-	if (this.comment.getTag("constructor").length) {
-		this.isa = "CONSTRUCTOR";
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@constructor*"+"/"));
-		is(sym.isa, "CONSTRUCTOR", "@constructor tag, makes symbol a constructor.");
-	*/
-	
-	// @static
-	if (this.comment.getTag("static").length) {
-		this.isStatic = true;
-		if (this.isa == "CONSTRUCTOR") {
-			this.isNamespace = true;
-		}
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@static\n@constructor*"+"/"));
-		is(sym.isStatic, true, "@static tag, makes isStatic true.");
-		is(sym.isNamespace, true, "@static and @constructor tag, makes isNamespace true.");
-	*/
-	
-	// @inner
-	if (this.comment.getTag("inner").length) {
-		this.isInner = true;
-		this.isStatic = false;
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@inner*"+"/"));
-		is(sym.isStatic, false, "@inner tag, makes isStatic false.");
-		is(sym.isInner, true, "@inner makes isInner true.");
-	*/
-	
-	// @name
-	var names = this.comment.getTag("name");
-	if (names.length) {
-		this.name = names[0].desc;
-	}
-	
-	/*t:
-		// todo
-	*/
-	
-	// @field
-	if (this.comment.getTag("field").length) {
-		this.isa = "OBJECT";
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "FUNCTION", new JSDOC.DocComment("/**@field*"+"/"));
-		is(sym.isa, "OBJECT", "@field tag, makes symbol an object.");
-	*/
-	
-	// @function
-	if (this.comment.getTag("function").length) {
-		this.isa = "FUNCTION";
-		if (/event:/.test(this.alias)) this.isEvent = true;
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@function*"+"/"));
-		is(sym.isa, "FUNCTION", "@function tag, makes symbol a function.");
-	*/
-	
-	// @event
-	var events = this.comment.getTag("event");
-	if (events.length) {
-		this.isa = "FUNCTION";
-		this.isEvent = true;
-		if (!/event:/.test(this.alias))
-			this.alias = this.alias.replace(/^(.*[.#-])([^.#-]+)$/, "$1event:$2");
-	}
-	
-	/*t:
-		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@event*"+"/"));
-		is(sym.isa, "FUNCTION", "@event tag, makes symbol a function.");
-		is(sym.isEvent, true, "@event makes isEvent true.");
-	*/
-	
-	// @fires
-	var fires = this.comment.getTag("fires");
-	if (fires.length) {
-		for (var i = 0; i < fires.length; i++) {
-			this.fires.push(fires[i].desc);
-		}
-	}
-	
-	/*t:
-		// todo
-	*/
-	
-	// @property
-	var properties = this.comment.getTag("property");
-	if (properties.length) {
-		thisProperties = this.properties;
-		for (var i = 0; i < properties.length; i++) {
-			var property = new JSDOC.Symbol(this.alias+"#"+properties[i].name, [], "OBJECT", new JSDOC.DocComment("/**"+properties[i].desc+"*/"));
-			// TODO: shouldn't the following happen in the addProperty method of Symbol?
-			if (properties[i].type) property.type = properties[i].type;
-			if (properties[i].defaultValue) property.defaultValue = properties[i].defaultValue;
-			this.addProperty(property);
-			if (!JSDOC.Parser.symbols.getSymbolByName(property.name))
-				JSDOC.Parser.addSymbol(property);
-		}
-	}
-	
-	/*t:
-		// todo
-	*/
-
-	// @return
-	var returns = this.comment.getTag("return");
-	if (returns.length) { // there can be many return tags in a single doclet
-		this.returns = returns;
-		this.type = returns.map(function($){return $.type}).join(", ");
-	}
-	
-	/*t:
-		// todo
-	*/
-	
-	// @exception
-	this.exceptions = this.comment.getTag("throws");
-	
-	/*t:
-		// todo
-	*/
-	
-	// @requires
-	var requires = this.comment.getTag("requires");
-	if (requires.length) {
-		this.requires = requires.map(function($){return $.desc});
-	}
-	
-	/*t:
-		// todo
-	*/
-	
-	// @type
-	var types = this.comment.getTag("type");
-	if (types.length) {
-		this.type = types[0].desc; //multiple type tags are ignored
-	}
-	
-	/*t:
-		// todo
-	*/
-	
-	// @private
-	if (this.comment.getTag("private").length || this.isInner) {
-		this.isPrivate = true;
-	}
-	
-	// @ignore
-	if (this.comment.getTag("ignore").length) {
-		this.isIgnored = true;
-	}
-	
-	/*t:
-		// todo
-	*/
-	
-	// @inherits ... as ...
-	var inherits = this.comment.getTag("inherits");
-	if (inherits.length) {
-		for (var i = 0; i < inherits.length; i++) {
-			if (/^\s*([a-z$0-9_.#:-]+)(?:\s+as\s+([a-z$0-9_.#:-]+))?/i.test(inherits[i].desc)) {
-				var inAlias = RegExp.$1;
-				var inAs = RegExp.$2 || inAlias;
-
-				if (inAlias) inAlias = inAlias.replace(/\.prototype\.?/g, "#");
-				
-				if (inAs) {
-					inAs = inAs.replace(/\.prototype\.?/g, "#");
-					inAs = inAs.replace(/^this\.?/, "#");
-				}
-
-				if (inAs.indexOf(inAlias) != 0) { //not a full namepath
-					var joiner = ".";
-					if (this.alias.charAt(this.alias.length-1) == "#" || inAs.charAt(0) == "#") {
-						joiner = "";
-					}
-					inAs = this.alias + joiner + inAs;
-				}
-			}
-			this.inherits.push({alias: inAlias, as: inAs});
-		}
-	}
-	
-	/*t:
-		// todo
-	*/
-	
-	// @augments
-	this.augments = this.comment.getTag("augments");
-	
-	// @default
-	var defaults = this.comment.getTag("default");
-	if (defaults.length) {
-		if (this.is("OBJECT")) {
-			this.defaultValue = defaults[0].desc;
-		}
-	}
-	
-	/*t:
-		// todo
-	*/
-	
-	// @memberOf
-	var memberOfs = this.comment.getTag("memberOf");
-	if (memberOfs.length) {
-		this.memberOf = memberOfs[0].desc;
-		this.memberOf = this.memberOf.replace(/\.prototype\.?/g, "#");
-	}
-
-	/*t:
-		// todo
-	*/
-	
-	// @public
-	if (this.comment.getTag("public").length) {
-		this.isPrivate = false;
-	}
-	
-	/*t:
-		// todo
-	*/
-		
-	if (JSDOC.PluginManager) {
-		JSDOC.PluginManager.run("onSetTags", this);
-	}
-}
-
-JSDOC.Symbol.prototype.is = function(what) {
-	return this.isa === what;
-}
-
-JSDOC.Symbol.prototype.isBuiltin = function() {
-	return JSDOC.Lang.isBuiltin(this.alias);
-}
-
-JSDOC.Symbol.prototype.setType = function(/**String*/comment, /**Boolean*/overwrite) {
-	if (!overwrite && this.type) return;
-	var typeComment = JSDOC.DocComment.unwrapComment(comment);
-	this.type = typeComment;
-}
-
-JSDOC.Symbol.prototype.inherit = function(symbol) {
-	if (!this.hasMember(symbol.name) && !symbol.isInner) {
-		if (symbol.is("FUNCTION"))
-			this.methods.push(symbol);
-		else if (symbol.is("OBJECT"))
-			this.properties.push(symbol);
-	}
-}
-
-JSDOC.Symbol.prototype.hasMember = function(name) {
-	return (this.hasMethod(name) || this.hasProperty(name));
-}
-
-JSDOC.Symbol.prototype.addMember = function(symbol) {
-	if (symbol.is("FUNCTION")) { this.addMethod(symbol); }
-	else if (symbol.is("OBJECT")) { this.addProperty(symbol); }
-}
-
-JSDOC.Symbol.prototype.hasMethod = function(name) {
-	var thisMethods = this.methods;
-	for (var i = 0, l = thisMethods.length; i < l; i++) {
-		if (thisMethods[i].name == name) return true;
-		if (thisMethods[i].alias == name) return true;
-	}
-	return false;
-}
-
-JSDOC.Symbol.prototype.addMethod = function(symbol) {
-	var methodAlias = symbol.alias;
-	var thisMethods = this.methods;
-	for (var i = 0, l = thisMethods.length; i < l; i++) {
-		if (thisMethods[i].alias == methodAlias) {
-			thisMethods[i] = symbol; // overwriting previous method
-			return;
-		}
-	}
-	thisMethods.push(symbol); // new method with this alias
-}
-
-JSDOC.Symbol.prototype.hasProperty = function(name) {
-	var thisProperties = this.properties;
-	for (var i = 0, l = thisProperties.length; i < l; i++) {
-		if (thisProperties[i].name == name) return true;
-		if (thisProperties[i].alias == name) return true;
-	}
-	return false;
-}
-
-JSDOC.Symbol.prototype.addProperty = function(symbol) {
-	var propertyAlias = symbol.alias;
-	var thisProperties = this.properties;
-	for (var i = 0, l = thisProperties.length; i < l; i++) {
-		if (thisProperties[i].alias == propertyAlias) {
-			thisProperties[i] = symbol; // overwriting previous property
-			return;
-		}
-	}
-
-	thisProperties.push(symbol); // new property with this alias
-}
-
-JSDOC.Symbol.srcFile = ""; //running reference to the current file being parsed
--- a/sbin/res/app/lib/JSDOC/SymbolSet.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,243 +0,0 @@
-/** @constructor */
-JSDOC.SymbolSet = function() {
-	this.init();
-}
-
-JSDOC.SymbolSet.prototype.init = function() {
-	this._index = new Hash();
-}
-
-JSDOC.SymbolSet.prototype.keys = function() {
-	return this._index.keys();
-}
-
-JSDOC.SymbolSet.prototype.hasSymbol = function(alias) {
-	return this._index.hasKey(alias);
-}
-
-JSDOC.SymbolSet.prototype.addSymbol = function(symbol) {
-	if (JSDOC.opt.a && this.hasSymbol(symbol.alias)) {
-		LOG.warn("Overwriting symbol documentation for: " + symbol.alias + ".");
-		this.deleteSymbol(symbol.alias);
-	}
-	this._index.set(symbol.alias, symbol);
-}
-
-JSDOC.SymbolSet.prototype.getSymbol = function(alias) {
-	if (this.hasSymbol(alias)) return this._index.get(alias);
-}
-
-JSDOC.SymbolSet.prototype.getSymbolByName = function(name) {
-	for (var p = this._index.first(); p; p = this._index.next()) {
-		var symbol = p.value;
-		if (symbol.name == name) return symbol;
-	}
-}
-
-JSDOC.SymbolSet.prototype.toArray = function() {
-	return this._index.values();
-}
-
-JSDOC.SymbolSet.prototype.deleteSymbol = function(alias) {
-	if (!this.hasSymbol(alias)) return;
-	this._index.drop(alias);
-}
-
-JSDOC.SymbolSet.prototype.renameSymbol = function(oldName, newName) {
-	// todo: should check if oldname or newname already exist
-	this._index.replace(oldName, newName);
-	this._index.get(newName).alias = newName;
-	return newName;
-}
-
-JSDOC.SymbolSet.prototype.relate = function() {
-	this.resolveBorrows();
-	this.resolveMemberOf();
-	this.resolveAugments();
-}
-
-JSDOC.SymbolSet.prototype.resolveBorrows = function() {
-	for (var p = this._index.first(); p; p = this._index.next()) {
-		var symbol = p.value;
-		if (symbol.is("FILE") || symbol.is("GLOBAL")) continue;
-		
-		var borrows = symbol.inherits;
-		for (var i = 0; i < borrows.length; i++) {
-		
-if (/#$/.test(borrows[i].alias)) {
-	LOG.warn("Attempted to borrow entire instance of "+borrows[i].alias+" but that feature is not yet implemented.");
-	return;
-}
-			var borrowed = this.getSymbol(borrows[i].alias);
-			
-			if (!borrowed) {
-				LOG.warn("Can't borrow undocumented "+borrows[i].alias+".");
-				continue;
-			}
-
-			if (borrows[i].as == borrowed.alias) {
-				var assumedName = borrowed.name.split(/([#.-])/).pop();
-				borrows[i].as = symbol.name+RegExp.$1+assumedName;
-				LOG.inform("Assuming borrowed as name is "+borrows[i].as+" but that feature is experimental.");
-			}
-			
-			var borrowAsName = borrows[i].as;
-			var borrowAsAlias = borrowAsName;
-			if (!borrowAsName) {
-				LOG.warn("Malformed @borrow, 'as' is required.");
-				continue;
-			}
-			
-			if (borrowAsName.length > symbol.alias.length && borrowAsName.indexOf(symbol.alias) == 0) {
-				borrowAsName = borrowAsName.replace(borrowed.alias, "")
-			}
-			else {
-				var joiner = "";
-				if (borrowAsName.charAt(0) != "#") joiner = ".";
-				borrowAsAlias = borrowed.alias + joiner + borrowAsName;
-			}
-			
-			borrowAsName = borrowAsName.replace(/^[#.]/, "");
-					
-			if (this.hasSymbol(borrowAsAlias)) continue;
-
-			var clone = borrowed.clone();
-			clone.name = borrowAsName;
-			clone.alias = borrowAsAlias;
-			this.addSymbol(clone);
-		}
-	}
-}
-
-JSDOC.SymbolSet.prototype.resolveMemberOf = function() {
-	for (var p = this._index.first(); p; p = this._index.next()) {
-		var symbol = p.value;
-
-		if (symbol.is("FILE") || symbol.is("GLOBAL")) continue;
-		
-		// the memberOf value was provided in the @memberOf tag
-		else if (symbol.memberOf) {			
-			// like foo.bar is a memberOf foo
-			if (symbol.alias.indexOf(symbol.memberOf) == 0) {
-				var memberMatch = new RegExp("^("+symbol.memberOf+")[.#-]?(.+)$");
-				var aliasParts = symbol.alias.match(memberMatch);
-				
-				if (aliasParts) {
-					symbol.memberOf = aliasParts[1];
-					symbol.name = aliasParts[2];
-				}
-				
-				var nameParts = symbol.name.match(memberMatch);
-
-				if (nameParts) {
-					symbol.name = nameParts[2];
-				}
-			}
-			// like bar is a memberOf foo
-			else {
-				var joiner = symbol.memberOf.charAt(symbol.memberOf.length-1);
-				if (!/[.#-]/.test(joiner)) symbol.memberOf += ".";
-				this.renameSymbol(symbol.alias, symbol.memberOf + symbol.name);
-			}
-		}
-		// the memberOf must be calculated
-		else {
-			var parts = symbol.alias.match(/^(.*[.#-])([^.#-]+)$/);
-
-			if (parts) {
-				symbol.memberOf = parts[1];
-				symbol.name = parts[2];				
-			}
-		}
-
-		// set isStatic, isInner
-		if (symbol.memberOf) {
-			switch (symbol.memberOf.charAt(symbol.memberOf.length-1)) {
-				case '#' :
-					symbol.isStatic = false;
-					symbol.isInner = false;
-				break;
-				case '.' :
-					symbol.isStatic = true;
-					symbol.isInner = false;
-				break;
-				case '-' :
-					symbol.isStatic = false;
-					symbol.isInner = true;
-				break;
-				default: // memberOf ends in none of the above
-					symbol.isStatic = true;
-				break;
-			}
-		}
-		
-		// unowned methods and fields belong to the global object
-		if (!symbol.is("CONSTRUCTOR") && !symbol.isNamespace && symbol.memberOf == "") {
-			symbol.memberOf = "_global_";
-		}
-
-		// clean up
-		if (symbol.memberOf.match(/[.#-]$/)) {
-			symbol.memberOf = symbol.memberOf.substr(0, symbol.memberOf.length-1);
-		}
-		// add to parent's methods or properties list
-		if (symbol.memberOf) {
-
-			var container = this.getSymbol(symbol.memberOf);
-			if (!container) {
-				if (JSDOC.Lang.isBuiltin(symbol.memberOf)) container = JSDOC.Parser.addBuiltin(symbol.memberOf);
-				else {
-					LOG.warn("Trying to document "+symbol.name +" as a member of undocumented symbol "+symbol.memberOf+".");
-				}
-			}
-			
-			if (container) container.addMember(symbol);
-		}
-	}
-}
-
-JSDOC.SymbolSet.prototype.resolveAugments = function() {
-	for (var p = this._index.first(); p; p = this._index.next()) {
-		var symbol = p.value;
-		
-		if (symbol.alias == "_global_" || symbol.is("FILE")) continue;
-		JSDOC.SymbolSet.prototype.walk.apply(this, [symbol]);
-	}
-}
-
-JSDOC.SymbolSet.prototype.walk = function(symbol) {
-	var augments = symbol.augments;
-	for(var i = 0; i < augments.length; i++) {
-		var contributer = this.getSymbol(augments[i]);
-		if (!contributer && JSDOC.Lang.isBuiltin(''+augments[i])) {
-			contributer = new JSDOC.Symbol("_global_."+augments[i], [], augments[i], new JSDOC.DocComment("Built in."));
-			contributer.isNamespace = true;
-			contributer.srcFile = "";
-			contributer.isPrivate = false;
-			JSDOC.Parser.addSymbol(contributer);
-		}
-		
-		if (contributer) {			
-			if (contributer.augments.length) {
-				JSDOC.SymbolSet.prototype.walk.apply(this, [contributer]);
-			}
-			
-			symbol.inheritsFrom.push(contributer.alias);
-			//if (!isUnique(symbol.inheritsFrom)) {
-			//	LOG.warn("Can't resolve augments: Circular reference: "+symbol.alias+" inherits from "+contributer.alias+" more than once.");
-			//}
-			//else {
-				var cmethods = contributer.methods;
-				var cproperties = contributer.properties;
-				
-				for (var ci = 0, cl = cmethods.length; ci < cl; ci++) {
-					if (!cmethods[ci].isStatic) symbol.inherit(cmethods[ci]);
-				}
-				for (var ci = 0, cl = cproperties.length; ci < cl; ci++) {
-					if (!cproperties[ci].isStatic) symbol.inherit(cproperties[ci]);
-				}	
-			//}
-		}
-		else LOG.warn("Can't augment contributer: "+augments[i]+", not found.");
-	}
-}
--- a/sbin/res/app/lib/JSDOC/TextStream.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-
-/**
-	@constructor
-*/
-JSDOC.TextStream = function(text) {
-	if (typeof(text) == "undefined") text = "";
-	text = ""+text;
-	this.text = text;
-	this.cursor = 0;
-}
-
-JSDOC.TextStream.prototype.look = function(n) {
-	if (typeof n == "undefined") n = 0;
-	
-	if (this.cursor+n < 0 || this.cursor+n >= this.text.length) {
-		var result = new String("");
-		result.eof = true;
-		return result;
-	}
-	return this.text.charAt(this.cursor+n);
-}
-
-JSDOC.TextStream.prototype.next = function(n) {
-	if (typeof n == "undefined") n = 1;
-	if (n < 1) return null;
-	
-	var pulled = "";
-	for (var i = 0; i < n; i++) {
-		if (this.cursor+i < this.text.length) {
-			pulled += this.text.charAt(this.cursor+i);
-		}
-		else {
-			var result = new String("");
-			result.eof = true;
-			return result;
-		}
-	}
-
-	this.cursor += n;
-	return pulled;
-}
\ No newline at end of file
--- a/sbin/res/app/lib/JSDOC/Token.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-if (typeof JSDOC == "undefined") JSDOC = {};
-
-/**
-	@constructor
-*/
-JSDOC.Token = function(data, type, name) {
-	this.data = data;
-	this.type = type;
-	this.name = name;
-}
-
-JSDOC.Token.prototype.toString = function() { 
-	return "<"+this.type+" name=\""+this.name+"\">"+this.data+"</"+this.type+">";
-}
-
-JSDOC.Token.prototype.is = function(what) {
-	return this.name === what || this.type === what;
-}
\ No newline at end of file
--- a/sbin/res/app/lib/JSDOC/TokenReader.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,332 +0,0 @@
-if (typeof JSDOC == "undefined") JSDOC = {};
-
-/**
-	@class Search a {@link JSDOC.TextStream} for language tokens.
-*/
-JSDOC.TokenReader = function() {
-	this.keepDocs = true;
-	this.keepWhite = false;
-	this.keepComments = false;
-}
-
-/**
-	@type {JSDOC.Token[]}
- */
-JSDOC.TokenReader.prototype.tokenize = function(/**JSDOC.TextStream*/stream) {
-	var tokens = [];
-	/**@ignore*/ tokens.last    = function() { return tokens[tokens.length-1]; }
-	/**@ignore*/ tokens.lastSym = function() {
-		for (var i = tokens.length-1; i >= 0; i--) {
-			if (!(tokens[i].is("WHIT") || tokens[i].is("COMM"))) return tokens[i];
-		}
-	}
-
-	while (!stream.look().eof) {
-		if (this.read_mlcomment(stream, tokens)) continue;
-		if (this.read_slcomment(stream, tokens)) continue;
-		if (this.read_dbquote(stream, tokens))   continue;
-		if (this.read_snquote(stream, tokens))   continue;
-		if (this.read_regx(stream, tokens))      continue;
-		if (this.read_numb(stream, tokens))      continue;
-		if (this.read_punc(stream, tokens))      continue;
-		if (this.read_newline(stream, tokens))   continue;
-		if (this.read_space(stream, tokens))     continue;
-		if (this.read_word(stream, tokens))      continue;
-		
-		// if execution reaches here then an error has happened
-		tokens.push(new JSDOC.Token(stream.next(), "TOKN", "UNKNOWN_TOKEN"));
-	}
-	return tokens;
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_word = function(/**JSDOC.TokenStream*/stream, tokens) {
-	var found = "";
-	while (!stream.look().eof && JSDOC.Lang.isWordChar(stream.look())) {
-		found += stream.next();
-	}
-	
-	if (found === "") {
-		return false;
-	}
-	else {
-		var name;
-		if ((name = JSDOC.Lang.keyword(found))) tokens.push(new JSDOC.Token(found, "KEYW", name));
-		else tokens.push(new JSDOC.Token(found, "NAME", "NAME"));
-		return true;
-	}
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_punc = function(/**JSDOC.TokenStream*/stream, tokens) {
-	var found = "";
-	var name;
-	while (!stream.look().eof && JSDOC.Lang.punc(found+stream.look())) {
-		found += stream.next();
-	}
-	
-	if (found === "") {
-		return false;
-	}
-	else {
-		tokens.push(new JSDOC.Token(found, "PUNC", JSDOC.Lang.punc(found)));
-		return true;
-	}
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_space = function(/**JSDOC.TokenStream*/stream, tokens) {
-	var found = "";
-	
-	while (!stream.look().eof && JSDOC.Lang.isSpace(stream.look())) {
-		found += stream.next();
-	}
-	
-	if (found === "") {
-		return false;
-	}
-	else {
-		if (this.collapseWhite) found = " ";
-		if (this.keepWhite) tokens.push(new JSDOC.Token(found, "WHIT", "SPACE"));
-		return true;
-	}
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_newline = function(/**JSDOC.TokenStream*/stream, tokens) {
-	var found = "";
-	
-	while (!stream.look().eof && JSDOC.Lang.isNewline(stream.look())) {
-		found += stream.next();
-	}
-	
-	if (found === "") {
-		return false;
-	}
-	else {
-		if (this.collapseWhite) found = "\n";
-		if (this.keepWhite) tokens.push(new JSDOC.Token(found, "WHIT", "NEWLINE"));
-		return true;
-	}
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_mlcomment = function(/**JSDOC.TokenStream*/stream, tokens) {
-	if (stream.look() == "/" && stream.look(1) == "*") {
-		var found = stream.next(2);
-		
-		while (!stream.look().eof && !(stream.look(-1) == "/" && stream.look(-2) == "*")) {
-			found += stream.next();
-		}
-		
-		// to start doclet we allow /** or /*** but not /**/ or /****
-		if (/^\/\*\*([^\/]|\*[^*])/.test(found) && this.keepDocs) tokens.push(new JSDOC.Token(found, "COMM", "JSDOC"));
-		else if (this.keepComments) tokens.push(new JSDOC.Token(found, "COMM", "MULTI_LINE_COMM"));
-		return true;
-	}
-	return false;
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_slcomment = function(/**JSDOC.TokenStream*/stream, tokens) {
-	var found;
-	if (
-		(stream.look() == "/" && stream.look(1) == "/" && (found=stream.next(2)))
-		|| 
-		(stream.look() == "<" && stream.look(1) == "!" && stream.look(2) == "-" && stream.look(3) == "-" && (found=stream.next(4)))
-	) {
-		
-		while (!stream.look().eof && !JSDOC.Lang.isNewline(stream.look())) {
-			found += stream.next();
-		}
-		
-		if (this.keepComments) {
-			tokens.push(new JSDOC.Token(found, "COMM", "SINGLE_LINE_COMM"));
-		}
-		return true;
-	}
-	return false;
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_dbquote = function(/**JSDOC.TokenStream*/stream, tokens) {
-	if (stream.look() == "\"") {
-		// find terminator
-		var string = stream.next();
-		
-		while (!stream.look().eof) {
-			if (stream.look() == "\\") {
-				if (JSDOC.Lang.isNewline(stream.look(1))) {
-					do {
-						stream.next();
-					} while (!stream.look().eof && JSDOC.Lang.isNewline(stream.look()));
-					string += "\\\n";
-				}
-				else {
-					string += stream.next(2);
-				}
-			}
-			else if (stream.look() == "\"") {
-				string += stream.next();
-				tokens.push(new JSDOC.Token(string, "STRN", "DOUBLE_QUOTE"));
-				return true;
-			}
-			else {
-				string += stream.next();
-			}
-		}
-	}
-	return false; // error! unterminated string
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_snquote = function(/**JSDOC.TokenStream*/stream, tokens) {
-	if (stream.look() == "'") {
-		// find terminator
-		var string = stream.next();
-		
-		while (!stream.look().eof) {
-			if (stream.look() == "\\") { // escape sequence
-				string += stream.next(2);
-			}
-			else if (stream.look() == "'") {
-				string += stream.next();
-				tokens.push(new JSDOC.Token(string, "STRN", "SINGLE_QUOTE"));
-				return true;
-			}
-			else {
-				string += stream.next();
-			}
-		}
-	}
-	return false; // error! unterminated string
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_numb = function(/**JSDOC.TokenStream*/stream, tokens) {
-	if (stream.look() === "0" && stream.look(1) == "x") {
-		return this.read_hex(stream, tokens);
-	}
-	
-	var found = "";
-	
-	while (!stream.look().eof && JSDOC.Lang.isNumber(found+stream.look())){
-		found += stream.next();
-	}
-	
-	if (found === "") {
-		return false;
-	}
-	else {
-		if (/^0[0-7]/.test(found)) tokens.push(new JSDOC.Token(found, "NUMB", "OCTAL"));
-		else tokens.push(new JSDOC.Token(found, "NUMB", "DECIMAL"));
-		return true;
-	}
-}
-/*t:
-	requires("../lib/JSDOC/TextStream.js");
-	requires("../lib/JSDOC/Token.js");
-	requires("../lib/JSDOC/Lang.js");
-	
-	plan(3, "testing JSDOC.TokenReader.prototype.read_numb");
-	
-	//// setup
-	var src = "function foo(num){while (num+8.0 >= 0x20 && num < 0777){}}";
-	var tr = new JSDOC.TokenReader();
-	var tokens = tr.tokenize(new JSDOC.TextStream(src));
-	
-	var hexToken, octToken, decToken;
-	for (var i = 0; i < tokens.length; i++) {
-		if (tokens[i].name == "HEX_DEC") hexToken = tokens[i];
-		if (tokens[i].name == "OCTAL") octToken = tokens[i];
-		if (tokens[i].name == "DECIMAL") decToken = tokens[i];
-	}
-	////
-	
-	is(decToken.data, "8.0", "decimal number is found in source.");
-	is(hexToken.data, "0x20", "hexdec number is found in source (issue #99).");
-	is(octToken.data, "0777", "octal number is found in source.");
-*/
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_hex = function(/**JSDOC.TokenStream*/stream, tokens) {
-	var found = stream.next(2);
-	
-	while (!stream.look().eof) {
-		if (JSDOC.Lang.isHexDec(found) && !JSDOC.Lang.isHexDec(found+stream.look())) { // done
-			tokens.push(new JSDOC.Token(found, "NUMB", "HEX_DEC"));
-			return true;
-		}
-		else {
-			found += stream.next();
-		}
-	}
-	return false;
-}
-
-/**
-	@returns {Boolean} Was the token found?
- */
-JSDOC.TokenReader.prototype.read_regx = function(/**JSDOC.TokenStream*/stream, tokens) {
-	var last;
-	if (
-		stream.look() == "/"
-		&& 
-		(
-			
-			(
-				!(last = tokens.lastSym()) // there is no last, the regex is the first symbol
-				|| 
-				(
-					   !last.is("NUMB")
-					&& !last.is("NAME")
-					&& !last.is("RIGHT_PAREN")
-					&& !last.is("RIGHT_BRACKET")
-				)
-			)
-		)
-	) {
-		var regex = stream.next();
-		
-		while (!stream.look().eof) {
-			if (stream.look() == "\\") { // escape sequence
-				regex += stream.next(2);
-			}
-			else if (stream.look() == "/") {
-				regex += stream.next();
-				
-				while (/[gmi]/.test(stream.look())) {
-					regex += stream.next();
-				}
-				
-				tokens.push(new JSDOC.Token(regex, "REGX", "REGX"));
-				return true;
-			}
-			else {
-				regex += stream.next();
-			}
-		}
-		// error: unterminated regex
-	}
-	return false;
-}
--- a/sbin/res/app/lib/JSDOC/TokenStream.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,133 +0,0 @@
-if (typeof JSDOC == "undefined") JSDOC = {};
-
-/**
-	@constructor
-*/
-JSDOC.TokenStream = function(tokens) {
-	this.tokens = (tokens || []);
-	this.rewind();
-}
-
-/**
-	@constructor
-	@private
-*/
-function VoidToken(/**String*/type) {
-	this.toString = function() {return "<VOID type=\""+type+"\">"};
-	this.is = function(){return false;}
-}
-
-JSDOC.TokenStream.prototype.rewind = function() {
-	this.cursor = -1;
-}
-
-/**
-	@type JSDOC.Token
-*/
-JSDOC.TokenStream.prototype.look = function(/**Number*/n, /**Boolean*/considerWhitespace) {
-	if (typeof n == "undefined") n = 0;
-
-	if (considerWhitespace == true) {
-		if (this.cursor+n < 0 || this.cursor+n > this.tokens.length) return {};
-		return this.tokens[this.cursor+n];
-	}
-	else {
-		var count = 0;
-		var i = this.cursor;
-
-		while (true) {
-			if (i < 0) return new JSDOC.Token("", "VOID", "START_OF_STREAM");
-			else if (i > this.tokens.length) return new JSDOC.Token("", "VOID", "END_OF_STREAM");
-
-			if (i != this.cursor && (this.tokens[i] === undefined || this.tokens[i].is("WHIT"))) {
-				if (n < 0) i--; else i++;
-				continue;
-			}
-			
-			if (count == Math.abs(n)) {
-				return this.tokens[i];
-			}
-			count++;
-			(n < 0)? i-- : i++;
-		}
-
-		return new JSDOC.Token("", "VOID", "STREAM_ERROR"); // because null isn't an object and caller always expects an object
-	}
-}
-
-/**
-	@type JSDOC.Token|JSDOC.Token[]
-*/
-JSDOC.TokenStream.prototype.next = function(/**Number*/howMany) {
-	if (typeof howMany == "undefined") howMany = 1;
-	if (howMany < 1) return null;
-	var got = [];
-
-	for (var i = 1; i <= howMany; i++) {
-		if (this.cursor+i >= this.tokens.length) {
-			return null;
-		}
-		got.push(this.tokens[this.cursor+i]);
-	}
-	this.cursor += howMany;
-
-	if (howMany == 1) {
-		return got[0];
-	}
-	else return got;
-}
-
-/**
-	@type JSDOC.Token[]
-*/
-JSDOC.TokenStream.prototype.balance = function(/**String*/start, /**String*/stop) {
-	if (!stop) stop = JSDOC.Lang.matching(start);
-	
-	var depth = 0;
-	var got = [];
-	var started = false;
-	
-	while ((token = this.look())) {
-		if (token.is(start)) {
-			depth++;
-			started = true;
-		}
-		
-		if (started) {
-			got.push(token);
-		}
-		
-		if (token.is(stop)) {
-			depth--;
-			if (depth == 0) return got;
-		}
-		if (!this.next()) break;
-	}
-}
-
-JSDOC.TokenStream.prototype.getMatchingToken = function(/**String*/start, /**String*/stop) {
-	var depth = 0;
-	var cursor = this.cursor;
-	
-	if (!start) {
-		start = JSDOC.Lang.matching(stop);
-		depth = 1;
-	}
-	if (!stop) stop = JSDOC.Lang.matching(start);
-	
-	while ((token = this.tokens[cursor])) {
-		if (token.is(start)) {
-			depth++;
-		}
-		
-		if (token.is(stop) && cursor) {
-			depth--;
-			if (depth == 0) return this.tokens[cursor];
-		}
-		cursor++;
-	}
-}
-
-JSDOC.TokenStream.prototype.insertAhead = function(/**JSDOC.Token*/token) {
-	this.tokens.splice(this.cursor+1, 0, token);
-}
\ No newline at end of file
--- a/sbin/res/app/lib/JSDOC/Util.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/**
- * @namespace
- * @deprecated Use {@link FilePath} instead.
- */
-JSDOC.Util = {
-}
-
-/**
- * @deprecated Use {@link FilePath.fileName} instead.
- */
-JSDOC.Util.fileName = function(path) {
-	LOG.warn("JSDOC.Util.fileName is deprecated. Use FilePath.fileName instead.");
-	var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
-	return path.substring(nameStart);
-}
-
-/**
- * @deprecated Use {@link FilePath.fileExtension} instead.
- */
-JSDOC.Util.fileExtension = function(filename) {
-	LOG.warn("JSDOC.Util.fileExtension is deprecated. Use FilePath.fileExtension instead.");
-	return filename.split(".").pop().toLowerCase();
-};
-
-/**
- * @deprecated Use {@link FilePath.dir} instead.
- */
-JSDOC.Util.dir = function(path) {
-	LOG.warn("JSDOC.Util.dir is deprecated. Use FilePath.dir instead.");
-	var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
-	return path.substring(0, nameStart-1);
-}
--- a/sbin/res/app/lib/JSDOC/Walker.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,507 +0,0 @@
-if (typeof JSDOC == "undefined") JSDOC = {};
-
-/** @constructor */
-JSDOC.Walker = function(/**JSDOC.TokenStream*/ts) {
-	this.init();
-	if (typeof ts != "undefined") {
-		this.walk(ts);
-	}
-}
-
-JSDOC.Walker.prototype.init = function() {
-	this.ts = null;
-
-	var globalSymbol = new JSDOC.Symbol("_global_", [], "GLOBAL", new JSDOC.DocComment(""));
-	globalSymbol.isNamespace = true;
-	globalSymbol.srcFile = "";
-	globalSymbol.isPrivate = false;
-	JSDOC.Parser.addSymbol(globalSymbol);
-	this.lastDoc = null;
-	this.token = null;
-	
-	/**
-		The chain of symbols under which we are currently nested.
-		@type Array
-	*/
-	this.namescope = [globalSymbol];
-	this.namescope.last = function(n){ if (!n) n = 0; return this[this.length-(1+n)] || "" };
-}
-
-JSDOC.Walker.prototype.walk = function(/**JSDOC.TokenStream*/ts) {
-	this.ts = ts;
-	while (this.token = this.ts.look()) {
-		if (this.token.popNamescope) {
-			
-			var symbol = this.namescope.pop();
-			if (symbol.is("FUNCTION")) {
-				if (this.ts.look(1).is("LEFT_PAREN") && symbol.comment.getTag("function").length == 0) {
-					symbol.isa = "OBJECT";
-				}
-			}
-		}
-		this.step();
-		if (!this.ts.next()) break;
-	}
-}
-
-JSDOC.Walker.prototype.step = function() {
-	if (this.token.is("JSDOC")) { // it's a doc comment
-	
-		var doc = new JSDOC.DocComment(this.token.data);
-		
-				
-		if (doc.getTag("exports").length > 0) {
-			var exports = doc.getTag("exports")[0];
-
-			exports.desc.match(/(\S+) as (\S+)/i);
-			var n1 = RegExp.$1;
-			var n2 = RegExp.$2;
-			
-			if (!n1 && n2) throw "@exports tag requires a value like: 'name as ns.name'";
-			
-			JSDOC.Parser.rename = (JSDOC.Parser.rename || {});	
-			JSDOC.Parser.rename[n1] = n2
-		}
-		
-		if (doc.getTag("lends").length > 0) {
-			var lends = doc.getTag("lends")[0];
-
-			var name = lends.desc
-			if (!name) throw "@lends tag requires a value.";
-			
-			var symbol = new JSDOC.Symbol(name, [], "OBJECT", doc);
-			
-			this.namescope.push(symbol);
-			
-			var matching = this.ts.getMatchingToken("LEFT_CURLY");
-			if (matching) matching.popNamescope = name;
-			else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
-			
-			this.lastDoc = null;
-			return true;
-		}
-		else if (doc.getTag("name").length > 0 && doc.getTag("overview").length == 0) { // it's a virtual symbol
-			var virtualName = doc.getTag("name")[0].desc;
-			if (!virtualName) throw "@name tag requires a value.";
-			
-			if (doc.getTag("memberOf").length > 0) {
-				virtualName = (doc.getTag("memberOf")[0] + "." + virtualName)
-					.replace(/([#.])\./, "$1");
-				doc.deleteTag("memberOf");
-			}
-
-			var symbol = new JSDOC.Symbol(virtualName, [], "VIRTUAL", doc);
-			
-			JSDOC.Parser.addSymbol(symbol);
-			
-			this.lastDoc = null;
-			return true;
-		}
-		else if (doc.meta) { // it's a meta doclet
-			if (doc.meta == "@+") JSDOC.DocComment.shared = doc.src;
-			else if (doc.meta == "@-") JSDOC.DocComment.shared = "";
-			else if (doc.meta == "nocode+") JSDOC.Parser.conf.ignoreCode = true;
-			else if (doc.meta == "nocode-") JSDOC.Parser.conf.ignoreCode = JSDOC.opt.n;
-			else throw "Unrecognized meta comment: "+doc.meta;
-			
-			this.lastDoc = null;
-			return true;
-		}
-		else if (doc.getTag("overview").length > 0) { // it's a file overview
-			symbol = new JSDOC.Symbol("", [], "FILE", doc);
-			
-			JSDOC.Parser.addSymbol(symbol);
-			
-			this.lastDoc = null;
-			return true;
-		}
-		else {
-			this.lastDoc = doc;
-			return false;
-		}
-	}
-	else if (!JSDOC.Parser.conf.ignoreCode) { // it's code
-		if (this.token.is("NAME")) { // it's the name of something
-			var symbol;
-			var name = this.token.data;
-			var doc = null; if (this.lastDoc) doc = this.lastDoc;
-			var params = [];
-		
-			// it's inside an anonymous object
-			if (this.ts.look(1).is("COLON") && this.ts.look(-1).is("LEFT_CURLY") && !(this.ts.look(-2).is("JSDOC") || this.namescope.last().comment.getTag("lends").length || this.ts.look(-2).is("ASSIGN") || this.ts.look(-2).is("COLON"))) {
-				name = "$anonymous";
-				name = this.namescope.last().alias+"-"+name
-					
-				params = [];
-				
-				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
-
-				JSDOC.Parser.addSymbol(symbol);
-				
-				this.namescope.push(symbol);
-				
-				var matching = this.ts.getMatchingToken(null, "RIGHT_CURLY");
-				if (matching) matching.popNamescope = name;
-				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
-			}
-			// function foo() {}
-			else if (this.ts.look(-1).is("FUNCTION") && this.ts.look(1).is("LEFT_PAREN")) {
-				var isInner;
-				
-				if (this.lastDoc) doc = this.lastDoc;
-				
-				if (doc && doc.getTag("memberOf").length > 0) {
-					name = (doc.getTag("memberOf")[0]+"."+name).replace("#.", "#");
-					doc.deleteTag("memberOf");
-				}
-				else {
-					name = this.namescope.last().alias+"-"+name;
-					if (!this.namescope.last().is("GLOBAL")) isInner = true;
-				}
-				
-				if (!this.namescope.last().is("GLOBAL")) isInner = true;
-				
-				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
-
-				symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
-				if (isInner) symbol.isInner = true;
-
-				if (this.ts.look(1).is("JSDOC")) {
-					var inlineReturn = ""+this.ts.look(1).data;
-					inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, "");
-					symbol.type = inlineReturn;
-				}
-				
-				JSDOC.Parser.addSymbol(symbol);
-				
-				this.namescope.push(symbol);
-				
-				var matching = this.ts.getMatchingToken("LEFT_CURLY");
-				if (matching) matching.popNamescope = name;
-				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
-			}
-			// foo = function() {}
-			else if (this.ts.look(1).is("ASSIGN") && this.ts.look(2).is("FUNCTION")) {
-				var constructs;
-				var isConstructor = false;
-				if (doc && (constructs = doc.getTag("constructs")) && constructs.length) {
-					if (constructs[0].desc) {
-						name = constructs[0].desc;
-						isConstructor = true;
-					}
-				}
-					
-				var isInner;
-				if (this.ts.look(-1).is("VAR") || this.isInner) {
-					if (doc && doc.getTag("memberOf").length > 0) {
-						name = (doc.getTag("memberOf")[0]+"."+name).replace("#.", "#");
-						doc.deleteTag("memberOf");
-					}
-					else {
-						name = this.namescope.last().alias+"-"+name;
-						if (!this.namescope.last().is("GLOBAL")) isInner = true;
-					}
-					if (!this.namescope.last().is("GLOBAL")) isInner = true;
-				}
-				else if (name.indexOf("this.") == 0) {
-					name = this.resolveThis(name);
-				}
-
-				if (this.lastDoc) doc = this.lastDoc;
-				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
-				
-				symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
-
-				if (isInner) symbol.isInner = true;
-				if (isConstructor) symbol.isa = "CONSTRUCTOR";
-				
-				if (this.ts.look(1).is("JSDOC")) {
-					var inlineReturn = ""+this.ts.look(1).data;
-					inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, "");
-					symbol.type = inlineReturn;
-				}
-
-				JSDOC.Parser.addSymbol(symbol);
-				
-				this.namescope.push(symbol);
-				
-				var matching = this.ts.getMatchingToken("LEFT_CURLY");
-				if (matching) matching.popNamescope = name;
-				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
-			}
-			// foo = new function() {} or foo = (function() {}
-			else if (this.ts.look(1).is("ASSIGN") && (this.ts.look(2).is("NEW") || this.ts.look(2).is("LEFT_PAREN")) && this.ts.look(3).is("FUNCTION")) {
-				var isInner;
-				if (this.ts.look(-1).is("VAR") || this.isInner) {
-					name = this.namescope.last().alias+"-"+name
-					if (!this.namescope.last().is("GLOBAL")) isInner = true;
-				}
-				else if (name.indexOf("this.") == 0) {
-					name = this.resolveThis(name);
-				}
-
-				this.ts.next(3); // advance past the "new" or "("
-				
-				if (this.lastDoc) doc = this.lastDoc;
-				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
-				
-				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
-				if (isInner) symbol.isInner = true;
-				
-				if (this.ts.look(1).is("JSDOC")) {
-					var inlineReturn = ""+this.ts.look(1).data;
-					inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, "");
-					symbol.type = inlineReturn;
-				}
-				
-				JSDOC.Parser.addSymbol(symbol);
-				
-				symbol.scopeType = "INSTANCE";
-				this.namescope.push(symbol);
-				
-				var matching = this.ts.getMatchingToken("LEFT_CURLY");
-				if (matching) matching.popNamescope = name;
-				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
-			}
-			// foo: function() {}
-			else if (this.ts.look(1).is("COLON") && this.ts.look(2).is("FUNCTION")) {
-				name = (this.namescope.last().alias+"."+name).replace("#.", "#");
-				
-				if (this.lastDoc) doc = this.lastDoc;
-				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
-				
-				if (doc && doc.getTag("constructs").length) {
-					name = name.replace(/\.prototype(\.|$)/, "#");
-					
-					if (name.indexOf("#") > -1) name = name.match(/(^[^#]+)/)[0];
-					else name = this.namescope.last().alias;
-
-					symbol = new JSDOC.Symbol(name, params, "CONSTRUCTOR", doc);
-				}
-				else {
-					symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
-				}
-				
-				if (this.ts.look(1).is("JSDOC")) {
-					var inlineReturn = ""+this.ts.look(1).data;
-					inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, "");
-					symbol.type = inlineReturn;
-				}
-				
-				JSDOC.Parser.addSymbol(symbol);
-				
-				this.namescope.push(symbol);
-				
-				var matching = this.ts.getMatchingToken("LEFT_CURLY");
-				if (matching) matching.popNamescope = name;
-				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
-			}
-			// foo = {}
-			else if (this.ts.look(1).is("ASSIGN") && this.ts.look(2).is("LEFT_CURLY")) {
-				var isInner;
-				if (this.ts.look(-1).is("VAR") || this.isInner) {
-					name = this.namescope.last().alias+"-"+name
-					if (!this.namescope.last().is("GLOBAL")) isInner = true;
-				}
-				else if (name.indexOf("this.") == 0) {
-					name = this.resolveThis(name);
-				}
-				
-				if (this.lastDoc) doc = this.lastDoc;
-				
-				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
-				if (isInner) symbol.isInner = true;
-				
-			
-				if (doc) JSDOC.Parser.addSymbol(symbol);
-
-				this.namescope.push(symbol);
-				
-				var matching = this.ts.getMatchingToken("LEFT_CURLY");
-				if (matching) matching.popNamescope = name;
-				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
-			}
-			// var foo;
-			else if (this.ts.look(1).is("SEMICOLON")) {
-				var isInner;
-
-				if (this.ts.look(-1).is("VAR") || this.isInner) {
-					name = this.namescope.last().alias+"-"+name
-					if (!this.namescope.last().is("GLOBAL")) isInner = true;
-					
-					if (this.lastDoc) doc = this.lastDoc;
-				
-					symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
-					if (isInner) symbol.isInner = true;
-					
-				
-					if (doc) JSDOC.Parser.addSymbol(symbol);
-				}
-			}
-			// foo = x
-			else if (this.ts.look(1).is("ASSIGN")) {				
-				var isInner;
-				if (this.ts.look(-1).is("VAR") || this.isInner) {
-					name = this.namescope.last().alias+"-"+name
-					if (!this.namescope.last().is("GLOBAL")) isInner = true;
-				}
-				else if (name.indexOf("this.") == 0) {
-					name = this.resolveThis(name);
-				}
-				
-				if (this.lastDoc) doc = this.lastDoc;
-				
-				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
-				if (isInner) symbol.isInner = true;
-				
-			
-				if (doc) JSDOC.Parser.addSymbol(symbol);
-			}
-			// foo: {}
-			else if (this.ts.look(1).is("COLON") && this.ts.look(2).is("LEFT_CURLY")) {
-				name = (this.namescope.last().alias+"."+name).replace("#.", "#");
-				
-				if (this.lastDoc) doc = this.lastDoc;
-				
-				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
-				
-			
-				if (doc) JSDOC.Parser.addSymbol(symbol);
-				
-				this.namescope.push(symbol);
-				
-				var matching = this.ts.getMatchingToken("LEFT_CURLY");
-				if (matching) matching.popNamescope = name;
-				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
-			}
-			// foo: x
-			else if (this.ts.look(1).is("COLON")) {
-				name = (this.namescope.last().alias+"."+name).replace("#.", "#");;
-				
-				if (this.lastDoc) doc = this.lastDoc;
-				
-				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
-				
-			
-				if (doc) JSDOC.Parser.addSymbol(symbol);
-			}
-			// foo(...)
-			else if (this.ts.look(1).is("LEFT_PAREN")) {
-				if (typeof JSDOC.PluginManager != "undefined") {
-					var functionCall = {name: name};
-				
-					var cursor = this.ts.cursor;
-					params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
-					this.ts.cursor = cursor;
-					
-					for (var i = 0; i < params.length; i++)
-						functionCall["arg" + (i + 1)] = params[i].name;
-				
-					JSDOC.PluginManager.run("onFunctionCall", functionCall);
-					if (functionCall.doc) {
-						this.ts.insertAhead(new JSDOC.Token(functionCall.doc, "COMM", "JSDOC"));
-					}
-				}
-			}
-			this.lastDoc = null;
-		}
-		else if (this.token.is("FUNCTION")) { // it's an anonymous function
-			if (
-				(!this.ts.look(-1).is("COLON") || !this.ts.look(-1).is("ASSIGN"))
-				&& !this.ts.look(1).is("NAME")
-			) {
-				if (this.lastDoc) doc = this.lastDoc;
-				
-				name = "$anonymous";
-				name = this.namescope.last().alias+"-"+name
-				
-				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
-				
-				symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
-				
-				JSDOC.Parser.addSymbol(symbol);
-				
-				this.namescope.push(symbol);
-				
-				var matching = this.ts.getMatchingToken("LEFT_CURLY");
-				if (matching) matching.popNamescope = name;
-				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
-			}
-		}
-	}
-	return true;
-}
-
-/**
-	Resolves what "this." means when it appears in a name.
-	@param name The name that starts with "this.".
-	@returns The name with "this." resolved.
- */
-JSDOC.Walker.prototype.resolveThis = function(name) {
-	name.match(/^this\.(.+)$/)
-	var nameFragment = RegExp.$1;
-	if (!nameFragment) return name;
-	
-	var symbol = this.namescope.last();
-	var scopeType = symbol.scopeType || symbol.isa;
-
-	// if we are in a constructor function, `this` means the instance
-	if (scopeType == "CONSTRUCTOR") {
-		name = symbol.alias+"#"+nameFragment;
-	}
-	
-	// if we are in an anonymous constructor function, `this` means the instance
-	else if (scopeType == "INSTANCE") {
-		name = symbol.alias+"."+nameFragment;
-	}
-	
-	// if we are in a function, `this` means the container (possibly the global)
-	else if (scopeType == "FUNCTION") {
-		// in a method of a prototype, so `this` means the constructor
-		if (symbol.alias.match(/(^.*)[#.-][^#.-]+/)) {
-			var parentName = RegExp.$1;
-			var parent = JSDOC.Parser.symbols.getSymbol(parentName);
-
-			if (!parent) {
-				if (JSDOC.Lang.isBuiltin(parentName)) parent = JSDOC.Parser.addBuiltin(parentName);
-				else {
-					if (symbol.alias.indexOf("$anonymous") < 0) // these will be ignored eventually
-						LOG.warn("Trying to document "+symbol.alias+" without first documenting "+parentName+".");
-				}
-			}
-			if (parent) name = parentName+(parent.is("CONSTRUCTOR")?"#":".")+nameFragment;
-		}
-		else {
-			parent = this.namescope.last(1);
-			name = parent.alias+(parent.is("CONSTRUCTOR")?"#":".")+nameFragment;
-		}
-	}
-	// otherwise it means the global
-	else {
-		name = nameFragment;
-	}
-	
-	return name;
-}
-
-JSDOC.Walker.onParamList = function(/**Array*/paramTokens) {
-	if (!paramTokens) {
-		LOG.warn("Malformed parameter list. Can't parse code.");
-		return [];
-	}
-	var params = [];
-	for (var i = 0, l = paramTokens.length; i < l; i++) {
-		if (paramTokens[i].is("JSDOC")) {
-			var paramType = paramTokens[i].data.replace(/(^\/\*\* *| *\*\/$)/g, "");
-			
-			if (paramTokens[i+1] && paramTokens[i+1].is("NAME")) {
-				i++;
-				params.push({type: paramType, name: paramTokens[i].data});
-			}
-		}
-		else if (paramTokens[i].is("NAME")) {
-			params.push({name: paramTokens[i].data});
-		}
-	}
-	return params;
-}
--- a/sbin/res/app/main.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,111 +0,0 @@
-/**
- * @version $Id: main.js 818 2009-11-08 14:51:41Z micmath $
- */
-
-function main() {
-	IO.include("lib/JSDOC.js");
-	IO.includeDir("plugins/");
-	
-	// process the options
-	
-	// the -c option: options are defined in a configuration file
-	if (JSDOC.opt.c) {
-		eval("JSDOC.conf = " + IO.readFile(JSDOC.opt.c));
-		
-		LOG.inform("Using configuration file at '"+JSDOC.opt.c+"'.");
-		
-		for (var c in JSDOC.conf) {
-			if (c !== "D" && !defined(JSDOC.opt[c])) { // commandline overrules config file
-				JSDOC.opt[c] = JSDOC.conf[c];
-			}
-		}
-		
-		if (typeof JSDOC.conf["_"] != "undefined") {
-			JSDOC.opt["_"] = JSDOC.opt["_"].concat(JSDOC.conf["_"]);
-		}
-		
-		LOG.inform("With configuration: ");
-		for (var o in JSDOC.opt) {
-			LOG.inform("    "+o+": "+JSDOC.opt[o]);
-		}
-	}
-	
-	// be verbose
-	if (JSDOC.opt.v) LOG.verbose = true;
-	
-	// send log messages to a file
-	if (JSDOC.opt.o) LOG.out = IO.open(JSDOC.opt.o);
-	
-	// run the unit tests
-	if (JSDOC.opt.T) {
-		LOG.inform("JsDoc Toolkit running in test mode at "+new Date()+".");
-		IO.include("frame/Testrun.js");
-		IO.include("test.js");
-	}
-	else {
-		// a template must be defined and must be a directory path
-		if (!JSDOC.opt.t && System.getProperty("jsdoc.template.dir")) {
-			JSDOC.opt.t = System.getProperty("jsdoc.template.dir");
-		}
-		if (JSDOC.opt.t && SYS.slash != JSDOC.opt.t.slice(-1)) {
-			JSDOC.opt.t += SYS.slash;
-		}
-		
-		// verbose messages about the options we were given
-		LOG.inform("JsDoc Toolkit main() running at "+new Date()+".");
-		LOG.inform("With options: ");
-		for (var o in JSDOC.opt) {
-			LOG.inform("    "+o+": "+JSDOC.opt[o]);
-		}
-		
-		// initialize and build a symbolSet from your code
-		JSDOC.JsDoc();
-		
-		// debugger's option: dump the entire symbolSet produced from your code
-		if (JSDOC.opt.Z) {
-			LOG.warn("So you want to see the data structure, eh? This might hang if you have circular refs...");
-			IO.include("frame/Dumper.js");
-			var symbols = JSDOC.JsDoc.symbolSet.toArray();
-			for (var i = 0, l = symbols.length; i < l; i++) {
-				var symbol = symbols[i];
-				print("// symbol: " + symbol.alias);
-				print(symbol.serialize());
-			}
-		}
-		else {
-			if (typeof JSDOC.opt.t != "undefined") {
-				try {
-					// a file named "publish.js" must exist in the template directory
-					load(JSDOC.opt.t+"publish.js");
-					
-					// and must define a function named "publish"
-					if (!publish) {
-						LOG.warn("No publish() function is defined in that template so nothing to do.");
-					}
-					else {
-						// which will be called with the symbolSet produced from your code
-						publish(JSDOC.JsDoc.symbolSet);
-					}
-				}
-				catch(e) {
-					LOG.warn("Sorry, that doesn't seem to be a valid template: "+JSDOC.opt.t+"publish.js : "+e);
-				}
-			}
-			else {
-				LOG.warn("No template given. Might as well read the usage notes.");
-				JSDOC.usage();
-			}
-		}
-	}
-	
-	// notify of any warnings
-	if (!JSDOC.opt.q && LOG.warnings.length) {
-		print(LOG.warnings.length+" warning"+(LOG.warnings.length != 1? "s":"")+".");
-	}
-	
-	// stop sending log messages to a file
-	if (LOG.out) {
-		LOG.out.flush();
-		LOG.out.close();
-	}
-}
\ No newline at end of file
--- a/sbin/res/app/plugins/commentSrcJson.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-JSDOC.PluginManager.registerPlugin(
-	"JSDOC.commentSrcJson",
-	{
-		onDocCommentSrc: function(comment) {
-			var json;
-			if (/^\s*@json\b/.test(comment)) {
-				comment.src = new String(comment.src).replace("@json", "");
-
-				eval("json = "+comment.src);
-				var tagged = "";
-				for (var i in json) {
-					var tag = json[i];
-					// todo handle cases where tag is an object
-					tagged += "@"+i+" "+tag+"\n";
-				}
-				comment.src = tagged;
-			}
-		}
-	}
-);
\ No newline at end of file
--- a/sbin/res/app/plugins/frameworkPrototype.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-JSDOC.PluginManager.registerPlugin(
-	"JSDOC.frameworkPrototype",
-	{
-		onPrototypeClassCreate: function(classCreator) {
-			var desc = "";
-			if (classCreator.comment) {
-				desc = classCreator.comment;
-			}
-			var insert = desc+"/** @name "+classCreator.name+"\n@constructor\n@scope "+classCreator.name+".prototype */"
-			
-			insert = insert.replace(/\*\/\/\*\*/g, "\n");
-			/*DEBUG*///print("insert is "+insert);
-			classCreator.addComment.data = insert;
-		}
-	}
-);
--- a/sbin/res/app/plugins/functionCall.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-JSDOC.PluginManager.registerPlugin(
-	"JSDOC.functionCall",
-	{
-		onFunctionCall: function(functionCall) {
-			if (functionCall.name == "dojo.define" && functionCall.arg1) {
-				functionCall.doc = "/** @lends "+eval(functionCall.arg1)+".prototype */";
-			}
-		}
-	}
-);
\ No newline at end of file
--- a/sbin/res/app/plugins/publishSrcHilite.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-JSDOC.PluginManager.registerPlugin(
-	"JSDOC.publishSrcHilite",
-	{
-		onPublishSrc: function(src) {
-			if (src.path in JsHilite.cache) {
-				return; // already generated src code
-			}
-			else JsHilite.cache[src.path] = true;
-		
-			try {
-				var sourceCode = IO.readFile(src.path);
-			}
-			catch(e) {
-				print(e.message);
-				quit();
-			}
-
-			var hiliter = new JsHilite(sourceCode, src.charset);
-			src.hilited = hiliter.hilite();
-		}
-	}
-);
-
-function JsHilite(src, charset) {
-
-	var tr = new JSDOC.TokenReader();
-	
-	tr.keepComments = true;
-	tr.keepDocs = true;
-	tr.keepWhite = true;
-	
-	this.tokens = tr.tokenize(new JSDOC.TextStream(src));
-	
-	// TODO is redefining toString() the best way?
-	JSDOC.Token.prototype.toString = function() { 
-		return "<span class=\""+this.type+"\">"+this.data.replace(/</g, "&lt;")+"</span>";
-	}
-	
-	if (!charset) charset = "utf-8";
-	
-	this.header = '<html><head><meta http-equiv="content-type" content="text/html; charset='+charset+'"> '+
-	"<style>\n\
-	.KEYW {color: #933;}\n\
-	.COMM {color: #bbb; font-style: italic;}\n\
-	.NUMB {color: #393;}\n\
-	.STRN {color: #393;}\n\
-	.REGX {color: #339;}\n\
-	.line {border-right: 1px dotted #666; color: #666; font-style: normal;}\n\
-	</style></head><body><pre>";
-	this.footer = "</pre></body></html>";
-	this.showLinenumbers = true;
-}
-
-JsHilite.cache = {};
-
-JsHilite.prototype.hilite = function() {
-	var hilited = this.tokens.join("");
-	var line = 1;
-	if (this.showLinenumbers) hilited = hilited.replace(/(^|\n)/g, function(m){return m+"<span class='line'>"+((line<10)? " ":"")+((line<100)? " ":"")+(line++)+"</span> "});
-	
-	return this.header+hilited+this.footer;
-}
\ No newline at end of file
--- a/sbin/res/app/plugins/symbolLink.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-JSDOC.PluginManager.registerPlugin(
-	"JSDOC.symbolLink",
-	{
-		onSymbolLink: function(link) {
-			// modify link.linkPath (the href part of the link)
-			// or link.linkText (the text displayed)
-			// or link.linkInner (the #name part of the link)
-		}
-	}
-);
\ No newline at end of file
--- a/sbin/res/app/plugins/tagParamConfig.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-JSDOC.PluginManager.registerPlugin(
-	"JSDOC.tagParamConfig",
-	{
-		onDocCommentTags: function(comment) {
-			var currentParam = null;
-			var tags = comment.tags;
-			for (var i = 0, l = tags.length; i < l; i++) {
-				
-				if (tags[i].title == "param") {
-					if (tags[i].name.indexOf(".") == -1) {
-						currentParam = i;
-					}
-				}
-				else if (tags[i].title == "config") {
-					tags[i].title = "param";
-					if (currentParam == null) {
-						tags[i].name = "arguments"+"."+tags[i].name;
-					}
-					else if (tags[i].name.indexOf(tags[currentParam].name+".") != 0) {
-						tags[i].name = tags[currentParam].name+"."+tags[i].name;
-					}
-					currentParam != null
-					//tags[currentParam].properties.push(tags[i]);
-				}
-				else {
-					currentParam = null;
-				}
-			}
-		}
-	}
-);
--- a/sbin/res/app/plugins/tagSynonyms.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-JSDOC.PluginManager.registerPlugin(
-	"JSDOC.tagSynonyms",
-	{
-		onDocCommentSrc: function(comment) {
-			comment.src = comment.src.replace(/@methodOf\b/i, "@function\n@memberOf");
-			comment.src = comment.src.replace(/@fieldOf\b/i, "@field\n@memberOf");
-		},
-		
-		onDocCommentTags: function(comment) {
-			for (var i = 0, l = comment.tags.length; i < l; i++) {
-				var title = comment.tags[i].title.toLowerCase();
-				var syn;
-				if ((syn = JSDOC.tagSynonyms.synonyms["="+title])) {
-					comment.tags[i].title = syn;
-				}
-			}
-		}
-	}
-);
-
-new Namespace(
-	"JSDOC.tagSynonyms",
-	function() {
-		JSDOC.tagSynonyms.synonyms = {
-			"=member":             "memberOf",
-			"=memberof":           "memberOf",
-			"=description":        "desc",
-			"=exception":          "throws",
-			"=argument":           "param",
-			"=returns":            "return",
-			"=classdescription":   "class",
-			"=fileoverview":       "overview",
-			"=extends":            "augments",
-			"=base":               "augments",
-			"=projectdescription": "overview",
-			"=classdescription":   "class",
-			"=link":               "see",
-			"=borrows":            "inherits",
-			"=scope":              "lends",
-			"=construct":          "constructor"
-		}
-	}
-);
\ No newline at end of file
--- a/sbin/res/app/run.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,348 +0,0 @@
-/**
- * @fileOverview
- * A bootstrap script that creates some basic required objects
- * for loading other scripts.
- * @author Michael Mathews, micmath@gmail.com
- * @version $Id: run.js 756 2009-01-07 21:32:58Z micmath $
- */
-
-/**
- * @namespace Keep track of any messages from the running script.
- */
-LOG = {
-	warn: function(msg, e) {
-		if (JSDOC.opt.q) return;
-		if (e) msg = e.fileName+", line "+e.lineNumber+": "+msg;
-		
-		msg = ">> WARNING: "+msg;
-		LOG.warnings.push(msg);
-		if (LOG.out) LOG.out.write(msg+"\n");
-		else print(msg);
-	},
-
-	inform: function(msg) {
-		if (JSDOC.opt.q) return;
-		msg = " > "+msg;
-		if (LOG.out) LOG.out.write(msg+"\n");
-		else if (typeof LOG.verbose != "undefined" && LOG.verbose) print(msg);
-	}
-};
-LOG.warnings = [];
-LOG.verbose = false
-LOG.out = undefined;
-
-/**
- *	@class Manipulate a filepath.
- */
-function FilePath(absPath, separator) {
-	this.slash =  separator || "/"; 
-	this.root = this.slash;
-	this.path = [];
-	this.file = "";
-	
-	var parts = absPath.split(/[\\\/]/);
-	if (parts) {
-		if (parts.length) this.root = parts.shift() + this.slash;
-		if (parts.length) this.file =  parts.pop()
-		if (parts.length) this.path = parts;
-	}
-	
-	this.path = this.resolvePath();
-}
-
-/** Collapse any dot-dot or dot items in a filepath. */
-FilePath.prototype.resolvePath = function() {
-	var resolvedPath = [];
-	for (var i = 0; i < this.path.length; i++) {
-		if (this.path[i] == "..") resolvedPath.pop();
-		else if (this.path[i] != ".") resolvedPath.push(this.path[i]);
-	}
-	return resolvedPath;
-}
-
-/** Trim off the filename. */
-FilePath.prototype.toDir = function() {
-	if (this.file) this.file = "";
-	return this;
-}
-
-/** Go up a directory. */
-FilePath.prototype.upDir = function() {
-	this.toDir();
-	if (this.path.length) this.path.pop();
-	return this;
-}
-
-FilePath.prototype.toString = function() {
-	return this.root
-		+ this.path.join(this.slash)
-		+ ((this.path.length > 0)? this.slash : "")
-		+ this.file;
-}
-
-/**
- * Turn a path into just the name of the file.
- */
-FilePath.fileName = function(path) {
-	var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
-	return path.substring(nameStart);
-}
-
-/**
- * Get the extension of a filename
- */
-FilePath.fileExtension = function(filename) {
-   return filename.split(".").pop().toLowerCase();
-};
-
-/**
- * Turn a path into just the directory part.
- */
-FilePath.dir = function(path) {
-	var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
-	return path.substring(0, nameStart-1);
-}
-
-
-importClass(java.lang.System);
-
-/**
- * @namespace A collection of information about your system.
- */
-SYS = {
-	/**
-	 * Information about your operating system: arch, name, version.
-	 * @type string
-	 */
-	os: [
-		new String(System.getProperty("os.arch")),
-		new String(System.getProperty("os.name")),
-		new String(System.getProperty("os.version"))
-	].join(", "),
-	
-	/**
-	 * Which way does your slash lean.
-	 * @type string
-	 */
-	slash: System.getProperty("file.separator")||"/",
-	
-	/**
-	 * The path to the working directory where you ran java.
-	 * @type string
-	 */
-	userDir: new String(System.getProperty("user.dir")),
-	
-	/**
-	 * Where is Java's home folder.
-	 * @type string
-	 */
-	javaHome: new String(System.getProperty("java.home")),
-	
-	/**
-	 * The absolute path to the directory containing this script.
-	 * @type string
-	 */
-	pwd: undefined
-};
-
-// jsrun appends an argument, with the path to here.
-if (arguments[arguments.length-1].match(/^-j=(.+)/)) {
-	if (RegExp.$1.charAt(0) == SYS.slash || RegExp.$1.charAt(1) == ":") { // absolute path to here
-		SYS.pwd = new FilePath(RegExp.$1).toDir().toString();
-	}
-	else { // relative path to here
-		SYS.pwd = new FilePath(SYS.userDir + SYS.slash + RegExp.$1).toDir().toString();
-	}
-	arguments.pop();
-}
-else {
-	print("The run.js script requires you use jsrun.jar.");
-	quit();
-}
-
-// shortcut
-var File = Packages.java.io.File;
-
-/**
- * @namespace A collection of functions that deal with reading a writing to disk.
- */
-IO = {
-
-	/**
-	 * Create a new file in the given directory, with the given name and contents.
-	 */
-	saveFile: function(/**string*/ outDir, /**string*/ fileName, /**string*/ content) {
-		var out = new Packages.java.io.PrintWriter(
-			new Packages.java.io.OutputStreamWriter(
-				new Packages.java.io.FileOutputStream(outDir+SYS.slash+fileName),
-				IO.encoding
-			)
-		);
-		out.write(content);
-		out.flush();
-		out.close();
-	},
-	
-	/**
-	 * @type string
-	 */
-	readFile: function(/**string*/ path) {
-		if (!IO.exists(path)) {
-			throw "File doesn't exist there: "+path;
-		}
-		return readFile(path, IO.encoding);
-	},
-
-	/**
-	 * @param inFile 
-	 * @param outDir
-	 * @param [fileName=The original filename]
-	 */
-	copyFile: function(/**string*/ inFile, /**string*/ outDir, /**string*/ fileName) {
-		if (fileName == null) fileName = FilePath.fileName(inFile);
-	
-		var inFile = new File(inFile);
-		var outFile = new File(outDir+SYS.slash+fileName);
-		
-		var bis = new Packages.java.io.BufferedInputStream(new Packages.java.io.FileInputStream(inFile), 4096);
-		var bos = new Packages.java.io.BufferedOutputStream(new Packages.java.io.FileOutputStream(outFile), 4096);
-		var theChar;
-		while ((theChar = bis.read()) != -1) {
-			bos.write(theChar);
-		}
-		bos.close();
-		bis.close();
-	},
-
-	/**
-	 * Creates a series of nested directories.
-	 */
-	mkPath: function(/**Array*/ path) {
-		if (path.constructor != Array) path = path.split(/[\\\/]/);
-		var make = "";
-		for (var i = 0, l = path.length; i < l; i++) {
-			make += path[i] + SYS.slash;
-			if (! IO.exists(make)) {
-				IO.makeDir(make);
-			}
-		}
-	},
-	
-	/**
-	 * Creates a directory at the given path.
-	 */
-	makeDir: function(/**string*/ path) {
-		(new File(path)).mkdir();
-	},
-
-	/**
-	 * @type string[]
-	 * @param dir The starting directory to look in.
-	 * @param [recurse=1] How many levels deep to scan.
-	 * @returns An array of all the paths to files in the given dir.
-	 */
-	ls: function(/**string*/ dir, /**number*/ recurse, _allFiles, _path) {
-		if (_path === undefined) { // initially
-			var _allFiles = [];
-			var _path = [dir];
-		}
-		if (_path.length == 0) return _allFiles;
-		if (recurse === undefined) recurse = 1;
-		
-		dir = new File(dir);
-		if (!dir.directory) return [String(dir)];
-		var files = dir.list();
-		
-		for (var f = 0; f < files.length; f++) {
-			var file = String(files[f]);
-			if (file.match(/^\.[^\.\/\\]/)) continue; // skip dot files
-	
-			if ((new File(_path.join(SYS.slash)+SYS.slash+file)).list()) { // it's a directory
-				_path.push(file);
-				if (_path.length-1 < recurse) IO.ls(_path.join(SYS.slash), recurse, _allFiles, _path);
-				_path.pop();
-			}
-			else {
-				_allFiles.push((_path.join(SYS.slash)+SYS.slash+file).replace(SYS.slash+SYS.slash, SYS.slash));
-			}
-		}
-	
-		return _allFiles;
-	},
-
-	/**
-	 * @type boolean
-	 */
-	exists: function(/**string*/ path) {
-		file = new File(path);
-	
-		if (file.isDirectory()){
-			return true;
-		}
-		if (!file.exists()){
-			return false;
-		}
-		if (!file.canRead()){
-			return false;
-		}
-		return true;
-	},
-
-	/**
-	 * 
-	 */
-	open: function(/**string*/ path, /**string*/ append) {
-		var append = true;
-		var outFile = new File(path);
-		var out = new Packages.java.io.PrintWriter(
-			new Packages.java.io.OutputStreamWriter(
-				new Packages.java.io.FileOutputStream(outFile, append),
-				IO.encoding
-			)
-		);
-		return out;
-	},
-
-	/**
-	 * Sets {@link IO.encoding}.
-	 * Encoding is used when reading and writing text to files,
-	 * and in the meta tags of HTML output.
-	 */
-	setEncoding: function(/**string*/ encoding) {
-		if (/ISO-8859-([0-9]+)/i.test(encoding)) {
-			IO.encoding = "ISO8859_"+RegExp.$1;
-		}
-		else {
-			IO.encoding = encoding;
-		}
-	},
-
-	/**
-	 * @default "utf-8"
-	 * @private
-	 */
-	encoding: "utf-8",
-	
-	/**
-	 * Load the given script.
-	 */
-	include: function(relativePath) {
-		load(SYS.pwd+relativePath);
-	},
-	
-	/**
-	 * Loads all scripts from the given directory path.
-	 */
-	includeDir: function(path) {
-		if (!path) return;
-		
-		for (var lib = IO.ls(SYS.pwd+path), i = 0; i < lib.length; i++) 
-			if (/\.js$/i.test(lib[i])) load(lib[i]);
-	}
-}
-
-// now run the application
-IO.include("frame.js");
-IO.include("main.js");
-
-main();
--- a/sbin/res/app/t/TestDoc.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,144 +0,0 @@
-var TestDoc = {
-	fails: 0,
-	plans: 0,
-	passes: 0,
-	results: []
-};
-
-TestDoc.record = function(result) {
-	TestDoc.results.push(result);
-	if (typeof result.verdict == "boolean") {
-		if (result.verdict === false) TestDoc.fails++;
-		if (result.verdict === true) TestDoc.passes++;
-	}
-}
-
-TestDoc.prove = function(filePath) {
-	if (typeof document != "undefined" && typeof document.write != "undefined") {
-		if (TestDoc.console) print = function(s) { TestDoc.console.appendChild(document.createTextNode(s+"\n")); }
-		else print = function(s) { document.write(s+"<br />"); }
-	}
-	TestDoc.run(TestDoc.readFile(filePath));
-}
-
-TestDoc.run = function(src) {
-	try { eval(src); } catch(e) { print("# ERROR! "+e); }
-	
-	var chunks = src.split(/\/\*t:/);
-	
-	var run = function(chunk) {
-		// local shortcuts
-		var is = TestDoc.assertEquals;
-		var isnt = TestDoc.assertNotEquals;
-		var plan = TestDoc.plan;
-		var requires = TestDoc.requires;
-		
-		try { eval(chunk); } catch(e) { print("# ERROR! "+e); }
-	}
-	for (var start = -1, end = 0; (start = src.indexOf("/*t:", end)) > end; start = end) {
-		run(
-			src.substring(
-				start+4,
-				(end = src.indexOf("*/", start))
-			)
-		);
-	}
-}
-
-TestDoc.Result = function(verdict, message) {
-	this.verdict = verdict;
-	this.message = message;
-}
-
-TestDoc.Result.prototype.toString = function() {
-	if (typeof this.verdict == "boolean") {
-		return (this.verdict? "ok" : "not ok") + " " + (++TestDoc.report.counter) + " - " + this.message;
-	}
-	
-	return "# " + this.message;
-}
-
-TestDoc.requires = function(file) {
-	if (!TestDoc.requires.loaded[file]) {
-		load(file);
-		TestDoc.requires.loaded[file] = true;
-	}
-}
-TestDoc.requires.loaded = {};
-
-TestDoc.report = function() {
-	TestDoc.report.counter = 0;
-	print("1.."+TestDoc.plans);
-	for (var i = 0; i < TestDoc.results.length; i++) {
-		print(TestDoc.results[i]);
-	}
-	print("----------------------------------------");
-	if (TestDoc.fails == 0 && TestDoc.passes == TestDoc.plans) {
-		print("All tests successful.");
-	}
-	else {
-		print("Failed " + TestDoc.fails + "/" + TestDoc.plans + " tests, "+((TestDoc.plans == 0)? 0 : Math.round(TestDoc.passes/(TestDoc.passes+TestDoc.fails)*10000)/100)+"% okay. Planned to run "+TestDoc.plans+", did run "+(TestDoc.passes+TestDoc.fails)+".")
-	}
-}
-
-TestDoc.plan = function(n, message) {
-	TestDoc.plans += n;
-	TestDoc.record(new TestDoc.Result(null, message+" ("+n+" tests)"));
-}
-
-TestDoc.assertEquals = function(a, b, message) {
-	var result = (a == b);
-	if (!result) message += "\n#\n# " + a + " does not equal " + b + "\n#";
-	TestDoc.record(new TestDoc.Result(result, message));
-}
-
-TestDoc.assertNotEquals = function(a, b, message) {
-	var result = (a != b);
-	if (!result) message += "\n#\n# " + a + " equals " + b + "\n#";
-	TestDoc.record(new TestDoc.Result(result, message));
-}
-
-TestDoc.readFile = (function(){
-	// rhino
-	if (typeof readFile == "function") {
-		return function(url) {
-			var text = readFile(url);
-			return text || "";
-		}
-	}
-
-	// a web browser
-	else {
-		return function(url) {
-			var httpRequest;
-		
-			if (window.XMLHttpRequest) { // Mozilla, Safari, etc
-				httpRequest = new XMLHttpRequest();
-			} 
-			else if (window.ActiveXObject) { // IE
-				try {
-					httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
-				} 
-				catch (e) {
-				   try {
-						httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
-					} 
-					catch (e) {
-					}
-				}
-			}
-		
-			if (!httpRequest) { throw "Cannot create HTTP Request."; }
-			
-			httpRequest.open('GET', url, false);
-			httpRequest.send('');
-			if (httpRequest.readyState == 4) {
-				if (httpRequest.status >= 400) {
-					throw "The HTTP Request returned an error code: "+httpRequest.status;
-				}
-			}
-			
-			return httpRequest.responseText || "";
-		}
-	}
-})();
--- a/sbin/res/app/t/runner.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-// try: java -jar ../../jsrun.jar runner.js
-
-load("TestDoc.js");
-
-TestDoc.prove("../frame/Opt.js");
-TestDoc.prove("../lib/JSDOC.js");
-TestDoc.prove("../frame/String.js");
-TestDoc.prove("../lib/JSDOC/DocTag.js");
-TestDoc.prove("../lib/JSDOC/DocComment.js");
-TestDoc.prove("../lib/JSDOC/TokenReader.js");
-TestDoc.prove("../lib/JSDOC/Symbol.js");
-
-TestDoc.report();
--- a/sbin/res/app/test.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,342 +0,0 @@
-load("app/frame/Dumper.js");
-function symbolize(opt) {
-	symbols = null;
-	JSDOC.JsDoc(opt);
-	symbols = JSDOC.JsDoc.symbolSet;
-}
-
-var testCases = [
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/overview.js"]});
-		//print(Dumper.dump(symbols));	
-		is('symbols.getSymbolByName("My Cool Library").name', 'My Cool Library', 'File overview can be found by alias.');		
-	}
-	,
-	function() {
-		symbolize({_: [SYS.pwd+"test/name.js"]});
-
-		is('symbols.getSymbol("Response").name', "Response", 'Virtual class name is found.');
-		is('symbols.getSymbol("Response#text").alias', "Response#text", 'Virtual method name is found.');
-		is('symbols.getSymbol("Response#text").memberOf', "Response", 'Virtual method parent name is found.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/prototype.js"]});
-
-		is('symbols.getSymbol("Article").name', "Article", 'Function set to constructor prototype with inner constructor name is found.');
-		is('symbols.getSymbol("Article").hasMethod("init")', true, 'The initializer method name of prototype function is correct.');
-		is('symbols.getSymbol("Article").hasMember("counter")', true, 'A static property set in the prototype definition is found.');
-		is('symbols.getSymbol("Article").hasMember("title")', true, 'An instance property set in the prototype is found.');
-		is('symbols.getSymbol("Article#title").isStatic', false, 'An instance property has isStatic set to false.');
-		is('symbols.getSymbol("Article.counter").name', "counter", 'A static property set in the initializer has the name set correctly.');
-		is('symbols.getSymbol("Article.counter").memberOf', "Article", 'A static property set in the initializer has the memberOf set correctly.');
-		is('symbols.getSymbol("Article.counter").isStatic', true, 'A static property set in the initializer has isStatic set to true.');
-	}
-	,
-	function() {
-		symbolize({a:true, _: [SYS.pwd+"test/prototype_oblit.js"]});
-		
-		is('symbols.getSymbol("Article").name', "Article", 'Oblit set to constructor prototype name is found.');
-		is('typeof symbols.getSymbol("Article.prototype")', "undefined", 'The prototype oblit is not a symbol.');
-		is('symbols.getSymbol("Article#getTitle").name', "getTitle", 'The nonstatic method name of prototype oblit is correct.');
-		is('symbols.getSymbol("Article#getTitle").alias', "Article#getTitle", 'The alias of non-static method of prototype oblit is correct.');
-		is('symbols.getSymbol("Article#getTitle").isStatic', false, 'The isStatic of a nonstatic method of prototype oblit is correct.');
-		is('symbols.getSymbol("Article.getTitle").name', "getTitle", 'The static method name of prototype oblit is correct.');
-		is('symbols.getSymbol("Article.getTitle").isStatic', true, 'The isStatic of a static method of prototype oblit is correct.');
-		is('symbols.getSymbol("Article#getTitle").isa', "FUNCTION", 'The isa of non-static method of prototype oblit is correct.');
-		is('symbols.getSymbol("Article.getTitle").alias', "Article.getTitle", 'The alias of a static method of prototype oblit is correct.');
-		is('symbols.getSymbol("Article.getTitle").isa', "FUNCTION", 'The isa of static method of prototype oblit is correct.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/prototype_oblit_constructor.js"]});
-		
-		is('symbols.getSymbol("Article").name', "Article", 'Oblit set to constructor prototype with inner constructor name is found.');
-		is('symbols.getSymbol("Article#init").name', "init", 'The initializer method name of prototype oblit is correct.');
-		is('symbols.getSymbol("Article").hasMember("pages")', true, 'Property set by initializer method "this" is on the outer constructor.');
-		is('symbols.getSymbol("Article#Title").name', "Title", 'Name of the inner constructor name is found.');
-		is('symbols.getSymbol("Article#Title").memberOf', "Article", 'The memberOf of the inner constructor name is found.');
-		is('symbols.getSymbol("Article#Title").isa', "CONSTRUCTOR", 'The isa of the inner constructor name is constructor.');
-		is('symbols.getSymbol("Article#Title").hasMember("title")', true, 'A property set on the inner constructor "this"  is on the inner constructor.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/inner.js"]});
-		
-		is('symbols.getSymbol("Outer").name', "Outer", 'Outer constructor prototype name is found.');
-		is('symbols.getSymbol("Outer").methods.length', 1, 'Inner function doesnt appear as a method of the outer.');
-		is('symbols.getSymbol("Outer").hasMethod("open")', true, 'Outer constructors methods arent affected by inner function.');
-		is('symbols.getSymbol("Outer-Inner").alias', "Outer-Inner", 'Alias of inner function is found.');
-		is('symbols.getSymbol("Outer-Inner").isa', "CONSTRUCTOR", 'isa of inner function constructor is found.');
-		is('symbols.getSymbol("Outer-Inner").memberOf', "Outer", 'The memberOf of inner function is found.');
-		is('symbols.getSymbol("Outer-Inner").name', "Inner", 'The name of inner function is found.');
-		is('symbols.getSymbol("Outer-Inner#name").name', "name", 'A member of the inner function constructor, attached to "this" is found on inner.');
-		is('symbols.getSymbol("Outer-Inner#name").memberOf', "Outer-Inner", 'The memberOf of an inner function member is found.');		
-	}
-	,
-	function() {
-		symbolize({a:true, _: [SYS.pwd+"test/prototype_nested.js"]});
-		
-		is('symbols.getSymbol("Word").name', "Word", 'Base constructor name is found.');
-		is('symbols.getSymbol("Word").hasMethod("reverse")', true, 'Base constructor method is found.');
-		is('symbols.getSymbol("Word").methods.length', 1, 'Base constructor has only one method.');
-		is('symbols.getSymbol("Word").memberOf', "", 'Base constructor memberOf is empty.');
-		is('symbols.getSymbol("Word#reverse").name', "reverse", 'Member of constructor prototype name is found.');
-		is('symbols.getSymbol("Word#reverse").memberOf', "Word", 'Member of constructor prototype memberOf is found.');
-		is('symbols.getSymbol("Word#reverse.utf8").name', "utf8", 'Member of constructor prototype method name is found.');
-		is('symbols.getSymbol("Word#reverse.utf8").memberOf', "Word#reverse", 'Static nested member memberOf is found.');
-	}
-	,
-	function() {
-		symbolize({a:true, _: [SYS.pwd+"test/namespace_nested.js"]});
-		
-		is('symbols.getSymbol("ns1").name', "ns1", 'Base namespace name is found.');
-		is('symbols.getSymbol("ns1").memberOf', "", 'Base namespace memberOf is empty (its a constructor).');
-		is('symbols.getSymbol("ns1.ns2").name', "ns2", 'Nested namespace name is found.');
- 		is('symbols.getSymbol("ns1.ns2").alias', "ns1.ns2", 'Nested namespace alias is found.');
- 		is('symbols.getSymbol("ns1.ns2").memberOf', "ns1", 'Nested namespace memberOf is found.');
- 		is('symbols.getSymbol("ns1.ns2.Function1").name', "Function1", 'Method of nested namespace name is found.');
- 		is('symbols.getSymbol("ns1.ns2.Function1").memberOf', "ns1.ns2", 'Constructor of nested namespace memberOf is found.');			
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/functions_nested.js"]});
-		
-		is('symbols.getSymbol("Zop").name', "Zop", 'Any constructor name is found.');
-		is('symbols.getSymbol("Zop").isa', "CONSTRUCTOR", 'It isa constructor.');
-		is('symbols.getSymbol("Zop").hasMethod("zap")', true, 'Its method name, set later, is in methods array.');
-		is('symbols.getSymbol("Foo").name', "Foo", 'The containing constructor name is found.');
-		is('symbols.getSymbol("Foo").hasMethod("methodOne")', true, 'Its method name is found.');
-		is('symbols.getSymbol("Foo").hasMethod("methodTwo")', true, 'Its second method name is found.');
-		is('symbols.getSymbol("Foo#methodOne").alias', "Foo#methodOne", 'A methods alias is found.');
-		is('symbols.getSymbol("Foo#methodOne").isStatic', false, 'A methods is not static.');
-		is('symbols.getSymbol("Bar").name', "Bar", 'A global function declared inside another function is found.');
-		is('symbols.getSymbol("Bar").isa', "FUNCTION", 'It isa function.');
-		is('symbols.getSymbol("Bar").memberOf', "_global_", 'It is global.');
-		is('symbols.getSymbol("Foo-inner").name', "inner", 'An inner functions name is found.');
-		is('symbols.getSymbol("Foo-inner").memberOf', "Foo", 'It is member of the outer function.');
-		is('symbols.getSymbol("Foo-inner").isInner', true, 'It is an inner function.');
-	}
-	,
-	function() {
-		symbolize({a:true, _: [SYS.pwd+"test/memberof_constructor.js"]});
-		
-		is('symbols.getSymbol("Circle#Tangent").name', "Tangent", 'Constructor set on prototype using @member has correct name.');
- 		is('symbols.getSymbol("Circle#Tangent").memberOf', "Circle", 'Constructor set on prototype using @member has correct memberOf.');
- 		is('symbols.getSymbol("Circle#Tangent").alias', "Circle#Tangent", 'Constructor set on prototype using @member has correct alias.');
- 		is('symbols.getSymbol("Circle#Tangent").isa', "CONSTRUCTOR", 'Constructor set on prototype using @member has correct isa.');
-		is('symbols.getSymbol("Circle#Tangent").isStatic', false, 'Constructor set on prototype using @member is not static.');
-		is('symbols.getSymbol("Circle#Tangent#getDiameter").name', "getDiameter", 'Method set on prototype using @member has correct name.');
-		is('symbols.getSymbol("Circle#Tangent#getDiameter").memberOf', "Circle#Tangent", 'Method set on prototype using @member has correct memberOf.');
-		is('symbols.getSymbol("Circle#Tangent#getDiameter").alias', "Circle#Tangent#getDiameter", 'Method set on prototype using @member has correct alias.');
-		is('symbols.getSymbol("Circle#Tangent#getDiameter").isa', "FUNCTION", 'Method set on prototype using @member has correct isa.');
-		is('symbols.getSymbol("Circle#Tangent#getDiameter").isStatic', false, 'Method set on prototype using @member is not static.');
-	}
-	,
-	function() {
-		symbolize({a:true, p: true,  _: [SYS.pwd+"test/memberof.js"]});
-		
-		is('symbols.getSymbol("pack.install").alias', "pack.install", 'Using @memberOf sets alias, when parent name is in memberOf tag.');
-		is('symbols.getSymbol("pack.install.overwrite").name', "install.overwrite", 'Using @memberOf sets name, even if the name is dotted.');
-		is('symbols.getSymbol("pack.install.overwrite").memberOf', "pack", 'Using @memberOf sets memberOf.');
- 		is('symbols.getSymbol("pack.install.overwrite").isStatic', true, 'Using @memberOf with value not ending in octothorp sets isStatic to true.');
-	}
-	,
-	function() {
-		symbolize({a:true, p: true,  _: [SYS.pwd+"test/memberof2.js"]});
-		
-		is('symbols.getSymbol("Foo#bar").alias', "Foo#bar", 'An inner function can be documented as an instance method.');
-		is('symbols.getSymbol("Foo.zip").alias', "Foo.zip", 'An inner function can be documented as a static method.');
-		is('symbols.getSymbol("Foo.Fiz").alias', "Foo.Fiz", 'An inner function can be documented as a static constructor.');
-		is('symbols.getSymbol("Foo.Fiz#fipple").alias', "Foo.Fiz#fipple", 'An inner function can be documented as a static constructor with a method.');
-		is('symbols.getSymbol("Foo#blat").alias', "Foo#blat", 'An global function can be documented as an instance method.');
-	}
-	,
-	function() {
-		symbolize({a:true, p: true,  _: [SYS.pwd+"test/memberof3.js"]});
-		
-		is('symbols.getSymbol("Foo#bar").alias', "Foo#bar", 'A virtual field can be documented as an instance method.');
-		is('symbols.getSymbol("Foo2#bar").alias', "Foo2#bar", 'A virtual field with the same name can be documented as an instance method.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/borrows.js"]});
-
-		is('symbols.getSymbol("Layout").name', "Layout", 'Constructor can be found.');
-		is('symbols.getSymbol("Layout").hasMethod("init")', true, 'Constructor method name can be found.');
-		is('symbols.getSymbol("Layout").hasMember("orientation")', true, 'Constructor property name can be found.');
-		
-		is('symbols.getSymbol("Page").hasMethod("reset")', true, 'Second constructor method name can be found.');
-		is('symbols.getSymbol("Page").hasMember("orientation")', true, 'Second constructor borrowed property name can be found in properties.');
-		is('symbols.getSymbol("Page#orientation").memberOf', "Page", 'Second constructor borrowed property memberOf can be found.');
-		is('symbols.getSymbol("Page-getInnerElements").alias', "Page-getInnerElements", 'Can borrow an inner function and it is still inner.');
-		is('symbols.getSymbol("Page.units").alias', "Page.units", 'Can borrow a static function and it is still static.');
-		
-		is('symbols.getSymbol("ThreeColumnPage#init").alias', "ThreeColumnPage#init", 'Third constructor method can be found even though method with same name is borrowed.');
-		is('symbols.getSymbol("ThreeColumnPage#reset").alias', "ThreeColumnPage#reset", 'Borrowed method can be found.');
-		is('symbols.getSymbol("ThreeColumnPage#orientation").alias', "ThreeColumnPage#orientation", 'Twice borrowed method can be found.');
-	
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/borrows2.js"]});
-
-		is('symbols.getSymbol("Foo").hasMethod("my_zop")', true, 'Borrowed method can be found.');		
-		is('symbols.getSymbol("Bar").hasMethod("my_zip")', true, 'Second borrowed method can be found.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/constructs.js"]});
-
-		is('symbols.getSymbol("Person").hasMethod("say")', true, 'The constructs tag creates a class that lends can add a method to.');		
-	}
-	,
-	function() {
-		symbolize({a: true, _: [SYS.pwd+"test/augments.js", SYS.pwd+"test/augments2.js"]});
-		
-		is('symbols.getSymbol("Page").augments[0]', "Layout", 'An augmented class can be found.');
-		is('symbols.getSymbol("Page#reset").alias', "Page#reset", 'Method of augmenter can be found.');
-		is('symbols.getSymbol("Page").hasMethod("Layout#init")', true, 'Method from augmented can be found.');
-		is('symbols.getSymbol("Page").hasMember("Layout#orientation")', true, 'Property from augmented can be found.');
-		is('symbols.getSymbol("Page").methods.length', 3, 'Methods of augmented class are included in methods array.');
-	
-		is('symbols.getSymbol("ThreeColumnPage").augments[0]', "Page", 'The extends tag is a synonym for augments.');
-		is('symbols.getSymbol("ThreeColumnPage").hasMethod("ThreeColumnPage#init")', true, 'Local method overrides augmented method of same name.');
-		is('symbols.getSymbol("ThreeColumnPage").methods.length', 3, 'Local method count is right.');
-		
-		is('symbols.getSymbol("NewsletterPage").augments[0]', "ThreeColumnPage", 'Can augment across file boundaries.');
-		is('symbols.getSymbol("NewsletterPage").augments.length', 2, 'Multiple augments are supported.');
-		is('symbols.getSymbol("NewsletterPage").inherits[0].alias', "Junkmail#annoy", 'Inherited method with augments.');
-		is('symbols.getSymbol("NewsletterPage").methods.length', 6, 'Methods of augmented class are included in methods array across files.');
-		is('symbols.getSymbol("NewsletterPage").properties.length', 1, 'Properties of augmented class are included in properties array across files.');
-	}
-	,
-	function() {
-		symbolize({a:true, _: [SYS.pwd+"test/static_this.js"]});
-		
-		is('symbols.getSymbol("box.holder").name', "holder", 'Static namespace name can be found.');
-		is('symbols.getSymbol("box.holder.foo").name', "foo", 'Static namespace method name can be found.');
-		is('symbols.getSymbol("box.holder").isStatic', true, 'Static namespace method is static.');
-		
-		is('symbols.getSymbol("box.holder.counter").name', "counter", 'Instance namespace property name set on "this" can be found.');
-		is('symbols.getSymbol("box.holder.counter").alias', "box.holder.counter", 'Instance namespace property alias set on "this" can be found.');
-		is('symbols.getSymbol("box.holder.counter").memberOf', "box.holder", 'Static namespace property memberOf set on "this" can be found.');
-	}
-	,
-	function() {
-		symbolize({a:true, p: true, _: [SYS.pwd+"test/lend.js"]});
-
-		is('symbols.getSymbol("Person").name', "Person", 'Class defined in lend comment is found.');
-		is('symbols.getSymbol("Person").hasMethod("initialize")', true, 'Lent instance method name can be found.');
-		is('symbols.getSymbol("Person").hasMethod("say")', true, 'Second instance method can be found.');
-		is('symbols.getSymbol("Person#sing").isStatic', false, 'Instance method is known to be not static.');
-		
-		is('symbols.getSymbol("Person.getCount").name', "getCount", 'Static method name from second lend comment can be found.');
-		is('symbols.getSymbol("Person.getCount").isStatic', true, 'Static method from second lend comment is known to be static.');
-	
-		is('LOG.warnings.filter(function($){if($.indexOf("notok") > -1) return $}).length', 1, 'A warning is emitted when lending to an undocumented parent.');
-	}
-	,
-	function() {
-		symbolize({a:true, _: [SYS.pwd+"test/param_inline.js"]});
-	
-		is('symbols.getSymbol("Layout").params[0].type', "int", 'Inline param name is set.');
-		is('symbols.getSymbol("Layout").params[0].desc', "The number of columns.", 'Inline param desc is set from comment.');
-		is('symbols.getSymbol("Layout#getElement").params[0].name', "id", 'User defined param documentation takes precedence over parser defined.');
-		is('symbols.getSymbol("Layout#getElement").params[0].isOptional', true, 'Default for param is to not be optional.');
-		is('symbols.getSymbol("Layout#getElement").params[1].isOptional', false, 'Can mark a param as being optional.');
-		is('symbols.getSymbol("Layout#getElement").params[1].type', "number|string", 'Type of inline param doc can have multiple values.');
-		is('symbols.getSymbol("Layout#Canvas").params[0].type', "", 'Type can be not defined for some params.');
-		is('symbols.getSymbol("Layout#Canvas").params[2].type', "int", 'Type can be defined inline for only some params.');
-		is('symbols.getSymbol("Layout#rotate").params.length', 0, 'Docomments inside function sig is ignored without a param.');
-		is('symbols.getSymbol("Layout#init").params[2].type', "zoppler", 'Doc comment type overrides inline type for param with same name.');
-	}
-	,
-	function() {
-		symbolize({a: true, _: [SYS.pwd+"test/shared.js", SYS.pwd+"test/shared2.js"]});
-
-		is('symbols.getSymbol("Array#some").name', 'some', 'The name of a symbol in a shared section is found.');
-		is('symbols.getSymbol("Array#some").alias', 'Array#some', 'The alias of a symbol in a shared section is found.');
-		is('symbols.getSymbol("Array#some").desc', "Extension to builtin array.", 'A description can be shared.');
-		is('symbols.getSymbol("Array#filter").desc', "Extension to builtin array.\nChange every element of an array.", 'A shared description is appended.');
-		is('symbols.getSymbol("Queue").desc', "A first in, first out data structure.", 'A description is not shared when outside a shared section.');
-		is('symbols.getSymbol("Queue.rewind").alias', "Queue.rewind", 'Second shared tag can be started.');
-		is('symbols.getSymbol("startOver").alias', "startOver", 'Shared tag doesnt cross over files.');
-	}
-	,
-	function() {
-		symbolize({a: true, _: [SYS.pwd+"test/config.js"]});
-		is('symbols.getSymbol("Contact").params[0].name', 'person', 'The name of a param is found.');
-		is('symbols.getSymbol("Contact").params[1].name', 'person.name', 'The name of a param set with a dot name is found.');
-		is('symbols.getSymbol("Contact").params[2].name', 'person.age', 'The name of a second param set with a dot name is found.');
-		is('symbols.getSymbol("Contact").params[4].name', 'connection', 'The name of a param after config is found.');
-		
-		is('symbols.getSymbol("Family").params[0].name', 'persons', 'Another name of a param is found.');
-		is('symbols.getSymbol("Family").params[1].name', 'persons.Father', 'The name of a param+config is found.');
-		is('symbols.getSymbol("Family").params[2].name', 'persons.Mother', 'The name of a second param+config is found.');
-		is('symbols.getSymbol("Family").params[3].name', 'persons.Children', 'The name of a third param+config is found.');	
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/ignore.js"]});
-		is('LOG.warnings.filter(function($){if($.indexOf("undocumented symbol Ignored") > -1) return $}).length', 1, 'A warning is emitted when documenting members of an ignored parent.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/functions_anon.js"]});
-		is('symbols.getSymbol("a.b").alias', 'a.b', 'In anonymous constructor this is found to be the container object.');
-		is('symbols.getSymbol("a.f").alias', 'a.f', 'In anonymous constructor this can have a method.');
-		is('symbols.getSymbol("a.c").alias', 'a.c', 'In anonymous constructor method this is found to be the container object.');
-		is('symbols.getSymbol("g").alias', 'g', 'In anonymous function executed inline this is the global.');
-		is('symbols.getSymbol("bar2.p").alias', 'bar2.p', 'In named constructor executed inline this is the container object.');
-		is('symbols.getSymbol("module.pub").alias', 'module.pub', 'In parenthesized anonymous function executed inline function scoped variables arent documented.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/oblit_anon.js"]});
-		is('symbols.getSymbol("opt").name', 'opt', 'Anonymous object properties are created.');
-		is('symbols.getSymbol("opt.conf.keep").alias', 'opt.conf.keep', 'Anonymous object first property is assigned to $anonymous.');
-		is('symbols.getSymbol("opt.conf.base").alias', 'opt.conf.base', 'Anonymous object second property is assigned to $anonymous.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/params_optional.js"]});
-		is('symbols.getSymbol("Document").params.length', 3, 'Correct number of params are found when optional param syntax is used.');
-		is('symbols.getSymbol("Document").params[1].name', "id", 'Name of optional param is found.');
-		is('symbols.getSymbol("Document").params[1].isOptional', true, 'Optional param is marked isOptional.');
-		is('symbols.getSymbol("Document").params[2].name', "title", 'Name of optional param with default value is found.');
-		is('symbols.getSymbol("Document").params[2].isOptional', true, 'Optional param with default value is marked isOptional.');
-		is('symbols.getSymbol("Document").params[2].defaultValue', " This is untitled.", 'Optional param default value is found.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/synonyms.js"]});
-		is('symbols.getSymbol("myObject.myFunc").type', 'function', 'Type can be set to function.');
-	}
-	,
-	function() {
-		symbolize({a:true, p:true, _: [SYS.pwd+"test/event.js"]});
-		is('symbols.getSymbol("Kitchen#event:cakeEaten").isEvent', true, 'Function with event prefix is an event.');
-		is('symbols.getSymbol("Kitchen#cakeEaten").isa', "FUNCTION", 'Function with same name as event isa function.');
-	}
-	,
-	function() {
-		symbolize({x:"js", a:true, _: [SYS.pwd+"test/scripts/"]});
-		is('JSDOC.JsDoc.srcFiles.length', 1, 'Only js files are scanned when -x=js.');
-	}
-	,
-	function() {
-		symbolize({x:"js", a:true, _: [SYS.pwd+"test/exports.js"]});
-		is('symbols.getSymbol("mxn.Map#doThings").name', 'doThings', 'Exports creates a documentation alias that can have methods.');
-	}
-	,
-	function() {
-		symbolize({p:true, a:true, _: [SYS.pwd+"test/module.js"]});
-		is('symbols.getSymbol("myProject.myModule.myPublicMethod").name', 'myPublicMethod', 'A function wrapped in parens can be recognized.');
-		is('symbols.getSymbol("myProject.myModule-myPrivateMethod").name', 'myPrivateMethod', 'A private method in the scope of a function wrapped in parens can be recognized.');
-		is('symbols.getSymbol("myProject.myModule-myPrivateVar").name', 'myPrivateVar', 'A private member in the scope of a function wrapped in parens can be recognized.');
-	}
-];
-
-//// run and print results
-print(testrun(testCases));
--- a/sbin/res/app/test/addon.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-String.prototype.reverse = function() {
-}
-
-String.prototype.reverse.utf8 = function() {
-}
-
-Function.count = function() {
-}
-
-/** @memberOf Function */
-Function.count.reset = function() {
-}
-
-/** @memberOf Function */
-count.getValue = function() {
-}
-
-/** @memberOf Function.prototype */
-getSig = function() {
-}
-
-/** @memberOf Function.prototype */
-Function.prototype.getProps = function() {
-}
--- a/sbin/res/app/test/anon_inner.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-/**
- * @name bar
- * @namespace
- */
- 
-new function() {
-    /**
-     * @name bar-foo
-     * @function
-     * @param {number} x
-     */
-    function foo(x) {
-    }
-}
\ No newline at end of file
--- a/sbin/res/app/test/augments.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/**
-@constructor
-*/
-function Layout(p) {
-	this.init = function(p) {
-	}
-	
-	this.getId = function() {
-	}
-	
-	/** @type Page */
-	this.orientation = "landscape";
-}
-
-/**
-@constructor
-@augments Layout
-*/
-function Page() {
-	this.reset = function(b) {
-	}
-}
-
-/**
-@extends Page
-@constructor
-*/
-function ThreeColumnPage() {
-	this.init = function(resetCode) {
-	}
-}
--- a/sbin/res/app/test/augments2.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/**
-@constructor
-*/
-function LibraryItem() {
-	this.reserve = function() {
-	}
-}
-
-/**
-@constructor
-*/
-function Junkmail() {
-	this.annoy = function() {
-	}
-}
-
-/**
-@inherits Junkmail.prototype.annoy as pester
-@augments ThreeColumnPage
-@augments LibraryItem
-@constructor
-*/
-function NewsletterPage() {
-	this.getHeadline = function() {
-	}
-}
--- a/sbin/res/app/test/borrows.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-/**
-@constructor
-*/
-function Layout(p) {
-	/** initilize 1 */
-	this.init = function(p) {
-	}
-	
-	/** get the id */
-	this.getId = function() {
-	}
-	
-	/** @type string */
-	this.orientation = "landscape";
-	
-	function getInnerElements(elementSecretId){
-	}
-}
-
-/** A static method. */
-Layout.units = function() {
-}
-
-/**
-@constructor
-@borrows Layout#orientation
-@borrows Layout-getInnerElements
-@borrows Layout.units
-*/
-function Page() {
-	/** reset the page */
-	this.reset = function(b) {
-	}
-}
-
-/**
-@constructor
-@borrows Layout.prototype.orientation as this.orientation
-@borrows Layout.prototype.init as #init
-@inherits Page.prototype.reset as #reset
-*/
-function ThreeColumnPage() {
-	/** initilize 2 */
-	this.init = function(p) {
-	}
-}
--- a/sbin/res/app/test/borrows2.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-// testing circular borrows
-
-/**
-	@class
-	@borrows Bar#zop as this.my_zop
-*/
-function Foo() {
-	/** this is a zip. */
-	this.zip = function() {}
-	
-	this.my_zop = new Bar().zop;
-}
-
-/**
-	@class
-	@borrows Foo#zip as this.my_zip
-*/
-function Bar() {
-	/** this is a zop. */
-	this.zop = function() {}
-	
-	this.my_zip = new Foo().zip;
-}
\ No newline at end of file
--- a/sbin/res/app/test/config.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-/**
- * @constructor
- * @param person The person.
- * @param {string} person.name The person's name.
- * @config {integer} age The person's age.
- * @config [id=1] Optional id number to use.
- * @param connection
- */
-function Contact(person, connection) {
-
-}
-
-/**
- * @constructor
- * @param persons
- * @config {string} Father The paternal person.
- * @config {string} Mother The maternal person.
- * @config {string[]} Children And the rest.
- */
-function Family(/**Object*/persons) {
-
-}
--- a/sbin/res/app/test/constructs.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-var Person = makeClass(
-    /**
-      @scope Person
-    */
-    {
-        /**
-        	This is just another way to define a constructor.
-        	@constructs
-        	@param {string} name The name of the person.
-         */
-        initialize: function(name) {
-            this.name = name;
-        },
-        say: function(message) {
-            return this.name + " says: " + message;
-        }
-    }
-);
\ No newline at end of file
--- a/sbin/res/app/test/encoding.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-
-/**
- * @Constructor
- * @desc é…置文件
- * @class 什么也ä¸è¿”回
- */
-function Test(conf) {
-    // do something;
-}
-
--- a/sbin/res/app/test/encoding_other.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-
-/**
- * @Constructor
- * @desc ðïîÛ
- * @class ßàáâãäåæçèçìëêíîï °±²³´µ¡¶·¸¹
- */
-function Test(conf) {
-    // do something;
-}
-
-// run with commanline option -e=iso-8859-5
-
--- a/sbin/res/app/test/event.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/**
- * @name Kitchen
- * @constructor
- * @fires Bakery#event:donutOrdered
- */
-
-/**
- * Fired when some cake is eaten.
- * @name Kitchen#event:cakeEaten
- * @function
- * @param {Number} pieces The number of pieces eaten.
- */
-
-/**
- * Find out if cake was eaten.
- * @name Kitchen#cakeEaten
- * @function
- * @param {Boolean} wasEaten
- */
-
-/**
- * @name getDesert
- * @function
- * @fires Kitchen#event:cakeEaten
- */
- 
-/**
- * @name Bakery
- * @constructor
- * @extends Kitchen
- */
-
-/**
- * Fired when a donut order is made.
- * @name Bakery#event:donutOrdered
- * @event
- * @param {Event} e The event object.
- * @param {String} [e.topping] Optional sprinkles.
- */
-
-/**
- * @constructor
- * @borrows Bakery#event:donutOrdered as this.event:cakeOrdered
- */
-function CakeShop() {
-}
-
-/** @event */
-CakeShop.prototype.icingReady = function(isPink) {
-}
-
-/** @event */
-function amHungry(/**Boolean*/enoughToEatAHorse) {
-}
\ No newline at end of file
--- a/sbin/res/app/test/exports.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-/** @namespace */
-var mxn = {};
-
-(function(){ 
-    /** @exports Map as mxn.Map */
-    var Map =
-        /** @constructor */
-        mxn.Map = function() {
-        };
-    
-    /** A method. */
-    Map.prototype.doThings = function() {
-    };
-})();
\ No newline at end of file
--- a/sbin/res/app/test/functions_anon.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/** an anonymous constructor executed inline */
-a = new function() {
-	/** a.b*/
-    this.b = 1;
-    /** a.f */
-    this.f = function() {
-    	/** a.c */
-    	this.c = 2;
-    }
-}
-
-
-/**
-	named function executed inline
-*/
-bar1 = function Zoola1() {
-	/** property of global */
-	this.g = 1;
-}();
-
-/**
-	named constructor executed inline
-*/
-bar2 = new function Zoola2() {
-	/** property of bar */
-	this.p = 1;
-};
-
-/** module pattern */
-module = (function () {
-	/** won't appear in documentation */
-	var priv = 1;
-	
-	/** @scope module */
-	return {
-		/** will appear as a property of module */
-		pub: 1
-	}
-})();
--- a/sbin/res/app/test/functions_nested.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/** @constructor */
-function Zop() {
-}
-
-/**
- @class
-*/
-Foo = function(id) {
-	// this is a bit twisted, but if you call Foo() you will then
-	// modify Foo(). This is kinda, sorta non-insane, because you
-	// would have to call Foo() 100% of the time to use Foo's methods
-	Foo.prototype.methodOne = function(bar) {
-	  alert(bar);
-	};
-	
-	// same again
-	Foo.prototype.methodTwo = function(bar2) {
-	  alert(bar2);
-	};
-	
-	// and these are only executed if the enclosing function is actually called
-	// and who knows if that will ever happen?
-	Bar = function(pez) {
-	  alert(pez);
-	};
-	Zop.prototype.zap = function(p){
-		alert(p);
-	};
-	
-	// but this is only visible inside Foo
-	function inner() {
-	}
-};
--- a/sbin/res/app/test/global.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-/** ecks */
-var x = [1, 2, 4];
-
-var y = {
-	foo: function(){
-	}
-}
-
-bar = function() {
-}
-
-function zop() {
-}
--- a/sbin/res/app/test/globals.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-function example(/**Circle*/a, b) {
-	/** a global defined in function  */
-	var number = a;
-	
-	var hideNumber = function(){
-	}
-	
-	setNumber = function(){
-	}
-	alert('You have chosen: ' + b);
-}
-
-function initPage() {
-	var supported = document.createElement && document.getElementsByTagName;
-	if (!supported) return;
-	// start of DOM script
-	var x = document.getElementById('writeroot');
-	// etc.
-}
-
-/** an example var */
-var document = new Document(x, y);
-
-var getNumber = function(){
-}
\ No newline at end of file
--- a/sbin/res/app/test/ignore.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-/**
- * A test constructor.
- * @constructor
- * @ignore
- */
-function Ignored() {
-	/** a method */
-    this.bar = function() {
-    }
-}
\ No newline at end of file
--- a/sbin/res/app/test/inner.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-/**
- * @constructor
- */
-function Outer() {
-  /**
-   * @constructor
-   */
-  function Inner(name) {
-    /** The name of this. */
-    this.name = name;
-  }
-
-  this.open = function(name) {
-    return (new Inner(name));
-  }
-}
\ No newline at end of file
--- a/sbin/res/app/test/jsdoc_test.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,477 +0,0 @@
-/** 
- * @fileoverview This file is to be used for testing the JSDoc parser
- * It is not intended to be an example of good JavaScript OO-programming,
- * nor is it intended to fulfill any specific purpose apart from 
- * demonstrating the functionality of the 
- * <a href='http://sourceforge.net/projects/jsdoc'>JSDoc</a> parser
- *
- * @author Gabriel Reid gab_reid@users.sourceforge.net
- * @version 0.1 
- */
-
-
-/**
- * Construct a new Shape object.
- * @class This is the basic Shape class.  
- * It can be considered an abstract class, even though no such thing
- * really existing in JavaScript
- * @constructor
- * @throws MemoryException if there is no more memory 
- * @throws GeneralShapeException rarely (if ever)
- * @return {Shape|Coordinate} A new shape.
- */
-function Shape(){
-  
-   /**
-    * This is an example of a function that is not given as a property
-    * of a prototype, but instead it is assigned within a constructor.
-    * For inner functions like this to be picked up by the parser, the
-    * function that acts as a constructor <b>must</b> be denoted with
-    * the <b>&#64;constructor</b> tag in its comment.
-    * @type String
-    */
-   this.getClassName = function(){
-      return "Shape";
-   }
-
-   /** 
-    * This is an inner method, just used here as an example
-    * @since version 0.5
-    * @author Sue Smart
-    */
-   function addReference(){
-       // Do nothing...
-   }
-   
-}
-
-/**
- * Create a new Hexagon instance.
- * @extends Shape
- * @class Hexagon is a class that is a <i>logical</i> sublcass of 
- * {@link Shape} (thanks to the <code>&#64;extends</code> tag), but in 
- * reality it is completely unrelated to Shape.
- * @param {int} sideLength The length of one side for the new Hexagon
- * @example
- * var h = new Hexagon(2);
- * @example
- * if (hasHex) {
- *     hex   = new Hexagon(5);
- *     color = hex.getColor();
- * }
- */
-function Hexagon(sideLength) {
-}
-
-
-/**
- * This is an unattached (static) function that adds two integers together.
- * @param {int} One The first number to add 
- * @param {int} Two The second number to add 
- * @author Gabriel Reid
- * @deprecated So you shouldn't use it anymore! Use {@link Shape#getClassName} instead.
- */
-function Add(One, Two){
-    return One + Two;
-}
-
-
-/**
- * The color of this shape
- * @type Color
- */
-Shape.prototype.color = null;
-
-/**
- * The border of this shape. 
- * @field
- * @type int
- */
-Shape.prototype.border = function(){return border;};
-
-/*
- * These are all the instance method implementations for Shape
- */
-
-/**
- * Get the coordinates of this shape. It is assumed that we're always talking
- * about shapes in a 2D location here.
- * @requires The {@link Shape} class
- * @returns A Coordinate object representing the location of this Shape
- * @type Coordinate[]
- */
-Shape.prototype.getCoords = function(){
-   return this.coords;
-}
-
-/**
- * Get the color of this shape.
- * @see #setColor
- * @see The <a href="http://example.com">Color</a> library.
- * @link Shape
- * @type Color
- */
-Shape.prototype.getColor = function(){
-   return this.color;
-}
-
-/**
- * Set the coordinates for this Shape
- * @param {Coordinate} coordinates The coordinates to set for this Shape
- */
-Shape.prototype.setCoords = function(coordinates){
-   this.coords = coordinates;
-}
-
-/**
- * Set the color for this Shape
- * @param {Color} color The color to set for this Shape
- * @param other There is no other param, but it can still be documented if
- *              optional parameters are used
- * @throws NonExistantColorException (no, not really!)
- * @see #getColor
- */
-Shape.prototype.setColor = function(color){
-   this.color = color;
-}
-
-/**
- * Clone this shape
- * @returns A copy of this shape
- * @type Shape
- * @author Gabriel Reid
- */
-Shape.prototype.clone = function(){
-   return new Shape();
-}
-
-/**
- * Create a new Rectangle instance. 
- * @class A basic rectangle class, inherits from Shape.
- * This class could be considered a concrete implementation class
- * @constructor
- * @param {int} width The optional width for this Rectangle
- * @param {int} height Thie optional height for this Rectangle
- * @author Gabriel Reid
- * @see Shape is the base class for this
- * @augments Shape
- * @hilited
- */
-function Rectangle(width, // This is the width 
-                  height // This is the height
-                  ){
-   if (width){
-      this.width = width;
-      if (height){
-	 this.height = height;
-      }
-   }
-}
-
-
-/* Inherit from Shape */
-Rectangle.prototype = new Shape();
-
-/**
- * Value to represent the width of the Rectangle.
- * <br>Text in <b>bold</b> and <i>italic</i> and a 
- * link to <a href="http://sf.net">SourceForge</a>
- * @private
- * @type int
- */
-Rectangle.prototype.width = 0;
-
-/**
- * Value to represent the height of the Rectangle
- * @private
- * @type int
- */
-Rectangle.prototype.height = 0;
-
-/**
- * Get the type of this object. 
- * @type String
- */
-Rectangle.prototype.getClassName= function(){
-    return "Rectangle";
-}
-
-/**
- * Get the value of the width for the Rectangle
- * @type int
- * @see Rectangle#setWidth
- */
-Rectangle.prototype.getWidth = function(){
-   return this.width;
-}
-
-/**
- * Get the value of the height for the Rectangle.
- * Another getter is the {@link Shape#getColor} method in the 
- * {@link Shape} base class.  
- * @return The height of this Rectangle
- * @type int
- * @see Rectangle#setHeight
- */
-Rectangle.prototype.getHeight = function(){
-    return this.height;
-}
-
-/**
- * Set the width value for this Rectangle.
- * @param {int} width The width value to be set
- * @see #setWidth
- */
-Rectangle.prototype.setWidth = function(width){
-   this.width = width;
-}
-
-/**
- * Set the height value for this Rectangle.
- * @param {int} height The height value to be set
- * @see #getHeight
- */
-Rectangle.prototype.setHeight = function(height){
-   this.height = height;
-}
-
-/**
- * Get the value for the total area of this Rectangle
- * @return total area of this Rectangle
- * @type int
- */
-Rectangle.prototype.getArea = function(){
-   return width * height;
-}
-
-
-/**
- * Create a new Square instance.
- * @class A Square is a subclass of {@link Rectangle}
- * @param {int} width The optional width for this Rectangle
- * @param {int} height The optional height for this Rectangle
- * @augments Rectangle
- */
-function Square(width, height){
-   if (width){
-      this.width = width;
-      if (height){
-	 this.height = height;
-      }
-   } 
-   
-}
-
-/* Square is a subclass of Rectangle */
-Square.prototype = new Rectangle();
-
-/**
- * Set the width value for this Shape.
- * @param {int} width The width value to be set
- * @see #getWidth
- */
-Square.prototype.setWidth = function(width){
-   this.width = this.height = width;
-}
-
-/**
- * Set the height value for this Shape 
- * Sets the {@link Rectangle#height} attribute in the Rectangle.
- * @param {int} height The height value to be set
- */
-Square.prototype.setHeight = function(height){
-   this.height = this.width = height;
-}
-
-
-/**
- * Create a new Circle instance based on a radius.
- * @class Circle class is another subclass of Shape
- * @extends Shape
- * @param {int} radius The optional radius of this {@link Circle }
- * @mixin Square.prototype.setWidth as this.setDiameter
- */
-function Circle(radius){
-   if (radius) {
-      /** The radius of the this Circle. */
-      this.radius = radius;
-   }
-}
-
-/* Circle inherits from {@link Shape} */
-Circle.prototype = new Shape();
-
-/** 
- * The radius value for this Circle 
- * @private
- * @type int
- */
-Circle.prototype.radius = 0;
-
-/** 
- * A very simple class (static) field that is also a constant
- * @final
- * @type float
- */
-Circle.PI = 3.14;
-
-/**
- * Get the radius value for this Circle
- * @type int
- * @see #setRadius
- */
-Circle.prototype.getRadius = function(){
-   return this.radius;
-}
-
-/** 
- * Set the radius value for this Circle
- * @param {int} radius The {@link Circle#radius} value to set
- * @see #getRadius
- */
-Circle.prototype.setRadius = function(radius){
-   this.radius = radius;
-}
-
-/** 
- * An example of a  class (static) method that acts as a factory for Circle
- * objects. Given a radius value, this method creates a new Circle.
- * @param {int} radius The radius value to use for the new Circle.
- * @type Circle
- */
-Circle.createCircle = function(radius){
-    return new Circle(radius);
-}
-
-
-/**
- * Create a new Coordinate instance based on x and y grid data.
- * @class Coordinate is a class that can encapsulate location information.
- * @param {int} [x=0] The optional x portion of the Coordinate
- * @param {int} [y=0] The optinal y portion of the Coordinate
- */
-function Coordinate(x, y){
-   if (x){
-      this.x = x;
-      if (y){
-	 this.y = y;
-      }
-   }
-}
-
-/** 
- * The x portion of the Coordinate 
- * @type int
- * @see #getX
- * @see #setX
- */
-Coordinate.prototype.x = 0;
-
-/** 
- * The y portion of the Coordinate 
- * @type int
- * @see #getY
- * @see #setY
- */
-Coordinate.prototype.y = 0;
-
-/**
- * Gets the x portion of the Coordinate.
- * @type int
- * @see #setX
- */
-Coordinate.prototype.getX = function(){
-   return this.x;
-}
-
-/** 
- * Get the y portion of the Coordinate.
- * @type int
- * @see #setY
- */
-Coordinate.prototype.getY = function(){
-   return this.y;
-}
-
-/**
- * Sets the x portion of the Coordinate.
- * @param {int} x The x value to set
- * @see #getX
- */
-Coordinate.prototype.setX = function(x){
-   this.x = x;
-}
-
-/** 
- * Sets the y portion of the Coordinate.
- * @param {int} y The y value to set
- * @see #getY
- */
-Coordinate.prototype.setY = function(y){
-   this.y = y;
-}
-
-/**
- * @class This class exists to demonstrate the assignment of a class prototype
- * as an anonymous block.
- */
-function ShapeFactory(){
-}
-
-ShapeFactory.prototype = {
-   /** 
-    * Creates a new {@link Shape} instance.
-    * @return A new {@link Shape}
-    * @type Shape
-    */
-   createShape: function(){
-      return new Shape();
-   }
-}
-
-/**
- * An example of a singleton class
- * @param ... Arguments represent {@link coordinate}s in the shape.
- * @constructor
- */
-MySingletonShapeFactory = function(){
-
-   /**
-    * Get the next {@link Shape}
-    * @type Shape
-    * @return A new {@link Shape}
-    */
-   this.getShape = function(){ 
-      return null; 
-   }
-
-}
-
-
-/** 
- * Create a new Foo instance.
- * @class This is the Foo class. It exists to demonstrate 'nested' classes.
- * @constructor 
- * @see Foo.Bar
- */
-function Foo(){}
-
-/** 
- * Creates a new instance of Bar.
- * @class This class exists to demonstrate 'nested' classes.
- * @constructor 
- * @see Foo.Bar
- */
-function Bar(){}
-
-/** 
- * Nested class
- * @constructor 
- */
-Foo.Bar = function(){
-	/** The x. */ this.x = 2;
-}
-
-Foo.Bar.prototype = new Bar();
-/** The y. */ 
-Foo.Bar.prototype.y = '3';
--- a/sbin/res/app/test/lend.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
- /** @class  */
-var Person = Class.create(
-    /**
-      @lends Person.prototype
-    */
-    {
-      initialize: function(name) {
-            this.name = name;
-        },
-        say: function(message) {
-            return this.name + ': ' + message;
-        }
-    }
- );
-
-/** @lends Person.prototype */
-{
-	/** like say but more musical */
-	sing: function(song) {
-	}
-}
-
-/** @lends Person */
-{
-	getCount: function() {
-	}
-}
-
-/** @lends Unknown.prototype */
-{
-	notok: function() {
-	}
-}
\ No newline at end of file
--- a/sbin/res/app/test/memberof.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-/** @constructor */
-pack = function() {
-	this.init = function(){}
-	function config(){}
-}
- 
- pack.build = function(task) {};
-
-/** @memberOf pack */
-pack.install = function() {}
-
-/** @memberOf pack */
-pack.install.overwrite = function() {}
-
-/** @memberOf pack */
-clean = function() {}
-
-/** @memberOf pack-config */
-install = function() {};
--- a/sbin/res/app/test/memberof2.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-/**
- * @constructor
- */
-function Foo() {
-    /**
-    	@memberOf Foo.prototype
-    */
-    function bar(a, b) {
-    }
-    
-    /**
-    	@memberOf Foo
-    */
-    var zip = function(p, q) {
-    }
-    
-    /**
-    	@memberOf Foo
-    */
-    function zop( x,y ) {
-    }
-    
-    /**
-    	@memberOf Foo
-    	@constructor
-    */
-    function Fiz() {
-    	/** A method of Foo#Fiz. */
-    	this.fipple = function(fop){}
-    }
-}
-
-/**
-	@memberOf Foo#
- */
-var blat = function() {
-
-}
\ No newline at end of file
--- a/sbin/res/app/test/memberof3.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/**
-* @name Foo
-* @class
-*/
-
-/**#@+
-* @memberOf Foo#
-* @field
-*/
-
-/**
-* @name bar
-* @type Object[]
-*/
-
-/**#@-*/
-
-/**
-* @name Foo2
-* @class
-*/
-
-/**#@+
-* @memberOf Foo2#
-* @field
-*/
-
-/**
-* @name bar
-* @type Object[]
-*/
-
-/**#@-*/
\ No newline at end of file
--- a/sbin/res/app/test/memberof_constructor.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-/** @constructor */
-function Circle(){}
-
-/**
-	@constructor
-	@memberOf Circle#
- */
-Circle.prototype.Tangent = function(){};
-
-// renaming Circle#Tangent to Circle#Circle#Tangent
-
-/**
-	@memberOf Circle#Tangent#
- */
-Circle.prototype.Tangent.prototype.getDiameter = function(){};
-
-
--- a/sbin/res/app/test/module.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-/** @namespace */
-myProject = myProject || {};
-
-/** @namespace */
-myProject.myModule = (function () {
-	/** describe myPrivateVar here */
-	var myPrivateVar = "";
-
-	var myPrivateMethod = function () {
-	}
-
-	/** @scope myProject.myModule */
-	return {
-		myPublicMethod: function () {
-		}
-	};
-})();
\ No newline at end of file
--- a/sbin/res/app/test/multi_methods.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-
-/**
-	Get the entire flavor.
-	@name flavor^3
-	@function
-	@returns {Object} The entire flavor hash.
-*/
-/**
-	Get a named flavor.
-	@name flavor^2
-	@function
-	@param {String} name The name of the flavor to get.
-	@returns {String} The value of that flavor.
-*/
-/**
-	Set the flavor.
-	@param {String} name The name of the flavor to set.
-	@param {String} value The value of the flavor.
-	@returns {String} The value of that flavor.
-*/
-function flavor(name, value) {
-	if (arguments.length > 1) flavor[name] = value;
-	else if (arguments.length == 1) return flavor[name];
-	else return flavor;
-}
\ No newline at end of file
--- a/sbin/res/app/test/name.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-/**
- @name Response
- @class
-*/
-
-Response.prototype = {
-	/**
-	 @name Response#text
-	 @function
-	 @description
-		Gets the body of the response as plain text
-	 @returns {String}
-		Response as text
-	*/
-
-	text: function() {
-		return this.nativeResponse.responseText;
-	}
-}
\ No newline at end of file
--- a/sbin/res/app/test/namespace_nested.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-/** 
-	@namespace This is the first namespace.
-*/
-ns1 = {};
-
-/** 
-	This is the second namespace.
-	@namespace
-*/
-ns1.ns2 = {};
-
-/**
-	This part of ns1.ns2
-	@constructor
-*/
-ns1.ns2.Function1 = function() {
-};
-
-ns1.staticFunction = function() {
-};
-
-/** A static field in a namespace. */
-ns1.ns2.staticField = 1;
--- a/sbin/res/app/test/nocode.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-/**#nocode+*/
-    /**
-      @name star
-      @function
-    */
-    function blahblah() {
-    
-    }
-/**#nocode-*/
-
-function yaddayadda() {
-
-}
\ No newline at end of file
--- a/sbin/res/app/test/oblit_anon.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-/** the options */
-opt = Opt.get(
-	arguments, 
-	{
-	 d: "directory",
-	 c: "conf",
-	 "D[]": "define"
-	}
-);
-
-/** configuration */
-opt.conf = {
-	/** keep */
-	keep: true,
-	/** base */
-	base: getBase(this, {p: properties})
-}
-
-
-
--- a/sbin/res/app/test/overview.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-/**
- * @overview This "library" contains a 
- *               lot of classes and functions.
- * @example
- <pre>
-	var x (x < 1);
-	alert("This 'is' \"code\"");
- </pre>
- * @name My Cool Library
- * @author 	Joe Smith jsmith@company.com
- * @version 	0.1 
- */
- 
-/** 
- * Gets the current foo 
- * @param {String} fooId	The unique identifier for the foo.
- * @return {Object}	Returns the current foo.
- */
-function getFoo(fooID){
-}
\ No newline at end of file
--- a/sbin/res/app/test/param_inline.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-/**
-	@constructor
-	@param columns The number of columns.
-*/
-function Layout(/**int*/columns){
-	/**
-		@param [id] The id of the element.
-		@param elName The name of the element.
-	*/
-	this.getElement = function(
-		/** string */ elName,
-		/** number|string */ id
-	) {
-	};
-	
-	/** 
-		@constructor
-	 */
-	this.Canvas = function(top, left, /**int*/width, height) {
-		/** Is it initiated yet? */
-		this.initiated = true;
-	}
-	
-	this.rotate = function(/**nothing*/) {
-	}
-	
-	/** 
-	@param x
-	@param y
-	@param {zoppler} z*/
-	this.init = function(x, y, /**abbler*/z) {
-		/** The xyz. */
-		this.xyz = x+y+z;
-		this.getXyz = function() {
-		}
-	}
-}
--- a/sbin/res/app/test/params_optional.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-
-/**
- * @param {Page[]} pages
- * @param {number} [id] Specifies the id, if applicable.
- * @param {String} [title = This is untitled.] Specifies the title.
- */
-function Document(pages, id, title){
-}
\ No newline at end of file
--- a/sbin/res/app/test/prototype.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-/** @constructor */
-function Article() {
-}
-
-Article.prototype.init = function(title) {
-	/** the instance title */
-	this.title = title;
-	
-	/** the static counter */
-	Article.counter = 1;
-}
-
-a = new Article();
-a.Init("my title");
-
-print(a.title);
-print(Article.counter);
\ No newline at end of file
--- a/sbin/res/app/test/prototype_nested.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-/** @constructor */
-function Word() {
-}
-
-Word.prototype.reverse = function() {
-}
-
-Word.prototype.reverse.utf8 = function() {
-}
\ No newline at end of file
--- a/sbin/res/app/test/prototype_oblit.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-/** @constructor */
-function Article() {
-}
-
-Article.prototype = {
-	/** instance get title */
-	getTitle: function(){
-	}
-}
-
-/** static get title */
-Article.getTitle = function(){
-}
\ No newline at end of file
--- a/sbin/res/app/test/prototype_oblit_constructor.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-/** @constructor */
-function Article() {
-}
-
-Article.prototype = {
-	/** @constructor */
-	Title: function(title) {
-		/** the value of the Title instance */
-		this.title = title;
-	},
-	
-	init: function(pages) {
-		/** the value of the pages of the Article instance */
-		this.pages = pages;
-	}
-}
-
-f = new Article();
-f.init("one two three");
-
-t = new f.Title("my title");
-
-print(f.pages);
-print(t.title);
\ No newline at end of file
--- a/sbin/res/app/test/public.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-/**@constructor*/
-function Foo() {
-	/**
-		@public
-		@static
-		@field
-	*/
-	var bar = function(x) {
-	}
-}
\ No newline at end of file
--- a/sbin/res/app/test/scripts/code.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-/**
-	@class
- */
-function thisiscode() {
-}
\ No newline at end of file
--- a/sbin/res/app/test/scripts/notcode.txt	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-(This is not code)
-function foo(){{{{
-(
-!
-@
\ No newline at end of file
--- a/sbin/res/app/test/shared.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-
-/**
- * Builtin object.
- * @class
- * @name Array
- */
- 
-/**#@+
- * Extension to builtin array.
- * @memberOf Array
- * @method
- */
- 
-/**
- * @returns Boolen if some array members...
- */
-Array.prototype.some = function(){};
-
-/**
- * Change every element of an array.
- * @returns Filtered array copy.
- */
-Array.prototype.filter = function(){};
-
-/**#@-*/
-
-
-/**
- * A first in, first out data structure.
- * @constructor
- */
-Queue = function(){};
-
-/**#@+
- * Extension to Queue.
- * @memberOf Queue
- */
-
-rewind = function(){
-}
-
-// should close automatically here.
\ No newline at end of file
--- a/sbin/res/app/test/shared2.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-startOver = function(){
-}
\ No newline at end of file
--- a/sbin/res/app/test/shortcuts.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-// /**#=+
-//  * {
-//  *	'D': 'Date.prototype',
-//  *	'$N': 'Number'
-//  * }
-//  */
-// var D = Date.prototype,
-// $N = Number;
-// 
-// D.locale = function(){
-// };
-// 
-// /**
-// 	@return {string} The cardinal number string.
-// */
-// $N.nth = function(n){
-// };
-// 
-// LOAD.file = function(){
-// }
-// 
-// /**#=-*/
\ No newline at end of file
--- a/sbin/res/app/test/static_this.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-/** the parent */
-var box = {};
-
-/** @namespace */
-box.holder = {}
-
-box.holder.foo = function() {
-	/** the counter */
-	this.counter = 1;
-}
-
-box.holder.foo();
-print(box.holder.counter);
--- a/sbin/res/app/test/synonyms.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/**
-	@class
-	@inherits Bar#zop as #my_zop
-*/
-function Foo() {
-	/** this is a zip. */
-	this.zip = function() {}
-	
-	/** from Bar */
-	this.my_zop = new Bar().zop;
-}
-
-/**
-	@class
-	@borrows Foo#zip as this.my_zip
-*/
-function Bar() {
-	/** this is a zop. */
-	this.zop = function() {}
-	
-	/** from Foo */
-	this.my_zip = new Foo().zip;
-}
-
-/** @namespace */
-var myObject = {
-	/**
-		@type function
-	*/
-	myFunc: getFunction()
-}
\ No newline at end of file
--- a/sbin/res/app/test/tosource.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-/**
- * @param {Object} object
- * @return {string}
- */
-function valueOf(object) {}
-
-/**
- * @param {Object} object
- * @return {string}
- */
-function toString(object) {}
-
-/**
- * @param {Object} object
- * @return {string}
- */
-function toSource(object) {}
-
-/**
- * @param {Object} object
- * @return {string}
- */
-function constructor(object) {}
\ No newline at end of file
--- a/sbin/res/app/test/variable_redefine.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-/** @constructor */
-function Foo() {
-	var bar = 1;
-	bar = 2; // redefining a private
-	
-	this.baz = 1;
-	baz = 2; // global
-	
-	/** a private */
-	var blap = {
-		/** in here */
-		tada: 1
-	}
-}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/LdtPlayer-release.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,3541 @@
+/* 
+ * 	
+ *	Copyright 2010 Institut de recherche et d'innovation 
+ *	contributor(s) : Samuel Huron 
+ *	 
+ *	contact@iri.centrepompidou.fr
+ *	http://www.iri.centrepompidou.fr 
+ *	 
+ *	This software is a computer program whose purpose is to show and add annotations on a video .
+ *	This software is governed by the CeCILL-C license under French law and
+ *	abiding by the rules of distribution of free software. You can  use, 
+ *	modify and/ or redistribute the software under the terms of the CeCILL-C
+ *	license as circulated by CEA, CNRS and INRIA at the following URL
+ *	"http://www.cecill.info". 
+ *	
+ *	The fact that you are presently reading this means that you have had
+ *	knowledge of the CeCILL-C license and that you accept its terms.
+*/
+/*! LAB.js (LABjs :: Loading And Blocking JavaScript)
+    v2.0.3 (c) Kyle Simpson
+    MIT License
+*/
+
+(function(global){
+	var _$LAB = global.$LAB,
+	
+		// constants for the valid keys of the options object
+		_UseLocalXHR = "UseLocalXHR",
+		_AlwaysPreserveOrder = "AlwaysPreserveOrder",
+		_AllowDuplicates = "AllowDuplicates",
+		_CacheBust = "CacheBust",
+		/*!START_DEBUG*/_Debug = "Debug",/*!END_DEBUG*/
+		_BasePath = "BasePath",
+		
+		// stateless variables used across all $LAB instances
+		root_page = /^[^?#]*\//.exec(location.href)[0],
+		root_domain = /^\w+\:\/\/\/?[^\/]+/.exec(root_page)[0],
+		append_to = document.head || document.getElementsByTagName("head"),
+		
+		// inferences... ick, but still necessary
+		opera_or_gecko = (global.opera && Object.prototype.toString.call(global.opera) == "[object Opera]") || ("MozAppearance" in document.documentElement.style),
+
+/*!START_DEBUG*/
+		// console.log() and console.error() wrappers
+		log_msg = function(){}, 
+		log_error = log_msg,
+/*!END_DEBUG*/
+		
+		// feature sniffs (yay!)
+		test_script_elem = document.createElement("script"),
+		explicit_preloading = typeof test_script_elem.preload == "boolean", // http://wiki.whatwg.org/wiki/Script_Execution_Control#Proposal_1_.28Nicholas_Zakas.29
+		real_preloading = explicit_preloading || (test_script_elem.readyState && test_script_elem.readyState == "uninitialized"), // will a script preload with `src` set before DOM append?
+		script_ordered_async = !real_preloading && test_script_elem.async === true, // http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order
+		
+		// XHR preloading (same-domain) and cache-preloading (remote-domain) are the fallbacks (for some browsers)
+		xhr_or_cache_preloading = !real_preloading && !script_ordered_async && !opera_or_gecko
+	;
+
+/*!START_DEBUG*/
+	// define console wrapper functions if applicable
+	if (global.console && global.console.log) {
+		if (!global.console.error) global.console.error = global.console.log;
+		log_msg = function(msg) { global.console.log(msg); };
+		log_error = function(msg,err) { global.console.error(msg,err); };
+	}
+/*!END_DEBUG*/
+
+	// test for function
+	function is_func(func) { return Object.prototype.toString.call(func) == "[object Function]"; }
+
+	// test for array
+	function is_array(arr) { return Object.prototype.toString.call(arr) == "[object Array]"; }
+
+	// make script URL absolute/canonical
+	function canonical_uri(src,base_path) {
+		var absolute_regex = /^\w+\:\/\//;
+		
+		// is `src` is protocol-relative (begins with // or ///), prepend protocol
+		if (/^\/\/\/?/.test(src)) {
+			src = location.protocol + src;
+		}
+		// is `src` page-relative? (not an absolute URL, and not a domain-relative path, beginning with /)
+		else if (!absolute_regex.test(src) && src.charAt(0) != "/") {
+			// prepend `base_path`, if any
+			src = (base_path || "") + src;
+		}
+		// make sure to return `src` as absolute
+		return absolute_regex.test(src) ? src : ((src.charAt(0) == "/" ? root_domain : root_page) + src);
+	}
+
+	// merge `source` into `target`
+	function merge_objs(source,target) {
+		for (var k in source) { if (source.hasOwnProperty(k)) {
+			target[k] = source[k]; // TODO: does this need to be recursive for our purposes?
+		}}
+		return target;
+	}
+
+	// does the chain group have any ready-to-execute scripts?
+	function check_chain_group_scripts_ready(chain_group) {
+		var any_scripts_ready = false;
+		for (var i=0; i<chain_group.scripts.length; i++) {
+			if (chain_group.scripts[i].ready && chain_group.scripts[i].exec_trigger) {
+				any_scripts_ready = true;
+				chain_group.scripts[i].exec_trigger();
+				chain_group.scripts[i].exec_trigger = null;
+			}
+		}
+		return any_scripts_ready;
+	}
+
+	// creates a script load listener
+	function create_script_load_listener(elem,registry_item,flag,onload) {
+		elem.onload = elem.onreadystatechange = function() {
+			if ((elem.readyState && elem.readyState != "complete" && elem.readyState != "loaded") || registry_item[flag]) return;
+			elem.onload = elem.onreadystatechange = null;
+			onload();
+		};
+	}
+
+	// script executed handler
+	function script_executed(registry_item) {
+		registry_item.ready = registry_item.finished = true;
+		for (var i=0; i<registry_item.finished_listeners.length; i++) {
+			registry_item.finished_listeners[i]();
+		}
+		registry_item.ready_listeners = [];
+		registry_item.finished_listeners = [];
+	}
+
+	// make the request for a scriptha
+	function request_script(chain_opts,script_obj,registry_item,onload,preload_this_script) {
+		// setTimeout() "yielding" prevents some weird race/crash conditions in older browsers
+		setTimeout(function(){
+			var script, src = script_obj.real_src, xhr;
+			
+			// don't proceed until `append_to` is ready to append to
+			if ("item" in append_to) { // check if `append_to` ref is still a live node list
+				if (!append_to[0]) { // `append_to` node not yet ready
+					// try again in a little bit -- note: will re-call the anonymous function in the outer setTimeout, not the parent `request_script()`
+					setTimeout(arguments.callee,25);
+					return;
+				}
+				// reassign from live node list ref to pure node ref -- avoids nasty IE bug where changes to DOM invalidate live node lists
+				append_to = append_to[0];
+			}
+			script = document.createElement("script");
+			if (script_obj.type) script.type = script_obj.type;
+			if (script_obj.charset) script.charset = script_obj.charset;
+			
+			// should preloading be used for this script?
+			if (preload_this_script) {
+				// real script preloading?
+				if (real_preloading) {
+					/*!START_DEBUG*/if (chain_opts[_Debug]) log_msg("start script preload: "+src);/*!END_DEBUG*/
+					registry_item.elem = script;
+					if (explicit_preloading) { // explicit preloading (aka, Zakas' proposal)
+						script.preload = true;
+						script.onpreload = onload;
+					}
+					else {
+						script.onreadystatechange = function(){
+							if (script.readyState == "loaded") onload();
+						};
+					}
+					script.src = src;
+					// NOTE: no append to DOM yet, appending will happen when ready to execute
+				}
+				// same-domain and XHR allowed? use XHR preloading
+				else if (preload_this_script && src.indexOf(root_domain) == 0 && chain_opts[_UseLocalXHR]) {
+					xhr = new XMLHttpRequest(); // note: IE never uses XHR (it supports true preloading), so no more need for ActiveXObject fallback for IE <= 7
+					/*!START_DEBUG*/if (chain_opts[_Debug]) log_msg("start script preload (xhr): "+src);/*!END_DEBUG*/
+					xhr.onreadystatechange = function() {
+						if (xhr.readyState == 4) {
+							xhr.onreadystatechange = function(){}; // fix a memory leak in IE
+							registry_item.text = xhr.responseText + "\n//@ sourceURL=" + src; // http://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/
+							onload();
+						}
+					};
+					xhr.open("GET",src);
+					xhr.send();
+				}
+				// as a last resort, use cache-preloading
+				else {
+					/*!START_DEBUG*/if (chain_opts[_Debug]) log_msg("start script preload (cache): "+src);/*!END_DEBUG*/
+					script.type = "text/cache-script";
+					create_script_load_listener(script,registry_item,"ready",function() {
+						append_to.removeChild(script);
+						onload();
+					});
+					script.src = src;
+					append_to.insertBefore(script,append_to.firstChild);
+				}
+			}
+			// use async=false for ordered async? parallel-load-serial-execute http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order
+			else if (script_ordered_async) {
+				/*!START_DEBUG*/if (chain_opts[_Debug]) log_msg("start script load (ordered async): "+src);/*!END_DEBUG*/
+				script.async = false;
+				create_script_load_listener(script,registry_item,"finished",onload);
+				script.src = src;
+				append_to.insertBefore(script,append_to.firstChild);
+			}
+			// otherwise, just a normal script element
+			else {
+				/*!START_DEBUG*/if (chain_opts[_Debug]) log_msg("start script load: "+src);/*!END_DEBUG*/
+				create_script_load_listener(script,registry_item,"finished",onload);
+				script.src = src;
+				append_to.insertBefore(script,append_to.firstChild);
+			}
+		},0);
+	}
+		
+	// create a clean instance of $LAB
+	function create_sandbox() {
+		var global_defaults = {},
+			can_use_preloading = real_preloading || xhr_or_cache_preloading,
+			queue = [],
+			registry = {},
+			instanceAPI
+		;
+		
+		// global defaults
+		global_defaults[_UseLocalXHR] = true;
+		global_defaults[_AlwaysPreserveOrder] = false;
+		global_defaults[_AllowDuplicates] = false;
+		global_defaults[_CacheBust] = false;
+		/*!START_DEBUG*/global_defaults[_Debug] = false;/*!END_DEBUG*/
+		global_defaults[_BasePath] = "";
+
+		// execute a script that has been preloaded already
+		function execute_preloaded_script(chain_opts,script_obj,registry_item) {
+			var script;
+			
+			function preload_execute_finished() {
+				if (script != null) { // make sure this only ever fires once
+					script = null;
+					script_executed(registry_item);
+				}
+			}
+			
+			if (registry[script_obj.src].finished) return;
+			if (!chain_opts[_AllowDuplicates]) registry[script_obj.src].finished = true;
+			
+			script = registry_item.elem || document.createElement("script");
+			if (script_obj.type) script.type = script_obj.type;
+			if (script_obj.charset) script.charset = script_obj.charset;
+			create_script_load_listener(script,registry_item,"finished",preload_execute_finished);
+			
+			// script elem was real-preloaded
+			if (registry_item.elem) {
+				registry_item.elem = null;
+			}
+			// script was XHR preloaded
+			else if (registry_item.text) {
+				script.onload = script.onreadystatechange = null;	// script injection doesn't fire these events
+				script.text = registry_item.text;
+			}
+			// script was cache-preloaded
+			else {
+				script.src = script_obj.real_src;
+			}
+			append_to.insertBefore(script,append_to.firstChild);
+
+			// manually fire execution callback for injected scripts, since events don't fire
+			if (registry_item.text) {
+				preload_execute_finished();
+			}
+		}
+	
+		// process the script request setup
+		function do_script(chain_opts,script_obj,chain_group,preload_this_script) {
+			var registry_item,
+				registry_items,
+				ready_cb = function(){ script_obj.ready_cb(script_obj,function(){ execute_preloaded_script(chain_opts,script_obj,registry_item); }); },
+				finished_cb = function(){ script_obj.finished_cb(script_obj,chain_group); }
+			;
+			
+			script_obj.src = canonical_uri(script_obj.src,chain_opts[_BasePath]);
+			script_obj.real_src = script_obj.src + 
+				// append cache-bust param to URL?
+				(chain_opts[_CacheBust] ? ((/\?.*$/.test(script_obj.src) ? "&_" : "?_") + ~~(Math.random()*1E9) + "=") : "")
+			;
+			
+			if (!registry[script_obj.src]) registry[script_obj.src] = {items:[],finished:false};
+			registry_items = registry[script_obj.src].items;
+
+			// allowing duplicates, or is this the first recorded load of this script?
+			if (chain_opts[_AllowDuplicates] || registry_items.length == 0) {
+				registry_item = registry_items[registry_items.length] = {
+					ready:false,
+					finished:false,
+					ready_listeners:[ready_cb],
+					finished_listeners:[finished_cb]
+				};
+
+				request_script(chain_opts,script_obj,registry_item,
+					// which callback type to pass?
+					(
+					 	(preload_this_script) ? // depends on script-preloading
+						function(){
+							registry_item.ready = true;
+							for (var i=0; i<registry_item.ready_listeners.length; i++) {
+								registry_item.ready_listeners[i]();
+							}
+							registry_item.ready_listeners = [];
+						} :
+						function(){ script_executed(registry_item); }
+					),
+					// signal if script-preloading should be used or not
+					preload_this_script
+				);
+			}
+			else {
+				registry_item = registry_items[0];
+				if (registry_item.finished) {
+					finished_cb();
+				}
+				else {
+					registry_item.finished_listeners.push(finished_cb);
+				}
+			}
+		}
+
+		// creates a closure for each separate chain spawned from this $LAB instance, to keep state cleanly separated between chains
+		function create_chain() {
+			var chainedAPI,
+				chain_opts = merge_objs(global_defaults,{}),
+				chain = [],
+				exec_cursor = 0,
+				scripts_currently_loading = false,
+				group
+			;
+			
+			// called when a script has finished preloading
+			function chain_script_ready(script_obj,exec_trigger) {
+				/*!START_DEBUG*/if (chain_opts[_Debug]) log_msg("script preload finished: "+script_obj.real_src);/*!END_DEBUG*/
+				script_obj.ready = true;
+				script_obj.exec_trigger = exec_trigger;
+				advance_exec_cursor(); // will only check for 'ready' scripts to be executed
+			}
+
+			// called when a script has finished executing
+			function chain_script_executed(script_obj,chain_group) {
+				/*!START_DEBUG*/if (chain_opts[_Debug]) log_msg("script execution finished: "+script_obj.real_src);/*!END_DEBUG*/
+				script_obj.ready = script_obj.finished = true;
+				script_obj.exec_trigger = null;
+				// check if chain group is all finished
+				for (var i=0; i<chain_group.scripts.length; i++) {
+					if (!chain_group.scripts[i].finished) return;
+				}
+				// chain_group is all finished if we get this far
+				chain_group.finished = true;
+				advance_exec_cursor();
+			}
+
+			// main driver for executing each part of the chain
+			function advance_exec_cursor() {
+				while (exec_cursor < chain.length) {
+					if (is_func(chain[exec_cursor])) {
+						/*!START_DEBUG*/if (chain_opts[_Debug]) log_msg("$LAB.wait() executing: "+chain[exec_cursor]);/*!END_DEBUG*/
+						try { chain[exec_cursor++](); } catch (err) {
+							/*!START_DEBUG*/if (chain_opts[_Debug]) log_error("$LAB.wait() error caught: ",err);/*!END_DEBUG*/
+						}
+						continue;
+					}
+					else if (!chain[exec_cursor].finished) {
+						if (check_chain_group_scripts_ready(chain[exec_cursor])) continue;
+						break;
+					}
+					exec_cursor++;
+				}
+				// we've reached the end of the chain (so far)
+				if (exec_cursor == chain.length) {
+					scripts_currently_loading = false;
+					group = false;
+				}
+			}
+			
+			// setup next chain script group
+			function init_script_chain_group() {
+				if (!group || !group.scripts) {
+					chain.push(group = {scripts:[],finished:true});
+				}
+			}
+
+			// API for $LAB chains
+			chainedAPI = {
+				// start loading one or more scripts
+				script:function(){
+					for (var i=0; i<arguments.length; i++) {
+						(function(script_obj,script_list){
+							var splice_args;
+							
+							if (!is_array(script_obj)) {
+								script_list = [script_obj];
+							}
+							for (var j=0; j<script_list.length; j++) {
+								init_script_chain_group();
+								script_obj = script_list[j];
+								
+								if (is_func(script_obj)) script_obj = script_obj();
+								if (!script_obj) continue;
+								if (is_array(script_obj)) {
+									// set up an array of arguments to pass to splice()
+									splice_args = [].slice.call(script_obj); // first include the actual array elements we want to splice in
+									splice_args.unshift(j,1); // next, put the `index` and `howMany` parameters onto the beginning of the splice-arguments array
+									[].splice.apply(script_list,splice_args); // use the splice-arguments array as arguments for splice()
+									j--; // adjust `j` to account for the loop's subsequent `j++`, so that the next loop iteration uses the same `j` index value
+									continue;
+								}
+								if (typeof script_obj == "string") script_obj = {src:script_obj};
+								script_obj = merge_objs(script_obj,{
+									ready:false,
+									ready_cb:chain_script_ready,
+									finished:false,
+									finished_cb:chain_script_executed
+								});
+								group.finished = false;
+								group.scripts.push(script_obj);
+								
+								do_script(chain_opts,script_obj,group,(can_use_preloading && scripts_currently_loading));
+								scripts_currently_loading = true;
+								
+								if (chain_opts[_AlwaysPreserveOrder]) chainedAPI.wait();
+							}
+						})(arguments[i],arguments[i]);
+					}
+					return chainedAPI;
+				},
+				// force LABjs to pause in execution at this point in the chain, until the execution thus far finishes, before proceeding
+				wait:function(){
+					if (arguments.length > 0) {
+						for (var i=0; i<arguments.length; i++) {
+							chain.push(arguments[i]);
+						}
+						group = chain[chain.length-1];
+					}
+					else group = false;
+					
+					advance_exec_cursor();
+					
+					return chainedAPI;
+				}
+			};
+
+			// the first chain link API (includes `setOptions` only this first time)
+			return {
+				script:chainedAPI.script, 
+				wait:chainedAPI.wait, 
+				setOptions:function(opts){
+					merge_objs(opts,chain_opts);
+					return chainedAPI;
+				}
+			};
+		}
+
+		// API for each initial $LAB instance (before chaining starts)
+		instanceAPI = {
+			// main API functions
+			setGlobalDefaults:function(opts){
+				merge_objs(opts,global_defaults);
+				return instanceAPI;
+			},
+			setOptions:function(){
+				return create_chain().setOptions.apply(null,arguments);
+			},
+			script:function(){
+				return create_chain().script.apply(null,arguments);
+			},
+			wait:function(){
+				return create_chain().wait.apply(null,arguments);
+			},
+
+			// built-in queuing for $LAB `script()` and `wait()` calls
+			// useful for building up a chain programmatically across various script locations, and simulating
+			// execution of the chain
+			queueScript:function(){
+				queue[queue.length] = {type:"script", args:[].slice.call(arguments)};
+				return instanceAPI;
+			},
+			queueWait:function(){
+				queue[queue.length] = {type:"wait", args:[].slice.call(arguments)};
+				return instanceAPI;
+			},
+			runQueue:function(){
+				var $L = instanceAPI, len=queue.length, i=len, val;
+				for (;--i>=0;) {
+					val = queue.shift();
+					$L = $L[val.type].apply(null,val.args);
+				}
+				return $L;
+			},
+
+			// rollback `[global].$LAB` to what it was before this file was loaded, the return this current instance of $LAB
+			noConflict:function(){
+				global.$LAB = _$LAB;
+				return instanceAPI;
+			},
+
+			// create another clean instance of $LAB
+			sandbox:function(){
+				return create_sandbox();
+			}
+		};
+
+		return instanceAPI;
+	}
+
+	// create the main instance of $LAB
+	global.$LAB = create_sandbox();
+
+
+	/* The following "hack" was suggested by Andrea Giammarchi and adapted from: http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html
+	   NOTE: this hack only operates in FF and then only in versions where document.readyState is not present (FF < 3.6?).
+	   
+	   The hack essentially "patches" the **page** that LABjs is loaded onto so that it has a proper conforming document.readyState, so that if a script which does 
+	   proper and safe dom-ready detection is loaded onto a page, after dom-ready has passed, it will still be able to detect this state, by inspecting the now hacked 
+	   document.readyState property. The loaded script in question can then immediately trigger any queued code executions that were waiting for the DOM to be ready. 
+	   For instance, jQuery 1.4+ has been patched to take advantage of document.readyState, which is enabled by this hack. But 1.3.2 and before are **not** safe or 
+	   fixed by this hack, and should therefore **not** be lazy-loaded by script loader tools such as LABjs.
+	*/ 
+	(function(addEvent,domLoaded,handler){
+		if (document.readyState == null && document[addEvent]){
+			document.readyState = "loading";
+			document[addEvent](domLoaded,handler = function(){
+				document.removeEventListener(domLoaded,handler,false);
+				document.readyState = "complete";
+			},false);
+		}
+	})("addEventListener","DOMContentLoaded");
+
+})(this);/*
+  mustache.js — Logic-less templates in JavaScript
+
+  See http://mustache.github.com/ for more info.
+*/
+
+var Mustache = function() {
+  var Renderer = function() {};
+
+  Renderer.prototype = {
+    otag: "{{",
+    ctag: "}}",
+    pragmas: {},
+    buffer: [],
+    pragmas_implemented: {
+      "IMPLICIT-ITERATOR": true
+    },
+    context: {},
+
+    render: function(template, context, partials, in_recursion) {
+      // reset buffer & set context
+      if(!in_recursion) {
+        this.context = context;
+        this.buffer = []; // TODO: make this non-lazy
+      }
+
+      // fail fast
+      if(!this.includes("", template)) {
+        if(in_recursion) {
+          return template;
+        } else {
+          this.send(template);
+          return;
+        }
+      }
+
+      template = this.render_pragmas(template);
+      var html = this.render_section(template, context, partials);
+      if(in_recursion) {
+        return this.render_tags(html, context, partials, in_recursion);
+      }
+
+      this.render_tags(html, context, partials, in_recursion);
+    },
+
+    /*
+      Sends parsed lines
+    */
+    send: function(line) {
+      if(line !== "") {
+        this.buffer.push(line);
+      }
+    },
+
+    /*
+      Looks for %PRAGMAS
+    */
+    render_pragmas: function(template) {
+      // no pragmas
+      if(!this.includes("%", template)) {
+        return template;
+      }
+
+      var that = this;
+      var regex = new RegExp(this.otag + "%([\\w-]+) ?([\\w]+=[\\w]+)?" +
+            this.ctag, "g");
+      return template.replace(regex, function(match, pragma, options) {
+        if(!that.pragmas_implemented[pragma]) {
+          throw({message: 
+            "This implementation of mustache doesn't understand the '" +
+            pragma + "' pragma"});
+        }
+        that.pragmas[pragma] = {};
+        if(options) {
+          var opts = options.split("=");
+          that.pragmas[pragma][opts[0]] = opts[1];
+        }
+        return "";
+        // ignore unknown pragmas silently
+      });
+    },
+
+    /*
+      Tries to find a partial in the curent scope and render it
+    */
+    render_partial: function(name, context, partials) {
+      name = this.trim(name);
+      if(!partials || partials[name] === undefined) {
+        throw({message: "unknown_partial '" + name + "'"});
+      }
+      if(typeof(context[name]) != "object") {
+        return this.render(partials[name], context, partials, true);
+      }
+      return this.render(partials[name], context[name], partials, true);
+    },
+
+    /*
+      Renders inverted (^) and normal (#) sections
+    */
+    render_section: function(template, context, partials) {
+      if(!this.includes("#", template) && !this.includes("^", template)) {
+        return template;
+      }
+
+      var that = this;
+      // CSW - Added "+?" so it finds the tighest bound, not the widest
+      var regex = new RegExp(this.otag + "(\\^|\\#)\\s*(.+)\\s*" + this.ctag +
+              "\n*([\\s\\S]+?)" + this.otag + "\\/\\s*\\2\\s*" + this.ctag +
+              "\\s*", "mg");
+
+      // for each {{#foo}}{{/foo}} section do...
+      return template.replace(regex, function(match, type, name, content) {
+        var value = that.find(name, context);
+        if(type == "^") { // inverted section
+          if(!value || that.is_array(value) && value.length === 0) {
+            // false or empty list, render it
+            return that.render(content, context, partials, true);
+          } else {
+            return "";
+          }
+        } else if(type == "#") { // normal section
+          if(that.is_array(value)) { // Enumerable, Let's loop!
+            return that.map(value, function(row) {
+              return that.render(content, that.create_context(row),
+                partials, true);
+            }).join("");
+          } else if(that.is_object(value)) { // Object, Use it as subcontext!
+            return that.render(content, that.create_context(value),
+              partials, true);
+          } else if(typeof value === "function") {
+            // higher order section
+            return value.call(context, content, function(text) {
+              return that.render(text, context, partials, true);
+            });
+          } else if(value) { // boolean section
+            return that.render(content, context, partials, true);
+          } else {
+            return "";
+          }
+        }
+      });
+    },
+
+    /*
+      Replace {{foo}} and friends with values from our view
+    */
+    render_tags: function(template, context, partials, in_recursion) {
+      // tit for tat
+      var that = this;
+
+      var new_regex = function() {
+        return new RegExp(that.otag + "(=|!|>|\\{|%)?([^\\/#\\^]+?)\\1?" +
+          that.ctag + "+", "g");
+      };
+
+      var regex = new_regex();
+      var tag_replace_callback = function(match, operator, name) {
+        switch(operator) {
+        case "!": // ignore comments
+          return "";
+        case "=": // set new delimiters, rebuild the replace regexp
+          that.set_delimiters(name);
+          regex = new_regex();
+          return "";
+        case ">": // render partial
+          return that.render_partial(name, context, partials);
+        case "{": // the triple mustache is unescaped
+          return that.find(name, context);
+        default: // escape the value
+          return that.escape(that.find(name, context));
+        }
+      };
+      var lines = template.split("\n");
+      for(var i = 0; i < lines.length; i++) {
+        lines[i] = lines[i].replace(regex, tag_replace_callback, this);
+        if(!in_recursion) {
+          this.send(lines[i]);
+        }
+      }
+
+      if(in_recursion) {
+        return lines.join("\n");
+      }
+    },
+
+    set_delimiters: function(delimiters) {
+      var dels = delimiters.split(" ");
+      this.otag = this.escape_regex(dels[0]);
+      this.ctag = this.escape_regex(dels[1]);
+    },
+
+    escape_regex: function(text) {
+      // thank you Simon Willison
+      if(!arguments.callee.sRE) {
+        var specials = [
+          '/', '.', '*', '+', '?', '|',
+          '(', ')', '[', ']', '{', '}', '\\'
+        ];
+        arguments.callee.sRE = new RegExp(
+          '(\\' + specials.join('|\\') + ')', 'g'
+        );
+      }
+      return text.replace(arguments.callee.sRE, '\\$1');
+    },
+
+    /*
+      find `name` in current `context`. That is find me a value
+      from the view object
+    */
+    find: function(name, context) {
+      name = this.trim(name);
+
+      // Checks whether a value is thruthy or false or 0
+      function is_kinda_truthy(bool) {
+        return bool === false || bool === 0 || bool;
+      }
+
+      var value;
+      if(is_kinda_truthy(context[name])) {
+        value = context[name];
+      } else if(is_kinda_truthy(this.context[name])) {
+        value = this.context[name];
+      }
+
+      if(typeof value === "function") {
+        return value.apply(context);
+      }
+      if(value !== undefined) {
+        return value;
+      }
+      // silently ignore unkown variables
+      return "";
+    },
+
+    // Utility methods
+
+    /* includes tag */
+    includes: function(needle, haystack) {
+      return haystack.indexOf(this.otag + needle) != -1;
+    },
+
+    /*
+      Does away with nasty characters
+    */
+    escape: function(s) {
+      s = String(s === null ? "" : s);
+      return s.replace(/&(?!\w+;)|["'<>\\]/g, function(s) {
+        switch(s) {
+        case "&": return "&amp;";
+        case "\\": return "\\\\";
+        case '"': return '&quot;';
+        case "'": return '&#39;';
+        case "<": return "&lt;";
+        case ">": return "&gt;";
+        default: return s;
+        }
+      });
+    },
+
+    // by @langalex, support for arrays of strings
+    create_context: function(_context) {
+      if(this.is_object(_context)) {
+        return _context;
+      } else {
+        var iterator = ".";
+        if(this.pragmas["IMPLICIT-ITERATOR"]) {
+          iterator = this.pragmas["IMPLICIT-ITERATOR"].iterator;
+        }
+        var ctx = {};
+        ctx[iterator] = _context;
+        return ctx;
+      }
+    },
+
+    is_object: function(a) {
+      return a && typeof a == "object";
+    },
+
+    is_array: function(a) {
+      return Object.prototype.toString.call(a) === '[object Array]';
+    },
+
+    /*
+      Gets rid of leading and trailing whitespace
+    */
+    trim: function(s) {
+      return s.replace(/^\s*|\s*$/g, "");
+    },
+
+    /*
+      Why, why, why? Because IE. Cry, cry cry.
+    */
+    map: function(array, fn) {
+      if (typeof array.map == "function") {
+        return array.map(fn);
+      } else {
+        var r = [];
+        var l = array.length;
+        for(var i = 0; i < l; i++) {
+          r.push(fn(array[i]));
+        }
+        return r;
+      }
+    }
+  };
+
+  return({
+    name: "mustache.js",
+    version: "0.3.1-dev",
+
+    /*
+      Turns a template and view into HTML
+    */
+    to_html: function(template, view, partials, send_fun) {
+      var renderer = new Renderer();
+      if(send_fun) {
+        renderer.send = send_fun;
+      }
+      renderer.render(template, view, partials);
+      if(!send_fun) {
+        return renderer.buffer.join("\n");
+      }
+    }
+  });
+}();
+// Underscore.js 1.2.3
+// (c) 2009-2011 Jeremy Ashkenas, DocumentCloud Inc.
+// Underscore is freely distributable under the MIT license.
+// Portions of Underscore are inspired or borrowed from Prototype,
+// Oliver Steele's Functional, and John Resig's Micro-Templating.
+// For all details and documentation:
+// http://documentcloud.github.com/underscore
+(function(){function r(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source==
+c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&r(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(m.call(a,h)&&(f++,!(g=m.call(c,h)&&r(a[h],c[h],d))))break;if(g){for(h in c)if(m.call(c,
+h)&&!f--)break;g=!f}}d.pop();return g}var s=this,F=s._,o={},k=Array.prototype,p=Object.prototype,i=k.slice,G=k.concat,H=k.unshift,l=p.toString,m=p.hasOwnProperty,v=k.forEach,w=k.map,x=k.reduce,y=k.reduceRight,z=k.filter,A=k.every,B=k.some,q=k.indexOf,C=k.lastIndexOf,p=Array.isArray,I=Object.keys,t=Function.prototype.bind,b=function(a){return new n(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else typeof define==="function"&&
+define.amd?define("underscore",function(){return b}):s._=b;b.VERSION="1.2.3";var j=b.each=b.forEach=function(a,c,b){if(a!=null)if(v&&a.forEach===v)a.forEach(c,b);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(b,a[e],e,a)===o)break}else for(e in a)if(m.call(a,e)&&c.call(b,a[e],e,a)===o)break};b.map=function(a,c,b){var e=[];if(a==null)return e;if(w&&a.map===w)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});return e};b.reduce=b.foldl=b.inject=function(a,
+c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(x&&a.reduce===x)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(y&&a.reduceRight===y)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,
+c,d,e):b.reduce(g,c)};b.find=b.detect=function(a,c,b){var e;D(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(z&&a.filter===z)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(A&&a.every===A)return a.every(c,
+b);j(a,function(a,g,h){if(!(e=e&&c.call(b,a,g,h)))return o});return e};var D=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(B&&a.some===B)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return o});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return q&&a.indexOf===q?a.indexOf(c)!=-1:b=D(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(c.call?c||a:a[c]).apply(a,
+d)})};b.pluck=function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&(e={value:a,
+computed:b})});return e.value};b.shuffle=function(a){var c=[],b;j(a,function(a,f){f==0?c[0]=a:(b=Math.floor(Math.random()*(f+1)),c[f]=c[b],c[b]=a)});return c};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,g){return{value:a,criteria:c.call(d,a,b,g)}}).sort(function(a,c){var b=a.criteria,d=c.criteria;return b<d?-1:b>d?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=
+function(a,c,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:a.toArray?a.toArray():b.isArray(a)?i.call(a):b.isArguments(a)?i.call(a):b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length-
+1]};b.rest=b.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,e=[];b.reduce(d,function(d,g,h){if(0==h||(c===true?b.last(d)!=g:!b.include(d,g)))d[d.length]=g,e[e.length]=a[h];return d},
+[]);return e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=function(a,
+c,d){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(q&&a.indexOf===q)return a.indexOf(c);for(d=0,e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(C&&a.lastIndexOf===C)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d;return g};
+var E=function(){};b.bind=function(a,c){var d,e;if(a.bind===t&&t)return t.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));E.prototype=a.prototype;var b=new E,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a,
+c){var d={};c||(c=b.identity);return function(){var b=c.apply(this,arguments);return m.call(d,b)?d[b]:d[b]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i=b.debounce(function(){h=g=false},c);return function(){d=this;e=arguments;var b;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);i()},c));g?h=true:
+a.apply(d,e);i();g=true}};b.debounce=function(a,b){var d;return function(){var e=this,f=arguments;clearTimeout(d);d=setTimeout(function(){d=null;a.apply(e,f)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=G.apply([a],arguments);return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};b.after=
+function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=I||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var b=[],d;for(d in a)m.call(a,d)&&(b[b.length]=d);return b};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)b[d]!==void 0&&(a[d]=b[d])});return a};b.defaults=function(a){j(i.call(arguments,
+1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return r(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(m.call(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=p||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===
+Object(a)};b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!m.call(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)==
+"[object Date]"};b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.noConflict=function(){s._=F;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(""+a).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};b.mixin=function(a){j(b.functions(a),function(c){J(c,
+b[c]=a[c])})};var K=0;b.uniqueId=function(a){var b=K++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape,function(a,b){return"',_.escape("+b.replace(/\\'/g,"'")+"),'"}).replace(d.interpolate,function(a,b){return"',"+b.replace(/\\'/g,
+"'")+",'"}).replace(d.evaluate||null,function(a,b){return"');"+b.replace(/\\'/g,"'").replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};var n=function(a){this._wrapped=a};b.prototype=n.prototype;var u=function(a,c){return c?b(a).chain():a},J=function(a,c){n.prototype[a]=function(){var a=i.call(arguments);H.call(a,this._wrapped);return u(c.apply(b,
+a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];n.prototype[a]=function(){b.apply(this._wrapped,arguments);return u(this._wrapped,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];n.prototype[a]=function(){return u(b.apply(this._wrapped,arguments),this._chain)}});n.prototype.chain=function(){this._chain=true;return this};n.prototype.value=function(){return this._wrapped}}).call(this);
+/* main file */
+
+if ( window.IriSP === undefined && window.__IriSP === undefined ) { 
+	var IriSP = {}; 
+	var __IriSP = IriSP; /* for backward compatibility */
+}
+
+IriSP.loadLibs = function( libs, config, metadata_url, callback ) {
+    // Localize jQuery variable
+		IriSP.jQuery = null;
+    var $L = $LAB.script(libs.jQuery).script(libs.swfObject)
+                .script(libs.jQueryUI)
+                                   
+    if (config.player.type === "jwplayer") {
+      // load our popcorn.js lookalike
+      $L = $L.script(libs.jwplayer);
+    } else {
+      // load the real popcorn
+      $L = $L.script(libs.popcorn).script(libs["popcorn.code"]);
+      if (config.player.type === "youtube") {
+        $L = $L.script(libs["popcorn.youtube"]);
+      } 
+      if (config.player.type === "vimeo")
+        $L = $L.script(libs["popcorn.vimeo"]);
+      
+      /* do nothing for html5 */
+    }       
+    
+    /* widget specific requirements */
+    for (var idx in config.gui.widgets) {
+      if (config.gui.widgets[idx].type === "PolemicWidget") {        
+        $L.script(libs.raphael);
+      }
+    }
+    
+    // same for modules
+    /*
+    for (var idx in config.modules) {
+      if (config.modules[idx].type === "PolemicWidget")
+        $L.script(libs.raphaelJs);
+    }
+    */
+
+    $L.wait(function() {
+      IriSP.jQuery = window.jQuery.noConflict( true );
+      IriSP._ = window._.noConflict();
+      IriSP.underscore = IriSP._;
+      
+      var css_link_jquery = IriSP.jQuery( "<link>", { 
+        rel: "stylesheet", 
+        type: "text/css", 
+        href: libs.cssjQueryUI,
+        'class': "dynamic_css"
+      } );
+      var css_link_custom = IriSP.jQuery( "<link>", { 
+        rel: "stylesheet", 
+        type: "text/css", 
+        href: config.gui.css,
+        'class': "dynamic_css"
+      } );
+      
+      css_link_jquery.appendTo('head');
+      css_link_custom.appendTo('head');
+          
+      IriSP.setupDataLoader();
+      IriSP.__dataloader.get(metadata_url, 
+          function(data) {
+            /* save the data so that we could re-use it to
+               configure the video
+            */
+            IriSP.__jsonMetadata = data;
+            callback.call(window) });
+    });
+};
+IriSP.annotation_template = "{{! template for an annotation displayed in a segmentWidget }}<div title='{{divTitle}}' id='{{id}}'	class='Ldt-iri-chapter' 	style='left: {{startPixel}}px;          width: {{pxWidth}}px;          background-color:#{{hexa_color}};' 	></div>";
+IriSP.annotationWidget_template = "{{! template for the annotation widget }}<div class='Ldt-AnnotationsWidget'>  <!-- ugly div because we want to have a double border -->  <div class='Ldt-Annotation-DoubleBorder'>      <div class='Ldt-AnnotationContent'>        <div class='Ldt-AnnotationShareIcons'>         <a class='Ldt-fbShare' href=''><img src='{{img_dir}}/facebook.png' alt='share on facebook'></img></a>         <a class='Ldt-TwShare' href=''><img src='{{img_dir}}/twitter.png' alt='share on twitter'></img></a>         <a class='Ldt-GplusShare' href=''><img src='{{img_dir}}/google.png' alt='share on google+'></img></a>      </div>		  <div class='Ldt-SaTitle'></div>	  	<div class='Ldt-SaDescription'></div>    </div>  </div></div>";
+IriSP.annotation_loading_template = "{{! template shown while the annotation widget is loading }}<div id='Ldt-load-container'><div id='Ldt-loader'>&nbsp;</div> Chargement... </div>";
+IriSP.arrowWidget_template = "<div class='Ldt-arrowWidget'></div>";
+IriSP.overlay_marker_template = "{{! the template for the small bars which is z-indexed over our segment widget }}<div class='Ldt-SegmentPositionMarker' style='background-color: #F7268E;'></div>";
+IriSP.player_template = "{{! template for the radio player }}<div class='Ldt-controler demo'>	<div class='Ldt-LeftPlayerControls'>    <div class='Ldt-button Ldt-CtrlPlay'></div>		<div class='Ldt-button Ldt-CtrlAnnotate'></div>    <div class='Ldt-button Ldt-CtrlSearch'></div>	</div>		<div class='Ldt-RightPlayerControls'>    <div class='Ldt-Time'>      <div class='Ldt-ElapsedTime'></div>      <div class='Ldt-TimeSeparator'>/</div>      <div class='Ldt-TotalTime'></div>    </div>		<div class='Ldt-button Ldt-CtrlSound'></div>	</div></div>";
+IriSP.search_template = "{{! template for the search container }}<div class='LdtSearchContainer'	style='margin-left: {{margin_left}}; position: absolute; margin-top: -60px;'>	<div class='LdtSearch'		style='display: none; background-color: #EEE; width: 165px; boder: 1px; border-color: #CFCFCF; position: absolute; text-align: center;'>		<input class='LdtSearchInput'			style='margin-top: 2px; margin-bottom: 2px;' />	</div></div><div class='cleaner'></div>";
+IriSP.share_template = "{{! social network sharing template }}<a onclick='__IriSP.MyApiPlayer.share(\'delicious\');' title='partager avec delicious'><span class='share shareDelicious'>&nbsp;</span></a>		<a onclick='__IriSP.MyApiPlayer.share(\'facebook\');' title='partager avec facebook'> <span class='share shareFacebook'>&nbsp;</span></a><a onclick='__IriSP.MyApiPlayer.share(\'twitter\');' title='partager avec twitter'>  <span class='share shareTwitter'>&nbsp;</span></a><a onclick='__IriSP.MyApiPlayer.share(\'myspace\');' title='partager avec Myspace'>  <span class='share shareMySpace'>&nbsp;</span></a>";
+IriSP.sliderWidget_template = "{{! template for the slider widget - it's composed of two divs we one overlayed on top    of the other }}<div class='Ldt-sliderBackground'></div><div class='Ldt-sliderForeground'></div><div class='Ldt-sliderPositionMarker'></div>";
+IriSP.tooltip_template = "{{! template used by the jquery ui tooltip }}<div class='Ldt-tooltip'>  <div class='title'>{{title}}</div>  <div class='time'>{{begin}} : {{end}} </div>  <div class='description'>{{description}}</div></div>";
+IriSP.tooltipWidget_template = "{{! template for the tooltip widget }}<div class='tip'>	<div class='tipcolor' style='height:10px;width:10px'></div>	<div class='tiptext'></div>";
+IriSP.tweetWidget_template = "{{! template for the tweet widget }}<div class='Ldt-tweetWidget'>  <div class='Ldt-tweet-DoubleBorder'>      <img src='{{img_dir}}/minimize.png' class='Ldt-tweetWidgetKeepOpen' alt='dont minimize automatically'></img>      <img src='{{img_dir}}/minimize.png' class='Ldt-tweetWidgetMinimize' alt='minimize window'></img>      <div class='Ldt-tweetAvatar'></div>      <img src='{{img_dir}}/profile_arrow.png' class='Ldt-tweetAvatar-profileArrow'></img>      <div class='Ldt-tweetContents'></div>      <a href='' target='_blank' class='Ldt-Retweet'><div class='Ldt-RetweetIcon'></div> - Retweet </a>      <a href='' target='_blank' class='Ldt-TweetReply'><div class='Ldt-TweetReplyIcon'></div> - Reply</a>  </div></div>";/* wrapper that simulates popcorn.js because
+   popcorn is a bit unstable at the time */
+
+IriSP.PopcornReplacement = {
+  msgPump : {} /* used by jquery to receive and send messages */
+};
+
+IriSP.PopcornReplacement.media = { 
+  "paused": true,
+  "muted": false
+};
+
+IriSP.PopcornReplacement.listen = function(msg, callback) {
+//  IriSP.jQuery(IriSP.PopcornReplacement.msgPump).bind(msg, function(event, rest) { callback(rest); });
+  if (!IriSP.PopcornReplacement.msgPump.hasOwnProperty(msg))
+    IriSP.PopcornReplacement.msgPump[msg] = [];
+
+  IriSP.PopcornReplacement.msgPump[msg].push(callback);
+};
+
+IriSP.PopcornReplacement.trigger = function(msg, params) {
+//  IriSP.jQuery(IriSP.PopcornReplacement.msgPump).trigger(msg, params);
+  
+  if (!IriSP.PopcornReplacement.msgPump.hasOwnProperty(msg))
+    return;
+
+  var d = IriSP.PopcornReplacement.msgPump[msg];
+  for(var entry in d) {
+    d[entry].call(window, params);
+  }
+
+};
+
+IriSP.PopcornReplacement.guid = function(prefix) {
+  var str = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
+      var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
+      return v.toString(16);
+   });
+
+  return prefix + str;
+};
+
+IriSP.PopcornReplacement.__initApi = function() {
+  IriSP.PopcornReplacement.trigger("loadedmetadata"); // we've done more than loading metadata of course,
+                                                      // but popcorn doesn't need to know more.
+  IriSP.PopcornReplacement.media.muted = jwplayer(IriSP.PopcornReplacement._container).getMute();
+};
+
+IriSP.PopcornReplacement.jwplayer = function(container, options) {
+  IriSP.PopcornReplacement._container = container.slice(1); //eschew the '#'
+  options.events = {
+      onReady: IriSP.PopcornReplacement.__initApi,
+      onTime: IriSP.PopcornReplacement.__timeHandler,
+      onPlay: IriSP.PopcornReplacement.__playHandler,
+      onPause: IriSP.PopcornReplacement.__pauseHandler,
+      onSeek: IriSP.PopcornReplacement.__seekHandler 
+      }
+    
+  jwplayer(IriSP.PopcornReplacement._container).setup(options);
+  IriSP.PopcornReplacement.media.duration = options.duration;
+  return IriSP.PopcornReplacement;
+};
+
+IriSP.PopcornReplacement.currentTime = function(time) {
+  if (typeof(time) === "undefined") {
+      return jwplayer(IriSP.PopcornReplacement._container).getPosition();            
+  } else {
+     var currentTime = +time;
+     jwplayer( IriSP.PopcornReplacement._container ).seek( currentTime );
+     IriSP.PopcornReplacement.trigger("seeked");
+     return jwplayer(IriSP.PopcornReplacement._container).getPosition();            
+  }
+};
+
+IriSP.PopcornReplacement.play = function() {
+      IriSP.PopcornReplacement.media.paused = false;
+      IriSP.PopcornReplacement.trigger("play");
+//      IriSP.PopcornReplacement.trigger("playing");
+      jwplayer( IriSP.PopcornReplacement._container ).play();
+};
+    
+IriSP.PopcornReplacement.pause = function() {
+      if ( !IriSP.PopcornReplacement.media.paused ) {
+        IriSP.PopcornReplacement.media.paused = true;
+        IriSP.PopcornReplacement.trigger( "pause" );
+        jwplayer( IriSP.PopcornReplacement._container ).pause();
+      }
+};
+
+IriSP.PopcornReplacement.muted = function(val) {
+  if (typeof(val) !== "undefined") {
+
+    if (jwplayer(IriSP.PopcornReplacement._container).getMute() !== val) {
+      if (val) {
+        jwplayer(IriSP.PopcornReplacement._container).setMute(true);
+        IriSP.PopcornReplacement.media.muted = true;
+      } else {
+        jwplayer( IriSP.PopcornReplacement._container ).setMute(false);
+        IriSP.PopcornReplacement.media.muted = false;
+      }
+
+      IriSP.PopcornReplacement.trigger( "volumechange" );
+    }
+    
+    return jwplayer( IriSP.PopcornReplacement._container ).getMute();
+  } else {
+    return jwplayer( IriSP.PopcornReplacement._container ).getMute();
+  }
+};
+
+IriSP.PopcornReplacement.mute = IriSP.PopcornReplacement.muted;
+
+IriSP.PopcornReplacement.__codes = [];
+IriSP.PopcornReplacement.code = function(options) {
+  IriSP.PopcornReplacement.__codes.push(options);
+  return IriSP.PopcornReplacement;
+};
+
+IriSP.PopcornReplacement.__runCode = function() {
+  var currentTime = jwplayer(IriSP.PopcornReplacement._container).getPosition();
+  var i = 0;
+  for(i = 0; i < IriSP.PopcornReplacement.__codes.length; i++) {
+    var c = IriSP.PopcornReplacement.__codes[i];
+    if (currentTime == c.start) {
+      c.onStart();
+    }
+    
+    if (currentTime == c.end) {
+      c.onEnd();
+    }
+
+  }
+};
+
+/* called everytime the player updates itself 
+   (onTime event)
+ */
+
+IriSP.PopcornReplacement.__timeHandler = function(event) {
+  var pos = event.position;
+
+  var i = 0;
+  for(i = 0; i < IriSP.PopcornReplacement.__codes.length; i++) {
+     var c = IriSP.PopcornReplacement.__codes[i];
+     
+     if (pos >= c.start && pos < c.end && 
+         pos - 0.1 <= c.start) {       
+        c.onStart();
+     }
+ 
+     if (pos > c.start && pos > c.end && 
+         pos - 0.1 <= c.end) {
+         console.log("eonedn");
+        c.onEnd();
+     }
+   
+  }
+ 
+  IriSP.PopcornReplacement.trigger("timeupdate");
+};
+
+IriSP.PopcornReplacement.__seekHandler = function(event) {
+  var i = 0;
+  
+  for(i = 0; i < IriSP.PopcornReplacement.__codes.length; i++) {
+     var c = IriSP.PopcornReplacement.__codes[i];
+    
+     if (event.position >= c.start && event.position < c.end) {        
+        c.onEnd();
+     }         
+   }
+
+   for(i = 0; i < IriSP.PopcornReplacement.__codes.length; i++) {
+     var c = IriSP.PopcornReplacement.__codes[i];
+
+     if (typeof(event.offset) === "undefined")
+       event.offset = 0;
+           
+     if (event.offset >= c.start && event.offset < c.end) { 
+       c.onStart();
+     }
+     
+   }
+
+  IriSP.PopcornReplacement.trigger("timeupdate");
+};
+
+
+IriSP.PopcornReplacement.__playHandler = function(event) {
+  IriSP.PopcornReplacement.media.paused = false;
+  IriSP.PopcornReplacement.trigger("play");
+};
+
+IriSP.PopcornReplacement.__pauseHandler = function(event) {
+  IriSP.PopcornReplacement.media.paused = true;
+  IriSP.PopcornReplacement.trigger("pause");
+};
+
+IriSP.PopcornReplacement.roundTime = function() {
+  var currentTime = IriSP.PopcornReplacement.currentTime();
+  return Math.round(currentTime);
+};
+/* utils.js - various utils that don't belong anywhere else */
+
+/* trace function, for debugging */
+
+IriSP.traceNum = 0;
+IriSP.trace = function( msg, value ) {
+/*
+	if( IriSP.config.gui.debug === true ) {
+		IriSP.traceNum += 1;
+		IriSP.jQuery( "<div>"+IriSP.traceNum+" - "+msg+" : "+value+"</div>" ).appendTo( "#Ldt-output" );
+	}
+*/
+};
+
+/* used in callbacks - because in callbacks we lose "this",
+   we need to have a special function which wraps "this" in 
+   a closure. This way, the 
+*/   
+IriSP.wrap = function (obj, fn) {
+  return function() {    
+    var args = Array.prototype.slice.call(arguments, 0);
+    return fn.apply(obj, args);
+  }
+}
+
+/* convert a time to a percentage in the media */
+IriSP.timeToPourcent = function(time, timetotal){
+	var time = Math.abs(time);
+  var timetotal = Math.abs(timetotal);
+  
+	return Math.floor((time/timetotal) * 100);
+};
+
+IriSP.padWithZeros = function(num) {
+  if (Math.abs(num) < 10) {
+    return "0" + num.toString();
+  } else {
+    return num.toString();
+  }
+};
+/* convert a number of seconds to a tuple of the form 
+   [hours, minutes, seconds]
+*/
+IriSP.secondsToTime = function(secs) {  
+  var hours = Math.abs(parseInt( secs / 3600 ) % 24);
+  var minutes = Math.abs(parseInt( secs / 60 ) % 60);
+  var seconds = parseFloat(Math.abs(secs % 60).toFixed(0));
+  
+  var toString_fn = function() {
+    var ret = "";
+    if (hours > 0)
+       ret = IriSP.padWithZeros(this.hours) + ":";
+    ret += IriSP.padWithZeros(this.minutes) + ":" + IriSP.padWithZeros(this.seconds);
+
+    return ret;
+  }
+  return {"hours" : hours, "minutes" : minutes, "seconds" : seconds, toString: toString_fn};
+};
+
+IriSP.secondsToString
+
+/* format a tweet - replaces @name by a link to the profile, #hashtag, etc. */
+IriSP.formatTweet = function(tweet) {
+  /*
+    an array of arrays which hold a regexp and its replacement.
+  */
+  var regExps = [
+    /* copied from http://codegolf.stackexchange.com/questions/464/shortest-url-regex-match-in-javascript/480#480 */
+    [/((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)/gi, "<a href='$1'>$1</a>"],
+    [/@(\w+)/gi, "<a href='http://twitter.com/$1'>@$1</a>"], // matches a @handle
+    [/#(\w+)/gi, "<a href='http://twitter.com/search?q=%23$1'>#$1</a>"],// matches a hashtag
+    [/(\+\+)/gi, "<span class='Ldt-PolemicPlusPlus'>$1</span>"],
+    [/(--)/gi, "<span class='Ldt-PolemicMinusMinus'>$1</span>"],
+    [/(==)/gi, "<span class='Ldt-PolemicEqualEqual'>$1</span>"],
+    [/(\?\?)/gi, "<span class='Ldt-PolemicQuestion'>$1</span>"]
+  ]; 
+
+  var i = 0;
+  for(i = 0; i < regExps.length; i++) {
+     tweet = tweet.replace(regExps[i][0], regExps[i][1]);
+  }
+  
+  return tweet;
+};
+
+IriSP.countProperties = function(obj) {
+    var count = 0;
+
+    for(var prop in obj) {
+        if(obj.hasOwnProperty(prop))
+                ++count;
+    }
+
+    return count;
+};
+
+// conversion de couleur Decimal vers HexaDecimal || 000 si fff
+IriSP.DEC_HEXA_COLOR = function (dec) {
+	 var hexa='0123456789ABCDEF';
+   var hex='';
+	 var tmp;
+	 while (dec>15){
+		  tmp = dec-(Math.floor(dec/16))*16;
+		  hex = hexa.charAt(tmp)+hex;
+		  dec = Math.floor(dec/16);
+	 }
+	 hex = hexa.charAt(dec)+hex;	 
+	 return(hex);
+};
+
+/* shortcut to have global variables in templates */
+IriSP.templToHTML = function(template, values) {
+  var params = IriSP.jQuery.extend(IriSP.default_templates_vars, values);
+  return Mustache.to_html(template, params);
+};
+
+/* we need to be stricter than encodeURIComponent,
+   because of twitter
+*/  
+IriSP.encodeURI = function(str) {
+  return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').  
+                                 replace(/\)/g, '%29').replace(/\*/g, '%2A');  
+}  
+
+IriSP.__guidCounter = 0;
+IriSP.guid = function(prefix) {
+  IriSP.__guidCounter += 1;
+  return prefix + IriSP.__guidCounter;
+};
+/* for ie compatibility
+if (Object.prototype.__defineGetter__&&!Object.defineProperty) {
+   Object.defineProperty=function(obj,prop,desc) {
+      if ("get" in desc) obj.__defineGetter__(prop,desc.get);
+      if ("set" in desc) obj.__defineSetter__(prop,desc.set);
+   }
+}
+*/
+/* data.js - this file deals with how the players gets and sends data */
+
+IriSP.DataLoader = function() {
+  this._cache = {};
+  
+  /*
+    A structure to hold callbacks for specific urls. We need it because
+    ajax calls are asynchronous, so it means that sometimes we ask
+    multiple times for a ressource because the first call hasn't been
+    received yet.
+  */
+  this._callbacks = {};
+};
+
+IriSP.DataLoader.prototype.get = function(url, callback) {
+
+  var base_url = url.split("&")[0]
+  if (this._cache.hasOwnProperty(base_url)) {
+    callback(this._cache[base_url]);
+  } else {  
+    if (!this._callbacks.hasOwnProperty(base_url)) {
+      this._callbacks[base_url] = [];
+      this._callbacks[base_url].push(callback);   
+      /* we need a closure because this gets lost when it's called back */
+  
+      // uncomment you don't want to use caching.
+      // IriSP.jQuery.get(url, callback);
+      
+      var func = function(data) {
+                  this._cache[base_url] = data;                                
+                  var i = 0;
+                  
+                  for (i = 0; i < this._callbacks[base_url].length; i++) {
+                    this._callbacks[base_url][i](this._cache[base_url]);                                  
+                  }
+      };
+      
+      /* automagically choose between json and jsonp */
+      if (url.indexOf(document.location.hostname) === -1 &&
+          url.indexOf("http://") !== -1 /* not a relative url */ ) {
+        // we contacting a foreign domain, use JSONP
+
+        IriSP.jQuery.get(url, {}, IriSP.wrap(this, func), "jsonp");
+      } else {
+
+        // otherwise, hey, whatever rows your boat
+        IriSP.jQuery.get(url, IriSP.wrap(this, func));
+      }
+    
+    } else {
+      /* simply push the callback - it'll get called when the ressource
+         has been received */
+      
+      this._callbacks[base_url].push(callback);   
+   
+    }
+  }
+}
+
+/* the base abstract "class" */
+IriSP.Serializer = function(DataLoader, url) {
+  this._DataLoader = DataLoader;
+  this._url = url;
+  this._data = [];
+};
+
+IriSP.Serializer.prototype.serialize = function(data) { };
+IriSP.Serializer.prototype.deserialize = function(data) {};
+
+IriSP.Serializer.prototype.currentMedia = function() {  
+};
+
+IriSP.Serializer.prototype.sync = function(callback) {  
+  callback.call(this, this._data);  
+};
+
+IriSP.SerializerFactory = function(DataLoader) {
+  this._dataloader = DataLoader;
+};
+
+IriSP.SerializerFactory.prototype.getSerializer = function(metadataOptions) {
+  /* This function returns serializer set-up with the correct
+     configuration - takes a metadata struct describing the metadata source
+  */
+  
+  if (metadataOptions === undefined)
+    /* return an empty serializer */
+    return IriSP.Serializer("", "");
+            
+  switch(metadataOptions.type) {
+    case "json":
+      return new IriSP.JSONSerializer(this._dataloader, metadataOptions.src);
+      break;
+    
+    case "dummy": /* only used for unit testing - not defined in production */
+      return new IriSP.MockSerializer(this._dataloader, metadataOptions.src);
+      break;
+    
+    case "empty":
+      return new IriSP.Serializer("", "empty");
+      break;
+      
+    default:      
+      return undefined;
+  }
+};
+/* site.js - all our site-dependent config : player chrome, cdn locations, etc...*/
+
+IriSP.lib = { 
+		jQuery : "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js",
+		jQueryUI : "http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/jquery-ui.js",
+		jQueryToolTip : "http://cdn.jquerytools.org/1.2.4/all/jquery.tools.min.js",
+		swfObject : "http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js",
+		cssjQueryUI : "http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/themes/base/jquery-ui.css",
+    popcorn : "/mdp/src/js/libs/popcorn.js",
+    jwplayer : "/mdp/src/js/libs/jwplayer.js",
+    popcornReplacement: "/mdp/src/js/libs/pop.js",
+    raphael: "/mdp/src/js/libs/raphael.js",
+    "popcorn.mediafragment" : "/mdp/src/js/libs/popcorn.mediafragment.js",
+    "popcorn.code" : "/mdp/src/js/libs/popcorn.code.js",
+    "popcorn.jwplayer": "/mdp/src/js/libs/popcorn.jwplayer.js",
+    "popcorn.youtube": "/mdp/src/js/libs/popcorn.youtube.js"
+};
+
+//Player Configuration 
+IriSP.config = undefined;
+
+IriSP.widgetsDefaults = {
+  "LayoutManager" : {spacer_div_height : "0px" },
+  "PlayerWidget" : {},
+  "AnnotationsWidget": {
+    "share_text" : "I'm watching ",     
+    "fb_link" : "http://www.facebook.com/share.php?u=",
+    "tw_link" : "http://twitter.com/home?status=",
+    "gplus_link" : ""
+    },
+  "TweetsWidget" : {
+      default_profile_picture : "https://si0.twimg.com/sticky/default_profile_images/default_profile_1_normal.png",
+      tweet_display_period: 10000 // how long do we show a tweet ?
+  },
+  "SliderWidget" : {
+      minimize_period: 850 // how long does the slider stays maximized after the user leaves the zone ?
+  },
+  "Main" : {
+      autoplay: true
+  }
+  
+};
+
+IriSP.paths = {
+//  "imgs": "/tweetlive/res/metadataplayer/src/css/imgs"
+  "imgs": "/mdp/src/css/imgs"
+};
+IriSP.default_templates_vars = {
+  "img_dir" : IriSP.paths.imgs 
+};
+
+/* ui.js - ui related functions */
+
+/* FIXME: use an sharing library */
+IriSP.LdtShareTool = IriSP.share_template; /* the contents come from share.html */
+
+IriSP.createPlayerChrome = function(){
+	var width = IriSP.config.gui.width;
+	var height = IriSP.config.gui.height;
+	var heightS = IriSP.config.gui.height-20;
+	
+	// AUDIO  */
+	// PB dans le html : ; 
+	IriSP.trace( "__IriSP.createMyHtml",IriSP.config.gui.container );
+
+	
+	/* FIXME : factor this in another file */
+	if( IriSP.config.gui.mode=="radio" ){
+
+		IriSP.jQuery( "#"+IriSP.config.gui.container ).before(IriSP.search_template);
+		var radioPlayer = Mustache.to_html(IriSP.radio_template, {"share_template" : IriSP.share_template});
+		IriSP.jQuery(radioPlayer).appendTo("#"+IriSP.config.gui.container);
+
+		// special tricks for IE 7
+		if (IriSP.jQuery.browser.msie==true && IriSP.jQuery.browser.version=="7.0"){
+			//LdtSearchContainer
+			//__IriSP.jQuery("#LdtPlayer").attr("margin-top","50px");
+			IriSP.jQuery("#Ldt-Root").css("padding-top","25px");
+			IriSP.trace("__IriSP.createHtml","IE7 SPECIAL ");
+		}
+	} else if(IriSP.config.gui.mode=="video") {
+	
+		var videoPlayer = Mustache.to_html(IriSP.video_template, {"share_template" : IriSP.share_template, "heightS" : heightS});
+		IriSP.jQuery(videoPlayer).appendTo("#"+IriSP.config.gui.container);
+	}
+	
+	IriSP.jQuery("#Ldt-Annotations").width(width-(75*2));
+	IriSP.jQuery("#Ldt-Show-Arrow-container").width(width-(75*2));
+	IriSP.jQuery("#Ldt-ShowAnnotation-audio").width(width-10);
+	IriSP.jQuery("#Ldt-ShowAnnotation-video").width(width-10);
+	IriSP.jQuery("#Ldt-SaKeyword").width(width-10);
+	IriSP.jQuery("#Ldt-controler").width(width-10);
+	IriSP.jQuery("#Ldt-Control").attr("z-index","100");
+	IriSP.jQuery("#Ldt-controler").hide();
+	
+	IriSP.jQuery(IriSP.annotation_loading_template).appendTo("#Ldt-ShowAnnotation-audio");
+
+	if(IriSP.config.gui.mode=='radio'){
+		IriSP.jQuery("#Ldt-load-container").attr("width",IriSP.config.gui.width);
+	}
+	// Show or not the output
+	if(IriSP.config.gui.debug===true){
+		IriSP.jQuery("#Ldt-output").show();
+	} else {
+		IriSP.jQuery("#Ldt-output").hide();
+	}
+	
+};
+
+
+/* create the buttons and the slider   */
+IriSP.createInterface = function( width, height, duration ) {
+		
+		IriSP.jQuery( "#Ldt-controler" ).show();
+		//__IriSP.jQuery("#Ldt-Root").css('display','visible');
+		IriSP.trace( "__IriSP.createInterface" , width+","+height+","+duration+"," );
+		
+		IriSP.jQuery( "#Ldt-ShowAnnotation").click( function () { 
+			 //__IriSP.jQuery(this).slideUp(); 
+		} );
+
+		var LdtpPlayerY = IriSP.jQuery("#Ldt-PlaceHolder").attr("top");
+		var LdtpPlayerX = IriSP.jQuery("#Ldt-PlaceHolder").attr("left");
+		
+		IriSP.jQuery( "#slider-range-min" ).slider( { //range: "min",
+			value: 0,
+			min: 1,
+			max: duration/1000,//1:54:52.66 = 3600+3240+
+			step: 0.1,
+			slide: function(event, ui) {
+				
+				//__IriSP.jQuery("#amount").val(ui.value+" s");
+				//player.sendEvent('SEEK', ui.value)
+				IriSP.MyApiPlayer.seek(ui.value);
+				//changePageUrlOffset(ui.value);
+				//player.sendEvent('PAUSE')
+			}
+		} );
+		
+		IriSP.trace("__IriSP.createInterface","ICI");
+		IriSP.jQuery("#amount").val(IriSP.jQuery("#slider-range-min").slider("value")+" s");
+		IriSP.jQuery(".Ldt-Control1 button:first").button({
+			icons: {
+				primary: 'ui-icon-play'
+			},
+			text: false
+		}).next().button({
+			icons: {
+				primary: 'ui-icon-seek-next'
+			},
+			 text: false
+		});
+		IriSP.jQuery(".Ldt-Control2 button:first").button({
+			icons: {
+				primary: 'ui-icon-search'//,
+				//secondary: 'ui-icon-volume-off'
+			},
+			text: false
+		}).next().button({
+			icons: {
+				primary: 'ui-icon-volume-on'
+			},
+			 text: false
+		});
+
+		// /!\ PB A MODIFIER 
+		//__IriSP.MyTags.draw();
+		IriSP.trace("__IriSP.createInterface","ICI2");
+		IriSP.jQuery( "#ldt-CtrlPlay" ).attr( "style", "background-color:#CD21C24;" );
+		
+		IriSP.jQuery( "#Ldt-load-container" ).hide();
+		
+		if( IriSP.config.gui.mode=="radio" & IriSP.jQuery.browser.msie != true ) {
+			IriSP.jQuery( "#Ldtplayer1" ).attr( "height", "0" );
+		}
+		IriSP.trace( "__IriSP.createInterface" , "3" );
+
+		IriSP.trace( "__IriSP.createInterface", "END" );
+		
+	};
+/* the widget classes and definitions */
+
+IriSP.Widget = function(Popcorn, config, Serializer) {
+
+  if (config === undefined || config === null) {
+    config = {}
+  }
+  
+  this._Popcorn = Popcorn;
+  this._config = config;  
+  this._serializer = Serializer;
+  
+  if (config.hasOwnProperty("container")) {
+     this._id = config.container;
+     this.selector = IriSP.jQuery("#" + this._id);
+  }
+
+  if (config.hasOwnProperty("spacer")) {
+     this._spacerId = config.spacer;
+     this.spacer = IriSP.jQuery("#" + this._spacerId);
+  }
+
+
+  if (config.hasOwnProperty("width")) {
+     // this.width and not this._width because we consider it public.
+     this.width = config.width;     
+  }
+  
+  if (config.hasOwnProperty("height")) {    
+     this.height = config.height;     
+  }
+  
+  if (config.hasOwnProperty("heightmax")) {
+     this.heightmax = config.heightmax;     
+  }
+
+  if (config.hasOwnProperty("widthmax")) {
+     this.widthmax = config.widthmax;     
+  }
+  
+};
+
+IriSP.Widget.prototype.draw = function() {
+  /* implemented by "sub-classes" */  
+};
+
+IriSP.Widget.prototype.redraw = function() {
+  /* implemented by "sub-classes" */  
+};
+/* modules are non-graphical entities, similar to widgets */
+
+IriSP.Module = function(Popcorn, config, Serializer) {
+
+  if (config === undefined || config === null) {
+    config = {}
+  }
+  
+  this._Popcorn = Popcorn;
+  this._config = config;  
+  this._serializer = Serializer;
+};
+/* layout.js - very basic layout management */
+
+/*
+  a layout manager manages a div and the layout of objects
+  inside it.
+*/
+
+IriSP.LayoutManager = function(options) {
+    this._Popcorn = null;
+    this._widgets = [];
+    
+    this._div = "LdtPlayer";
+    this._width = 640;
+    
+    if (options === undefined) {
+      options = {};
+    };
+    
+    if (options.hasOwnProperty('container')) {
+      this._div = options.container;
+    }
+
+    if (options.hasOwnProperty('width')) {
+      this._width = options.width;
+    }    
+    
+    if (options.hasOwnProperty('height')) {
+      this._height = options.height;
+    } 
+    
+    /* this is a shortcut */
+    this.selector = IriSP.jQuery("#" + this._div);
+    
+    this.selector.css("width", this._width);
+    
+    if (this._height !== undefined)
+      this.selector.css("height", this._height);
+};
+
+/* we need this special setter because of a chicken and egg problem :
+   we want the manager to use popcorn but the popcorn div will be managed
+   by the manager. So we need a way to set the instance the manager uses
+*/
+   
+IriSP.LayoutManager.prototype.setPopcornInstance = function(popcorn) {
+    this._Popcorn = popcorn;
+}
+
+/* stem is a string to append to the id of the widget */
+IriSP.LayoutManager.prototype.createDiv = function(stem) {
+    if (typeof(stem) === "undefined")
+       stem = "";
+
+    var newDiv = IriSP.guid(this._div + "_widget_" + stem + "_");
+    var spacerDiv = IriSP.guid("LdtPlayer_spacer_");
+    this._widgets.push(newDiv);
+
+    var divTempl = "<div id='{{id}}' style='width: {{width}}px; position: relative;'></div";
+    var spacerTempl = "<div id='{{spacer_id}}' style='width: {{width}}px; position: relative; height: {{spacer_div_height}};'></div";
+    
+    var divCode = Mustache.to_html(divTempl, {id: newDiv, width: this._width});
+    var spacerCode = Mustache.to_html(spacerTempl, {spacer_id: spacerDiv, width: this._width,
+                                                    spacer_div_height: IriSP.widgetsDefaults.LayoutManager.spacer_div_height });
+
+    this.selector.append(divCode);
+    this.selector.append(spacerCode);
+
+    return [newDiv, spacerDiv];
+};
+/* init.js - initialization and configuration of Popcorn and the widgets
+exemple json configuration:
+ 
+ */
+
+IriSP.setupDataLoader = function() {
+  /* we set it up separately because we need to
+     get data at the very beginning, for instance when
+     setting up the video */
+  IriSP.__dataloader = new IriSP.DataLoader();
+};
+
+IriSP.configurePopcorn = function (layoutManager, options) {
+    var pop;
+    var ret = layoutManager.createDiv(); 
+    var containerDiv = ret[0];
+    
+    switch(options.type) {
+      /*
+        todo : dynamically create the div/video tag which
+        will contain the video.
+      */
+      case "html5":
+           var tmpId = Popcorn.guid("video"); 
+           IriSP.jQuery("#" + containerDiv).append("<video src='" + options.file + "' id='" + tmpId + "'></video>");
+
+           if (options.hasOwnProperty("width"))
+             IriSP.jQuery("#" + containerDiv).css("width", options.width);
+           
+           if (options.hasOwnProperty("height"))
+             IriSP.jQuery("#" + containerDiv).css("height", options.height);
+
+           pop = Popcorn("#" + tmpId);
+        break;
+        
+      case "jwplayer":
+          var opts = IriSP.jQuery.extend({}, options);
+          delete opts.container;
+
+          if (options.provider === "rtmp") {
+            /* exit if we can't access the metadata */
+            if (typeof(IriSP.__jsonMetadata) === "undefined") {
+                break;
+            };
+
+
+            // the json format is totally illogical
+            opts.streamer = IriSP.__jsonMetadata["medias"][0]["meta"]["item"]["value"];
+            var source = IriSP.__jsonMetadata["medias"][0]["href"];
+
+            // the source if a full url but jwplayer wants an url relative to the
+            // streamer url, so we've got to remove the common part.
+            opts.file = source.slice(opts.streamer.length);
+          } else {
+            /* other providers type, video for instance -
+               pass everything as is */
+          }
+
+          pop = IriSP.PopcornReplacement.jwplayer("#" + containerDiv, opts);
+        break;
+      
+      case "youtube":
+          var opts = IriSP.jQuery.extend({}, options);
+          delete opts.container;
+          opts.controls = 0;
+          opts.autostart = false;
+          templ = "width: {{width}}px; height: {{height}}px;";
+          var str = Mustache.to_html(templ, {width: opts.width, height: opts.height});    
+          // Popcorn.youtube wants us to specify the size of the player in the style attribute of its container div.
+          IriSP.jQuery("#" + containerDiv).attr("style", str);
+          
+          pop = Popcorn.youtube("#" + containerDiv, opts.video, opts);
+        break;
+        
+      default:
+        pop = undefined;
+    };
+    
+    return pop;
+};
+
+IriSP.configureWidgets = function (popcornInstance, layoutManager, guiOptions) {
+ 
+  var serialFactory = new IriSP.SerializerFactory(IriSP.__dataloader);
+  var params = {width: guiOptions.width, height: guiOptions.height};
+
+  var ret_widgets = [];
+  var index;
+  
+  for (index = 0; index < guiOptions.widgets.length; index++) {    
+    var widgetConfig = guiOptions.widgets[index];
+    var widget = IriSP.instantiateWidget(popcornInstance, serialFactory, layoutManager, widgetConfig);
+    ret_widgets.push(widget);
+   
+  };
+
+  return ret_widgets;
+};
+
+IriSP.configureModules = function (popcornInstance, modulesList) {
+ 
+  var serialFactory = new IriSP.SerializerFactory(IriSP.__dataloader);
+  var ret_modules = [];
+  var index;
+  
+  for (index = 0; index < modulesList.length; index++) {    
+    var moduleConfig = modulesList[index];
+    
+    var serializer = serialFactory.getSerializer(moduleConfig.metadata);
+    var module = new IriSP[moduleConfig.type](popcornInstance, moduleConfig, serializer);    
+    ret_modules.push(module);
+  };
+
+  return ret_modules;
+};
+
+IriSP.instantiateWidget = function(popcornInstance, serialFactory, layoutManager, widgetConfig) {
+    /* create div returns us a container for the widget and a spacer */
+    var ret = layoutManager.createDiv(widgetConfig.type);        
+    var container = ret[0];
+    var spacer = ret[1];
+
+    var arr = IriSP.jQuery.extend({}, widgetConfig);
+    arr.container = container;
+    arr.spacer = spacer;
+    
+    var serializer = serialFactory.getSerializer(widgetConfig.metadata);    
+    
+    if (typeof serializer == "undefined")   
+      debugger;
+    
+    // instantiate the object passed as a string
+    var widget = new IriSP[widgetConfig.type](popcornInstance, arr, serializer);    
+    
+    if (widgetConfig.hasOwnProperty("requires")) {
+      // also create the widgets this one depends on.
+      // the dependency widget is available in the parent widget context as
+      // this.WidgetName (for instance, this.TipWidget);
+      
+      var i = 0;
+      for(i = 0; i < widgetConfig.requires.length; i++) {
+        var widgetName = widgetConfig.requires[i]["type"];
+        widget[widgetName] = IriSP.instantiateWidget(popcornInstance, serialFactory, layoutManager, widgetConfig.requires[i]);
+      }
+    }       
+     
+    serializer.sync(IriSP.wrap(widget, function() { this.draw(); }));
+    return widget;
+};
+/* mediafragment module */
+
+IriSP.MediaFragment = function(Popcorn, config, Serializer) {
+  IriSP.Module.call(this, Popcorn, config, Serializer);
+
+  this.mutex = false; /* a mutex because we access the url from two different functions */
+
+  this._Popcorn.listen( "loadedmetadata", IriSP.wrap(this, IriSP.MediaFragment.advanceTime));
+  this._Popcorn.listen( "pause", IriSP.wrap(this, IriSP.MediaFragment.updateTime));
+  this._Popcorn.listen( "seeked", IriSP.wrap(this, IriSP.MediaFragment.updateTime));
+  this._Popcorn.listen( "IriSP.PolemicTweet.click", IriSP.wrap(this, IriSP.MediaFragment.updateAnnotation));
+  this._Popcorn.listen( "IriSP.SegmentsWidget.click", IriSP.wrap(this, IriSP.MediaFragment.updateAnnotation));
+};
+
+IriSP.MediaFragment.advanceTime = function() {
+             var url = window.location.href;
+
+              if ( url.split( "#" )[ 1 ] != null ) {
+                  pageoffset = url.split( "#" )[1];
+
+                  if ( pageoffset.substring(0, 2) === "t=") {
+                    // timecode 
+                    if ( pageoffset.substring( 2 ) != null ) {
+                    var offsettime = pageoffset.substring( 2 );
+                    this._Popcorn.currentTime( parseFloat( offsettime ) );
+                    }
+                  } else if ( pageoffset.substring(0, 2) === "a=") {
+                    // annotation
+                    var annotationId = pageoffset.substring( 2 );
+
+                    // there's no better way than that because
+                    // of possible race conditions
+                    this._serializer.sync(IriSP.wrap(this, function() {
+                          IriSP.MediaFragment.lookupAnnotation.call(this, annotationId); 
+                          }));
+                  }
+              }
+};
+
+IriSP.MediaFragment.updateTime = function() {
+  if (this.mutex === true) {
+    return;
+  }
+
+  var history = window.history;
+  if ( !history.pushState ) {
+    return false;
+  }
+  
+  splitArr = window.location.href.split( "#" )
+  history.replaceState( {}, "", splitArr[0] + "#t=" + this._Popcorn.currentTime().toFixed( 2 ) );
+};
+
+
+IriSP.MediaFragment.updateAnnotation = function(annotationId) {
+  var _this = this;
+  this.mutex = true;
+
+  var history = window.history;
+  if ( !history.pushState ) {
+    return false;
+  }
+  
+  splitArr = window.location.href.split( "#" )
+  history.replaceState( {}, "", splitArr[0] + "#a=" + annotationId);
+ 
+  window.setTimeout(function() { _this.mutex = false }, 50);
+};
+
+// lookup and seek to the beginning of an annotation
+IriSP.MediaFragment.lookupAnnotation = function(annotationId) {
+  var annotation = undefined;
+  var annotations = this._serializer._data.annotations;
+
+  var i;
+  for (i = 0; i < annotations.length; i++) {
+      if (annotations[i].id === annotationId) {
+        annotation = annotations[i];
+        break;
+      }
+  }
+
+  if (typeof(annotation) !== "undefined") {
+    this._Popcorn.currentTime(annotation.begin / 1000);
+  }
+};
+IriSP.AnnotationsWidget = function(Popcorn, config, Serializer) {
+  IriSP.Widget.call(this, Popcorn, config, Serializer);
+  
+};
+
+
+IriSP.AnnotationsWidget.prototype = new IriSP.Widget();
+
+IriSP.AnnotationsWidget.prototype.clear = function() {
+    this.selector.find(".Ldt-SaTitle").text("");
+    this.selector.find(".Ldt-SaDescription").text("");
+    this.selector.find(".Ldt-SaKeywordText").text("");
+};
+
+IriSP.AnnotationsWidget.prototype.displayAnnotation = function(annotation) {   
+
+    var title = annotation.content.title;
+    var description = annotation.content.description;
+    var keywords =  "" // FIXME;
+    var begin = +annotation.begin / 1000;
+    var end = +annotation.end / 1000;
+    var duration = +this._serializer.currentMedia().meta["dc:duration"];
+    
+    var title_templ = "{{title}} - ( {{begin}} - {{end}} )";
+    var endstr = Mustache.to_html(title_templ, {title: title, begin: IriSP.secondsToTime(begin), end: IriSP.secondsToTime(end)});
+
+    this.selector.find(".Ldt-SaTitle").text(endstr);
+    this.selector.find(".Ldt-SaDescription").text(description);
+    
+    // update sharing buttons
+    var defaults = IriSP.widgetsDefaults.AnnotationsWidget;
+    var text = defaults.share_text;
+    var fb_link = defaults.fb_link;
+    var tw_link = defaults.tw_link;
+    var gplus_link = defaults.gplus_link;
+    var url = document.location.href + "#a=" + annotation.id;
+    this.selector.find(".Ldt-fbShare").attr("href", fb_link + IriSP.encodeURI(text) + IriSP.encodeURI(url));
+    this.selector.find(".Ldt-TwShare").attr("href", tw_link + IriSP.encodeURI(text) + IriSP.encodeURI(url));
+    this.selector.find(".Ldt-GplusShare").attr("href", fb_link + IriSP.encodeURI(text) + IriSP.encodeURI(url));
+};
+
+IriSP.AnnotationsWidget.prototype.clearWidget = function() {
+
+    
+    /* retract the pane between two annotations */
+    this.selector.find(".Ldt-SaTitle").text("");
+    this.selector.find(".Ldt-SaDescription").text("");
+    this.selector.find(".Ldt-SaKeywordText").html("");
+    this.selector.find(".Ldt-ShowAnnotation").slideUp();
+};
+
+IriSP.AnnotationsWidget.prototype.draw = function() {
+  var _this = this;
+
+  var annotationMarkup = IriSP.templToHTML(IriSP.annotationWidget_template);
+	this.selector.append(annotationMarkup);
+  var view;
+
+  if (typeof(this._serializer._data.views) !== "undefined" && this._serializer._data.views !== null)
+     view = this._serializer._data.views[0];
+
+  var view_type = "";
+
+  if(typeof(view) !== "undefined" && typeof(view.annotation_types) !== "undefined" && view.annotation_types.length > 1) {
+          view_type = view.annotation_types[0];
+  }
+ 
+  var annotations = this._serializer._data.annotations;
+  var i;
+  
+	for (i in annotations) {    
+    var annotation = annotations[i];
+    var begin = Math.round((+ annotation.begin) / 1000);
+    var end = Math.round((+ annotation.end) / 1000);
+
+    if (view_type != "" && typeof(annotation.meta) !== "undefined" && typeof(annotation.meta["id-ref"]) !== "undefined"
+          && annotation.meta["id-ref"] != view_type) {
+        continue;
+    }
+
+
+    var conf = {start: begin, end: end, 
+                onStart: 
+                       function(annotation) { 
+                        return function() { 
+                            _this.displayAnnotation(annotation); 
+                          
+                        } }(annotation),
+                onEnd: 
+                       function() { _this.clearWidget.call(_this); }
+                };
+    this._Popcorn = this._Popcorn.code(conf);                                             
+  }
+
+};
+IriSP.ArrowWidget = function(Popcorn, config, Serializer) {
+  IriSP.Widget.call(this, Popcorn, config, Serializer);
+
+  this._oldAnnotation = null;
+  
+};
+
+
+IriSP.ArrowWidget.prototype = new IriSP.Widget();
+
+IriSP.ArrowWidget.prototype.clear = function() {
+
+};
+
+IriSP.ArrowWidget.prototype.clearWidget = function() {
+};
+
+IriSP.ArrowWidget.prototype.draw = function() {
+  var templ = Mustache.to_html(IriSP.arrowWidget_template, {});
+  this.selector.append(templ);
+  this._Popcorn.listen("timeupdate", IriSP.wrap(this, this.timeUpdateHandler));
+};
+
+IriSP.ArrowWidget.prototype.timeUpdateHandler = function(percents) {
+  var currentTime = this._Popcorn.currentTime();
+  var currentAnnotation = this._serializer.currentAnnotations(currentTime)[0]; // FIXME : use the others ?
+
+  /* move the arrow only if the current annotation changes */
+  if (currentAnnotation != this._oldAnnotation) {
+    var begin = (+ currentAnnotation.begin) / 1000;
+    var end = (+ currentAnnotation.end) / 1000;
+
+    var duration = +this._serializer.currentMedia().meta["dc:duration"] / 1000;
+    var middle_time = (begin + end) / 2;
+    var percents = Math.floor((middle_time / duration) * 100);
+
+    // we need to apply a fix because the arrow has a certain length
+    // it's half the length of the arrow (27 / 2). We need to convert
+    // it in percents though.
+    var totalWidth = this.selector.width();
+    var correction = ((27 / 2) / totalWidth) * 100;
+    var corrected_percents = percents - correction;
+
+    /* don't move out of the screen */
+    if (corrected_percents <= 0)
+      corrected_percents = 0;
+
+    this.selector.children(".Ldt-arrowWidget").animate({"left" : corrected_percents + "%"});
+
+    this._oldAnnotation = currentAnnotation;
+  }
+}
+IriSP.PlayerWidget = function(Popcorn, config, Serializer) {
+  IriSP.Widget.call(this, Popcorn, config, Serializer);
+  
+  this._searchBlockOpen = false;
+  this._searchLastValue = "";
+};
+
+IriSP.PlayerWidget.prototype = new IriSP.Widget();
+
+IriSP.PlayerWidget.prototype.draw = function() {
+  var self = this;
+  var width = this.width;
+	var height = this.height;
+	var heightS = this.height-20;
+	  
+	var Player_templ = Mustache.to_html(IriSP.player_template, {"share_template" : IriSP.share_template});
+  this.selector.append(Player_templ);		
+	
+  this.selector.children(".Ldt-controler").show();
+    
+  // handle clicks by the user on the video.
+  this._Popcorn.listen("play", IriSP.wrap(this, this.playButtonUpdater));
+  this._Popcorn.listen("pause", IriSP.wrap(this, this.playButtonUpdater));
+  
+  this._Popcorn.listen("volumechange", IriSP.wrap(this, this.muteButtonUpdater));
+
+  this._Popcorn.listen("timeupdate", IriSP.wrap(this, this.timeDisplayUpdater));
+  this._Popcorn.listen("IriSP.search.matchFound", IriSP.wrap(this, this.searchMatch));
+  this._Popcorn.listen("IriSP.search.noMatchFound", IriSP.wrap(this, this.searchNoMatch));
+  
+  
+  this.selector.find(".Ldt-CtrlPlay").click(function() { self.playHandler.call(self); });
+  this.selector.find(".Ldt-CtrlNext").click(function() { });
+  this.selector.find(".Ldt-CtrlSearch").click(function() { self.searchButtonHandler.call(self); });
+  
+  this.selector.find('.Ldt-CtrlSound').click(function() { self.muteHandler.call(self); } );
+
+  this.selector.find(".Ldt-CtrlPlay").attr( "style", "background-color:#CD21C24;" );
+  
+  var searchButtonPos = this.selector.find(".Ldt-CtrlSearch").position();
+  var searchBox = Mustache.to_html(IriSP.search_template, {margin_left : searchButtonPos.left + "px"});
+  this.selector.append(searchBox);
+  
+  // trigger an IriSP.PlayerWidget.MouseOver to the widgets that are interested (i.e : sliderWidget)
+  this.selector.hover(function() { self._Popcorn.trigger("IriSP.PlayerWidget.MouseOver"); }, 
+                      function() { self._Popcorn.trigger("IriSP.PlayerWidget.MouseOut"); });
+ 
+  this.muteButtonUpdater(); /* some player - jwplayer notable - save the state of the mute button between sessions */
+};
+
+/* Update the elasped time div */
+IriSP.PlayerWidget.prototype.timeDisplayUpdater = function() {
+  
+  if (this._previousSecond === undefined)
+    this._previousSecond = this._Popcorn.roundTime();
+  
+  else {
+    /* we're still in the same second, so it's not necessary to update time */
+    if (this._Popcorn.roundTime() == this._previousSecond)
+      return;
+      
+  }
+  
+  // we get it at each call because it may change.
+  var duration = +this._serializer.currentMedia().meta["dc:duration"] / 1000; 
+  var totalTime = IriSP.secondsToTime(duration);
+  var elapsedTime = IriSP.secondsToTime(this._Popcorn.currentTime());
+  
+  this.selector.find(".Ldt-ElapsedTime").html(elapsedTime.toString());
+  this.selector.find(".Ldt-TotalTime").html(totalTime.toString());
+  this._previousSecond = this._Popcorn.roundTime();
+};
+
+/* update the icon of the button - separate function from playHandler
+   because in some cases (for instance, when the user directly clicks on
+   the jwplayer window) we have to change the icon without playing/pausing
+*/
+IriSP.PlayerWidget.prototype.playButtonUpdater = function() {
+  var status = this._Popcorn.media.paused;
+  
+  if ( status == true ){        
+    this.selector.find(".Ldt-CtrlPlay").attr("title", "Play");
+   
+    // we use templToHTML because it has some predefined
+    // vars like where to get the images
+    var templ = IriSP.templToHTML("url({{img_dir}}/play_sprite.png)");
+    this.selector.find(".Ldt-CtrlPlay").css("background-image", templ);
+
+  } else {
+    this.selector.find(".Ldt-CtrlPlay").attr("title", "Pause");
+
+    // we use templToHTML because it has some predefined
+    // vars like where to get the images
+    var templ = IriSP.templToHTML("url({{img_dir}}/pause_sprite.png)");
+    this.selector.find(".Ldt-CtrlPlay").css("background-image", templ);
+  }  
+
+  return;
+};
+
+
+IriSP.PlayerWidget.prototype.playHandler = function() {
+  var status = this._Popcorn.media.paused;
+  
+  if ( status == true ){        
+    this._Popcorn.play();   
+  } else {
+    this._Popcorn.pause();
+  }  
+};
+
+IriSP.PlayerWidget.prototype.muteHandler = function() {
+  if (!this._Popcorn.muted()) {    
+      this._Popcorn.mute(true);
+    } else {
+      this._Popcorn.mute(false);
+    }
+};
+
+IriSP.PlayerWidget.prototype.muteButtonUpdater = function() {
+  var status = this._Popcorn.media.muted;
+  
+  if ( status == true ){        
+    this.selector.find(".Ldt-CtrlSound").attr("title", "Unmute");
+   
+    // we use templToHTML because it has some predefined
+    // vars like where to get the images
+    var templ = IriSP.templToHTML("url({{img_dir}}/sound_sprite.png)");
+    this.selector.find(".Ldt-CtrlSound").css("background-image", templ);
+
+  } else {
+    this.selector.find(".Ldt-CtrlSound").attr("title", "Mute");
+
+    // we use templToHTML because it has some predefined
+    // vars like where to get the images
+    var templ = IriSP.templToHTML("url({{img_dir}}/mute_sprite.png)");
+    this.selector.find(".Ldt-CtrlSound").css("background-image", templ);
+  }  
+
+  return;
+};
+
+
+IriSP.PlayerWidget.prototype.searchButtonHandler = function() {
+    var self = this;
+
+    /* show the search field if it is not shown */
+  	if ( this._searchBlockOpen == false ) {      
+      this.selector.find(".LdtSearch").show(100);
+      
+      this.selector.find(".LdtSearchInput").css('background-color','#fff');
+      this.selector.find(".LdtSearchInput").focus();
+      this.selector.find(".LdtSearchInput").attr('value', this._searchLastValue);      
+      this._Popcorn.trigger("IriSP.search", this._searchLastValue); // trigger the search to make it more natural.
+      
+      this._searchBlockOpen = true;           
+      this.selector.find(".LdtSearchInput").bind('keyup', null, function() { self.searchHandler.call(self); } );
+      
+      // we need this variable because some widget can find a match in
+      // their data while at the same time other's don't. As we want the
+      // search field to become green when there's a match, we need a 
+      // variable to remember that we had one.
+      this._positiveMatch = false;
+
+      // tell the world the field is open
+      this._Popcorn.trigger("IriSP.search.open");
+      
+	} else {
+      this._searchLastValue = this.selector.find(".LdtSearchInput").attr('value');
+      this.selector.find(".LdtSearchInput").attr('value','');
+      this.selector.find(".LdtSearch").hide(100);
+      
+      // unbind the watcher event.
+      this.selector.find(".LdtSearchInput").unbind('keypress set');
+      this._searchBlockOpen = false;
+
+      this._positiveMatch = false;
+      
+      this._Popcorn.trigger("IriSP.search.closed");
+  }
+};
+
+/* this handler is called whenever the content of the search
+   field changes */
+IriSP.PlayerWidget.prototype.searchHandler = function() {
+  this._searchLastValue = this.selector.find(".LdtSearchInput").attr('value');
+  this._positiveMatch = false;
+  
+  // do nothing if the search field is empty, instead of highlighting everything.
+  if (this._searchLastValue == "") {
+    this._Popcorn.trigger("IriSP.search.cleared");
+    this.selector.find(".LdtSearchInput").css('background-color','');
+  } else {
+    this._Popcorn.trigger("IriSP.search", this._searchLastValue);
+  }
+};
+
+/*
+  handler for the IriSP.search.found message, which is sent by some views when they
+  highlight a match.
+*/
+IriSP.PlayerWidget.prototype.searchMatch = function() {
+  this._positiveMatch = true;
+  this.selector.find(".LdtSearchInput").css('background-color','#e1ffe1');
+}
+
+/* the same, except that no value could be found */
+IriSP.PlayerWidget.prototype.searchNoMatch = function() {
+  if (this._positiveMatch !== true)
+    this.selector.find(".LdtSearchInput").css('background-color', "#d62e3a");
+}
+
+/* 
+ *   
+ *  Copyright 2010 Institut de recherche et d'innovation 
+ *  contributor(s) : Samuel Huron 
+ *   
+ *  contact@iri.centrepompidou.fr
+ *  http://www.iri.centrepompidou.fr 
+ *   
+ *  This software is a computer program whose purpose is to show and add annotations on a video .
+ *  This software is governed by the CeCILL-C license under French law and
+ *  abiding by the rules of distribution of free software. You can  use, 
+ *  modify and/ or redistribute the software under the terms of the CeCILL-C
+ *  license as circulated by CEA, CNRS and INRIA at the following URL
+ *  "http://www.cecill.info". 
+ *  
+ *  The fact that you are presently reading this means that you have had
+ *  knowledge of the CeCILL-C license and that you accept its terms.
+*/
+// CHART TIMELINE / VERSION PROTOTYPE  ::
+
+IriSP.PolemicWidget = function(Popcorn, config, Serializer) {
+  IriSP.Widget.call(this, Popcorn, config, Serializer);
+ 
+  this.userPol    = new Array();
+  this.userNoPol  = new Array();
+  this.userst      = new Array();
+  this.numberOfTweet = 0;
+  this.Users;
+  this.TweetPolemic;
+  this.yMax        = this.height; 
+  this.PaperSlider;
+  this.heightOfChart;
+  this.tweets  = new Array();
+  this.svgElements = {};
+  
+  // Make and define the Raphael area
+  this.paper = Raphael(document.getElementById(this._id), config.width, config.height);
+  
+  this.oldSearchMatches = [];
+
+  // event handlers
+  this._Popcorn.listen("IriSP.search", IriSP.wrap(this, function(searchString) { this.searchHandler(searchString); }));
+  this._Popcorn.listen("IriSP.search.closed", IriSP.wrap(this, this.searchFieldClosedHandler));
+  this._Popcorn.listen("IriSP.search.cleared", IriSP.wrap(this, this.searchFieldClearedHandler));
+
+};
+
+IriSP.PolemicWidget.prototype = new IriSP.Widget();
+  
+IriSP.PolemicWidget.prototype.draw = function() {
+  
+    // variable 
+    // yMax
+    
+    var self = this;
+    var yCoef        = 2;             // coef for height of 1 tweet 
+    var frameSize     = 5;             // frame size 
+    var margin         = 1;            // marge between frame
+    var lineSize      = this.width;        // timeline pixel width 
+    var nbrframes     = lineSize/frameSize;     // frame numbers
+    var numberOfTweet   = 0;            // number of tweet overide later 
+    var duration      = +this._serializer.currentMedia().meta["dc:duration"];      // timescale width 
+    var frameLength   = lineSize / frameSize;    // frame timescale  
+    var timeline;
+    var colors  = new Array("","#1D973D","#C5A62D","#CE0A15","#036AAE","#585858");
+    
+    // array 
+    //var tweets  = new Array();
+    var element = new Array();
+    var cluster = new Array();
+    var frames  = new Array(frameLength);
+    var slices  = new Array();
+    
+    
+    // Classes =======================================================================
+    var Frames = function(){
+      
+      var Myclusters;
+      var x;
+      var y;
+      var width;
+      var height;
+    };
+    Frames = function(json){
+      // make my clusters
+      // ou Frame vide 
+    };
+    Frames.prototype.draw = function(){
+    };
+    Frames.prototype.zoom = function(){
+    };
+    Frames.prototype.inside = function(){
+    };
+    var Clusters = function(){
+      var Object;
+      var yDist;
+      var x;
+      var y;
+      var width;
+      var height;
+    };
+    Clusters = function(json){
+      // make my object
+    };
+    var Tweet = function(){
+    };
+    // Classes =======================================================================
+
+    // Refactoring (parametere) ************************************************************
+    // color translastion
+    var qTweet_0  =0;
+    var qTweet_Q  =0;
+    var qTweet_REF=0;
+    var qTweet_OK =0;
+    var qTweet_KO =0;
+    function colorTranslation(value){
+      if(value == "Q"){
+        qTweet_Q+=1;
+        return 2;
+      }else if(value =="REF"){
+        qTweet_REF+=1;
+        return 4;
+      }else if(value =="OK"){
+        qTweet_OK+=1;
+        return 1;
+      }else if(value =="KO"){
+        qTweet_KO+=1;
+        return 3;
+      }else if(value ==""){
+        qTweet_0+=1;
+        return 5;
+      }
+    }
+    
+
+      this._serializer.sync(function(data) { loaded_callback.call(self, data) });
+      
+      function loaded_callback (json) {
+
+        // get current view (the first ???)
+        view = json.views[0];
+        
+        // the tweets are by definition of the second annotation type FIXME ?
+        tweet_annot_type = null;
+        if(typeof(view.annotation_types) !== "undefined" && view.annotation_types.length > 1) {
+          tweet_annot_type = view.annotation_types[1];
+        }
+      
+      for(var i = 0; i < json.annotations.length; i++) {
+        var item = json.annotations[i];        
+        var MyTime  = Math.floor(item.begin/duration*lineSize);
+        var Myframe = Math.floor(MyTime/lineSize*frameLength);
+
+        if (typeof(item.meta) !== "undefined" 
+          && typeof(item.meta["id-ref"]) !== "undefined"
+          && item.meta["id-ref"] === tweet_annot_type) {
+            
+          var MyTJson = JSON.parse(item.meta['dc:source']['content']);
+          
+            if (item.content['polemics'] != undefined 
+            && item.content['polemics'][0] != null) {
+            
+              // a tweet can have many polemics at the same time.
+              for(var j=0; j<item.content['polemics'].length; j++){
+                  
+                  this.tweets[numberOfTweet] = {
+                        id:i,
+                        qualification:colorTranslation(item.content['polemics'][j]),
+                        yIndicator:MyTime,
+                        yframe:Myframe,
+                        title:item.content['title'],
+                        timeframe:item.begin,
+                        userId: MyTJson.id,
+                        userScreenName: MyTJson.screen_name,
+                        tsource:MyTJson,
+                        cinecast_id: item.id
+                        };
+                  numberOfTweet+=1;
+                  
+              }
+          }
+          else {
+            this.tweets[numberOfTweet] = {
+                  id:i,
+                  qualification:colorTranslation(""),
+                  yIndicator:MyTime,
+                  yframe:Myframe,
+                  title:item.content['title'],
+                  timeframe:item.begin,
+                  userId: MyTJson.id,
+                  userScreenName: MyTJson.screen_name,
+                  tsource:MyTJson,
+                  cinecast_id: item.id
+            };
+            numberOfTweet+=1;
+          }
+          
+        } 
+      };  
+      
+       DrawTweets.call (this); // FIXME: ugly.
+       
+      };      
+
+    // tweet Drawing (in raphael) 
+    function DrawTweets (){
+    // GROUPES TWEET ============================================
+    // Count nbr of cluster and tweet in a frame an save int in "frames"
+      numberOfTweet = this.tweets.length;
+      for(var i=0; i<nbrframes; i++) {  
+        for(var j=0; j<numberOfTweet; j++) {  
+        
+          if (i==this.tweets[j].yframe){
+            
+            var k = this.tweets[j].qualification;
+            
+            // make array for frame cluster
+            if(frames[i]==undefined){
+              frames[i] = {id:i,
+                     qualifVol:new Array(),
+                     mytweetsID:new Array()
+                    };
+            }
+            // add my tweet to frame
+            frames[i].mytweetsID.push(this.tweets[j]);
+            
+            // count opinion by frame
+            if( frames[i].qualifVol[k] == undefined){
+              frames[i].qualifVol[k] = 1;
+            }else{
+              frames[i].qualifVol[k] += 1;
+            }
+            
+          }
+        }
+      }
+    
+    // GROUPES TWEET ============================================    
+    // max of tweet by Frame 
+      var max = 0; 
+      for(var i = 0; i < nbrframes; i++) {
+        var moy  = 0;
+        for (var j = 0; j < 6; j++) {    
+          if (frames[i] != undefined) {
+            if (frames[i].qualifVol[j] != undefined) {
+              moy += frames[i].qualifVol[j];
+            }
+          }
+        }
+        
+        if (moy > max) {
+          max = moy;
+        }
+      }
+    
+      var tweetDrawed = new Array();
+      var TweetHeight = 5;
+      
+      // DRAW  TWEETS ============================================
+      for(var i = 0; i < nbrframes; i++) {
+        var addEheight = 5;
+        if (frames[i] != undefined){                
+          // by type 
+          
+          for (var j = 6; j > -1; j--) {
+            if (frames[i].qualifVol[j] != undefined) {
+              // show tweet by type 
+              for (var k = 0; k < frames[i].mytweetsID.length; k++) {
+              
+                if (frames[i].mytweetsID[k].qualification == j) {                
+                  var x = i * frameSize;
+                  var y = this.heightmax - addEheight;
+                  
+                  if (this.yMax > y) {
+                    this.yMax = y;
+                  }
+                  
+                  var e = this.paper.rect(x, y, frameSize - margin, TweetHeight /* height */)
+                                    .attr({stroke:"#00","stroke-width":0.1,  fill: colors[j]});  
+                  
+                  addEheight += TweetHeight;
+                  
+                  e.color = colors[j];
+                  e.time = frames[i].mytweetsID[k].timeframe;
+                  e.title = frames[i].mytweetsID[k].title;
+                  e.id = frames[i].mytweetsID[k].cinecast_id;
+
+                  this.svgElements[e.id] = e;
+
+                  /*
+                  e.mouseover(function(element) { return function (event) {
+                        // event.clientX and event.clientY are to raphael what event.pageX and pageY are to jquery.                        
+                        self.TooltipWidget.show.call(self.TooltipWidget, element.title, element.attr("fill"), event.clientX - 106, event.clientY - 160);
+                        element.displayed = true;
+                  }}(e)).mouseout(function(element) { return function () {                          
+                          self.TooltipWidget.hide.call(self.TooltipWidget);
+                  }}(e)).mousedown(function () {
+                    self._Popcorn.currentTime(this.time/1000);
+                    self._Popcorn.trigger("IriSP.PolemicTweet.click", this.id); 
+                  });
+                  */
+                  
+                  IriSP.jQuery(e.node).mouseenter(function(element) { return function (event) {                        
+                        // event.clientX and event.clientY are to raphael what event.pageX and pageY are to jquery.                        
+                        self.TooltipWidget.show.call(self.TooltipWidget, element.title, element.attr("fill"), event.pageX - 106, event.pageY - 160);
+                        element.displayed = true;
+                  }}(e)).mousedown(function(element) { return function () {                    
+                    self._Popcorn.currentTime(element.time/1000);
+                    self._Popcorn.trigger("IriSP.PolemicTweet.click", element.id); 
+                    }
+                  }(e));                  
+                  
+                  IriSP.jQuery(e.node).attr('id', 't' + k + '');
+                  IriSP.jQuery(e.node).attr('title', frames[i].mytweetsID[k].title);
+                  IriSP.jQuery(e.node).attr('begin',  frames[i].mytweetsID[k].timeframe);                  
+                }
+              }
+            }
+          }
+        }
+
+      }    
+      // DRAW UI :: resize border and bgd      
+      this.paperBackground = this.paper.rect(0, 0, this.width, this.heightmax).attr({fill:"#F8F8F8","stroke-width":0.1,opacity: 1});  
+
+      // outer borders
+      this.outerBorders   = [];
+      this.outerBorders.push(this.paper.rect(0, this.height - 1, this.width, 1).attr({fill:"#ababab",stroke: "none",opacity: 1}));  
+      this.outerBorders.push(this.paper.rect(0, 0, this.width, 1).attr({fill:"#ababab",stroke: "none",opacity: 1}));  
+
+      // inner borders
+      this.innerBorders   = [];
+      this.innerBorders.push(this.paper.rect(1, this.height - 2, this.width, 1).attr({fill:"#efefef",stroke: "none",opacity: 1}));  
+      this.innerBorders.push(this.paper.rect(1, 1, this.width, 1).attr({fill:"#efefef",stroke: "none",opacity: 1}));  
+      this.innerBorders.push(this.paper.rect(1, 1, 1, this.height - 2).attr({fill:"#d0d1d1",stroke: "none",opacity: 0.8}));  
+      this.innerBorders.push(this.paper.rect(this.width - 2, 1, 1, this.height - 2).attr({fill:"#efefef",stroke: "none",opacity: 1}));  
+
+
+
+      this.paperSlider   = this.paper.rect(0, 0, 0, this.heightmax).attr({fill:"#D4D5D5", stroke: "none", opacity: 1});
+      
+      // the small white line displayed over the slider.
+      this.sliderTip = this.paper.rect(0, 0, 1, this.heightmax).attr({fill:"#fc00ff", stroke: "none", opacity: 1});
+      // decalage 
+      // tweetSelection = this.paper.rect(-100,-100,5,5).attr({fill:"#fff",stroke: "none",opacity: 1});  
+      
+      
+      this.paperSlider.toBack();
+      this.paperBackground.toBack();
+      this.sliderTip.toFront();
+    }
+    
+    this.selector.mouseleave(IriSP.wrap(this, function() { self.TooltipWidget.hide.call(self.TooltipWidget); }));
+    this._Popcorn.listen("timeupdate", IriSP.wrap(this, this.sliderUpdater));
+}
+
+IriSP.PolemicWidget.prototype.sliderUpdater = function() {
+
+    var time = +this._Popcorn.currentTime();
+    var duration = +this._serializer.currentMedia().meta["dc:duration"];
+    
+    this.paperSlider.attr("width", time * (this.width / (duration / 1000)));
+        
+    this.sliderTip.attr("x", time * (this.width / (duration / 1000)));
+};
+    
+IriSP.PolemicWidget.prototype.searchHandler = function(searchString) {
+  if (searchString == "")
+    return;
+
+  var matches = this._serializer.searchTweetsOccurences(searchString);
+
+  if (IriSP.countProperties(matches) > 0) {
+    this._Popcorn.trigger("IriSP.search.matchFound");
+  } else {
+    this._Popcorn.trigger("IriSP.search.noMatchFound");
+  }
+
+  for (var id in matches) {
+    if (this.svgElements.hasOwnProperty(id)) {
+      var e = this.svgElements[id];
+      this.svgElements[id].attr({fill: "#fc00ff"});
+    }
+  }
+
+  // clean up the blocks that were in the previous search
+  // but who aren't in the current one.
+  for (var id in this.oldSearchMatches) {
+    if (!matches.hasOwnProperty(id)) {
+      var e = this.svgElements[id];
+      e.attr({fill: e.color});
+    }
+  }
+  
+  this.oldSearchMatches = matches;
+};
+
+IriSP.PolemicWidget.prototype.searchFieldClearedHandler = function() {
+  // clean up the blocks that were in the previous search
+  // but who aren't in the current one.
+  for (var id in this.oldSearchMatches) {
+      var e = this.svgElements[id];
+      e.attr({fill: e.color});
+  }
+ 
+};
+
+IriSP.PolemicWidget.prototype.searchFieldClosedHandler = function() {
+  // clean up the blocks that were in the previous search
+  // but who aren't in the current one.
+  for (var id in this.oldSearchMatches) {
+      var e = this.svgElements[id];
+      e.attr({fill: e.color});
+  }
+ 
+};
+   
+IriSP.SegmentsWidget = function(Popcorn, config, Serializer) {
+
+  var self = this;
+  IriSP.Widget.call(this, Popcorn, config, Serializer);
+  this.oldSearchMatches = [];
+
+  // event handlers
+  this._Popcorn.listen("IriSP.search", function(searchString) { self.searchHandler.call(self, searchString); });
+  this._Popcorn.listen("IriSP.search.closed", function() { self.searchFieldClosedHandler.call(self); });
+  this._Popcorn.listen("IriSP.search.cleared", function() { self.searchFieldClearedHandler.call(self); });
+};
+
+IriSP.SegmentsWidget.prototype = new IriSP.Widget();
+
+/* Get the width of a segment, in pixels. */
+IriSP.SegmentsWidget.prototype.segmentToPixel = function(annotation) {  
+  var begin = Math.round((+ annotation.begin) / 1000);
+  var end = Math.round((+ annotation.end) / 1000);    
+  var duration = this._serializer.currentMedia().meta["dc:duration"] / 1000;
+  
+  var startPourcent 	= IriSP.timeToPourcent(begin, duration);
+  var startPixel = Math.floor(this.selector.parent().width() * (startPourcent / 100));
+  
+  var endPourcent 	= Math.floor(IriSP.timeToPourcent(end, duration) - startPourcent);
+  var endPixel = Math.floor(this.selector.parent().width() * (endPourcent / 100));
+  
+  return endPixel;
+};
+
+/* compute the total length of a group of segments */
+IriSP.SegmentsWidget.prototype.segmentsLength = function(segmentsList) {
+  var self = this;
+  var total = 0;
+  
+  for (var i = 0; i < segmentsList.length; i++)
+    total += self.segmentToPixel(segmentsList[i].annotation);
+  
+  return total;  
+};
+
+IriSP.SegmentsWidget.prototype.draw = function() {
+
+  var self = this;
+  var annotations = this._serializer._data.annotations;
+
+  this.selector.addClass("Ldt-SegmentsWidget");
+  this.selector.append(Mustache.to_html(IriSP.overlay_marker_template));
+          
+  var view_type = this._serializer.getNonTweetIds()[0];    
+  
+  this.positionMarker = this.selector.children(":first");
+  
+  this._Popcorn.listen("timeupdate", IriSP.wrap(this, this.positionUpdater));
+  
+  
+  var i = 0;
+  
+  var segments_annotations = [];
+  
+  for (i = 0; i < annotations.length; i++) {
+    var annotation = annotations[i];
+
+    /* filter the annotations whose type is not the one we want */
+    if (view_type != "" && typeof(annotation.meta) !== "undefined" && typeof(annotation.meta["id-ref"]) !== "undefined"
+          && annotation.meta["id-ref"] != view_type) {
+        continue;
+    }
+
+    segments_annotations.push(annotation);
+  }
+    
+  var totalWidth = this.selector.width() - segments_annotations.length;
+  var lastSegment = IriSP.underscore.max(segments_annotations, function(annotation) { return annotation.end; });
+  
+  for (i = 0; i < segments_annotations.length; i++) {
+  
+    var annotation = segments_annotations[i];
+    var begin = (+ annotation.begin);
+    var end = (+ annotation.end);
+    var duration = this._serializer.currentMedia().meta["dc:duration"];
+    var id = annotation.id;
+        
+    var startPixel = Math.floor(this.selector.parent().width() * (begin / duration));
+
+    var endPixel = Math.floor(this.selector.parent().width() * (end / duration));
+    
+    if (annotation.id !== lastSegment.id) 
+      var pxWidth = endPixel - startPixel -1;
+    else
+      /* the last segment has no segment following it */
+      var pxWidth = endPixel - startPixel;
+ 
+    var divTitle = (annotation.content.title + " - " + annotation.content.description).substr(0,55);
+
+    if (typeof(annotation.content.color) !== "undefined")
+      var color = annotation.content.color;
+    else
+      var color = annotation.color;
+    
+    var hexa_color = IriSP.DEC_HEXA_COLOR(color);
+
+    if (hexa_color === "FFCC00")
+      hexa_color = "333";
+    if (hexa_color.length == 4)
+      hexa_color = hexa_color + '00';
+    
+    var annotationTemplate = Mustache.to_html(IriSP.annotation_template,
+        {"divTitle" : divTitle, "id" : id, "startPixel" : startPixel,
+        "pxWidth" : pxWidth, "hexa_color" : hexa_color,
+        "seekPlace" : Math.round(begin/1000)});
+
+        
+    this.selector.append(annotationTemplate);
+    
+    /* add a special class to the last segment and change its border */
+    if (annotation.id === lastSegment.id) {
+        this.selector.find("#" + id).addClass("Ldt-lastSegment");        
+        this.selector.find(".Ldt-lastSegment").css("border-color", "#" + hexa_color);        
+    }
+
+    IriSP.jQuery("#" + id).fadeTo(0, 0.3);
+
+    IriSP.jQuery("#" + id).mouseover(
+    /* we wrap the handler in another function because js's scoping
+       rules are function-based - otherwise, the internal vars like
+       divTitle are preserved but they are looked-up from the draw
+       method scope, so after that the loop is run, so they're not
+       preserved */
+    (function(divTitle) { 
+     return function(event) {
+          IriSP.jQuery(this).animate({opacity: 0.6}, 5);
+          var offset = IriSP.jQuery(this).offset();
+          var correction = IriSP.jQuery(this).outerWidth() / 2;
+
+          var offset_x = offset.left + correction - 106;
+          if (offset_x < 0)
+            offset_x = 0;
+                    
+          self.TooltipWidget.show(divTitle, color, offset_x, event.pageY - 160);
+    } })(divTitle)).mouseout(function(){
+      IriSP.jQuery(this).animate({opacity: 0.3}, 5);
+      self.TooltipWidget.hide();
+    });
+
+    IriSP.jQuery("#" + id).click(function(_this, annotation) {
+                                    return function() { _this.clickHandler(annotation)};
+                                 }(this, annotation));
+  }
+};
+
+/* restores the view after a search */
+IriSP.SegmentsWidget.prototype.clear = function() {
+  this.selector.children(".Ldt-iri-chapter").animate({opacity:0.3}, 100);
+};
+
+IriSP.SegmentsWidget.prototype.clickHandler = function(annotation) {
+  this._Popcorn.trigger("IriSP.SegmentsWidget.click", annotation.id);
+  var begin = (+ annotation.begin) / 1000;
+  this._Popcorn.currentTime(Math.round(begin));
+};
+
+IriSP.SegmentsWidget.prototype.searchHandler = function(searchString) {
+
+  if (searchString == "")
+    return;
+
+  var matches = this._serializer.searchOccurences(searchString);
+
+  if (IriSP.countProperties(matches) > 0) {
+    this._Popcorn.trigger("IriSP.search.matchFound");
+  } else {
+    this._Popcorn.trigger("IriSP.search.noMatchFound");
+  }
+
+  // un-highlight all the blocks
+  this.selector.children(".Ldt-iri-chapter").css("opacity", 0.1);
+ 
+  // then highlight the ones with matches.
+  for (var id in matches) {
+    var factor = 0.5 + matches[id] * 0.2;
+    this.selector.find("#"+id).dequeue();
+    this.selector.find("#"+id).animate({opacity:factor}, 200);
+  }
+
+ 
+  this.oldSearchMatches = matches;
+};
+
+IriSP.SegmentsWidget.prototype.searchFieldClearedHandler = function() {
+  this.clear();
+};
+
+IriSP.SegmentsWidget.prototype.searchFieldClosedHandler = function() {
+  this.clear();
+};
+
+IriSP.SegmentsWidget.prototype.positionUpdater = function() {  
+  var duration = this._serializer.currentMedia().meta["dc:duration"] / 1000;
+  var time = this._Popcorn.currentTime();
+  //var position 	= ((time / duration) * 100).toFixed(2);
+  var position 	= ((time / duration) * 100).toFixed(2);
+
+  this.positionMarker.css("left", position + "%");  
+};
+IriSP.SliderWidget = function(Popcorn, config, Serializer) {
+  IriSP.Widget.call(this, Popcorn, config, Serializer);
+};
+
+IriSP.SliderWidget.prototype = new IriSP.Widget();
+
+IriSP.SliderWidget.prototype.draw = function() {
+  var self = this;
+
+  this.selector.append(Mustache.to_html(IriSP.sliderWidget_template, {}));
+  this.selector.addClass("Ldt-SliderMinimized");
+
+  this.sliderBackground = this.selector.find(".Ldt-sliderBackground");
+  this.sliderForeground = this.selector.find(".Ldt-sliderForeground");
+  this.positionMarker = this.selector.find(".Ldt-sliderPositionMarker");
+
+
+  // a special variable to stop methods from tinkering
+  // with the positionMarker when the user is dragging it
+  this.draggingOngoing = false;
+
+  // another special variable used by the timeout handler to
+  // open or close the slider.
+  this.sliderMaximized = false;
+  this.timeOutId = null;
+
+  
+  this.positionMarker.draggable({axis: "x",
+  start: IriSP.wrap(this, this.positionMarkerDraggingStartedHandler),
+  stop: IriSP.wrap(this, this.positionMarkerDraggedHandler),
+  containment: "parent"
+  });
+  this.positionMarker.css("position", "absolute");
+  
+  this.sliderBackground.click(function(event) { self.backgroundClickHandler.call(self, event); });
+  this.sliderForeground.click(function(event) { self.foregroundClickHandler.call(self, event); });
+
+  this.selector.hover(IriSP.wrap(this, this.mouseOverHandler), IriSP.wrap(this, this.mouseOutHandler));
+
+  // update the positions
+  this._Popcorn.listen("timeupdate", IriSP.wrap(this, this.sliderUpdater));
+
+  // special messages :
+  this._Popcorn.listen("IriSP.PlayerWidget.MouseOver", IriSP.wrap(this, this.mouseOverHandler));
+  this._Popcorn.listen("IriSP.PlayerWidget.MouseOut", IriSP.wrap(this, this.mouseOutHandler));
+};
+
+/* update the slider and the position marker as time passes */
+IriSP.SliderWidget.prototype.sliderUpdater = function() {
+  if(this.draggingOngoing || this._disableUpdate)
+    return;
+  
+  var time = this._Popcorn.currentTime();
+
+  var duration = this._serializer.currentMedia().meta["dc:duration"] / 1000;
+  var percent = ((time / duration) * 100).toFixed(2);
+  
+  /* we do these complicated calculations to center exactly
+     the position Marker */
+  var pixels_to_percents = 100 / this.selector.width(); /* how much is a pixel in percents */
+  var positionMarker_width = this.positionMarker.width();
+  var correction = (pixels_to_percents * positionMarker_width) / 2;
+
+  var newPos = percent - correction;
+  if (newPos <= 0)
+    newPos = 0;
+  
+	this.sliderForeground.css("width", percent + "%");
+	this.positionMarker.css("left", newPos + "%");
+
+};
+
+IriSP.SliderWidget.prototype.backgroundClickHandler = function(event) {
+  /* this piece of code is a little bit convoluted - here's how it works :
+     we want to handle clicks on the progress bar and convert those to seeks in the media.
+     However, jquery only gives us a global position, and we want a number of pixels relative
+     to our container div, so we get the parent position, and compute an offset to this position,
+     and finally compute the progress ratio in the media.
+     Finally we multiply this ratio with the duration to get the correct time
+  */
+
+  var parentOffset = this.sliderBackground.parent().offset();
+  var width = this.sliderBackground.width();
+  var relX = event.pageX - parentOffset.left;
+
+  var duration = this._serializer.currentMedia().meta["dc:duration"] / 1000;
+  var newTime = ((relX / width) * duration).toFixed(2);
+
+  this._Popcorn.currentTime(newTime);
+};
+
+/* same function as the previous one, except that it handles clicks
+   on the foreground element */
+IriSP.SliderWidget.prototype.foregroundClickHandler = function(event) {
+  var parentOffset = this.sliderForeground.parent().offset();
+  var width = this.sliderBackground.width();
+  var relX = event.pageX - parentOffset.left;
+
+  var duration = this._serializer.currentMedia().meta["dc:duration"] / 1000;
+  var newTime = ((relX / width) * duration).toFixed(2);
+
+  this._Popcorn.currentTime(newTime);
+};
+
+/* handles mouse over the slider */
+IriSP.SliderWidget.prototype.mouseOverHandler = function(event) {
+  
+  if (this.timeOutId !== null) {
+    window.clearTimeout(this.timeOutId);
+  }
+ 
+  this.sliderMaximized = true;
+
+  this.sliderBackground.animate({"height": "9px"}, 100);
+  this.sliderForeground.animate({"height": "9px"}, 100);
+  this.positionMarker.animate({"height": "9px", "width": "9px"}, 100);
+  //this.positionMarker.css("margin-top", "-4px");
+  
+//  this.selector.removeClass("Ldt-SliderMinimized");
+//  this.selector.addClass("Ldt-SliderMaximized");
+};
+
+/* handles when the mouse leaves the slider */
+IriSP.SliderWidget.prototype.mouseOutHandler = function(event) {
+
+  this.timeOutId = window.setTimeout(IriSP.wrap(this, this.minimizeOnTimeout),
+                                     IriSP.widgetsDefaults.SliderWidget.minimize_period);
+};
+
+IriSP.SliderWidget.prototype.minimizeOnTimeout = function(event) {
+  this.sliderBackground.animate({"height": "5px"}, 100);
+  this.sliderForeground.animate({"height": "5px"}, 100);
+  this.positionMarker.animate({"height": "5px", "width": "5px"}, 100);
+  this.positionMarker.css("margin-top", "0px");
+  this.sliderMinimized = true;
+  
+//  this.selector.removeClass("Ldt-SliderMaximized");
+//  this.selector.addClass("Ldt-SliderMinimized");
+
+};
+
+// called when the user starts dragging the position indicator
+IriSP.SliderWidget.prototype.positionMarkerDraggingStartedHandler = function(event, ui) {  
+  this.draggingOngoing = true;
+};
+
+IriSP.SliderWidget.prototype.positionMarkerDraggedHandler = function(event, ui) {   
+  this._disableUpdate = true; // disable slider position updates while dragging is ongoing.
+  window.setTimeout(IriSP.wrap(this, function() { this._disableUpdate = false; }), 500);
+
+  var parentOffset = this.sliderForeground.parent().offset();
+  var width = this.sliderBackground.width();
+  var relX = event.pageX - parentOffset.left;
+
+  var duration = this._serializer.currentMedia().meta["dc:duration"] / 1000;
+  var newTime = ((relX / width) * duration).toFixed(2);
+
+  this._Popcorn.currentTime(newTime);
+  
+  this.draggingOngoing = false;
+};
+
+/* this widget displays a small tooltip */
+IriSP.TooltipWidget = function(Popcorn, config, Serializer) {
+  IriSP.Widget.call(this, Popcorn, config, Serializer);
+  this._shown = false;
+  this._displayedText = "";
+  this._hideTimeout = -1;
+};
+
+
+IriSP.TooltipWidget.prototype = new IriSP.Widget();
+
+IriSP.TooltipWidget.prototype.draw = function() {
+  var templ = Mustache.to_html(IriSP.tooltipWidget_template);
+
+  this.selector.append(templ);
+  this.hide();
+
+};
+
+IriSP.TooltipWidget.prototype.clear = function() {
+	this.selector.find(".tiptext").text("");
+};
+
+IriSP.TooltipWidget.prototype.show = function(text, color, x, y) {
+
+  if (this._displayedText == text)
+    return;
+  
+  this.selector.find(".tipcolor").css("background-color", color);
+  this._displayedText = text;
+	this.selector.find(".tiptext").text(text);
+  //this.selector.find(".tip").css("left", x).css("top", y);  
+  this.selector.find(".tip").css("left", x).css("top", y);
+  this.selector.find(".tip").show();
+  this._shown = true;
+};
+
+IriSP.TooltipWidget.prototype.hide = function() {                                                   
+  this.selector.find(".tip").hide();
+  this._shown = false;  
+};/* a widget that displays tweet - used in conjunction with the polemicWidget */
+
+IriSP.TweetsWidget = function(Popcorn, config, Serializer) {
+  IriSP.Widget.call(this, Popcorn, config, Serializer);
+
+  this._displayingTweet = false;
+  this._timeoutId = undefined;  
+};
+
+
+IriSP.TweetsWidget.prototype = new IriSP.Widget();
+
+
+IriSP.TweetsWidget.prototype.drawTweet = function(annotation) {
+    
+    var title = IriSP.formatTweet(annotation.content.title);
+    var img = annotation.content.img.src;
+    if (typeof(img) === "undefined" || img === "" || img === "None") {
+      img = IriSP.widgetsDefaults.TweetsWidget.default_profile_picture;
+    }
+
+    var imageMarkup = IriSP.templToHTML("<img src='{{src}}' alt='user image'></img>", 
+                                       {src : img});
+    
+    if (typeof(annotation.meta["dc:source"].content) !== "undefined") {
+      var tweetContents = JSON.parse(annotation.meta["dc:source"].content);
+      var creator = tweetContents.user.screen_name;
+      var real_name = tweetContents.user.name;
+
+      imageMarkup = IriSP.templToHTML("<a href='http://twitter.com/{{creator}}'><img src='{{src}}' alt='user image'></img></a>", 
+                                       {src : img, creator: creator});
+            
+      var formatted_date = new Date(tweetContents.created_at).toLocaleDateString();
+      title = IriSP.templToHTML("<a class='Ldt-tweet_userHandle' href='http://twitter.com/{{creator}}'>@{{creator}}</a> - " + 
+                                "<div class='Ldt-tweet_realName'>{{real_name}}</div>" +
+                                "<div class='Ldt-tweet_tweetContents'>{{{ contents }}}</div>" +
+                                "<div class='Ldt-tweet_date'>{{ date }}</div>", 
+                                {creator: creator, real_name: real_name, contents : title, date : formatted_date});
+
+      this.selector.find(".Ldt-TweetReply").attr("href", "http://twitter.com/home?status=@" + creator + ":%20");
+
+
+      var rtText = Mustache.to_html("http://twitter.com/home?status=RT @{{creator}}: {{text}}",
+                                    {creator: creator, text: IriSP.encodeURI(annotation.content.title)});
+      this.selector.find(".Ldt-Retweet").attr("href", rtText);
+    }
+
+    this.selector.find(".Ldt-tweetContents").html(title);
+    this.selector.find(".Ldt-tweetAvatar").html(imageMarkup);
+    this.selector.show("blind", 250); 
+};
+
+IriSP.TweetsWidget.prototype.displayTweet = function(annotation) {
+  if (this._displayingTweet === false) {
+    this._displayingTweet = true;
+  } else {
+    window.clearTimeout(this._timeoutId);
+  }
+
+  this.drawTweet(annotation);
+
+  var time = this._Popcorn.currentTime();  
+  this._timeoutId = window.setTimeout(IriSP.wrap(this, this.clearPanel), IriSP.widgetsDefaults.TweetsWidget.tweet_display_period);
+};
+
+
+IriSP.TweetsWidget.prototype.clearPanel = function() {  
+    this._displayingTweet = false;
+    this._timeoutId = undefined;
+    this.closePanel();
+    
+};
+
+IriSP.TweetsWidget.prototype.closePanel = function() {
+    if (this._timeoutId != undefined) {
+      /* we're called from the "close window" link */
+      /* cancel the timeout */
+      window.clearTimeout(this._timeoutId);
+      this._timeoutId = null;
+    }
+    
+    this.selector.hide("blind", 400);
+    
+};
+
+/* cancel the timeout if the user clicks on the keep panel open button */
+IriSP.TweetsWidget.prototype.keepPanel = function() {
+    if (this._timeoutId != undefined) {
+      /* we're called from the "close window" link */
+      /* cancel the timeout */
+      window.clearTimeout(this._timeoutId);
+      this._timeoutId = null;
+    }
+};
+
+IriSP.TweetsWidget.prototype.draw = function() {
+  var _this = this;
+  
+  var tweetMarkup = IriSP.templToHTML(IriSP.tweetWidget_template, {"share_template" : IriSP.share_template});
+  this.selector.append(tweetMarkup);
+  this.selector.hide();
+  this.selector.find(".Ldt-tweetWidgetMinimize").click(IriSP.wrap(this, this.closePanel));
+  this.selector.find(".Ldt-tweetWidgetKeepOpen").click(IriSP.wrap(this, this.keepPanel));
+  
+  this._Popcorn.listen("IriSP.PolemicTweet.click", IriSP.wrap(this, this.PolemicTweetClickHandler));
+};
+
+IriSP.TweetsWidget.prototype.PolemicTweetClickHandler = function(tweet_id) {  
+  var index, annotation;
+  for (index in this._serializer._data.annotations) {
+    annotation = this._serializer._data.annotations[index];
+    
+    if (annotation.id === tweet_id)
+      break;
+  }
+    
+  if (annotation.id !== tweet_id)
+      /* we haven't found it */
+      return;
+  
+  this.displayTweet(annotation);
+  return;
+};
+
+IriSP.JSONSerializer = function(DataLoader, url) {
+  IriSP.Serializer.call(this, DataLoader, url);
+};
+
+IriSP.JSONSerializer.prototype = new IriSP.Serializer();
+
+IriSP.JSONSerializer.prototype.serialize = function(data) {
+  return JSON.stringify(data);
+};
+
+IriSP.JSONSerializer.prototype.deserialize = function(data) {
+  return JSON.parse(data);
+};
+
+IriSP.JSONSerializer.prototype.sync = function(callback) {
+  /* we don't have to do much because jQuery handles json for us */
+
+  var self = this;
+
+  var fn = function(data) {      
+      self._data = data;      
+      // sort the data too     
+      self._data["annotations"].sort(function(a, b) 
+          { var a_begin = +a.begin;
+            var b_begin = +b.begin;
+            return a_begin - b_begin;
+          });
+     
+      callback(data);      
+  };
+  
+  this._DataLoader.get(this._url, fn);
+};
+
+IriSP.JSONSerializer.prototype.currentMedia = function() {  
+  return this._data.medias[0]; /* FIXME: don't hardcode it */
+};
+
+/* this function searches for an annotation which matches title, description and keyword 
+   "" matches any field. 
+   Note: it ignores tweets.
+*/    
+IriSP.JSONSerializer.prototype.searchAnnotations = function(title, description, keyword) {
+    /* we can have many types of annotations. We want search to only look for regular segments */
+    /* the next two lines are a bit verbose because for some test data, _serializer.data.view is either
+       null or undefined.
+    */
+    var view;
+
+    if (typeof(this._data.views) !== "undefined" && this._data.views !== null)
+       view = this._data.views[0];
+
+    var searchViewType = "";
+
+    if(typeof(view) !== "undefined" && typeof(view.annotation_types) !== "undefined" && view.annotation_types.length > 1) {
+            searchViewType = view.annotation_types[0];
+    }
+
+    var filterfn = function(annotation) {
+      if( searchViewType  != "" && 
+          typeof(annotation.meta) !== "undefined" && 
+          typeof(annotation.meta["id-ref"]) !== "undefined" &&
+          annotation.meta["id-ref"] !== searchViewType) {
+        return true; // don't pass
+      } else {
+          return false;
+      }
+    };
+
+    return this.searchAnnotationsFilter(title, description, keyword, filterfn);
+
+};
+
+/* only look for tweets */
+IriSP.JSONSerializer.prototype.searchTweets = function(title, description, keyword) {
+    /* we can have many types of annotations. We want search to only look for regular segments */
+    /* the next two lines are a bit verbose because for some test data, _serializer.data.view is either
+       null or undefined.
+    */
+    var view;
+
+    if (typeof(this._data.views) !== "undefined" && this._data.views !== null)
+       view = this._data.views[0];
+
+    var searchViewType = "";
+
+    if(typeof(view) !== "undefined" && typeof(view.annotation_types) !== "undefined" && view.annotation_types.length > 1) {
+            searchViewType = view.annotation_types[0];
+    }
+
+    var filterfn = function(annotation) {
+      if( searchViewType  != "" && 
+          typeof(annotation.meta) !== "undefined" && 
+          typeof(annotation.meta["id-ref"]) !== "undefined" &&
+          annotation.meta["id-ref"] !== searchViewType) {
+        return false; // pass
+      } else {
+          return true;
+      }
+    };
+
+    return this.searchAnnotationsFilter(title, description, keyword, filterfn);
+
+};
+
+/*
+  the previous function call this one, which is more general:
+ */    
+IriSP.JSONSerializer.prototype.searchAnnotationsFilter = function(title, description, keyword, filter) {
+
+    var rTitle;
+    var rDescription;
+    var rKeyword;
+    /* match anything if given the empty string */
+    if (title == "")
+      title = ".*";
+    if (description == "")
+      description = ".*";
+    if (keyword == "")
+      keyword = ".*";
+    
+    rTitle = new RegExp(title, "i");  
+    rDescription = new RegExp(description, "i");  
+    rKeyword = new RegExp(keyword, "i");  
+    
+    var ret_array = [];
+    
+    var i;
+    for (i in this._data.annotations) {
+      var annotation = this._data.annotations[i];
+      
+      /* filter the annotations whose type is not the one we want */
+      if (filter(annotation)) {
+          continue;
+      }
+      
+      if (rTitle.test(annotation.content.title) && 
+          rDescription.test(annotation.content.description)) {
+          /* FIXME : implement keyword support */
+          ret_array.push(annotation);
+      }
+    }
+    
+    return ret_array;
+};
+
+/* breaks a string in words and searches each of these words. Returns an array
+   of objects with the id of the annotation and its number of occurences.
+   
+   FIXME: optimize ? seems to be n^2 in the worst case.
+*/
+IriSP.JSONSerializer.prototype.searchOccurences = function(searchString) {
+  var ret = { };
+  var keywords = searchString.split(/\s+/);
+  
+  for (var i in keywords) {
+    var keyword = keywords[i];
+    
+    // search this keyword in descriptions and title
+    var found_annotations = []
+    found_annotations = found_annotations.concat(this.searchAnnotations(keyword, "", ""));
+    found_annotations = found_annotations.concat(this.searchAnnotations("", keyword, ""));
+    
+    for (var j in found_annotations) {
+      var current_annotation = found_annotations[j];
+      
+      if (!ret.hasOwnProperty(current_annotation.id)) {
+        ret[current_annotation.id] = 1;
+      } else {
+        ret[current_annotation.id] += 1;
+      }
+      
+    }
+
+  };
+  
+  return ret;
+};
+
+/* breaks a string in words and searches each of these words. Returns an array
+   of objects with the id of the annotation and its number of occurences.
+   
+   FIXME: optimize ? seems to be n^2 in the worst case.
+*/
+IriSP.JSONSerializer.prototype.searchTweetsOccurences = function(searchString) {
+  var ret = { };
+  var keywords = searchString.split(/\s+/);
+  
+  for (var i in keywords) {
+    var keyword = keywords[i];
+    
+    // search this keyword in descriptions and title
+    var found_annotations = []
+    found_annotations = found_annotations.concat(this.searchTweets(keyword, "", ""));
+    found_annotations = found_annotations.concat(this.searchTweets("", keyword, ""));
+    
+    for (var j in found_annotations) {
+      var current_annotation = found_annotations[j];
+      
+      if (!ret.hasOwnProperty(current_annotation.id)) {
+        ret[current_annotation.id] = 1;
+      } else {
+        ret[current_annotation.id] += 1;
+      }
+      
+    }
+
+  };
+  
+  return ret;
+};
+
+/* takes the currentTime and returns all the annotations that are displayable at the moment 
+   NB: only takes account the first type of annotations - ignores tweets 
+   currentTime is in seconds.
+ */
+
+IriSP.JSONSerializer.prototype.currentAnnotations = function(currentTime) {
+  var view;
+  var currentTimeMs = 1000 * currentTime;
+
+  if (typeof(this._data.views) !== "undefined" && this._data.views !== null)
+     view = this._data.views[0];
+
+  var view_type = "";
+
+  if(typeof(view) !== "undefined" && typeof(view.annotation_types) !== "undefined" && view.annotation_types.length >= 1) {
+          view_type = view.annotation_types[0];
+  }
+
+  var ret_array = [];
+  
+  var i;
+ 
+  for (i in this._data.annotations) {
+    var annotation = this._data.annotations[i];
+    
+    if (annotation.meta["id-ref"] === view_type && annotation.begin <= currentTimeMs && annotation.end >= currentTimeMs)
+      ret_array.push(annotation);
+  }
+
+  return ret_array;
+};
+
+
+/* this function returns a list of ids of tweet lines */
+IriSP.JSONSerializer.prototype.getTweetIds = function() {
+  if (typeof(this._data.lists) === "undefined" || this._data.lists === null)
+    return [];
+
+  var tweetsId = [];
+  
+  /* first get the list containing the tweets */
+  var tweets = IriSP.underscore.filter(this._data.lists, function(entry) { return entry.id.indexOf("tweet") !== -1 });
+  
+  // FIXME: collect tweets from multiple sources ?
+  tweetsId = IriSP.underscore.pluck(tweets[0].items, "id-ref");
+
+  return tweetsId;
+};
+
+/* this function returns a list of lines which are not tweet lines */
+IriSP.JSONSerializer.prototype.getNonTweetIds = function() {
+  if (typeof(this._data.lists) === "undefined" || this._data.lists === null)
+    return [];
+  
+  /* get all the ids */
+  var ids = IriSP.underscore.map(this._data.lists, function(entry) {                                                         
+                                                         return IriSP.underscore.pluck(entry.items, "id-ref"); });
+                                                         
+  var illegal_values = this.getTweetIds();
+  return IriSP.underscore.difference(ids, illegal_values);
+  
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/README.txt	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,183 @@
+======================================================================
+
+DESCRIPTION:
+
+This is the source code for JsDoc Toolkit, an automatic documentation
+generation tool for JavaScript. It is written in JavaScript and is run
+from a command line (or terminal) using Java and Mozilla's Rhino
+JavaScript runtime engine.
+
+Using this tool you can automatically turn JavaDoc-like comments in
+your JavaScript source code into published output files, such as HTML
+or XML.
+
+For more information, to report a bug, or to browse the technical
+documentation for this tool please visit the official JsDoc Toolkit
+project homepage at http://code.google.com/p/jsdoc-toolkit/
+
+For the most up-to-date documentation on JsDoc Toolkit see the 
+official wiki at http://code.google.com/p/jsdoc-toolkit/w/list
+
+======================================================================
+
+REQUIREMENTS:
+
+JsDoc Toolkit is known to work with:
+java version "1.6.0_03"
+Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
+on Windows XP,
+and java version "1.5.0_19"
+Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_19-b02-304)
+on Mac OS X 10.5.
+
+Other versions of java may or may not work with JsDoc Toolkit.
+
+======================================================================
+
+USAGE:
+
+Running JsDoc Toolkit requires you to have Java installed on your
+computer. For more information see http://www.java.com/getjava/
+
+Before running the JsDoc Toolkit app you should change your current
+working directory to the jsdoc-toolkit folder. Then follow the
+examples below, or as shown on the project wiki.
+
+On a computer running Windows a valid command line to run JsDoc
+Toolkit might look like this:
+
+> java -jar jsrun.jar app\run.js -a -t=templates\jsdoc mycode.js
+
+On Mac OS X or Linux the same command would look like this:
+
+$ java -jar jsrun.jar app/run.js -a -t=templates/jsdoc mycode.js
+
+The above assumes your current working directory contains jsrun.jar,
+the "app" and "templates" subdirectories from the standard JsDoc
+Toolkit distribution and that the relative path to the code you wish
+to document is "mycode.js".
+
+The output documentation files will be saved to a new directory named
+"out" (by default) in the current directory, or if you specify a
+-d=somewhere_else option, to the somewhere_else directory.
+
+For help (usage notes) enter this on the command line:
+
+$ java -jar jsrun.jar app/run.js --help
+
+More information about the various command line options used by JsDoc
+Toolkit are available on the project wiki.
+
+======================================================================
+
+RUNNING VIA SHELL SCRIPT
+
+Avi Deitcher has contributed the file jsrun.sh with the following usage notes:
+
+A script to simplify running jsdoc from the command-line, especially when
+running from within a development or build environment such as ant.
+
+Normally, to run jsdoc, you need a command-line as the following:
+java -Djsdoc.dir=/some/long/dir/path/to/jsdoc -jar
+/some/long/dir/path/to/jsdoc/jsrun.jar /some/long/dir/path/to/jsdoc/app/run.js
+-t=template -r=4 /some/long/dir/path/to/my/src/code
+
+This can get tedious to redo time and again, and difficult to use from within a build environment.
+
+To simplify the process, jsrun.sh will automatically run this path, as well as passing through any arguments.
+
+Usage: jsrun.sh <run.js arguments>
+
+All <run.js arguments> will be passed through.
+Additionally, jsrun.sh will take the following actions:
+1) If the environment variable JSDOCDIR is set, it will add
+"-Djsdoc.dir=$JSDOCDIR" to the command-line
+2) If the environment variable JSDOCTEMPLATEDIR is set, it will add
+"-Djsdoc.template.dir=$JSDOCTEMPLATEDIR" to the command-line
+3) java with the appropriate path to jsrun.jar and run.js will be instantiated
+
+If not variables are set, it is assumed that the path to jsrun.jar and app/ is in the current working directory.
+
+Example:
+# jsrun.sh ./src/
+Assuming JSDOCDIR=/some/path/to/my/jsdoc will cause the following command to
+execute:
+java -Djsdoc.dir=/some/path/to/my/jsdoc -jar /some/path/to/my/jsdoc/jsrun.jar
+/some/path/to/my/jsdoc/app/run.js ./src/
+
+======================================================================
+
+TESTING:
+
+To run the suite of unit tests included with JsDoc Toolkit enter this
+on the command line:
+
+$ java -jar jsrun.jar app/run.js -T
+
+To see a dump of the internal data structure that JsDoc Toolkit has
+built from your source files use this command:
+
+$ java -jar jsrun.jar app/run.js mycode.js -Z
+
+======================================================================
+
+LICENSE:
+
+JSDoc.pm
+
+This project is based on the JSDoc.pm tool, created by Michael
+Mathews and Gabriel Reid. More information on JsDoc.pm can
+be found on the JSDoc.pm homepage: http://jsdoc.sourceforge.net/
+
+Complete documentation on JsDoc Toolkit can be found on the project
+wiki at http://code.google.com/p/jsdoc-toolkit/w/list
+
+Rhino
+
+Rhino (JavaScript in Java) is open source and licensed by Mozilla
+under the MPL 1.1 or later/GPL 2.0 or later licenses, the text of
+which is available at http://www.mozilla.org/MPL/
+
+You can obtain the source code for Rhino from the Mozilla web site at
+http://www.mozilla.org/rhino/download.html
+
+JsDoc Toolkit is a larger work that uses the Rhino JavaScript engine
+but is not derived from it in any way. The Rhino library is used 
+without modification and without any claims whatsoever.
+
+The Rhino Debugger
+
+You can obtain more information about the Rhino Debugger from the 
+Mozilla web site at http://www.mozilla.org/rhino/debugger.html
+
+JsDoc Toolkit is a larger work that uses the Rhino Debugger but
+is not derived from it in any way. The Rhino Debugger is used
+without modification and without any claims whatsoever.
+
+JsDoc Toolkit
+
+All code specific to JsDoc Toolkit are free, open source and licensed
+for use under the X11/MIT License.
+
+JsDoc Toolkit is Copyright (c)2009 Michael Mathews <micmath@gmail.com>
+
+This program is free software; you can redistribute it and/or
+modify it under the terms below.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions: The above copyright notice and this
+permission notice must be included in all copies or substantial
+portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/frame.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,33 @@
+IO.include("frame/Opt.js");
+IO.include("frame/Chain.js");
+IO.include("frame/Link.js");
+IO.include("frame/String.js");
+IO.include("frame/Hash.js");
+IO.include("frame/Namespace.js");
+//IO.include("frame/Reflection.js");
+
+/** A few helper functions to make life a little easier. */
+
+function defined(o) {
+	return (o !== undefined);
+}
+
+function copy(o) { // todo check for circular refs
+	if (o == null || typeof(o) != 'object') return o;
+	var c = new o.constructor();
+	for(var p in o)	c[p] = copy(o[p]);
+	return c;
+}
+
+function isUnique(arr) {
+	var l = arr.length;
+	for(var i = 0; i < l; i++ ) {
+		if (arr.lastIndexOf(arr[i]) > i) return false;
+	}
+	return true;
+}
+
+/** Returns the given string with all regex meta characters backslashed. */
+RegExp.escapeMeta = function(str) {
+	return str.replace(/([$^\\\/()|?+*\[\]{}.-])/g, "\\$1");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/frame/Chain.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,102 @@
+/**@constructor*/
+function ChainNode(object, link) {
+	this.value = object;
+	this.link = link; // describes this node's relationship to the previous node
+}
+
+/**@constructor*/
+function Chain(valueLinks) {
+	this.nodes = [];
+	this.cursor = -1;
+	
+	if (valueLinks && valueLinks.length > 0) {
+		this.push(valueLinks[0], "//");
+		for (var i = 1, l = valueLinks.length; i < l; i+=2) {
+			this.push(valueLinks[i+1], valueLinks[i]);
+		}
+	}
+}
+
+Chain.prototype.push = function(o, link) {
+	if (this.nodes.length > 0 && link) this.nodes.push(new ChainNode(o, link));
+	else this.nodes.push(new ChainNode(o));
+}
+
+Chain.prototype.unshift = function(o, link) {
+	if (this.nodes.length > 0 && link) this.nodes[0].link = link;
+	this.nodes.unshift(new ChainNode(o));
+	this.cursor++;
+}
+
+Chain.prototype.get = function() {
+	if (this.cursor < 0 || this.cursor > this.nodes.length-1) return null;
+	return this.nodes[this.cursor];
+}
+
+Chain.prototype.first = function() {
+	this.cursor = 0;
+	return this.get();
+}
+
+Chain.prototype.last = function() {
+	this.cursor = this.nodes.length-1;
+	return this.get();
+}
+
+Chain.prototype.next = function() {
+	this.cursor++;
+	return this.get();
+}
+
+Chain.prototype.prev = function() {
+	this.cursor--;
+	return this.get();
+}
+
+Chain.prototype.toString = function() {
+	var string = "";
+	for (var i = 0, l = this.nodes.length; i < l; i++) {
+		if (this.nodes[i].link) string += " -("+this.nodes[i].link+")-> ";
+		string += this.nodes[i].value.toString();
+	}
+	return string;
+}
+
+Chain.prototype.joinLeft = function() {
+	var result = "";
+	for (var i = 0, l = this.cursor; i < l; i++) {
+		if (result && this.nodes[i].link) result += this.nodes[i].link;
+		result += this.nodes[i].value.toString();
+	}
+	return result;
+}
+
+
+/* USAGE:
+
+var path = "one/two/three.four/five-six";
+var pathChain = new Chain(path.split(/([\/.-])/));
+print(pathChain);
+
+var lineage = new Chain();
+lineage.push("Port");
+lineage.push("Les", "son");
+lineage.push("Dawn", "daughter");
+lineage.unshift("Purdie", "son");
+
+print(lineage);
+
+// walk left
+for (var node = lineage.last(); node !== null; node = lineage.prev()) {
+	print("< "+node.value);
+}
+
+// walk right
+var node = lineage.first()
+while (node !== null) {
+	print(node.value);
+	node = lineage.next();
+	if (node && node.link) print("had a "+node.link+" named");
+}
+
+*/
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/frame/Dumper.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,144 @@
+/**
+ * @class
+<pre>
+This is a lightly modified version of Kevin Jones' JavaScript
+library Data.Dump. To download the original visit:
+    <a href="http://openjsan.org/doc/k/ke/kevinj/Data/Dump/">http://openjsan.org/doc/k/ke/kevinj/Data/Dump/</a>
+
+AUTHORS
+
+The Data.Dump JavaScript module is written by Kevin Jones 
+(kevinj@cpan.org), based on Data::Dump by Gisle Aas (gisle@aas.no),
+based on Data::Dumper by Gurusamy Sarathy (gsar@umich.edu).
+
+COPYRIGHT
+
+Copyright 2007 Kevin Jones. Copyright 1998-2000,2003-2004 Gisle Aas.
+Copyright 1996-1998 Gurusamy Sarathy.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the Perl Artistic License
+
+See http://www.perl.com/perl/misc/Artistic.html
+</pre>
+ * @static
+ */
+Dumper = {
+	/** @param [...] The objects to dump. */
+	dump: function () {
+	    if (arguments.length > 1)
+	        return this._dump(arguments);
+	    else if (arguments.length == 1)
+	        return this._dump(arguments[0]);
+	    else
+	        return "()";
+	},
+	
+	_dump: function (obj) {
+		if (typeof obj == 'undefined') return 'undefined';
+		var out;
+		if (obj.serialize) { return obj.serialize(); }
+		var type = this._typeof(obj);
+		if (obj.circularReference) obj.circularReference++;
+		switch (type) {
+			case 'circular':
+				out = "{ //circularReference\n}";
+				break;
+			case 'object':
+				var pairs = new Array;
+				
+				for (var prop in obj) {
+					if (prop != "circularReference" && obj.hasOwnProperty(prop)) { //hide inherited properties
+						pairs.push(prop + ': ' + this._dump(obj[prop]));
+					}
+				}
+	
+				out = '{' + this._format_list(pairs) + '}';
+				break;
+	
+			case 'string':
+				for (var prop in Dumper.ESC) {
+					if (Dumper.ESC.hasOwnProperty(prop)) {
+						obj = obj.replace(prop, Dumper.ESC[prop]);
+					}
+				}
+	
+			// Escape UTF-8 Strings
+				if (obj.match(/^[\x00-\x7f]*$/)) {
+					out = '"' + obj.replace(/\"/g, "\\\"").replace(/([\n\r]+)/g, "\\$1") + '"';
+				}
+				else {
+					out = "unescape('"+escape(obj)+"')";
+				}
+				break;
+	
+			case 'array':
+				var elems = new Array;
+	
+				for (var i=0; i<obj.length; i++) {
+					elems.push( this._dump(obj[i]) );
+				}
+	
+				out = '[' + this._format_list(elems) + ']';
+				break;
+	
+			case 'date':
+			// firefox returns GMT strings from toUTCString()...
+			var utc_string = obj.toUTCString().replace(/GMT/,'UTC');
+				out = 'new Date("' + utc_string + '")';
+				break;
+	
+			case 'element':
+				// DOM element
+				out = this._dump_dom(obj);
+				break;
+		
+				default:
+					out = obj;
+		}
+	
+		out = String(out).replace(/\n/g, '\n    ');
+		out = out.replace(/\n    (.*)$/,"\n$1");
+	
+		return out;
+	},
+	
+	_format_list: function (list) {
+		if (!list.length) return '';
+		var nl = list.toString().length > 60 ? '\n' : ' ';
+		return nl + list.join(',' + nl) + nl;
+    },
+    
+    _typeof: function (obj) {
+    	if (obj && obj.circularReference && obj.circularReference > 1) return 'circular';
+		if (Array.prototype.isPrototypeOf(obj)) return 'array';
+		if (Date.prototype.isPrototypeOf(obj)) return 'date';
+		if (typeof obj.nodeType != 'undefined') return 'element';
+		return typeof(obj);
+	},
+	
+	_dump_dom: function (obj) {
+		return '"' + Dumper.nodeTypes[obj.nodeType] + '"';
+	}
+};
+
+Dumper.ESC = {
+    "\t": "\\t",
+    "\n": "\\n",
+    "\f": "\\f"
+};
+
+Dumper.nodeTypes = {
+    1: "ELEMENT_NODE",
+    2: "ATTRIBUTE_NODE",
+    3: "TEXT_NODE",
+    4: "CDATA_SECTION_NODE",
+    5: "ENTITY_REFERENCE_NODE",
+    6: "ENTITY_NODE",
+    7: "PROCESSING_INSTRUCTION_NODE",
+    8: "COMMENT_NODE",
+    9: "DOCUMENT_NODE",
+    10: "DOCUMENT_TYPE_NODE",
+    11: "DOCUMENT_FRAGMENT_NODE",
+    12: "NOTATION_NODE"
+};
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/frame/Hash.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,84 @@
+/**
+	@constructor
+	@example
+	var _index = new Hash();
+	_index.set("a", "apple");
+	_index.set("b", "blue");
+	_index.set("c", "coffee");
+
+	for (var p = _index.first(); p; p = _index.next()) {
+		print(p.key+" is for "+p.value);
+	}
+	
+ */
+var Hash = function() {
+	this._map = {};
+	this._keys = [];
+	this._vals = [];
+	this.reset();
+}
+
+Hash.prototype.set = function(k, v) {
+	if (k != "") {
+		this._keys.push(k);
+		this._map["="+k] = this._vals.length;
+		this._vals.push(v);
+	}
+}
+
+Hash.prototype.replace = function(k, k2, v) {
+	if (k == k2) return;
+
+	var offset = this._map["="+k];
+	this._keys[offset] = k2;
+	if (typeof v != "undefined") this._vals[offset] = v;
+	this._map["="+k2] = offset;
+	delete(this._map["="+k]);
+}
+
+Hash.prototype.drop = function(k) {
+	if (k != "") {
+		var offset = this._map["="+k];
+		this._keys.splice(offset, 1);
+		this._vals.splice(offset, 1);
+		delete(this._map["="+k]);
+		for (var p in this._map) {
+			if (this._map[p] >= offset) this._map[p]--;
+		}
+		if (this._cursor >= offset && this._cursor > 0) this._cursor--;
+	}
+}
+
+Hash.prototype.get = function(k) {
+	if (k != "") {
+		return this._vals[this._map["="+k]];
+	}
+}
+
+Hash.prototype.keys = function() {
+	return this._keys;
+}
+
+Hash.prototype.hasKey = function(k) {
+	if (k != "") {
+		return (typeof this._map["="+k] != "undefined");
+	}
+}
+
+Hash.prototype.values = function() {
+	return this._vals;
+}
+
+Hash.prototype.reset = function() {
+	this._cursor = 0;
+}
+
+Hash.prototype.first = function() {
+	this.reset();
+	return this.next();
+}
+
+Hash.prototype.next = function() {
+	if (this._cursor++ < this._keys.length)
+		return {key: this._keys[this._cursor-1], value: this._vals[this._cursor-1]};
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/frame/Link.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,173 @@
+/** Handle the creation of HTML links to documented symbols.
+	@constructor
+*/
+function Link() {
+	this.alias = "";
+	this.src = "";
+	this.file = "";
+	this.text = "";
+	this.innerName = "";
+	this.classLink = false;
+	this.targetName = "";
+	
+	this.target = function(targetName) {
+		if (defined(targetName)) this.targetName = targetName;
+		return this;
+	}
+	this.inner = function(inner) {
+		if (defined(inner)) this.innerName = inner;
+		return this;
+	}
+	this.withText = function(text) {
+		if (defined(text)) this.text = text;
+		return this;
+	}
+	this.toSrc = function(filename) {
+		if (defined(filename)) this.src = filename;
+		return this;
+	}
+	this.toSymbol = function(alias) {
+		if (defined(alias)) this.alias = new String(alias);
+		return this;
+	}
+	this.toClass = function(alias) {
+		this.classLink = true;
+		return this.toSymbol(alias);
+	}
+	this.toFile = function(file) {
+		if (defined(file)) this.file = file;
+		return this;
+	}
+	
+	this.toString = function() {
+		var linkString;
+		var thisLink = this;
+
+		if (this.alias) {
+			linkString = this.alias.replace(/(^|[^a-z$0-9_#.:^-])([|a-z$0-9_#.:^-]+)($|[^a-z$0-9_#.:^-])/i,
+				function(match, prematch, symbolName, postmatch) {
+					var symbolNames = symbolName.split("|");
+					var links = [];
+					for (var i = 0, l = symbolNames.length; i < l; i++) {
+						thisLink.alias = symbolNames[i];
+						links.push(thisLink._makeSymbolLink(symbolNames[i]));
+					}
+					return prematch+links.join("|")+postmatch;
+				}
+			);
+		}
+		else if (this.src) {
+			linkString = thisLink._makeSrcLink(this.src);
+		}
+		else if (this.file) {
+			linkString = thisLink._makeFileLink(this.file);
+		}
+
+		return linkString;
+	}
+}
+
+/** prefixed for hashes */
+Link.hashPrefix = "";
+
+/** Appended to the front of relative link paths. */
+Link.base = "";
+
+Link.symbolNameToLinkName = function(symbol) {
+	var linker = "",
+		ns = "";
+	
+	if (symbol.isStatic) linker = ".";
+	else if (symbol.isInner) linker = "-";
+	
+	if (symbol.isEvent && !/^event:/.test(symbol.name)) {
+		ns = "event:";
+	}
+	return Link.hashPrefix+linker+ns+symbol.name;
+}
+
+Link.getSymbol= function(alias) {
+    var symbol= Link.symbolSet.getSymbol(alias);
+    
+    if (symbol)
+        return symbol;
+        
+    if ('#'!==alias.charAt(0) || !Link.currentSymbol)
+        return null;
+    
+    //  resolve relative name
+    var container= Link.currentSymbol;
+    
+    while (container)
+    {
+        symbol= Link.symbolSet.getSymbol(container.alias + alias);
+        if (symbol)
+            return symbol;
+        
+        //  No superclass
+        if (!container.augments.length)
+            return null;
+        
+        container= Link.symbolSet.getSymbol(container.augments[0].desc);
+    }
+    
+    return null;
+}
+
+/** Create a link to another symbol. */
+Link.prototype._makeSymbolLink = function(alias) {
+	var linkBase = Link.base+publish.conf.symbolsDir;
+	var linkTo = Link.getSymbol(alias);
+	var linkPath;
+	var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
+
+	// if there is no symbol by that name just return the name unaltered
+	if (!linkTo)
+	    return this.text || alias;
+	
+	// it's a symbol in another file
+	else {
+		if (!linkTo.is("CONSTRUCTOR") && !linkTo.isNamespace) { // it's a method or property
+			linkPath= (Link.filemap) ? Link.filemap[linkTo.memberOf] :
+				      escape(linkTo.memberOf) || "_global_";
+				linkPath += publish.conf.ext + "#" + Link.symbolNameToLinkName(linkTo);
+		}
+		else {
+			linkPath = (Link.filemap)? Link.filemap[linkTo.alias] : escape(linkTo.alias);
+			linkPath += publish.conf.ext;// + (this.classLink? "":"#" + Link.hashPrefix + "constructor");
+		}
+		linkPath = linkBase + linkPath
+	}
+        
+	var linkText= this.text || alias;
+    
+	var link = {linkPath: linkPath, linkText: linkText, linkInner: (this.innerName? "#"+this.innerName : "")};
+	
+	if (typeof JSDOC.PluginManager != "undefined") {
+		JSDOC.PluginManager.run("onSymbolLink", link);
+	}
+	
+	return "<a href=\""+link.linkPath+link.linkInner+"\""+target+">"+link.linkText+"</a>";
+}
+
+/** Create a link to a source file. */
+Link.prototype._makeSrcLink = function(srcFilePath) {
+	var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
+		
+	// transform filepath into a filename
+	var srcFile = srcFilePath.replace(/\.\.?[\\\/]/g, "").replace(/[:\\\/]/g, "_");
+	var outFilePath = Link.base + publish.conf.srcDir + srcFile + publish.conf.ext;
+
+	if (!this.text) this.text = FilePath.fileName(srcFilePath);
+	return "<a href=\""+outFilePath+"\""+target+">"+this.text+"</a>";
+}
+
+/** Create a link to a source file. */
+Link.prototype._makeFileLink = function(filePath) {
+	var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
+		
+	var outFilePath =  Link.base + filePath;
+
+	if (!this.text) this.text = filePath;
+	return "<a href=\""+outFilePath+"\""+target+">"+this.text+"</a>";
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/frame/Namespace.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,10 @@
+_global_ = this;
+
+function Namespace(name, f) {
+	var n = name.split(".");
+	for (var o = _global_, i = 0, l = n.length; i < l; i++) {
+		o = o[n[i]] = o[n[i]] || {};
+	}
+	
+	if (f) f();
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/frame/Opt.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,134 @@
+/** @namespace */
+Opt = {
+	/**
+	 * Get commandline option values.
+	 * @param {Array} args Commandline arguments. Like ["-a=xml", "-b", "--class=new", "--debug"]
+	 * @param {object} optNames Map short names to long names. Like {a:"accept", b:"backtrace", c:"class", d:"debug"}.
+	 * @return {object} Short names and values. Like {a:"xml", b:true, c:"new", d:true}
+	 */
+	get: function(args, optNames) {
+		var opt = {"_": []}; // the unnamed option allows multiple values
+		for (var i = 0; i < args.length; i++) {
+			var arg = new String(args[i]);
+			var name;
+			var value;
+			if (arg.charAt(0) == "-") {
+				if (arg.charAt(1) == "-") { // it's a longname like --foo
+					arg = arg.substring(2);
+					var m = arg.split("=");
+					name = m.shift();
+					value = m.shift();
+					if (typeof value == "undefined") value = true;
+					
+					for (var n in optNames) { // convert it to a shortname
+						if (name == optNames[n]) {
+							name = n;
+						}
+					}
+				}
+				else { // it's a shortname like -f
+					arg = arg.substring(1);
+					var m = arg.split("=");
+					name = m.shift();
+					value = m.shift();
+					if (typeof value == "undefined") value = true;
+					
+					for (var n in optNames) { // find the matching key
+						if (name == n || name+'[]' == n) {
+							name = n;
+							break;
+						}
+					}
+				}
+				if (name.match(/(.+)\[\]$/)) { // it's an array type like n[]
+					name = RegExp.$1;
+					if (!opt[name]) opt[name] = [];
+				}
+				
+				if (opt[name] && opt[name].push) {
+					opt[name].push(value);
+				}
+				else {
+					opt[name] = value;
+				}
+			}
+			else { // not associated with any optname
+				opt._.push(args[i]);
+			}
+		}
+		return opt;
+	}
+}
+
+/*t:
+	plan(11, "Testing Opt.");
+	
+	is(
+		typeof Opt,
+		"object",
+		"Opt is an object."
+	);
+	
+	is(
+		typeof Opt.get,
+		"function",
+		"Opt.get is a function."
+	);
+	
+	var optNames = {a:"accept", b:"backtrace", c:"class", d:"debug", "e[]":"exceptions"};
+	var t_options = Opt.get(["-a=xml", "-b", "--class=new", "--debug", "-e=one", "-e=two", "foo", "bar"], optNames);
+	
+	is(
+		t_options.a,
+		"xml",
+		"an option defined with a short name can be accessed by its short name."
+	);
+	
+	is(
+		t_options.b,
+		true,
+		"an option defined with a short name and no value are true."
+	);
+	
+	is(
+		t_options.c,
+		"new",
+		"an option defined with a long name can be accessed by its short name."
+	);
+	
+	is(
+		t_options.d,
+		true,
+		"an option defined with a long name and no value are true."
+	);
+	
+	is(
+		typeof t_options.e,
+		"object",
+		"an option that can accept multiple values is defined."
+	);
+	
+	is(
+		t_options.e.length,
+		2,
+		"an option that can accept multiple values can have more than one value."
+	);
+	
+	is(
+		t_options.e[1],
+		"two",
+		"an option that can accept multiple values can be accessed as an array."
+	);
+	
+	is(
+		typeof t_options._,
+		"object",
+		"the property '_' is defined for unnamed options."
+	);
+	
+	is(
+		t_options._[0],
+		"foo",
+		"the property '_' can be accessed as an array."
+	);
+ */
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/frame/Reflection.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,26 @@
+/**@constructor*/
+function Reflection(obj) {
+	this.obj = obj;
+}
+
+Reflection.prototype.getConstructorName = function() {
+	if (this.obj.constructor.name) return this.obj.constructor.name;
+	var src = this.obj.constructor.toSource();
+	var name = src.substring(name.indexOf("function")+8, src.indexOf('(')).replace(/ /g,'');
+	return name;
+}
+
+Reflection.prototype.getMethod = function(name) {
+	for (var p in this.obj) {
+		if (p == name && typeof(this.obj[p]) == "function") return this.obj[p];
+	}
+	return null;
+}
+
+Reflection.prototype.getParameterNames = function() {
+	var src = this.obj.toSource();
+	src = src.substring(
+		src.indexOf("(", 8)+1, src.indexOf(")")
+	);
+	return src.split(/, ?/);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/frame/String.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,93 @@
+/**
+	@name String
+	@class Additions to the core string object.
+*/
+
+/** @author Steven Levithan, released as public domain. */
+String.prototype.trim = function() {
+	var str = this.replace(/^\s+/, '');
+	for (var i = str.length - 1; i >= 0; i--) {
+		if (/\S/.test(str.charAt(i))) {
+			str = str.substring(0, i + 1);
+			break;
+		}
+	}
+	return str;
+}
+/*t:
+	plan(6, "Testing String.prototype.trim.");
+	
+	var s = "   a bc   ".trim();
+	is(s, "a bc", "multiple spaces front and back are trimmed.");
+
+	s = "a bc\n\n".trim();
+	is(s, "a bc", "newlines only in back are trimmed.");
+	
+	s = "\ta bc".trim();
+	is(s, "a bc", "tabs only in front are trimmed.");
+	
+	s = "\n \t".trim();
+	is(s, "", "an all-space string is trimmed to empty.");
+	
+	s = "a b\nc".trim();
+	is(s, "a b\nc", "a string with no spaces in front or back is trimmed to itself.");
+	
+	s = "".trim();
+	is(s, "", "an empty string is trimmed to empty.");
+
+*/
+
+String.prototype.balance = function(open, close) {
+	var i = 0;
+	while (this.charAt(i) != open) {
+		if (i == this.length) return [-1, -1];
+		i++;
+	}
+	
+	var j = i+1;
+	var balance = 1;
+	while (j < this.length) {
+		if (this.charAt(j) == open) balance++;
+		if (this.charAt(j) == close) balance--;
+		if (balance == 0) break;
+		j++;
+		if (j == this.length) return [-1, -1];
+	}
+	
+	return [i, j];
+}
+/*t:
+	plan(16, "Testing String.prototype.balance.");
+	
+	var s = "{abc}".balance("{","}");
+	is(s[0], 0, "opener in first is found.");
+	is(s[1], 4, "closer in last is found.");
+	
+	s = "ab{c}de".balance("{","}");
+	is(s[0], 2, "opener in middle is found.");
+	is(s[1], 4, "closer in middle is found.");
+	
+	s = "a{b{c}de}f".balance("{","}");
+	is(s[0], 1, "nested opener is found.");
+	is(s[1], 8, "nested closer is found.");
+	
+	s = "{}".balance("{","}");
+	is(s[0], 0, "opener with no content is found.");
+	is(s[1], 1, "closer with no content is found.");
+	
+	s = "".balance("{","}");
+	is(s[0], -1, "empty string opener is -1.");
+	is(s[1], -1, "empty string closer is -1.");
+	
+	s = "{abc".balance("{","}");
+	is(s[0], -1, "opener with no closer returns -1.");
+	is(s[1], -1, "no closer returns -1.");
+	
+	s = "abc".balance("{","}");
+	is(s[0], -1, "no opener or closer returns -1 for opener.");
+	is(s[1], -1, "no opener or closer returns -1 for closer.");
+	
+	s = "a<bc}de".balance("<","}");
+	is(s[0], 1, "unmatching opener is found.");
+	is(s[1], 4, "unmatching closer is found.");
+*/
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/frame/Testrun.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,129 @@
+/**
+ * @fileOverview
+ * @name JsTestrun
+ * @author Michael Mathews micmath@gmail.com
+ * @url $HeadURL: https://jsdoc-toolkit.googlecode.com/svn/tags/jsdoc_toolkit-2.4.0/jsdoc-toolkit/app/frame/Testrun.js $
+ * @revision $Id: Testrun.js 418 2008-01-15 21:40:33Z micmath $
+ * @license <a href="http://en.wikipedia.org/wiki/MIT_License">X11/MIT License</a>
+ *          (See the accompanying README file for full details.)
+ */
+ 
+/**
+	Yet another unit testing tool for JavaScript.
+	@author Michael Mathews <a href="mailto:micmath@gmail.com">micmath@gmail.com</a>
+	@param {object} testCases Properties are testcase names, values are functions to execute as tests.
+*/
+function testrun(testCases) {
+	var ran = 0;
+	for (t in testCases) {
+		var result = testCases[t]();
+		ran++;
+	}
+	
+	return testrun.reportOut+"-------------------------------\n"+((testrun.fails>0)? ":( Failed "+testrun.fails+"/" : ":) Passed all ")+testrun.count+" test"+((testrun.count == 1)? "":"s")+".\n";
+}
+
+
+testrun.count = 0;
+testrun.current = null;
+testrun.passes = 0;
+testrun.fails = 0;
+testrun.reportOut = "";
+
+/** @private */
+testrun.report = function(text) {
+	testrun.reportOut += text+"\n";
+}
+
+/**
+	Check if test evaluates to true.
+	@param {string} test To be evaluated.
+	@param {string} message Optional. To be displayed in the report.
+	@return {boolean} True if the string test evaluates to true.
+*/
+ok = function(test, message) {
+	testrun.count++;
+	
+	var result;
+	try {
+		result = eval(test);
+		
+		if (result) {
+			testrun.passes++;
+			testrun.report("    OK "+testrun.count+" - "+((message != null)? message : ""));
+		}
+		else {
+			testrun.fails++;
+			testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
+		}
+	}
+	catch(e) {
+		testrun.fails++
+		testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
+
+	}
+}
+
+/**
+	Check if test is same as expected.
+	@param {string} test To be evaluated.
+	@param {string} expected
+	@param {string} message Optional. To be displayed in the report. 
+	@return {boolean} True if (test == expected). Note that the comparison is not a strict equality check.
+*/
+is = function(test, expected, message) {
+	testrun.count++;
+	
+	var result;
+	try {
+		result = eval(test);
+		
+		if (result == expected) {
+			testrun.passes++
+			testrun.report("    OK "+testrun.count+" - "+((message != null)? message : ""));
+		}
+		else {
+			testrun.fails++
+			testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
+			testrun.report("expected: "+expected);
+			testrun.report("     got: "+result);
+		}
+	}
+	catch(e) {
+		testrun.fails++
+		testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
+		testrun.report("expected: "+expected);
+		testrun.report("     got: "+result);}
+}
+
+/**
+	Check if test matches pattern.
+	@param {string} test To be evaluated.
+	@param {string} pattern Used to create a RegExp.
+	@param {string} message Optional. To be displayed in the report.
+	@return {boolean} True if test matches pattern.
+*/
+like = function(test, pattern, message) {
+	testrun.count++;
+
+	var result;
+	try {
+		result = eval(test);
+		var rgx = new RegExp(pattern);
+		
+		if (rgx.test(result)) {
+			testrun.passes++
+			testrun.report("    OK "+testrun.count+" - "+((message != null)? message : ""));
+		}
+		else {
+			testrun.fails++
+			testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
+			testrun.report("       this: "+result);
+			testrun.report("is not like: "+pattern);
+		}
+	}
+	catch(e) {
+		testrun.fails++
+		testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/handlers/FOODOC.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,26 @@
+/**
+   This is the main container for the FOODOC handler.
+   @namespace
+*/
+FOODOC = {
+};
+
+/** The current version string of this application. */
+FOODOC.VERSION = "1.0";
+
+FOODOC.handle = function(srcFile, src) {
+	LOG.inform("Handling file '" + srcFile + "'");
+	
+	return [
+		new JSDOC.Symbol(
+			"foo",
+			[],
+			"VIRTUAL",
+			new JSDOC.DocComment("/** This is a foo. */")
+		)
+	];
+};
+
+FOODOC.publish = function(symbolgroup) {
+	LOG.inform("Publishing symbolgroup.");
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/handlers/XMLDOC.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,26 @@
+/**
+ * This is the main container for the XMLDOC handler.
+ * @namespace
+ * @author Brett Fattori (bfattori@fry.com)
+ * @version $Revision: 498 $
+ */
+XMLDOC = {
+	
+};
+
+/** The current version string of this application. */
+XMLDOC.VERSION = "1.0";
+
+/** Include the library necessary to handle XML files */
+IO.includeDir("handlers/XMLDOC/");
+
+/**
+ * @type Symbol[]
+ */
+XMLDOC.handle = function(srcFile, src) {
+	
+};
+
+XMLDOC.publish = function(symbolgroup) {
+	
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/handlers/XMLDOC/DomReader.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,159 @@
+LOG.inform("XMLDOC.DomReader loaded");
+
+XMLDOC.DomReader = function(root) {
+
+   this.dom = root;
+
+   /**
+    * The current node the reader is on
+    */
+   this.node = root;
+
+   /**
+    * Get the current node the reader is on
+    * @type XMLDOC.Parser.node
+    */
+   XMLDOC.DomReader.prototype.getNode = function() {
+      return this.node;
+   };
+
+   /**
+    * Set the node the reader should be positioned on.
+    * @param node {XMLDOC.Parser.node}
+    */
+   XMLDOC.DomReader.prototype.setNode = function(node) {
+      this.node = node;
+   };
+
+   /**
+    * A helper method to make sure the current node will
+    * never return null, unless null is passed as the root.
+    * @param step {String} An expression to evaluate - should return a node or null
+    */
+   XMLDOC.DomReader.prototype.navigate = function(step) {
+      var n;
+      if ((n = step) != null)
+      {
+         this.node = n;
+         return this.node;
+      }
+      return null;
+   };
+
+   /**
+    * Get the root node of the current node's document.
+    */
+   XMLDOC.DomReader.prototype.root = function() {
+      this.navigate(this.dom);
+   };
+
+   /**
+    * Get the parent of the current node.
+    */
+   XMLDOC.DomReader.prototype.parent = function() {
+      return this.navigate(this.node.parentNode());
+   };
+
+   /**
+    * Get the first child of the current node.
+    */
+   XMLDOC.DomReader.prototype.firstChild = function() {
+      return this.navigate(this.node.firstChild());
+   };
+
+   /**
+    * Get the last child of the current node.
+    */
+   XMLDOC.DomReader.prototype.lastChild = function() {
+      return this.navigate(this.node.lastChild());
+   };
+
+   /**
+    * Get the next sibling of the current node.
+    */
+   XMLDOC.DomReader.prototype.nextSibling = function() {
+      return this.navigate(this.node.nextSibling());
+   };
+
+   /**
+    * Get the previous sibling of the current node.
+    */
+   XMLDOC.DomReader.prototype.prevSibling = function() {
+      return this.navigate(this.node.prevSibling());
+   };
+
+   //===============================================================================================
+   // Support methods
+
+   /**
+    * Walk the tree starting with the current node, calling the plug-in for
+    * each node visited.  Each time the plug-in is called, the DomReader
+    * is passed as the only parameter.  Use the {@link XMLDOC.DomReader#getNode} method
+    * to access the current node.   <i>This method uses a depth first traversal pattern.</i>
+    *
+    * @param srcFile {String} The source file being evaluated
+    */
+   XMLDOC.DomReader.prototype.getSymbols = function(srcFile)
+   {
+      XMLDOC.DomReader.symbols = [];
+      XMLDOC.DomReader.currentFile = srcFile;
+      JSDOC.Symbol.srcFile = (srcFile || "");
+
+      if (defined(JSDOC.PluginManager)) {
+         JSDOC.PluginManager.run("onDomGetSymbols", this);
+      }
+
+      return XMLDOC.DomReader.symbols;
+   };
+
+   /**
+    * Find the node with the given name using a depth first traversal.
+    * Does not modify the DomReader's current node.
+    *
+    * @param name {String} The name of the node to find
+    * @return the node that was found, or null if not found
+    */
+   XMLDOC.DomReader.prototype.findNode = function(name)
+   {
+      var findNode = null;
+
+      // Start at the current node and move into the subtree,
+      // looking for the node with the given name
+      function deeper(node, find)
+      {
+         var look = null;
+
+         if (node) {
+            if (node.name == find)
+            {
+               return node;
+            }
+
+            if (node.firstChild())
+            {
+               look = deeper(node.firstChild(), find);
+            }
+
+            if (!look && node.nextSibling())
+            {
+               look = deeper(node.nextSibling(), find);
+            }
+         }
+
+         return look;
+      }
+
+      return deeper(this.getNode().firstChild(), name);
+   };
+
+   /**
+    * Find the next node with the given name using a depth first traversal.
+    *
+    * @param name {String} The name of the node to find
+    */
+   XMLDOC.DomReader.prototype.findPreviousNode = function(name)
+   {
+   };
+
+};
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/handlers/XMLDOC/XMLDoc.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,16 @@
+LOG.inform("XMLDOC.symbolize loaded");
+
+/**
+ * Convert the source file to a set of symbols
+ */
+XMLDOC.symbolize = function(srcFile, src) {
+
+   LOG.inform("Symbolizing file '" + srcFile + "'");
+
+   // XML files already have a defined structure, so we don't need to
+   // do anything but parse them.  The DOM reader can create a symbol
+   // table from the parsed XML.
+   var dr = new XMLDOC.DomReader(XMLDOC.Parser.parse(src));
+   return dr.getSymbols(srcFile);
+
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/handlers/XMLDOC/XMLParse.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,292 @@
+LOG.inform("XMLDOC.Parser loaded");
+
+/**
+ * XML Parser object.  Returns an {@link #XMLDOC.Parser.node} which is
+ * the root element of the parsed document.
+ * <p/>
+ * By default, this parser will only handle well formed XML.  To
+ * allow the parser to handle HTML, set the <tt>XMLDOC.Parser.strictMode</tt>
+ * variable to <tt>false</tt> before calling <tt>XMLDOC.Parser.parse()</tt>.
+ * <p/>
+ * <i>Note: If you pass poorly formed XML, it will cause the parser to throw
+ * an exception.</i>
+ *
+ * @author Brett Fattori (bfattori@fry.com)
+ * @author $Author: micmath $
+ * @version $Revision: 497 $
+ */
+XMLDOC.Parser = {};
+
+/**
+ * Strict mode setting.  Setting this to false allows HTML-style source to
+ * be parsed.  Normally, well formed XML has defined end tags, or empty tags
+ * are properly formed.  Default: <tt>true</tt>
+ * @type Boolean
+ */
+XMLDOC.Parser.strictMode = true;
+
+/**
+ * A node in an XML Document.  Node types are ROOT, ELEMENT, COMMENT, PI, and TEXT.
+ * @param parent {XMLDOC.Parser.node} The parent node
+ * @param name {String} The node name
+ * @param type {String} One of the types
+ */
+XMLDOC.Parser.node = function(parent, name, type)
+{
+   this.name = name;
+   this.type = type || "ELEMENT";
+   this.parent = parent;
+   this.charData = "";
+   this.attrs = {};
+   this.nodes = [];
+   this.cPtr = 0;
+
+   XMLDOC.Parser.node.prototype.getAttributeNames = function() {
+      var a = [];
+      for (var o in this.attrs)
+      {
+         a.push(o);
+      }
+
+      return a;
+   };
+
+   XMLDOC.Parser.node.prototype.getAttribute = function(attr) {
+      return this.attrs[attr];
+   };
+
+   XMLDOC.Parser.node.prototype.setAttribute = function(attr, val) {
+      this.attrs[attr] = val;
+   };
+
+   XMLDOC.Parser.node.prototype.getChild = function(idx) {
+      return this.nodes[idx];
+   };
+
+   XMLDOC.Parser.node.prototype.parentNode = function() {
+      return this.parent;
+   };
+
+   XMLDOC.Parser.node.prototype.firstChild = function() {
+      return this.nodes[0];
+   };
+
+   XMLDOC.Parser.node.prototype.lastChild = function() {
+      return this.nodes[this.nodes.length - 1];
+   };
+
+   XMLDOC.Parser.node.prototype.nextSibling = function() {
+      var p = this.parent;
+      if (p && (p.nodes.indexOf(this) + 1 != p.nodes.length))
+      {
+         return p.getChild(p.nodes.indexOf(this) + 1);
+      }
+      return null;
+   };
+
+   XMLDOC.Parser.node.prototype.prevSibling = function() {
+      var p = this.parent;
+      if (p && (p.nodes.indexOf(this) - 1 >= 0))
+      {
+         return p.getChild(p.nodes.indexOf(this) - 1);
+      }
+      return null;
+   };
+};
+
+/**
+ * Parse an XML Document from the specified source.  The XML should be
+ * well formed, unless strict mode is disabled, then the parser will
+ * handle HTML-style XML documents.
+ * @param src {String} The source to parse
+ */
+XMLDOC.Parser.parse = function(src)
+{
+   var A = [];
+
+   // Normailize whitespace
+   A = src.split("\r\n");
+   src = A.join("\n");
+   A = src.split("\r");
+   src = A.join("\n");
+
+   // Remove XML and DOCTYPE specifier
+   src.replace(/<\?XML .*\?>/i, "");
+   src.replace(/<!DOCTYPE .*\>/i, "");
+
+   // The document is the root node and cannot be modified or removed
+   var doc = new XMLDOC.Parser.node(null, "ROOT", "DOCUMENT");
+
+   // Let's break it down
+   XMLDOC.Parser.eat(doc, src);
+
+   return doc;
+};
+
+/**
+ * The XML fragment processing routine.  This method is private and should not be called
+ * directly.
+ * @param parentNode {XMLDOC.Parser.node} The node which is the parent of this fragment
+ * @param src {String} The source within the fragment to process
+ * @private
+ */
+XMLDOC.Parser.eat = function(parentNode, src)
+{
+   // A simple tag def
+   var reTag = new RegExp("<(!|)(\\?|--|)((.|\\s)*?)\\2>","g");
+
+   // Special tag types
+   var reCommentTag = /<!--((.|\s)*?)-->/;
+   var rePITag = /<\?((.|\s)*?)\?>/;
+
+   // A start tag (with potential empty marker)
+   var reStartTag = /<(.*?)( +([\w_\-]*)=(\"|')(.*)\4)*(\/)?>/;
+
+   // An empty HTML style tag (not proper XML, but we'll accept it so we can process HTML)
+   var reHTMLEmptyTag = /<(.*?)( +([\w_\-]*)=(\"|')(.*)\4)*>/;
+
+   // Fully enclosing tag with nested tags
+   var reEnclosingTag = /<(.*?)( +([\w_\-]*)=(\"|')(.*?)\4)*>((.|\s)*?)<\/\1>/;
+
+   // Breaks down attributes
+   var reAttributes = new RegExp(" +([\\w_\\-]*)=(\"|')(.*?)\\2","g");
+
+   // Find us a tag
+   var tag;
+   while ((tag = reTag.exec(src)) != null)
+   {
+      if (tag.index > 0)
+      {
+         // The next tag has some text before it
+         var text = src.substring(0, tag.index).replace(/^[ \t\n]+((.|\n)*?)[ \t\n]+$/, "$1");
+
+         if (text.length > 0 && (text != "\n"))
+         {
+            var txtnode = new XMLDOC.Parser.node(parentNode, "", "TEXT");
+            txtnode.charData = text;
+
+            // Append the new text node
+            parentNode.nodes.push(txtnode);
+         }
+
+         // Reset the lastIndex of reTag
+         reTag.lastIndex -= src.substring(0, tag.index).length;
+
+         // Eat the text
+         src = src.substring(tag.index);
+      }
+
+      if (reCommentTag.test(tag[0]))
+      {
+         // Is this a comment?
+         var comment = new XMLDOC.Parser.node(parentNode, "", "COMMENT");
+         comment.charData = reCommentTag.exec(tag[0])[1];
+
+         // Append the comment
+         parentNode.nodes.push(comment);
+
+         // Move the lastIndex of reTag
+         reTag.lastIndex -= tag[0].length;
+
+         // Eat the tag
+         src = src.replace(reCommentTag, "");
+      }
+      else if (rePITag.test(tag[0]))
+      {
+         // Is this a processing instruction?
+         var pi = new XMLDOC.Parser.node(parentNode, "", "PI");
+         pi.charData = rePITag.exec(tag[0])[1];
+
+         // Append the processing instruction
+         parentNode.nodes.push(pi);
+
+         // Move the lastIndex of reTag
+         reTag.lastIndex -= tag[0].length;
+
+         // Eat the tag
+         src = src.replace(rePITag, "");
+      }
+      else if (reStartTag.test(tag[0]))
+      {
+         // Break it down
+         var e = reStartTag.exec(tag[0]);
+         var elem = new XMLDOC.Parser.node(parentNode, e[1], "ELEMENT");
+
+         // Get attributes from the tag
+         var a;
+         while ((a = reAttributes.exec(e[2])) != null )
+         {
+            elem.attrs[a[1]] = a[3];
+         }
+
+         // Is this an empty XML-style tag?
+         if (e[6] == "/")
+         {
+            // Append the empty element
+            parentNode.nodes.push(elem);
+
+            // Move the lastIndex of reTag (include the start tag length)
+            reTag.lastIndex -= e[0].length;
+
+            // Eat the tag
+            src = src.replace(reStartTag, "");
+         }
+         else
+         {
+            // Check for malformed XML tags
+            var htmlParsed = false;
+            var htmlStartTag = reHTMLEmptyTag.exec(src);
+
+            // See if there isn't an end tag within this block
+            var reHTMLEndTag = new RegExp("</" + htmlStartTag[1] + ">");
+            var htmlEndTag = reHTMLEndTag.exec(src);
+
+            if (XMLDOC.Parser.strictMode && htmlEndTag == null)
+            {
+               // Poorly formed XML fails in strict mode
+               var err = new Error("Malformed XML passed to XMLDOC.Parser... Error contains malformed 'src'");
+               err.src = src;
+               throw err;
+            }
+            else if (htmlEndTag == null)
+            {
+               // This is an HTML-style empty tag, store the element for it in non-strict mode
+               parentNode.nodes.push(elem);
+
+               // Eat the tag
+               src = src.replace(reHTMLEmptyTag, "");
+               htmlParsed = true;
+            }
+
+            // If we didn't parse HTML-style, it must be an enclosing tag
+            if (!htmlParsed)
+            {
+               var enc = reEnclosingTag.exec(src);
+
+               // Go deeper into the document
+               XMLDOC.Parser.eat(elem, enc[6]);
+
+               // Append the new element node
+               parentNode.nodes.push(elem);
+
+               // Eat the tag
+               src = src.replace(reEnclosingTag, "");
+            }
+         }
+
+         // Reset the lastIndex of reTag
+         reTag.lastIndex = 0;
+      }
+   }
+
+   // No tag was found... append the text if there is any
+   src = src.replace(/^[ \t\n]+((.|\n)*?)[ \t\n]+$/, "$1");
+   if (src.length > 0 && (src != "\n"))
+   {
+      var txtNode = new XMLDOC.Parser.node(parentNode, "", "TEXT");
+      txtNode.charData = src;
+
+      // Append the new text node
+      parentNode.nodes.push(txtNode);
+   }
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/lib/JSDOC.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,106 @@
+/**
+	@overview
+	@date $Date: 2010-06-13 22:02:44 +0100 (Sun, 13 Jun 2010) $
+	@version $Revision: 837 $ 
+	@location $HeadURL: https://jsdoc-toolkit.googlecode.com/svn/tags/jsdoc_toolkit-2.4.0/jsdoc-toolkit/app/lib/JSDOC.js $
+	@name JSDOC.js
+ */
+
+/**
+	This is the main container for the JSDOC application.
+	@namespace
+*/
+JSDOC = {
+};
+
+/**
+	@requires Opt
+ */
+if (typeof arguments == "undefined") arguments = [];
+JSDOC.opt = Opt.get(
+	arguments, 
+	{
+		a: "allfunctions", 
+		c: "conf",
+		d: "directory",
+		"D[]": "define",
+		e: "encoding",
+		"E[]": "exclude",
+		h: "help",
+		m: "multiple",
+		n: "nocode",
+		o: "out",
+		p: "private",
+		q: "quiet",
+		r: "recurse",
+		S: "securemodules",
+		s: "suppress",
+		t: "template",
+		T: "testmode",
+		u: "unique",
+		v: "verbose",
+		x: "ext"
+	}
+);
+
+/** The current version string of this application. */
+JSDOC.VERSION = "2.4.0";
+
+/** Print out usage information and quit. */
+JSDOC.usage = function() {
+	print("USAGE: java -jar jsrun.jar app/run.js [OPTIONS] <SRC_DIR> <SRC_FILE> ...");
+	print("");
+	print("OPTIONS:");
+	print("  -a or --allfunctions\n          Include all functions, even undocumented ones.\n");
+	print("  -c or --conf\n          Load a configuration file.\n");
+	print("  -d=<PATH> or --directory=<PATH>\n          Output to this directory (defaults to \"out\").\n");
+	print("  -D=\"myVar:My value\" or --define=\"myVar:My value\"\n          Multiple. Define a variable, available in JsDoc as JSDOC.opt.D.myVar.\n");
+	print("  -e=<ENCODING> or --encoding=<ENCODING>\n          Use this encoding to read and write files.\n");
+	print("  -E=\"REGEX\" or --exclude=\"REGEX\"\n          Multiple. Exclude files based on the supplied regex.\n");
+	print("  -h or --help\n          Show this message and exit.\n");
+	print("  -m or --multiples\n          Don't warn about symbols being documented more than once.\n");
+	print("  -n or --nocode\n          Ignore all code, only document comments with @name tags.\n");
+	print("  -o=<PATH> or --out=<PATH>\n          Print log messages to a file (defaults to stdout).\n");
+	print("  -p or --private\n          Include symbols tagged as private, underscored and inner symbols.\n");
+	print("  -q or --quiet\n          Do not output any messages, not even warnings.\n");
+	print("  -r=<DEPTH> or --recurse=<DEPTH>\n          Descend into src directories.\n");
+	print("  -s or --suppress\n          Suppress source code output.\n");
+	print("  -S or --securemodules\n          Use Secure Modules mode to parse source code.\n");
+	print("  -t=<PATH> or --template=<PATH>\n          Required. Use this template to format the output.\n");
+	print("  -T or --test\n          Run all unit tests and exit.\n");
+	print("  -u or --unique\n          Force file names to be unique, but not based on symbol names.\n");
+	print("  -v or --verbose\n          Provide verbose feedback about what is happening.\n");
+	print("  -x=<EXT>[,EXT]... or --ext=<EXT>[,EXT]...\n          Scan source files with the given extension/s (defaults to js).\n");
+	
+	quit();
+}
+
+/*t:
+	plan(4, "Testing JSDOC namespace.");
+	
+	is(
+		typeof JSDOC,
+		"object",
+		"JSDOC.usage is a function."
+	);
+	
+	is(
+		typeof JSDOC.VERSION,
+		"string",
+		"JSDOC.VERSION is a string."
+	);
+	
+	is(
+		typeof JSDOC.usage,
+		"function",
+		"JSDOC.usage is a function."
+	);
+	
+	is(
+		typeof JSDOC.opt,
+		"object",
+		"JSDOC.opt is a object."
+	);
+ */
+
+if (this.IO) IO.includeDir("lib/JSDOC/");
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/lib/JSDOC/DocComment.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,204 @@
+if (typeof JSDOC == "undefined") JSDOC = {};
+
+/**
+	Create a new DocComment. This takes a raw documentation comment,
+	and wraps it in useful accessors.
+	@class Represents a documentation comment object.
+ */ 
+JSDOC.DocComment = function(/**String*/comment) {
+	this.init();
+	if (typeof comment != "undefined") {
+		this.parse(comment);
+	}
+}
+
+JSDOC.DocComment.prototype.init = function() {
+	this.isUserComment = true;
+	this.src           = "";
+	this.meta          = "";
+	this.tagTexts      = [];
+	this.tags          = [];
+}
+
+/**
+	@requires JSDOC.DocTag
+ */
+JSDOC.DocComment.prototype.parse = function(/**String*/comment) {
+	if (comment == "") {
+		comment = "/** @desc */";
+		this.isUserComment = false;
+	}
+	
+	this.src = JSDOC.DocComment.unwrapComment(comment);
+	
+	this.meta = "";
+	if (this.src.indexOf("#") == 0) {
+		this.src.match(/#(.+[+-])([\s\S]*)$/);
+		if (RegExp.$1) this.meta = RegExp.$1;
+		if (RegExp.$2) this.src = RegExp.$2;
+	}
+	
+	if (typeof JSDOC.PluginManager != "undefined") {
+		JSDOC.PluginManager.run("onDocCommentSrc", this);
+	}
+	
+	this.fixDesc();
+
+	this.src = JSDOC.DocComment.shared+"\n"+this.src;
+	
+	this.tagTexts = 
+		this.src
+		.split(/(^|[\r\n])\s*@/)
+		.filter(function($){return $.match(/\S/)});
+	
+	/**
+		The tags found in the comment.
+		@type JSDOC.DocTag[]
+	 */
+	this.tags = this.tagTexts.map(function($){return new JSDOC.DocTag($)});
+	
+	if (typeof JSDOC.PluginManager != "undefined") {
+		JSDOC.PluginManager.run("onDocCommentTags", this);
+	}
+}
+
+/*t:
+	plan(5, "testing JSDOC.DocComment");
+	requires("../frame/String.js");
+	requires("../lib/JSDOC/DocTag.js");
+	
+	var com = new JSDOC.DocComment("/**@foo some\n* comment here*"+"/");
+	is(com.tagTexts[0], "foo some\ncomment here", "first tag text is found.");
+	is(com.tags[0].title, "foo", "the title is found in a comment with one tag.");
+	
+	var com = new JSDOC.DocComment("/** @foo first\n* @bar second*"+"/");
+	is(com.getTag("bar").length, 1, "getTag() returns one tag by that title.");
+	
+	JSDOC.DocComment.shared = "@author John Smith";
+	var com = new JSDOC.DocComment("/**@foo some\n* comment here*"+"/");
+	is(com.tags[0].title, "author", "shared comment is added.");
+	is(com.tags[1].title, "foo", "shared comment is added to existing tag.");
+*/
+
+/**
+	If no @desc tag is provided, this function will add it.
+ */
+JSDOC.DocComment.prototype.fixDesc = function() {
+	if (this.meta && this.meta != "@+") return;
+	if (/^\s*[^@\s]/.test(this.src)) {				
+		this.src = "@desc "+this.src;
+	}
+}
+
+/*t:
+	plan(5, "testing JSDOC.DocComment#fixDesc");
+	
+	var com = new JSDOC.DocComment();
+	
+	com.src = "this is a desc\n@author foo";
+	com.fixDesc();
+	is(com.src, "@desc this is a desc\n@author foo", "if no @desc tag is provided one is added.");
+
+	com.src = "x";
+	com.fixDesc();
+	is(com.src, "@desc x", "if no @desc tag is provided one is added to a single character.");
+
+	com.src = "\nx";
+	com.fixDesc();
+	is(com.src, "@desc \nx", "if no @desc tag is provided one is added to return and character.");
+	
+	com.src = " ";
+	com.fixDesc();
+	is(com.src, " ", "if no @desc tag is provided one is not added to just whitespace.");
+
+	com.src = "";
+	com.fixDesc();
+	is(com.src, "", "if no @desc tag is provided one is not added to empty.");
+*/
+
+/**
+	Remove slash-star comment wrapper from a raw comment string.
+	@type String
+ */
+JSDOC.DocComment.unwrapComment = function(/**String*/comment) {
+	if (!comment) return "";
+	var unwrapped = comment.replace(/(^\/\*\*|\*\/$)/g, "").replace(/^\s*\* ?/gm, "");
+	return unwrapped;
+}
+
+/*t:
+	plan(5, "testing JSDOC.DocComment.unwrapComment");
+	
+	var com = "/**x*"+"/";
+	var unwrapped = JSDOC.DocComment.unwrapComment(com);
+	is(unwrapped, "x", "a single character jsdoc is found.");
+	
+	com = "/***x*"+"/";
+	unwrapped = JSDOC.DocComment.unwrapComment(com);
+	is(unwrapped, "x", "three stars are allowed in the opener.");
+	
+	com = "/****x*"+"/";
+	unwrapped = JSDOC.DocComment.unwrapComment(com);
+	is(unwrapped, "*x", "fourth star in the opener is kept.");
+	
+	com = "/**x\n * y\n*"+"/";
+	unwrapped = JSDOC.DocComment.unwrapComment(com);
+	is(unwrapped, "x\ny\n", "leading stars and spaces are trimmed.");
+	
+	com = "/**x\n *   y\n*"+"/";
+	unwrapped = JSDOC.DocComment.unwrapComment(com);
+	is(unwrapped, "x\n  y\n", "only first space after leading stars are trimmed.");
+*/
+
+/**
+	Provides a printable version of the comment.
+	@type String
+ */
+JSDOC.DocComment.prototype.toString = function() {
+	return this.src;
+}
+
+/*t:
+	plan(1, "testing JSDOC.DocComment#fixDesc");
+	var com = new JSDOC.DocComment();
+	com.src = "foo";
+	is(""+com, "foo", "stringifying a comment returns the unwrapped src.");
+*/
+
+/**
+	Given the title of a tag, returns all tags that have that title.
+	@type JSDOC.DocTag[]
+ */
+JSDOC.DocComment.prototype.getTag = function(/**String*/tagTitle) {
+	return this.tags.filter(function($){return $.title == tagTitle});
+}
+
+JSDOC.DocComment.prototype.deleteTag = function(/**String*/tagTitle) {
+	this.tags = this.tags.filter(function($){return $.title != tagTitle})
+}
+
+/*t:
+	plan(1, "testing JSDOC.DocComment#getTag");
+	requires("../frame/String.js");
+	requires("../lib/JSDOC/DocTag.js");
+	
+	var com = new JSDOC.DocComment("/**@foo some\n* @bar\n* @bar*"+"/");
+	is(com.getTag("bar").length, 2, "getTag returns expected number of tags.");
+*/
+
+/**
+	Used to store the currently shared tag text.
+*/
+JSDOC.DocComment.shared = "";
+
+/*t:
+	plan(2, "testing JSDOC.DocComment.shared");
+	requires("../frame/String.js");
+	requires("../lib/JSDOC/DocTag.js");
+	
+	JSDOC.DocComment.shared = "@author Michael";
+	
+	var com = new JSDOC.DocComment("/**@foo\n* @foo*"+"/");
+	is(com.getTag("author").length, 1, "getTag returns shared tag.");
+	is(com.getTag("foo").length, 2, "getTag returns unshared tags too.");
+*/
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/lib/JSDOC/DocTag.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,294 @@
+if (typeof JSDOC == "undefined") JSDOC = {};
+
+/**
+	@constructor
+ */
+JSDOC.DocTag = function(src) {
+	this.init();
+	if (typeof src != "undefined") {
+		this.parse(src);
+	}
+}
+
+/**
+	Create and initialize the properties of this.
+ */
+JSDOC.DocTag.prototype.init = function() {
+	this.title        = "";
+	this.type         = "";
+	this.name         = "";
+	this.isOptional   = false;
+	this.defaultValue = "";
+	this.desc         = "";
+	
+	return this;
+}
+
+/**
+	Populate the properties of this from the given tag src.
+	@param {string} src
+ */
+JSDOC.DocTag.prototype.parse = function(src) {
+	if (typeof src != "string") throw "src must be a string not "+(typeof src);
+
+	try {
+		src = this.nibbleTitle(src);
+		if (JSDOC.PluginManager) {
+			JSDOC.PluginManager.run("onDocTagSynonym", this);
+		}
+		
+		src = this.nibbleType(src);
+		
+		// only some tags are allowed to have names.
+		if (this.title == "param" || this.title == "property" || this.title == "config") { // @config is deprecated
+			src = this.nibbleName(src);
+		}
+	}
+	catch(e) {
+		if (LOG) LOG.warn(e);
+		else throw e;
+	}
+	this.desc = src; // whatever is left
+	
+	// example tags need to have whitespace preserved
+	if (this.title != "example") this.desc = this.desc.trim();
+	
+	if (JSDOC.PluginManager) {
+		JSDOC.PluginManager.run("onDocTag", this);
+	}
+}
+
+/**
+	Automatically called when this is stringified.
+ */
+JSDOC.DocTag.prototype.toString = function() {
+	return this.desc;
+}
+
+/*t:
+	plan(1, "testing JSDOC.DocTag#toString");
+	
+	var tag = new JSDOC.DocTag("param {object} date A valid date.");
+	is(""+tag, "A valid date.", "stringifying a tag returns the desc.");
+ */
+
+/**
+	Find and shift off the title of a tag.
+	@param {string} src
+	@return src
+ */
+JSDOC.DocTag.prototype.nibbleTitle = function(src) {
+	if (typeof src != "string") throw "src must be a string not "+(typeof src);
+	
+	var parts = src.match(/^\s*(\S+)(?:\s([\s\S]*))?$/);
+
+	if (parts && parts[1]) this.title = parts[1];
+	if (parts && parts[2]) src = parts[2];
+	else src = "";
+	
+	return src;
+}
+
+/*t:
+	plan(8, "testing JSDOC.DocTag#nibbleTitle");
+	
+	var tag = new JSDOC.DocTag();
+	
+	tag.init().nibbleTitle("aTitleGoesHere");
+	is(tag.title, "aTitleGoesHere", "a title can be found in a single-word string.");
+	
+	var src = tag.init().nibbleTitle("aTitleGoesHere and the rest");
+	is(tag.title, "aTitleGoesHere", "a title can be found in a multi-word string.");
+	is(src, "and the rest", "the rest is returned when the title is nibbled off.");
+	
+	src = tag.init().nibbleTitle("");
+	is(tag.title, "", "given an empty string the title is empty.");
+	is(src, "", "the rest is empty when the tag is empty.");
+
+	var src = tag.init().nibbleTitle(" aTitleGoesHere\n  a description");
+	is(tag.title, "aTitleGoesHere", "leading and trailing spaces are not part of the title.");
+	is(src, "  a description", "leading spaces (less one) are part of the description.");
+
+	tag.init().nibbleTitle("a.Title::Goes_Here foo");
+	is(tag.title, "a.Title::Goes_Here", "titles with punctuation are allowed.");
+ */
+
+/**
+	Find and shift off the type of a tag.
+	@requires frame/String.js
+	@param {string} src
+	@return src
+ */
+JSDOC.DocTag.prototype.nibbleType = function(src) {
+	if (typeof src != "string") throw "src must be a string not "+(typeof src);
+	
+	if (src.match(/^\s*\{/)) {
+		var typeRange = src.balance("{", "}");
+		if (typeRange[1] == -1) {
+			throw "Malformed comment tag ignored. Tag type requires an opening { and a closing }: "+src;
+		}
+		this.type = src.substring(typeRange[0]+1, typeRange[1]).trim();
+		this.type = this.type.replace(/\s*,\s*/g, "|"); // multiples can be separated by , or |
+		src = src.substring(typeRange[1]+1);
+	}
+	
+	return src;
+}
+
+/*t:
+	plan(5, "testing JSDOC.DocTag.parser.nibbleType");
+	requires("../frame/String.js");
+	
+	var tag = new JSDOC.DocTag();
+	
+	tag.init().nibbleType("{String[]} aliases");
+	is(tag.type, "String[]", "type can have non-alpha characters.");
+	
+	tag.init().nibbleType("{ aTypeGoesHere  } etc etc");
+	is(tag.type, "aTypeGoesHere", "type is trimmed.");
+	
+	tag.init().nibbleType("{ oneType, twoType ,\n threeType  } etc etc");
+	is(tag.type, "oneType|twoType|threeType", "multiple types can be separated by commas.");
+	
+	var error;
+	try { tag.init().nibbleType("{widget foo"); }
+	catch(e) { error = e; }
+	is(typeof error, "string", "malformed tag type throws error.");
+	isnt(error.indexOf("Malformed"), -1, "error message tells tag is malformed.");
+ */
+
+/**
+	Find and shift off the name of a tag.
+	@requires frame/String.js
+	@param {string} src
+	@return src
+ */
+JSDOC.DocTag.prototype.nibbleName = function(src) {
+	if (typeof src != "string") throw "src must be a string not "+(typeof src);
+	
+	src = src.trim();
+	
+	// is optional?
+	if (src.charAt(0) == "[") {
+		var nameRange = src.balance("[", "]");
+		if (nameRange[1] == -1) {
+			throw "Malformed comment tag ignored. Tag optional name requires an opening [ and a closing ]: "+src;
+		}
+		this.name = src.substring(nameRange[0]+1, nameRange[1]).trim();
+		this.isOptional = true;
+		
+		src = src.substring(nameRange[1]+1);
+		
+		// has default value?
+		var nameAndValue = this.name.split("=");
+		if (nameAndValue.length) {
+			this.name = nameAndValue.shift().trim();
+			this.defaultValue = nameAndValue.join("=");
+		}
+	}
+	else {
+		var parts = src.match(/^(\S+)(?:\s([\s\S]*))?$/);
+		if (parts) {
+			if (parts[1]) this.name = parts[1];
+			if (parts[2]) src = parts[2].trim();
+			else src = "";
+		}
+	}	
+
+	return src;
+}
+
+/*t:
+	requires("../frame/String.js");
+	plan(9, "testing JSDOC.DocTag.parser.nibbleName");
+	
+	var tag = new JSDOC.DocTag();
+	
+	tag.init().nibbleName("[foo] This is a description.");
+	is(tag.isOptional, true, "isOptional syntax is detected.");
+	is(tag.name, "foo", "optional param name is found.");
+ 	
+	tag.init().nibbleName("[foo] This is a description.");
+	is(tag.isOptional, true, "isOptional syntax is detected when no type.");
+	is(tag.name, "foo", "optional param name is found when no type.");
+	
+	tag.init().nibbleName("[foo=7] This is a description.");
+ 	is(tag.name, "foo", "optional param name is found when default value.");
+ 	is(tag.defaultValue, 7, "optional param default value is found when default value.");
+ 	
+ 	//tag.init().nibbleName("[foo= a value] This is a description.");
+ 	//is(tag.defaultValue, " a value", "optional param default value is found when default value has spaces (issue #112).");
+ 	
+ 	tag.init().nibbleName("[foo=[]] This is a description.");
+ 	is(tag.defaultValue, "[]", "optional param default value is found when default value is [] (issue #95).");
+ 	
+ 	tag.init().nibbleName("[foo=a=b] This is a description.");
+ 	is(tag.name, "foo", "optional param name is found when default value is a=b.");
+ 	is(tag.defaultValue, "a=b", "optional param default value is found when default value is a=b.")
+ */
+
+/*t:
+	plan(32, "Testing JSDOC.DocTag.parser.");
+	requires("../frame/String.js");
+	
+ 	var tag = new JSDOC.DocTag();
+ 	
+ 	is(typeof tag, "object", "JSDOC.DocTag.parser with an empty string returns an object.");
+ 	is(typeof tag.title, "string", "returned object has a string property 'title'.");
+ 	is(typeof tag.type, "string", "returned object has a string property 'type'.");
+ 	is(typeof tag.name, "string", "returned object has a string property 'name'.");
+ 	is(typeof tag.defaultValue, "string", "returned object has a string property 'defaultValue'.");
+ 	is(typeof tag.isOptional, "boolean", "returned object has a boolean property 'isOptional'.");
+ 	is(typeof tag.desc, "string", "returned object has a string property 'desc'.");
+  
+  	tag = new JSDOC.DocTag("param {widget} foo");
+  	is(tag.title, "param", "param title is found.");
+  	is(tag.name, "foo", "param name is found when desc is missing.");
+ 	is(tag.desc, "", "param desc is empty when missing.");
+ 	
+ 	tag = new JSDOC.DocTag("param {object} date A valid date.");
+ 	is(tag.name, "date", "param name is found with a type.");
+ 	is(tag.type, "object", "param type is found.");
+ 	is(tag.desc, "A valid date.", "param desc is found with a type.");
+ 	
+  	tag = new JSDOC.DocTag("param aName a description goes\n    here.");
+	is(tag.name, "aName", "param name is found without a type.");
+ 	is(tag.desc, "a description goes\n    here.", "param desc is found without a type.");
+ 	
+ 	tag = new JSDOC.DocTag("param {widget}");
+ 	is(tag.name, "", "param name is empty when it is not given.");
+	
+	tag = new JSDOC.DocTag("param {widget} [foo] This is a description.");
+	is(tag.name, "foo", "optional param name is found.");
+	
+	tag = new JSDOC.DocTag("return {aType} This is a description.");
+	is(tag.type, "aType", "when return tag has no name, type is found.");
+	is(tag.desc, "This is a description.", "when return tag has no name, desc is found.");
+	
+	tag = new JSDOC.DocTag("author Joe Coder <jcoder@example.com>");
+	is(tag.title, "author", "author tag has a title.");
+	is(tag.type, "", "the author tag has no type.");
+	is(tag.name, "", "the author tag has no name.");
+	is(tag.desc, "Joe Coder <jcoder@example.com>", "author tag has desc.");
+	
+	tag = new JSDOC.DocTag("private \t\n  ");
+	is(tag.title, "private", "private tag has a title.");
+	is(tag.type, "", "the private tag has no type.");
+	is(tag.name, "", "the private tag has no name.");
+	is(tag.desc, "", "private tag has no desc.");
+
+	tag = new JSDOC.DocTag("example\n   example(code);\n   more();");
+	is(tag.desc, "   example(code);\n   more();", "leading whitespace (less one) in examples code is preserved.");
+	
+	tag = new JSDOC.DocTag("param theName  \n");
+	is(tag.name, "theName", "name only is found.");
+	
+	tag = new JSDOC.DocTag("type theDesc  \n");
+	is(tag.desc, "theDesc", "desc only is found.");
+	
+	tag = new JSDOC.DocTag("type {theType} \n");
+	is(tag.type, "theType", "type only is found.");
+	
+	tag = new JSDOC.DocTag("");
+	is(tag.title, "", "title is empty when tag is empty.");
+ */
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/lib/JSDOC/JsDoc.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,140 @@
+/**
+	@constructor
+	@param [opt] Used to override the commandline options. Useful for testing.
+	@version $Id: JsDoc.js 831 2010-03-09 14:24:56Z micmath $
+*/
+JSDOC.JsDoc = function(/**object*/ opt) {
+	if (opt) {
+		JSDOC.opt = opt;
+	}
+	
+	if (JSDOC.opt.h) {
+		JSDOC.usage();
+		quit();
+	}
+	
+	// defend against options that are not sane 
+	if (JSDOC.opt._.length == 0) {
+		LOG.warn("No source files to work on. Nothing to do.");
+		quit();
+	}
+	if (JSDOC.opt.t === true || JSDOC.opt.d === true) {
+		JSDOC.usage();
+	}
+	
+	if (typeof JSDOC.opt.d == "string") {
+		if (!JSDOC.opt.d.charAt(JSDOC.opt.d.length-1).match(/[\\\/]/)) {
+			JSDOC.opt.d = JSDOC.opt.d+"/";
+		}
+		LOG.inform("Output directory set to '"+JSDOC.opt.d+"'.");
+		IO.mkPath(JSDOC.opt.d);
+	}
+	if (JSDOC.opt.e) IO.setEncoding(JSDOC.opt.e);
+	
+	// the -r option: scan source directories recursively
+	if (typeof JSDOC.opt.r == "boolean") JSDOC.opt.r = 10;
+	else if (!isNaN(parseInt(JSDOC.opt.r))) JSDOC.opt.r = parseInt(JSDOC.opt.r);
+	else JSDOC.opt.r = 1;
+	
+	// the -D option: define user variables
+	var D = {};
+	if (JSDOC.opt.D) {
+		for (var i = 0; i < JSDOC.opt.D.length; i++) {
+			var param = JSDOC.opt.D[i];
+			// remove first and last character if both == "
+			if ( 
+				param.length > 1
+				&& param.charAt(0) == '"'
+				&& param.charAt(param.length-1) == '"'
+			) {
+				param = param.substr(1, param.length-2);
+			}
+			var defineParts = param.split(":");
+			if (defineParts && defineParts.length > 1) {
+				for ( var dpIdx = 2; dpIdx < defineParts.length; dpIdx++ ) {
+					defineParts[1] += ':' + defineParts[dpIdx];
+				}
+				D[defineParts[0]] = defineParts[1];
+			}
+		}
+	}
+	JSDOC.opt.D = D;
+	// combine any conf file D options with the commandline D options
+	if (defined(JSDOC.conf)) for (var c in JSDOC.conf.D) {
+ 		if (!defined(JSDOC.opt.D[c])) {
+ 			JSDOC.opt.D[c] = JSDOC.conf.D[c];
+ 		}
+ 	}
+	
+	// Give plugins a chance to initialize
+	if (defined(JSDOC.PluginManager)) {
+		JSDOC.PluginManager.run("onInit", JSDOC.opt);
+	}
+
+	JSDOC.opt.srcFiles = JSDOC.JsDoc._getSrcFiles();
+	JSDOC.JsDoc._parseSrcFiles();
+	JSDOC.JsDoc.symbolSet = JSDOC.Parser.symbols;
+}
+
+/**
+	Retrieve source file list.
+	@returns {String[]} The pathnames of the files to be parsed.
+ */
+JSDOC.JsDoc._getSrcFiles = function() {
+	JSDOC.JsDoc.srcFiles = [];
+	
+	var ext = ["js"];
+	if (JSDOC.opt.x) {
+		ext = JSDOC.opt.x.split(",").map(function($) {return $.toLowerCase()});
+	}
+	
+	for (var i = 0; i < JSDOC.opt._.length; i++) {
+		JSDOC.JsDoc.srcFiles = JSDOC.JsDoc.srcFiles.concat(
+			IO.ls(JSDOC.opt._[i], JSDOC.opt.r).filter(
+				function($) {
+					var thisExt = $.split(".").pop().toLowerCase();
+					
+					if (JSDOC.opt.E) {
+						for(var n = 0; n < JSDOC.opt.E.length; n++) {
+							if ($.match(new RegExp(JSDOC.opt.E[n]))) {
+								LOG.inform("Excluding " + $);
+								return false; // if the file matches the regex then it's excluded.
+							}
+						}
+					}
+					
+					return (ext.indexOf(thisExt) > -1); // we're only interested in files with certain extensions
+				}
+			)
+		);
+	}
+	
+	return JSDOC.JsDoc.srcFiles;
+}
+
+JSDOC.JsDoc._parseSrcFiles = function() {
+	JSDOC.Parser.init();
+	for (var i = 0, l = JSDOC.JsDoc.srcFiles.length; i < l; i++) {
+		var srcFile = JSDOC.JsDoc.srcFiles[i];
+		
+		if (JSDOC.opt.v) LOG.inform("Parsing file: " + srcFile);
+		
+		try {
+			var src = IO.readFile(srcFile);
+		}
+		catch(e) {
+			LOG.warn("Can't read source file '"+srcFile+"': "+e.message);
+		}
+
+		var tr = new JSDOC.TokenReader();
+		var ts = new JSDOC.TokenStream(tr.tokenize(new JSDOC.TextStream(src)));
+
+		JSDOC.Parser.parse(ts, srcFile);
+
+	}
+	JSDOC.Parser.finish();
+
+	if (JSDOC.PluginManager) {
+		JSDOC.PluginManager.run("onFinishedParsing", JSDOC.Parser.symbols);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/lib/JSDOC/JsPlate.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,109 @@
+/**
+	@constructor
+*/
+JSDOC.JsPlate = function(templateFile) {
+	if (templateFile) this.template = IO.readFile(templateFile);
+	
+	this.templateFile = templateFile;
+	this.code = "";
+	this.parse();
+}
+
+JSDOC.JsPlate.prototype.parse = function() {
+	this.template = this.template.replace(/\{#[\s\S]+?#\}/gi, "");
+	this.code = "var output=\u001e"+this.template;
+
+	this.code = this.code.replace(
+		/<for +each="(.+?)" +in="(.+?)" *>/gi, 
+		function (match, eachName, inName) {
+			return "\u001e;\rvar $"+eachName+"_keys = keys("+inName+");\rfor(var $"+eachName+"_i = 0; $"+eachName+"_i < $"+eachName+"_keys.length; $"+eachName+"_i++) {\rvar $"+eachName+"_last = ($"+eachName+"_i == $"+eachName+"_keys.length-1);\rvar $"+eachName+"_key = $"+eachName+"_keys[$"+eachName+"_i];\rvar "+eachName+" = "+inName+"[$"+eachName+"_key];\routput+=\u001e";
+		}
+	);	
+	this.code = this.code.replace(/<if test="(.+?)">/g, "\u001e;\rif ($1) { output+=\u001e");
+	this.code = this.code.replace(/<elseif test="(.+?)"\s*\/>/g, "\u001e;}\relse if ($1) { output+=\u001e");
+	this.code = this.code.replace(/<else\s*\/>/g, "\u001e;}\relse { output+=\u001e");
+	this.code = this.code.replace(/<\/(if|for)>/g, "\u001e;\r};\routput+=\u001e");
+	this.code = this.code.replace(
+		/\{\+\s*([\s\S]+?)\s*\+\}/gi,
+		function (match, code) {
+			code = code.replace(/"/g, "\u001e"); // prevent qoute-escaping of inline code
+			code = code.replace(/(\r?\n)/g, " ");
+			return "\u001e+ ("+code+") +\u001e";
+		}
+	);
+	this.code = this.code.replace(
+		/\{!\s*([\s\S]+?)\s*!\}/gi,
+		function (match, code) {
+			code = code.replace(/"/g, "\u001e"); // prevent qoute-escaping of inline code
+			code = code.replace(/(\n)/g, " ");
+			return "\u001e; "+code+";\routput+=\u001e";
+		}
+	);
+	this.code = this.code+"\u001e;";
+
+	this.code = this.code.replace(/(\r?\n)/g, "\\n");
+	this.code = this.code.replace(/"/g, "\\\"");
+	this.code = this.code.replace(/\u001e/g, "\"");
+}
+
+JSDOC.JsPlate.prototype.toCode = function() {
+	return this.code;
+}
+
+JSDOC.JsPlate.keys = function(obj) {
+	var keys = [];
+	if (obj.constructor.toString().indexOf("Array") > -1) {
+		for (var i = 0; i < obj.length; i++) {
+			keys.push(i);
+		}
+	}
+	else {
+		for (var i in obj) {
+			keys.push(i);
+		}
+	}
+	return keys;
+};
+
+JSDOC.JsPlate.values = function(obj) {
+	var values = [];
+	if (obj.constructor.toString().indexOf("Array") > -1) {
+		for (var i = 0; i < obj.length; i++) {
+			values.push(obj[i]);
+		}
+	}
+	else {
+		for (var i in obj) {
+			values.push(obj[i]);
+		}
+	}
+	return values;
+};
+
+JSDOC.JsPlate.prototype.process = function(data, compact) {
+	var keys = JSDOC.JsPlate.keys;
+	var values = JSDOC.JsPlate.values;
+	
+	try {
+		eval(this.code);
+	}
+	catch (e) {
+		print(">> There was an error evaluating the compiled code from template: "+this.templateFile);
+		print("   The error was on line "+e.lineNumber+" "+e.name+": "+e.message);
+		var lines = this.code.split("\r");
+		if (e.lineNumber-2 >= 0) print("line "+(e.lineNumber-1)+": "+lines[e.lineNumber-2]);
+		print("line "+e.lineNumber+": "+lines[e.lineNumber-1]);
+		print("");
+	}
+	
+	if (compact) { // patch by mcbain.asm
+ 		// Remove lines that contain only space-characters, usually left by lines in the template
+ 		// which originally only contained JSPlate tags or code. This makes it easier to write
+ 		// non-tricky templates which still put out nice code (not bloated with extra lines).
+ 		// Lines purposely left blank (just a line ending) are left alone.
+ 		output = output.replace(/\s+?(\r?)\n/g, "$1\n");
+ 	}
+ 	
+	/*debug*///print(this.code);
+	return output;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/lib/JSDOC/Lang.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,144 @@
+/**
+	@namespace
+*/
+JSDOC.Lang = {
+}
+
+JSDOC.Lang.isBuiltin = function(name) {
+	return (JSDOC.Lang.isBuiltin.coreObjects.indexOf(name) > -1);
+}
+JSDOC.Lang.isBuiltin.coreObjects = ['_global_', 'Array', 'Boolean', 'Date', 'Error', 'Function', 'Math', 'Number', 'Object', 'RegExp', 'String'];
+
+JSDOC.Lang.whitespace = function(ch) {
+	return JSDOC.Lang.whitespace.names[ch];
+}
+JSDOC.Lang.whitespace.names = {
+	" ":      "SPACE",
+	"\f":     "FORMFEED",
+	"\t":     "TAB",
+	"\u0009": "UNICODE_TAB",
+	"\u000A": "UNICODE_NBR",
+	"\u0008": "VERTICAL_TAB"
+};
+
+JSDOC.Lang.newline = function(ch) {
+	return JSDOC.Lang.newline.names[ch];
+}
+JSDOC.Lang.newline.names = {
+	"\n":     "NEWLINE",
+	"\r":     "RETURN",
+	"\u000A": "UNICODE_LF",
+	"\u000D": "UNICODE_CR",
+	"\u2029": "UNICODE_PS",
+	"\u2028": "UNICODE_LS"
+};
+
+JSDOC.Lang.keyword = function(word) {
+	return JSDOC.Lang.keyword.names["="+word];
+}
+JSDOC.Lang.keyword.names = {
+	"=break":      "BREAK",
+	"=case":       "CASE",
+	"=catch":      "CATCH",
+	"=const":      "VAR",
+	"=continue":   "CONTINUE",
+	"=default":    "DEFAULT",
+	"=delete":     "DELETE",
+	"=do":         "DO",
+	"=else":       "ELSE",
+	"=false":      "FALSE",
+	"=finally":    "FINALLY",
+	"=for":        "FOR",
+	"=function":   "FUNCTION",
+	"=if":         "IF",
+	"=in":         "IN",
+	"=instanceof": "INSTANCEOF",
+	"=new":        "NEW",
+	"=null":       "NULL",
+	"=return":     "RETURN",
+	"=switch":     "SWITCH",
+	"=this":       "THIS",
+	"=throw":      "THROW",
+	"=true":       "TRUE",
+	"=try":        "TRY",
+	"=typeof":     "TYPEOF",
+	"=void":       "VOID",
+	"=while":      "WHILE",
+	"=with":       "WITH",
+	"=var":        "VAR"
+};
+
+JSDOC.Lang.punc = function(ch) {
+	return JSDOC.Lang.punc.names[ch];
+}
+JSDOC.Lang.punc.names = {
+	";":   "SEMICOLON",
+	",":   "COMMA",
+	"?":   "HOOK",
+	":":   "COLON",
+	"||":  "OR", 
+	"&&":  "AND",
+	"|":   "BITWISE_OR",
+	"^":   "BITWISE_XOR",
+	"&":   "BITWISE_AND",
+	"===": "STRICT_EQ", 
+	"==":  "EQ",
+	"=":   "ASSIGN",
+	"!==": "STRICT_NE",
+	"!=":  "NE",
+	"<<":  "LSH",
+	"<=":  "LE", 
+	"<":   "LT",
+	">>>": "URSH",
+	">>":  "RSH",
+	">=":  "GE",
+	">":   "GT", 
+	"++":  "INCREMENT",
+	"--":  "DECREMENT",
+	"+":   "PLUS",
+	"-":   "MINUS",
+	"*":   "MUL",
+	"/":   "DIV", 
+	"%":   "MOD",
+	"!":   "NOT",
+	"~":   "BITWISE_NOT",
+	".":   "DOT",
+	"[":   "LEFT_BRACKET",
+	"]":   "RIGHT_BRACKET",
+	"{":   "LEFT_CURLY",
+	"}":   "RIGHT_CURLY",
+	"(":   "LEFT_PAREN",
+	")":   "RIGHT_PAREN"
+};
+
+JSDOC.Lang.matching = function(name) {
+	return JSDOC.Lang.matching.names[name];
+}
+JSDOC.Lang.matching.names = {
+	"LEFT_PAREN": "RIGHT_PAREN",
+	"RIGHT_PAREN": "LEFT_PAREN",
+	"LEFT_CURLY": "RIGHT_CURLY",
+	"RIGHT_CURLY": "LEFT_CURLY",
+	"LEFT_BRACE": "RIGHT_BRACE",
+	"RIGHT_BRACE": "LEFT_BRACE"
+}
+
+JSDOC.Lang.isNumber = function(str) {
+	return /^(\.[0-9]|[0-9]+\.|[0-9])[0-9]*([eE][+-][0-9]+)?$/i.test(str);
+}
+
+JSDOC.Lang.isHexDec = function(str) {
+	return /^0x[0-9A-F]+$/i.test(str);
+}
+
+JSDOC.Lang.isWordChar = function(str) {
+	return /^[a-zA-Z0-9$_.]+$/.test(str);
+}
+
+JSDOC.Lang.isSpace = function(str) {
+	return (typeof JSDOC.Lang.whitespace(str) != "undefined");
+}
+
+JSDOC.Lang.isNewline = function(str) {
+	return (typeof JSDOC.Lang.newline(str) != "undefined");
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/lib/JSDOC/Parser.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,146 @@
+if (typeof JSDOC == "undefined") JSDOC = {};
+
+/**
+	@namespace
+	@requires JSDOC.Walker
+	@requires JSDOC.Symbol
+	@requires JSDOC.DocComment
+*/
+JSDOC.Parser = {
+	conf: {
+		ignoreCode:               JSDOC.opt.n,
+		ignoreAnonymous:           true, // factory: true
+		treatUnderscoredAsPrivate: true, // factory: true
+		explain:                   false // factory: false
+	},
+	
+	addSymbol: function(symbol) {
+
+		if (JSDOC.Parser.rename) {
+			for (var n in JSDOC.Parser.rename) {
+				if (symbol.alias.indexOf(n) == 0) {
+					if (symbol.name == symbol.alias) {
+						symbol.name = symbol.name.replace(n, JSDOC.Parser.rename[n]);
+					}
+					symbol.alias = symbol.alias.replace(n, JSDOC.Parser.rename[n]);
+				}
+			}
+		}
+		
+		if (JSDOC.opt.S) {
+			if (typeof JSDOC.Parser.secureModules == "undefined") JSDOC.Parser.secureModules = {};
+			if (/^exports\./.test(symbol.alias)) {
+				symbol.srcFile.match(/(^|[\\\/])([^\\\/]+)\.js/i);
+				var fileNS = RegExp.$2;
+				
+				// need to create the namespace associated with this file first
+				if (!JSDOC.Parser.secureModules[fileNS]) {
+					JSDOC.Parser.secureModules[fileNS] = 1;
+					var nsSymbol = new JSDOC.Symbol(fileNS, [], "GLOBAL", new JSDOC.DocComment(""));
+					nsSymbol.isNamespace = true;
+					nsSymbol.srcFile = "";
+					nsSymbol.isPrivate = false;
+					nsSymbol.srcFile = symbol.srcFile;
+					nsSymbol.desc = (JSDOC.Parser.symbols.getSymbol(symbol.srcFile) || {desc: ""}).desc;
+					JSDOC.Parser.addSymbol(nsSymbol);
+				}
+				
+				symbol.alias = symbol.alias.replace(/^exports\./, fileNS + '.');
+				symbol.name = symbol.name.replace(/^exports\./, '');
+				symbol.memberOf = fileNS;
+				symbol.isStatic = true;
+			}
+		}
+
+		// if a symbol alias is documented more than once the first one with the user docs wins
+		if (JSDOC.Parser.symbols.hasSymbol(symbol.alias)) {
+ 			var oldSymbol = JSDOC.Parser.symbols.getSymbol(symbol.alias);
+			if (oldSymbol.comment.isUserComment) {
+				if (JSDOC.opt.m) return;
+				if (symbol.comment.isUserComment) { // old and new are both documented
+					LOG.warn("The symbol '"+symbol.alias+"' is documented more than once.");
+					return;
+				}
+				else { // old is documented but new isn't
+					return;
+				}
+			}
+		}
+		
+		// we don't document anonymous things
+		if (JSDOC.Parser.conf.ignoreAnonymous && symbol.name.match(/\$anonymous\b/)) return;
+
+		// uderscored things may be treated as if they were marked private, this cascades
+		if (JSDOC.Parser.conf.treatUnderscoredAsPrivate && symbol.name.match(/[.#-]_[^.#-]+$/)) {
+			if (!symbol.comment.getTag("public").length > 0) symbol.isPrivate = true;
+		}
+		
+		// -p flag is required to document private things
+		if (!JSDOC.opt.p && symbol.isPrivate) return; // issue #161 fixed by mcbain.asm
+		
+		// ignored things are not documented, this doesn't cascade
+		if (symbol.isIgnored) return;
+		JSDOC.Parser.symbols.addSymbol(symbol);
+	},
+	
+	addBuiltin: function(name) {
+		var builtin = new JSDOC.Symbol(name, [], "CONSTRUCTOR", new JSDOC.DocComment(""));
+		builtin.isNamespace = true;
+		builtin.srcFile = "";
+		builtin.isPrivate = false;
+		JSDOC.Parser.addSymbol(builtin);
+		return builtin;
+	},
+	
+	init: function() {
+		JSDOC.Parser.symbols = new JSDOC.SymbolSet();
+		JSDOC.Parser.walker = new JSDOC.Walker();
+	},
+	
+	finish: function() {
+		JSDOC.Parser.symbols.relate();		
+		
+		// make a litle report about what was found
+		if (JSDOC.Parser.conf.explain) {
+			var symbols = JSDOC.Parser.symbols.toArray();
+			var srcFile = "";
+			for (var i = 0, l = symbols.length; i < l; i++) {
+				var symbol = symbols[i];
+				if (srcFile != symbol.srcFile) {
+					srcFile = symbol.srcFile;
+					print("\n"+srcFile+"\n-------------------");
+				}
+				print(i+":\n  alias => "+symbol.alias + "\n  name => "+symbol.name+ "\n  isa => "+symbol.isa + "\n  memberOf => " + symbol.memberOf + "\n  isStatic => " + symbol.isStatic + ",  isInner => " + symbol.isInner+ ",  isPrivate => " + symbol.isPrivate);
+			}
+			print("-------------------\n");
+		}
+	}
+}
+
+JSDOC.Parser.parse = function(/**JSDOC.TokenStream*/ts, /**String*/srcFile) {
+	JSDOC.Symbol.srcFile = (srcFile || "");
+	JSDOC.DocComment.shared = ""; // shared comments don't cross file boundaries
+	
+	if (!JSDOC.Parser.walker) JSDOC.Parser.init();
+	JSDOC.Parser.walker.walk(ts); // adds to our symbols
+	
+	// filter symbols by option
+	for (var p = JSDOC.Parser.symbols._index.first(); p; p = JSDOC.Parser.symbols._index.next()) {
+		var symbol = p.value;
+		
+		if (!symbol) continue;
+		
+		if (symbol.is("FILE") || symbol.is("GLOBAL")) {
+			continue;
+		}
+		else if (!JSDOC.opt.a && !symbol.comment.isUserComment) {
+			JSDOC.Parser.symbols.deleteSymbol(symbol.alias);
+		}
+		
+		if (/#$/.test(symbol.alias)) { // we don't document prototypes
+			JSDOC.Parser.symbols.deleteSymbol(symbol.alias);
+		}
+	}
+	
+	return JSDOC.Parser.symbols.toArray();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/lib/JSDOC/PluginManager.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,33 @@
+/**
+	@namespace Holds functionality related to running plugins.
+*/
+JSDOC.PluginManager = {
+}
+
+/**
+	@param name A unique name that identifies that plugin.
+	@param handlers A collection of named functions. The names correspond to hooks in the core code.
+*/
+JSDOC.PluginManager.registerPlugin = function(/**String*/name, /**Object*/handlers) {
+	if (!defined(JSDOC.PluginManager.plugins))
+		/** The collection of all plugins. Requires a unique name for each.
+		*/
+		JSDOC.PluginManager.plugins = {};
+	
+	
+	JSDOC.PluginManager.plugins[name] = handlers;
+}
+
+/**
+	@param hook The name of the hook that is being caught.
+	@param target Any object. This will be passed as the only argument to the handler whose
+	name matches the hook name. Handlers cannot return a value, so must modify the target
+	object to have an effect.
+*/
+JSDOC.PluginManager.run = function(/**String*/hook, /**Mixed*/target) {
+	for (var name in JSDOC.PluginManager.plugins) {
+		if (defined(JSDOC.PluginManager.plugins[name][hook])) {
+			JSDOC.PluginManager.plugins[name][hook](target);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/lib/JSDOC/Symbol.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,644 @@
+if (typeof JSDOC == "undefined") JSDOC = {};
+
+/**
+	Create a new Symbol.
+	@class Represents a symbol in the source code.
+ */
+JSDOC.Symbol = function() {
+	this.init();
+	if (arguments.length) this.populate.apply(this, arguments);
+}
+
+JSDOC.Symbol.count = 0;
+
+JSDOC.Symbol.prototype.init = function() {
+	this._name = "";
+	this._params = [];
+	this.$args = [];
+	this.addOn = "";
+	this.alias = "";
+	this.augments = [];
+	this.author = "";
+	this.classDesc = "";
+	this.comment = {};
+	this.defaultValue = undefined;
+	this.deprecated = "";
+	this.desc = "";
+	this.example = [];
+	this.exceptions = [];
+	this.fires = [];
+	this.id = JSDOC.Symbol.count++;
+	this.inherits = [];
+	this.inheritsFrom = [];
+	this.isa = "OBJECT";
+	this.isConstant = false;
+	this.isEvent = false;
+	this.isIgnored = false;
+	this.isInner = false;
+	this.isNamespace = false;
+	this.isPrivate = false;
+	this.isStatic = false;
+	this.memberOf = "";
+	this.methods = [];
+	this.properties = [];
+	this.requires = [];
+	this.returns = [];
+	this.see = [];
+	this.since = "";
+	this.srcFile = {};
+	this.type = "";
+	this.version = "";
+}
+
+JSDOC.Symbol.prototype.serialize = function() {
+	var keys = [];
+	for (var p in this) {
+		keys.push (p);
+	}
+	keys = keys.sort();
+	
+	var out = "";
+	for (var i in keys) {
+		if (typeof this[keys[i]] == "function") continue;
+		out += keys[i]+" => "+Dumper.dump(this[keys[i]])+",\n";
+	}
+	return "\n{\n" + out + "}\n";
+}
+
+JSDOC.Symbol.prototype.clone = function() {
+	var clone = new JSDOC.Symbol();
+	clone.populate.apply(clone, this.$args); // repopulate using the original arguments
+	clone.srcFile = this.srcFile; // not the current srcFile, the one when the original was made
+	return clone;
+}
+
+JSDOC.Symbol.prototype.__defineSetter__("name",
+	function(n) { n = n.replace(/^_global_[.#-]/, ""); n = n.replace(/\.prototype\.?/g, '#'); this._name = n; }
+);
+JSDOC.Symbol.prototype.__defineGetter__("name",
+	function() { return this._name; }
+);
+JSDOC.Symbol.prototype.__defineSetter__("params", 
+	function(v) {
+		for (var i = 0, l = v.length; i < l; i++) {
+			if (v[i].constructor != JSDOC.DocTag) { // may be a generic object parsed from signature, like {type:..., name:...}
+				this._params[i] = new JSDOC.DocTag("param"+((v[i].type)?" {"+v[i].type+"}":"")+" "+v[i].name);
+			}
+			else {
+				this._params[i] = v[i];
+			}
+		}
+	}
+);
+JSDOC.Symbol.prototype.__defineGetter__("params",
+	function() { return this._params; }
+);
+
+JSDOC.Symbol.prototype.getEvents = function() {
+	var events = [];
+	for (var i = 0, l = this.methods.length; i < l; i++) {
+		if (this.methods[i].isEvent) {
+			this.methods[i].name = this.methods[i].name.replace("event:", "");
+			events.push(this.methods[i]);
+		}
+	}
+	return events;
+}
+
+JSDOC.Symbol.prototype.getMethods = function() {
+	var nonEvents = [];
+	for (var i = 0, l = this.methods.length; i < l; i++) {
+		if (!this.methods[i].isEvent) {
+			nonEvents.push(this.methods[i]);
+		}
+	}
+	return nonEvents;
+}
+
+
+JSDOC.Symbol.prototype.populate = function(
+		/** String */ name,
+		/** Object[] */ params,
+		/** String */ isa,
+		/** JSDOC.DocComment */ comment
+) {
+	this.$args = arguments;
+	
+	this.name = name;
+	this.alias = this.name;
+	
+	this.params = params;
+	this.isa = (isa == "VIRTUAL")? "OBJECT":isa;
+	this.comment = comment || new JSDOC.DocComment("");
+	this.srcFile = JSDOC.Symbol.srcFile;
+	
+	if (this.is("FILE") && !this.alias) this.alias = this.srcFile;
+
+	this.setTags();
+	
+	if (typeof JSDOC.PluginManager != "undefined") {
+		JSDOC.PluginManager.run("onSymbol", this);
+	}
+}
+
+JSDOC.Symbol.prototype.setTags = function() {
+	// @author
+	var authors = this.comment.getTag("author");
+	if (authors.length) {
+		this.author = authors.map(function($){return $.desc;}).join(", ");
+	}
+	
+	/*t:
+		plan(34, "testing JSDOC.Symbol");
+		
+		requires("../lib/JSDOC/DocComment.js");
+		requires("../frame/String.js");
+		requires("../lib/JSDOC/DocTag.js");
+
+		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@author Joe Smith*"+"/"));
+		is(sym.author, "Joe Smith", "@author tag, author is found.");
+	*/
+	
+	// @desc
+	var descs = this.comment.getTag("desc");
+	if (descs.length) {
+		this.desc = descs.map(function($){return $.desc;}).join("\n"); // multiple descriptions are concatenated into one
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@desc This is a description.*"+"/"));
+		is(sym.desc, "This is a description.", "@desc tag, description is found.");
+	*/
+	
+	// @overview
+	if (this.is("FILE")) {
+		if (!this.alias) this.alias = this.srcFile;
+		
+		var overviews = this.comment.getTag("overview");
+		if (overviews.length) {
+			this.desc = [this.desc].concat(overviews.map(function($){return $.desc;})).join("\n");
+		}
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@overview This is an overview.*"+"/"));
+		is(sym.desc, "\nThis is an overview.", "@overview tag, description is found.");
+	*/
+	
+	// @since
+	var sinces = this.comment.getTag("since");
+	if (sinces.length) {
+		this.since = sinces.map(function($){return $.desc;}).join(", ");
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@since 1.01*"+"/"));
+		is(sym.since, "1.01", "@since tag, description is found.");
+	*/
+	
+	// @constant
+	if (this.comment.getTag("constant").length) {
+		this.isConstant = true;
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@constant*"+"/"));
+		is(sym.isConstant, true, "@constant tag, isConstant set.");
+	*/
+	
+	// @version
+	var versions = this.comment.getTag("version");
+	if (versions.length) {
+		this.version = versions.map(function($){return $.desc;}).join(", ");
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@version 2.0x*"+"/"));
+		is(sym.version, "2.0x", "@version tag, version is found.");
+	*/
+	
+	// @deprecated
+	var deprecateds = this.comment.getTag("deprecated");
+	if (deprecateds.length) {
+		this.deprecated = deprecateds.map(function($){return $.desc;}).join("\n");
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@deprecated Use other method.*"+"/"));
+		is(sym.deprecated, "Use other method.", "@deprecated tag, desc is found.");
+	*/
+	
+	// @example
+	var examples = this.comment.getTag("example");
+	if (examples.length) {
+		this.example = examples.map(
+			// trim trailing whitespace
+			function($) {
+				$.desc = $.desc.replace(/\s+$/, "");
+				return $;
+			}
+		);
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@example This\n  is an example. \n*"+"/"));
+		isnt(typeof sym.example[0], "undefined", "@example tag, creates sym.example array.");
+		is(sym.example[0], "This\n  is an example.", "@example tag, desc is found.");
+	*/
+	
+	// @see
+	var sees = this.comment.getTag("see");
+	if (sees.length) {
+		var thisSee = this.see;
+		sees.map(function($){thisSee.push($.desc);});
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@see The other thing.*"+"/"));
+		is(sym.see, "The other thing.", "@see tag, desc is found.");
+	*/
+	
+	// @class
+	var classes = this.comment.getTag("class");
+	if (classes.length) {
+		this.isa = "CONSTRUCTOR";
+		this.classDesc = classes[0].desc; // desc can't apply to the constructor as there is none.
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@class This describes the class.*"+"/"));
+		is(sym.isa, "CONSTRUCTOR", "@class tag, makes symbol a constructor.");
+		is(sym.classDesc, "This describes the class.", "@class tag, class description is found.");
+	*/
+	
+	// @namespace
+	var namespaces = this.comment.getTag("namespace");
+	if (namespaces.length) {
+		this.classDesc = namespaces[0].desc;
+		this.isNamespace = true;
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@namespace This describes the namespace.*"+"/"));
+		is(sym.classDesc, "This describes the namespace.", "@namespace tag, class description is found.");
+	*/
+	
+	// @param
+	var params = this.comment.getTag("param");
+	if (params.length) {
+		// user-defined params overwrite those with same name defined by the parser
+		var thisParams = this.params;
+
+		if (thisParams.length == 0) { // none exist yet, so just bung all these user-defined params straight in
+			this.params = params;
+		}
+		else { // need to overlay these user-defined params on to existing parser-defined params
+			for (var i = 0, l = params.length; i < l; i++) {
+				if (thisParams[i]) {
+					if (params[i].type) thisParams[i].type = params[i].type;
+					thisParams[i].name = params[i].name;
+					thisParams[i].desc = params[i].desc;
+					thisParams[i].isOptional = params[i].isOptional;
+					thisParams[i].defaultValue = params[i].defaultValue;
+				}
+				else thisParams[i] = params[i];
+			}
+		}
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [{type: "array", name: "pages"}], "FUNCTION", new JSDOC.DocComment("/**Description.*"+"/"));
+		is(sym.params.length, 1, "parser defined param is found.");
+		
+		sym = new JSDOC.Symbol("foo", [], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {array} pages*"+"/"));
+		is(sym.params.length, 1, "user defined param is found.");
+		is(sym.params[0].type, "array", "user defined param type is found.");
+		is(sym.params[0].name, "pages", "user defined param name is found.");
+		
+		sym = new JSDOC.Symbol("foo", [{type: "array", name: "pages"}], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {string} uid*"+"/"));
+		is(sym.params.length, 1, "user defined param overwrites parser defined param.");
+		is(sym.params[0].type, "string", "user defined param type overwrites parser defined param type.");
+		is(sym.params[0].name, "uid", "user defined param name overwrites parser defined param name.");
+	
+		sym = new JSDOC.Symbol("foo", [{type: "array", name: "pages"}, {type: "number", name: "count"}], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {string} uid*"+"/"));
+		is(sym.params.length, 2, "user defined params  overlay parser defined params.");
+		is(sym.params[1].type, "number", "user defined param type overlays parser defined param type.");
+		is(sym.params[1].name, "count", "user defined param name overlays parser defined param name.");
+
+		sym = new JSDOC.Symbol("foo", [], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {array} pages The pages description.*"+"/"));
+		is(sym.params.length, 1, "user defined param with description is found.");
+		is(sym.params[0].desc, "The pages description.", "user defined param description is found.");
+	*/
+	
+	// @constructor
+	if (this.comment.getTag("constructor").length) {
+		this.isa = "CONSTRUCTOR";
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@constructor*"+"/"));
+		is(sym.isa, "CONSTRUCTOR", "@constructor tag, makes symbol a constructor.");
+	*/
+	
+	// @static
+	if (this.comment.getTag("static").length) {
+		this.isStatic = true;
+		if (this.isa == "CONSTRUCTOR") {
+			this.isNamespace = true;
+		}
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@static\n@constructor*"+"/"));
+		is(sym.isStatic, true, "@static tag, makes isStatic true.");
+		is(sym.isNamespace, true, "@static and @constructor tag, makes isNamespace true.");
+	*/
+	
+	// @inner
+	if (this.comment.getTag("inner").length) {
+		this.isInner = true;
+		this.isStatic = false;
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@inner*"+"/"));
+		is(sym.isStatic, false, "@inner tag, makes isStatic false.");
+		is(sym.isInner, true, "@inner makes isInner true.");
+	*/
+	
+	// @name
+	var names = this.comment.getTag("name");
+	if (names.length) {
+		this.name = names[0].desc;
+	}
+	
+	/*t:
+		// todo
+	*/
+	
+	// @field
+	if (this.comment.getTag("field").length) {
+		this.isa = "OBJECT";
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "FUNCTION", new JSDOC.DocComment("/**@field*"+"/"));
+		is(sym.isa, "OBJECT", "@field tag, makes symbol an object.");
+	*/
+	
+	// @function
+	if (this.comment.getTag("function").length) {
+		this.isa = "FUNCTION";
+		if (/event:/.test(this.alias)) this.isEvent = true;
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@function*"+"/"));
+		is(sym.isa, "FUNCTION", "@function tag, makes symbol a function.");
+	*/
+	
+	// @event
+	var events = this.comment.getTag("event");
+	if (events.length) {
+		this.isa = "FUNCTION";
+		this.isEvent = true;
+		if (!/event:/.test(this.alias))
+			this.alias = this.alias.replace(/^(.*[.#-])([^.#-]+)$/, "$1event:$2");
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@event*"+"/"));
+		is(sym.isa, "FUNCTION", "@event tag, makes symbol a function.");
+		is(sym.isEvent, true, "@event makes isEvent true.");
+	*/
+	
+	// @fires
+	var fires = this.comment.getTag("fires");
+	if (fires.length) {
+		for (var i = 0; i < fires.length; i++) {
+			this.fires.push(fires[i].desc);
+		}
+	}
+	
+	/*t:
+		// todo
+	*/
+	
+	// @property
+	var properties = this.comment.getTag("property");
+	if (properties.length) {
+		thisProperties = this.properties;
+		for (var i = 0; i < properties.length; i++) {
+			var property = new JSDOC.Symbol(this.alias+"#"+properties[i].name, [], "OBJECT", new JSDOC.DocComment("/**"+properties[i].desc+"*/"));
+			// TODO: shouldn't the following happen in the addProperty method of Symbol?
+			if (properties[i].type) property.type = properties[i].type;
+			if (properties[i].defaultValue) property.defaultValue = properties[i].defaultValue;
+			this.addProperty(property);
+			if (!JSDOC.Parser.symbols.getSymbolByName(property.name))
+				JSDOC.Parser.addSymbol(property);
+		}
+	}
+	
+	/*t:
+		// todo
+	*/
+
+	// @return
+	var returns = this.comment.getTag("return");
+	if (returns.length) { // there can be many return tags in a single doclet
+		this.returns = returns;
+		this.type = returns.map(function($){return $.type}).join(", ");
+	}
+	
+	/*t:
+		// todo
+	*/
+	
+	// @exception
+	this.exceptions = this.comment.getTag("throws");
+	
+	/*t:
+		// todo
+	*/
+	
+	// @requires
+	var requires = this.comment.getTag("requires");
+	if (requires.length) {
+		this.requires = requires.map(function($){return $.desc});
+	}
+	
+	/*t:
+		// todo
+	*/
+	
+	// @type
+	var types = this.comment.getTag("type");
+	if (types.length) {
+		this.type = types[0].desc; //multiple type tags are ignored
+	}
+	
+	/*t:
+		// todo
+	*/
+	
+	// @private
+	if (this.comment.getTag("private").length || this.isInner) {
+		this.isPrivate = true;
+	}
+	
+	// @ignore
+	if (this.comment.getTag("ignore").length) {
+		this.isIgnored = true;
+	}
+	
+	/*t:
+		// todo
+	*/
+	
+	// @inherits ... as ...
+	var inherits = this.comment.getTag("inherits");
+	if (inherits.length) {
+		for (var i = 0; i < inherits.length; i++) {
+			if (/^\s*([a-z$0-9_.#:-]+)(?:\s+as\s+([a-z$0-9_.#:-]+))?/i.test(inherits[i].desc)) {
+				var inAlias = RegExp.$1;
+				var inAs = RegExp.$2 || inAlias;
+
+				if (inAlias) inAlias = inAlias.replace(/\.prototype\.?/g, "#");
+				
+				if (inAs) {
+					inAs = inAs.replace(/\.prototype\.?/g, "#");
+					inAs = inAs.replace(/^this\.?/, "#");
+				}
+
+				if (inAs.indexOf(inAlias) != 0) { //not a full namepath
+					var joiner = ".";
+					if (this.alias.charAt(this.alias.length-1) == "#" || inAs.charAt(0) == "#") {
+						joiner = "";
+					}
+					inAs = this.alias + joiner + inAs;
+				}
+			}
+			this.inherits.push({alias: inAlias, as: inAs});
+		}
+	}
+	
+	/*t:
+		// todo
+	*/
+	
+	// @augments
+	this.augments = this.comment.getTag("augments");
+	
+	// @default
+	var defaults = this.comment.getTag("default");
+	if (defaults.length) {
+		if (this.is("OBJECT")) {
+			this.defaultValue = defaults[0].desc;
+		}
+	}
+	
+	/*t:
+		// todo
+	*/
+	
+	// @memberOf
+	var memberOfs = this.comment.getTag("memberOf");
+	if (memberOfs.length) {
+		this.memberOf = memberOfs[0].desc;
+		this.memberOf = this.memberOf.replace(/\.prototype\.?/g, "#");
+	}
+
+	/*t:
+		// todo
+	*/
+	
+	// @public
+	if (this.comment.getTag("public").length) {
+		this.isPrivate = false;
+	}
+	
+	/*t:
+		// todo
+	*/
+		
+	if (JSDOC.PluginManager) {
+		JSDOC.PluginManager.run("onSetTags", this);
+	}
+}
+
+JSDOC.Symbol.prototype.is = function(what) {
+	return this.isa === what;
+}
+
+JSDOC.Symbol.prototype.isBuiltin = function() {
+	return JSDOC.Lang.isBuiltin(this.alias);
+}
+
+JSDOC.Symbol.prototype.setType = function(/**String*/comment, /**Boolean*/overwrite) {
+	if (!overwrite && this.type) return;
+	var typeComment = JSDOC.DocComment.unwrapComment(comment);
+	this.type = typeComment;
+}
+
+JSDOC.Symbol.prototype.inherit = function(symbol) {
+	if (!this.hasMember(symbol.name) && !symbol.isInner) {
+		if (symbol.is("FUNCTION"))
+			this.methods.push(symbol);
+		else if (symbol.is("OBJECT"))
+			this.properties.push(symbol);
+	}
+}
+
+JSDOC.Symbol.prototype.hasMember = function(name) {
+	return (this.hasMethod(name) || this.hasProperty(name));
+}
+
+JSDOC.Symbol.prototype.addMember = function(symbol) {
+	if (symbol.is("FUNCTION")) { this.addMethod(symbol); }
+	else if (symbol.is("OBJECT")) { this.addProperty(symbol); }
+}
+
+JSDOC.Symbol.prototype.hasMethod = function(name) {
+	var thisMethods = this.methods;
+	for (var i = 0, l = thisMethods.length; i < l; i++) {
+		if (thisMethods[i].name == name) return true;
+		if (thisMethods[i].alias == name) return true;
+	}
+	return false;
+}
+
+JSDOC.Symbol.prototype.addMethod = function(symbol) {
+	var methodAlias = symbol.alias;
+	var thisMethods = this.methods;
+	for (var i = 0, l = thisMethods.length; i < l; i++) {
+		if (thisMethods[i].alias == methodAlias) {
+			thisMethods[i] = symbol; // overwriting previous method
+			return;
+		}
+	}
+	thisMethods.push(symbol); // new method with this alias
+}
+
+JSDOC.Symbol.prototype.hasProperty = function(name) {
+	var thisProperties = this.properties;
+	for (var i = 0, l = thisProperties.length; i < l; i++) {
+		if (thisProperties[i].name == name) return true;
+		if (thisProperties[i].alias == name) return true;
+	}
+	return false;
+}
+
+JSDOC.Symbol.prototype.addProperty = function(symbol) {
+	var propertyAlias = symbol.alias;
+	var thisProperties = this.properties;
+	for (var i = 0, l = thisProperties.length; i < l; i++) {
+		if (thisProperties[i].alias == propertyAlias) {
+			thisProperties[i] = symbol; // overwriting previous property
+			return;
+		}
+	}
+
+	thisProperties.push(symbol); // new property with this alias
+}
+
+JSDOC.Symbol.srcFile = ""; //running reference to the current file being parsed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/lib/JSDOC/SymbolSet.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,243 @@
+/** @constructor */
+JSDOC.SymbolSet = function() {
+	this.init();
+}
+
+JSDOC.SymbolSet.prototype.init = function() {
+	this._index = new Hash();
+}
+
+JSDOC.SymbolSet.prototype.keys = function() {
+	return this._index.keys();
+}
+
+JSDOC.SymbolSet.prototype.hasSymbol = function(alias) {
+	return this._index.hasKey(alias);
+}
+
+JSDOC.SymbolSet.prototype.addSymbol = function(symbol) {
+	if (JSDOC.opt.a && this.hasSymbol(symbol.alias)) {
+		LOG.warn("Overwriting symbol documentation for: " + symbol.alias + ".");
+		this.deleteSymbol(symbol.alias);
+	}
+	this._index.set(symbol.alias, symbol);
+}
+
+JSDOC.SymbolSet.prototype.getSymbol = function(alias) {
+	if (this.hasSymbol(alias)) return this._index.get(alias);
+}
+
+JSDOC.SymbolSet.prototype.getSymbolByName = function(name) {
+	for (var p = this._index.first(); p; p = this._index.next()) {
+		var symbol = p.value;
+		if (symbol.name == name) return symbol;
+	}
+}
+
+JSDOC.SymbolSet.prototype.toArray = function() {
+	return this._index.values();
+}
+
+JSDOC.SymbolSet.prototype.deleteSymbol = function(alias) {
+	if (!this.hasSymbol(alias)) return;
+	this._index.drop(alias);
+}
+
+JSDOC.SymbolSet.prototype.renameSymbol = function(oldName, newName) {
+	// todo: should check if oldname or newname already exist
+	this._index.replace(oldName, newName);
+	this._index.get(newName).alias = newName;
+	return newName;
+}
+
+JSDOC.SymbolSet.prototype.relate = function() {
+	this.resolveBorrows();
+	this.resolveMemberOf();
+	this.resolveAugments();
+}
+
+JSDOC.SymbolSet.prototype.resolveBorrows = function() {
+	for (var p = this._index.first(); p; p = this._index.next()) {
+		var symbol = p.value;
+		if (symbol.is("FILE") || symbol.is("GLOBAL")) continue;
+		
+		var borrows = symbol.inherits;
+		for (var i = 0; i < borrows.length; i++) {
+		
+if (/#$/.test(borrows[i].alias)) {
+	LOG.warn("Attempted to borrow entire instance of "+borrows[i].alias+" but that feature is not yet implemented.");
+	return;
+}
+			var borrowed = this.getSymbol(borrows[i].alias);
+			
+			if (!borrowed) {
+				LOG.warn("Can't borrow undocumented "+borrows[i].alias+".");
+				continue;
+			}
+
+			if (borrows[i].as == borrowed.alias) {
+				var assumedName = borrowed.name.split(/([#.-])/).pop();
+				borrows[i].as = symbol.name+RegExp.$1+assumedName;
+				LOG.inform("Assuming borrowed as name is "+borrows[i].as+" but that feature is experimental.");
+			}
+			
+			var borrowAsName = borrows[i].as;
+			var borrowAsAlias = borrowAsName;
+			if (!borrowAsName) {
+				LOG.warn("Malformed @borrow, 'as' is required.");
+				continue;
+			}
+			
+			if (borrowAsName.length > symbol.alias.length && borrowAsName.indexOf(symbol.alias) == 0) {
+				borrowAsName = borrowAsName.replace(borrowed.alias, "")
+			}
+			else {
+				var joiner = "";
+				if (borrowAsName.charAt(0) != "#") joiner = ".";
+				borrowAsAlias = borrowed.alias + joiner + borrowAsName;
+			}
+			
+			borrowAsName = borrowAsName.replace(/^[#.]/, "");
+					
+			if (this.hasSymbol(borrowAsAlias)) continue;
+
+			var clone = borrowed.clone();
+			clone.name = borrowAsName;
+			clone.alias = borrowAsAlias;
+			this.addSymbol(clone);
+		}
+	}
+}
+
+JSDOC.SymbolSet.prototype.resolveMemberOf = function() {
+	for (var p = this._index.first(); p; p = this._index.next()) {
+		var symbol = p.value;
+
+		if (symbol.is("FILE") || symbol.is("GLOBAL")) continue;
+		
+		// the memberOf value was provided in the @memberOf tag
+		else if (symbol.memberOf) {			
+			// like foo.bar is a memberOf foo
+			if (symbol.alias.indexOf(symbol.memberOf) == 0) {
+				var memberMatch = new RegExp("^("+symbol.memberOf+")[.#-]?(.+)$");
+				var aliasParts = symbol.alias.match(memberMatch);
+				
+				if (aliasParts) {
+					symbol.memberOf = aliasParts[1];
+					symbol.name = aliasParts[2];
+				}
+				
+				var nameParts = symbol.name.match(memberMatch);
+
+				if (nameParts) {
+					symbol.name = nameParts[2];
+				}
+			}
+			// like bar is a memberOf foo
+			else {
+				var joiner = symbol.memberOf.charAt(symbol.memberOf.length-1);
+				if (!/[.#-]/.test(joiner)) symbol.memberOf += ".";
+				this.renameSymbol(symbol.alias, symbol.memberOf + symbol.name);
+			}
+		}
+		// the memberOf must be calculated
+		else {
+			var parts = symbol.alias.match(/^(.*[.#-])([^.#-]+)$/);
+
+			if (parts) {
+				symbol.memberOf = parts[1];
+				symbol.name = parts[2];				
+			}
+		}
+
+		// set isStatic, isInner
+		if (symbol.memberOf) {
+			switch (symbol.memberOf.charAt(symbol.memberOf.length-1)) {
+				case '#' :
+					symbol.isStatic = false;
+					symbol.isInner = false;
+				break;
+				case '.' :
+					symbol.isStatic = true;
+					symbol.isInner = false;
+				break;
+				case '-' :
+					symbol.isStatic = false;
+					symbol.isInner = true;
+				break;
+				default: // memberOf ends in none of the above
+					symbol.isStatic = true;
+				break;
+			}
+		}
+		
+		// unowned methods and fields belong to the global object
+		if (!symbol.is("CONSTRUCTOR") && !symbol.isNamespace && symbol.memberOf == "") {
+			symbol.memberOf = "_global_";
+		}
+
+		// clean up
+		if (symbol.memberOf.match(/[.#-]$/)) {
+			symbol.memberOf = symbol.memberOf.substr(0, symbol.memberOf.length-1);
+		}
+		// add to parent's methods or properties list
+		if (symbol.memberOf) {
+
+			var container = this.getSymbol(symbol.memberOf);
+			if (!container) {
+				if (JSDOC.Lang.isBuiltin(symbol.memberOf)) container = JSDOC.Parser.addBuiltin(symbol.memberOf);
+				else {
+					LOG.warn("Trying to document "+symbol.name +" as a member of undocumented symbol "+symbol.memberOf+".");
+				}
+			}
+			
+			if (container) container.addMember(symbol);
+		}
+	}
+}
+
+JSDOC.SymbolSet.prototype.resolveAugments = function() {
+	for (var p = this._index.first(); p; p = this._index.next()) {
+		var symbol = p.value;
+		
+		if (symbol.alias == "_global_" || symbol.is("FILE")) continue;
+		JSDOC.SymbolSet.prototype.walk.apply(this, [symbol]);
+	}
+}
+
+JSDOC.SymbolSet.prototype.walk = function(symbol) {
+	var augments = symbol.augments;
+	for(var i = 0; i < augments.length; i++) {
+		var contributer = this.getSymbol(augments[i]);
+		if (!contributer && JSDOC.Lang.isBuiltin(''+augments[i])) {
+			contributer = new JSDOC.Symbol("_global_."+augments[i], [], augments[i], new JSDOC.DocComment("Built in."));
+			contributer.isNamespace = true;
+			contributer.srcFile = "";
+			contributer.isPrivate = false;
+			JSDOC.Parser.addSymbol(contributer);
+		}
+		
+		if (contributer) {			
+			if (contributer.augments.length) {
+				JSDOC.SymbolSet.prototype.walk.apply(this, [contributer]);
+			}
+			
+			symbol.inheritsFrom.push(contributer.alias);
+			//if (!isUnique(symbol.inheritsFrom)) {
+			//	LOG.warn("Can't resolve augments: Circular reference: "+symbol.alias+" inherits from "+contributer.alias+" more than once.");
+			//}
+			//else {
+				var cmethods = contributer.methods;
+				var cproperties = contributer.properties;
+				
+				for (var ci = 0, cl = cmethods.length; ci < cl; ci++) {
+					if (!cmethods[ci].isStatic) symbol.inherit(cmethods[ci]);
+				}
+				for (var ci = 0, cl = cproperties.length; ci < cl; ci++) {
+					if (!cproperties[ci].isStatic) symbol.inherit(cproperties[ci]);
+				}	
+			//}
+		}
+		else LOG.warn("Can't augment contributer: "+augments[i]+", not found.");
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/lib/JSDOC/TextStream.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,41 @@
+
+/**
+	@constructor
+*/
+JSDOC.TextStream = function(text) {
+	if (typeof(text) == "undefined") text = "";
+	text = ""+text;
+	this.text = text;
+	this.cursor = 0;
+}
+
+JSDOC.TextStream.prototype.look = function(n) {
+	if (typeof n == "undefined") n = 0;
+	
+	if (this.cursor+n < 0 || this.cursor+n >= this.text.length) {
+		var result = new String("");
+		result.eof = true;
+		return result;
+	}
+	return this.text.charAt(this.cursor+n);
+}
+
+JSDOC.TextStream.prototype.next = function(n) {
+	if (typeof n == "undefined") n = 1;
+	if (n < 1) return null;
+	
+	var pulled = "";
+	for (var i = 0; i < n; i++) {
+		if (this.cursor+i < this.text.length) {
+			pulled += this.text.charAt(this.cursor+i);
+		}
+		else {
+			var result = new String("");
+			result.eof = true;
+			return result;
+		}
+	}
+
+	this.cursor += n;
+	return pulled;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/lib/JSDOC/Token.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,18 @@
+if (typeof JSDOC == "undefined") JSDOC = {};
+
+/**
+	@constructor
+*/
+JSDOC.Token = function(data, type, name) {
+	this.data = data;
+	this.type = type;
+	this.name = name;
+}
+
+JSDOC.Token.prototype.toString = function() { 
+	return "<"+this.type+" name=\""+this.name+"\">"+this.data+"</"+this.type+">";
+}
+
+JSDOC.Token.prototype.is = function(what) {
+	return this.name === what || this.type === what;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/lib/JSDOC/TokenReader.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,332 @@
+if (typeof JSDOC == "undefined") JSDOC = {};
+
+/**
+	@class Search a {@link JSDOC.TextStream} for language tokens.
+*/
+JSDOC.TokenReader = function() {
+	this.keepDocs = true;
+	this.keepWhite = false;
+	this.keepComments = false;
+}
+
+/**
+	@type {JSDOC.Token[]}
+ */
+JSDOC.TokenReader.prototype.tokenize = function(/**JSDOC.TextStream*/stream) {
+	var tokens = [];
+	/**@ignore*/ tokens.last    = function() { return tokens[tokens.length-1]; }
+	/**@ignore*/ tokens.lastSym = function() {
+		for (var i = tokens.length-1; i >= 0; i--) {
+			if (!(tokens[i].is("WHIT") || tokens[i].is("COMM"))) return tokens[i];
+		}
+	}
+
+	while (!stream.look().eof) {
+		if (this.read_mlcomment(stream, tokens)) continue;
+		if (this.read_slcomment(stream, tokens)) continue;
+		if (this.read_dbquote(stream, tokens))   continue;
+		if (this.read_snquote(stream, tokens))   continue;
+		if (this.read_regx(stream, tokens))      continue;
+		if (this.read_numb(stream, tokens))      continue;
+		if (this.read_punc(stream, tokens))      continue;
+		if (this.read_newline(stream, tokens))   continue;
+		if (this.read_space(stream, tokens))     continue;
+		if (this.read_word(stream, tokens))      continue;
+		
+		// if execution reaches here then an error has happened
+		tokens.push(new JSDOC.Token(stream.next(), "TOKN", "UNKNOWN_TOKEN"));
+	}
+	return tokens;
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_word = function(/**JSDOC.TokenStream*/stream, tokens) {
+	var found = "";
+	while (!stream.look().eof && JSDOC.Lang.isWordChar(stream.look())) {
+		found += stream.next();
+	}
+	
+	if (found === "") {
+		return false;
+	}
+	else {
+		var name;
+		if ((name = JSDOC.Lang.keyword(found))) tokens.push(new JSDOC.Token(found, "KEYW", name));
+		else tokens.push(new JSDOC.Token(found, "NAME", "NAME"));
+		return true;
+	}
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_punc = function(/**JSDOC.TokenStream*/stream, tokens) {
+	var found = "";
+	var name;
+	while (!stream.look().eof && JSDOC.Lang.punc(found+stream.look())) {
+		found += stream.next();
+	}
+	
+	if (found === "") {
+		return false;
+	}
+	else {
+		tokens.push(new JSDOC.Token(found, "PUNC", JSDOC.Lang.punc(found)));
+		return true;
+	}
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_space = function(/**JSDOC.TokenStream*/stream, tokens) {
+	var found = "";
+	
+	while (!stream.look().eof && JSDOC.Lang.isSpace(stream.look())) {
+		found += stream.next();
+	}
+	
+	if (found === "") {
+		return false;
+	}
+	else {
+		if (this.collapseWhite) found = " ";
+		if (this.keepWhite) tokens.push(new JSDOC.Token(found, "WHIT", "SPACE"));
+		return true;
+	}
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_newline = function(/**JSDOC.TokenStream*/stream, tokens) {
+	var found = "";
+	
+	while (!stream.look().eof && JSDOC.Lang.isNewline(stream.look())) {
+		found += stream.next();
+	}
+	
+	if (found === "") {
+		return false;
+	}
+	else {
+		if (this.collapseWhite) found = "\n";
+		if (this.keepWhite) tokens.push(new JSDOC.Token(found, "WHIT", "NEWLINE"));
+		return true;
+	}
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_mlcomment = function(/**JSDOC.TokenStream*/stream, tokens) {
+	if (stream.look() == "/" && stream.look(1) == "*") {
+		var found = stream.next(2);
+		
+		while (!stream.look().eof && !(stream.look(-1) == "/" && stream.look(-2) == "*")) {
+			found += stream.next();
+		}
+		
+		// to start doclet we allow /** or /*** but not /**/ or /****
+		if (/^\/\*\*([^\/]|\*[^*])/.test(found) && this.keepDocs) tokens.push(new JSDOC.Token(found, "COMM", "JSDOC"));
+		else if (this.keepComments) tokens.push(new JSDOC.Token(found, "COMM", "MULTI_LINE_COMM"));
+		return true;
+	}
+	return false;
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_slcomment = function(/**JSDOC.TokenStream*/stream, tokens) {
+	var found;
+	if (
+		(stream.look() == "/" && stream.look(1) == "/" && (found=stream.next(2)))
+		|| 
+		(stream.look() == "<" && stream.look(1) == "!" && stream.look(2) == "-" && stream.look(3) == "-" && (found=stream.next(4)))
+	) {
+		
+		while (!stream.look().eof && !JSDOC.Lang.isNewline(stream.look())) {
+			found += stream.next();
+		}
+		
+		if (this.keepComments) {
+			tokens.push(new JSDOC.Token(found, "COMM", "SINGLE_LINE_COMM"));
+		}
+		return true;
+	}
+	return false;
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_dbquote = function(/**JSDOC.TokenStream*/stream, tokens) {
+	if (stream.look() == "\"") {
+		// find terminator
+		var string = stream.next();
+		
+		while (!stream.look().eof) {
+			if (stream.look() == "\\") {
+				if (JSDOC.Lang.isNewline(stream.look(1))) {
+					do {
+						stream.next();
+					} while (!stream.look().eof && JSDOC.Lang.isNewline(stream.look()));
+					string += "\\\n";
+				}
+				else {
+					string += stream.next(2);
+				}
+			}
+			else if (stream.look() == "\"") {
+				string += stream.next();
+				tokens.push(new JSDOC.Token(string, "STRN", "DOUBLE_QUOTE"));
+				return true;
+			}
+			else {
+				string += stream.next();
+			}
+		}
+	}
+	return false; // error! unterminated string
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_snquote = function(/**JSDOC.TokenStream*/stream, tokens) {
+	if (stream.look() == "'") {
+		// find terminator
+		var string = stream.next();
+		
+		while (!stream.look().eof) {
+			if (stream.look() == "\\") { // escape sequence
+				string += stream.next(2);
+			}
+			else if (stream.look() == "'") {
+				string += stream.next();
+				tokens.push(new JSDOC.Token(string, "STRN", "SINGLE_QUOTE"));
+				return true;
+			}
+			else {
+				string += stream.next();
+			}
+		}
+	}
+	return false; // error! unterminated string
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_numb = function(/**JSDOC.TokenStream*/stream, tokens) {
+	if (stream.look() === "0" && stream.look(1) == "x") {
+		return this.read_hex(stream, tokens);
+	}
+	
+	var found = "";
+	
+	while (!stream.look().eof && JSDOC.Lang.isNumber(found+stream.look())){
+		found += stream.next();
+	}
+	
+	if (found === "") {
+		return false;
+	}
+	else {
+		if (/^0[0-7]/.test(found)) tokens.push(new JSDOC.Token(found, "NUMB", "OCTAL"));
+		else tokens.push(new JSDOC.Token(found, "NUMB", "DECIMAL"));
+		return true;
+	}
+}
+/*t:
+	requires("../lib/JSDOC/TextStream.js");
+	requires("../lib/JSDOC/Token.js");
+	requires("../lib/JSDOC/Lang.js");
+	
+	plan(3, "testing JSDOC.TokenReader.prototype.read_numb");
+	
+	//// setup
+	var src = "function foo(num){while (num+8.0 >= 0x20 && num < 0777){}}";
+	var tr = new JSDOC.TokenReader();
+	var tokens = tr.tokenize(new JSDOC.TextStream(src));
+	
+	var hexToken, octToken, decToken;
+	for (var i = 0; i < tokens.length; i++) {
+		if (tokens[i].name == "HEX_DEC") hexToken = tokens[i];
+		if (tokens[i].name == "OCTAL") octToken = tokens[i];
+		if (tokens[i].name == "DECIMAL") decToken = tokens[i];
+	}
+	////
+	
+	is(decToken.data, "8.0", "decimal number is found in source.");
+	is(hexToken.data, "0x20", "hexdec number is found in source (issue #99).");
+	is(octToken.data, "0777", "octal number is found in source.");
+*/
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_hex = function(/**JSDOC.TokenStream*/stream, tokens) {
+	var found = stream.next(2);
+	
+	while (!stream.look().eof) {
+		if (JSDOC.Lang.isHexDec(found) && !JSDOC.Lang.isHexDec(found+stream.look())) { // done
+			tokens.push(new JSDOC.Token(found, "NUMB", "HEX_DEC"));
+			return true;
+		}
+		else {
+			found += stream.next();
+		}
+	}
+	return false;
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_regx = function(/**JSDOC.TokenStream*/stream, tokens) {
+	var last;
+	if (
+		stream.look() == "/"
+		&& 
+		(
+			
+			(
+				!(last = tokens.lastSym()) // there is no last, the regex is the first symbol
+				|| 
+				(
+					   !last.is("NUMB")
+					&& !last.is("NAME")
+					&& !last.is("RIGHT_PAREN")
+					&& !last.is("RIGHT_BRACKET")
+				)
+			)
+		)
+	) {
+		var regex = stream.next();
+		
+		while (!stream.look().eof) {
+			if (stream.look() == "\\") { // escape sequence
+				regex += stream.next(2);
+			}
+			else if (stream.look() == "/") {
+				regex += stream.next();
+				
+				while (/[gmi]/.test(stream.look())) {
+					regex += stream.next();
+				}
+				
+				tokens.push(new JSDOC.Token(regex, "REGX", "REGX"));
+				return true;
+			}
+			else {
+				regex += stream.next();
+			}
+		}
+		// error: unterminated regex
+	}
+	return false;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/lib/JSDOC/TokenStream.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,133 @@
+if (typeof JSDOC == "undefined") JSDOC = {};
+
+/**
+	@constructor
+*/
+JSDOC.TokenStream = function(tokens) {
+	this.tokens = (tokens || []);
+	this.rewind();
+}
+
+/**
+	@constructor
+	@private
+*/
+function VoidToken(/**String*/type) {
+	this.toString = function() {return "<VOID type=\""+type+"\">"};
+	this.is = function(){return false;}
+}
+
+JSDOC.TokenStream.prototype.rewind = function() {
+	this.cursor = -1;
+}
+
+/**
+	@type JSDOC.Token
+*/
+JSDOC.TokenStream.prototype.look = function(/**Number*/n, /**Boolean*/considerWhitespace) {
+	if (typeof n == "undefined") n = 0;
+
+	if (considerWhitespace == true) {
+		if (this.cursor+n < 0 || this.cursor+n > this.tokens.length) return {};
+		return this.tokens[this.cursor+n];
+	}
+	else {
+		var count = 0;
+		var i = this.cursor;
+
+		while (true) {
+			if (i < 0) return new JSDOC.Token("", "VOID", "START_OF_STREAM");
+			else if (i > this.tokens.length) return new JSDOC.Token("", "VOID", "END_OF_STREAM");
+
+			if (i != this.cursor && (this.tokens[i] === undefined || this.tokens[i].is("WHIT"))) {
+				if (n < 0) i--; else i++;
+				continue;
+			}
+			
+			if (count == Math.abs(n)) {
+				return this.tokens[i];
+			}
+			count++;
+			(n < 0)? i-- : i++;
+		}
+
+		return new JSDOC.Token("", "VOID", "STREAM_ERROR"); // because null isn't an object and caller always expects an object
+	}
+}
+
+/**
+	@type JSDOC.Token|JSDOC.Token[]
+*/
+JSDOC.TokenStream.prototype.next = function(/**Number*/howMany) {
+	if (typeof howMany == "undefined") howMany = 1;
+	if (howMany < 1) return null;
+	var got = [];
+
+	for (var i = 1; i <= howMany; i++) {
+		if (this.cursor+i >= this.tokens.length) {
+			return null;
+		}
+		got.push(this.tokens[this.cursor+i]);
+	}
+	this.cursor += howMany;
+
+	if (howMany == 1) {
+		return got[0];
+	}
+	else return got;
+}
+
+/**
+	@type JSDOC.Token[]
+*/
+JSDOC.TokenStream.prototype.balance = function(/**String*/start, /**String*/stop) {
+	if (!stop) stop = JSDOC.Lang.matching(start);
+	
+	var depth = 0;
+	var got = [];
+	var started = false;
+	
+	while ((token = this.look())) {
+		if (token.is(start)) {
+			depth++;
+			started = true;
+		}
+		
+		if (started) {
+			got.push(token);
+		}
+		
+		if (token.is(stop)) {
+			depth--;
+			if (depth == 0) return got;
+		}
+		if (!this.next()) break;
+	}
+}
+
+JSDOC.TokenStream.prototype.getMatchingToken = function(/**String*/start, /**String*/stop) {
+	var depth = 0;
+	var cursor = this.cursor;
+	
+	if (!start) {
+		start = JSDOC.Lang.matching(stop);
+		depth = 1;
+	}
+	if (!stop) stop = JSDOC.Lang.matching(start);
+	
+	while ((token = this.tokens[cursor])) {
+		if (token.is(start)) {
+			depth++;
+		}
+		
+		if (token.is(stop) && cursor) {
+			depth--;
+			if (depth == 0) return this.tokens[cursor];
+		}
+		cursor++;
+	}
+}
+
+JSDOC.TokenStream.prototype.insertAhead = function(/**JSDOC.Token*/token) {
+	this.tokens.splice(this.cursor+1, 0, token);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/lib/JSDOC/Util.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,32 @@
+/**
+ * @namespace
+ * @deprecated Use {@link FilePath} instead.
+ */
+JSDOC.Util = {
+}
+
+/**
+ * @deprecated Use {@link FilePath.fileName} instead.
+ */
+JSDOC.Util.fileName = function(path) {
+	LOG.warn("JSDOC.Util.fileName is deprecated. Use FilePath.fileName instead.");
+	var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
+	return path.substring(nameStart);
+}
+
+/**
+ * @deprecated Use {@link FilePath.fileExtension} instead.
+ */
+JSDOC.Util.fileExtension = function(filename) {
+	LOG.warn("JSDOC.Util.fileExtension is deprecated. Use FilePath.fileExtension instead.");
+	return filename.split(".").pop().toLowerCase();
+};
+
+/**
+ * @deprecated Use {@link FilePath.dir} instead.
+ */
+JSDOC.Util.dir = function(path) {
+	LOG.warn("JSDOC.Util.dir is deprecated. Use FilePath.dir instead.");
+	var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
+	return path.substring(0, nameStart-1);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/lib/JSDOC/Walker.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,507 @@
+if (typeof JSDOC == "undefined") JSDOC = {};
+
+/** @constructor */
+JSDOC.Walker = function(/**JSDOC.TokenStream*/ts) {
+	this.init();
+	if (typeof ts != "undefined") {
+		this.walk(ts);
+	}
+}
+
+JSDOC.Walker.prototype.init = function() {
+	this.ts = null;
+
+	var globalSymbol = new JSDOC.Symbol("_global_", [], "GLOBAL", new JSDOC.DocComment(""));
+	globalSymbol.isNamespace = true;
+	globalSymbol.srcFile = "";
+	globalSymbol.isPrivate = false;
+	JSDOC.Parser.addSymbol(globalSymbol);
+	this.lastDoc = null;
+	this.token = null;
+	
+	/**
+		The chain of symbols under which we are currently nested.
+		@type Array
+	*/
+	this.namescope = [globalSymbol];
+	this.namescope.last = function(n){ if (!n) n = 0; return this[this.length-(1+n)] || "" };
+}
+
+JSDOC.Walker.prototype.walk = function(/**JSDOC.TokenStream*/ts) {
+	this.ts = ts;
+	while (this.token = this.ts.look()) {
+		if (this.token.popNamescope) {
+			
+			var symbol = this.namescope.pop();
+			if (symbol.is("FUNCTION")) {
+				if (this.ts.look(1).is("LEFT_PAREN") && symbol.comment.getTag("function").length == 0) {
+					symbol.isa = "OBJECT";
+				}
+			}
+		}
+		this.step();
+		if (!this.ts.next()) break;
+	}
+}
+
+JSDOC.Walker.prototype.step = function() {
+	if (this.token.is("JSDOC")) { // it's a doc comment
+	
+		var doc = new JSDOC.DocComment(this.token.data);
+		
+				
+		if (doc.getTag("exports").length > 0) {
+			var exports = doc.getTag("exports")[0];
+
+			exports.desc.match(/(\S+) as (\S+)/i);
+			var n1 = RegExp.$1;
+			var n2 = RegExp.$2;
+			
+			if (!n1 && n2) throw "@exports tag requires a value like: 'name as ns.name'";
+			
+			JSDOC.Parser.rename = (JSDOC.Parser.rename || {});	
+			JSDOC.Parser.rename[n1] = n2
+		}
+		
+		if (doc.getTag("lends").length > 0) {
+			var lends = doc.getTag("lends")[0];
+
+			var name = lends.desc
+			if (!name) throw "@lends tag requires a value.";
+			
+			var symbol = new JSDOC.Symbol(name, [], "OBJECT", doc);
+			
+			this.namescope.push(symbol);
+			
+			var matching = this.ts.getMatchingToken("LEFT_CURLY");
+			if (matching) matching.popNamescope = name;
+			else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
+			
+			this.lastDoc = null;
+			return true;
+		}
+		else if (doc.getTag("name").length > 0 && doc.getTag("overview").length == 0) { // it's a virtual symbol
+			var virtualName = doc.getTag("name")[0].desc;
+			if (!virtualName) throw "@name tag requires a value.";
+			
+			if (doc.getTag("memberOf").length > 0) {
+				virtualName = (doc.getTag("memberOf")[0] + "." + virtualName)
+					.replace(/([#.])\./, "$1");
+				doc.deleteTag("memberOf");
+			}
+
+			var symbol = new JSDOC.Symbol(virtualName, [], "VIRTUAL", doc);
+			
+			JSDOC.Parser.addSymbol(symbol);
+			
+			this.lastDoc = null;
+			return true;
+		}
+		else if (doc.meta) { // it's a meta doclet
+			if (doc.meta == "@+") JSDOC.DocComment.shared = doc.src;
+			else if (doc.meta == "@-") JSDOC.DocComment.shared = "";
+			else if (doc.meta == "nocode+") JSDOC.Parser.conf.ignoreCode = true;
+			else if (doc.meta == "nocode-") JSDOC.Parser.conf.ignoreCode = JSDOC.opt.n;
+			else throw "Unrecognized meta comment: "+doc.meta;
+			
+			this.lastDoc = null;
+			return true;
+		}
+		else if (doc.getTag("overview").length > 0) { // it's a file overview
+			symbol = new JSDOC.Symbol("", [], "FILE", doc);
+			
+			JSDOC.Parser.addSymbol(symbol);
+			
+			this.lastDoc = null;
+			return true;
+		}
+		else {
+			this.lastDoc = doc;
+			return false;
+		}
+	}
+	else if (!JSDOC.Parser.conf.ignoreCode) { // it's code
+		if (this.token.is("NAME")) { // it's the name of something
+			var symbol;
+			var name = this.token.data;
+			var doc = null; if (this.lastDoc) doc = this.lastDoc;
+			var params = [];
+		
+			// it's inside an anonymous object
+			if (this.ts.look(1).is("COLON") && this.ts.look(-1).is("LEFT_CURLY") && !(this.ts.look(-2).is("JSDOC") || this.namescope.last().comment.getTag("lends").length || this.ts.look(-2).is("ASSIGN") || this.ts.look(-2).is("COLON"))) {
+				name = "$anonymous";
+				name = this.namescope.last().alias+"-"+name
+					
+				params = [];
+				
+				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
+
+				JSDOC.Parser.addSymbol(symbol);
+				
+				this.namescope.push(symbol);
+				
+				var matching = this.ts.getMatchingToken(null, "RIGHT_CURLY");
+				if (matching) matching.popNamescope = name;
+				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
+			}
+			// function foo() {}
+			else if (this.ts.look(-1).is("FUNCTION") && this.ts.look(1).is("LEFT_PAREN")) {
+				var isInner;
+				
+				if (this.lastDoc) doc = this.lastDoc;
+				
+				if (doc && doc.getTag("memberOf").length > 0) {
+					name = (doc.getTag("memberOf")[0]+"."+name).replace("#.", "#");
+					doc.deleteTag("memberOf");
+				}
+				else {
+					name = this.namescope.last().alias+"-"+name;
+					if (!this.namescope.last().is("GLOBAL")) isInner = true;
+				}
+				
+				if (!this.namescope.last().is("GLOBAL")) isInner = true;
+				
+				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
+
+				symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
+				if (isInner) symbol.isInner = true;
+
+				if (this.ts.look(1).is("JSDOC")) {
+					var inlineReturn = ""+this.ts.look(1).data;
+					inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, "");
+					symbol.type = inlineReturn;
+				}
+				
+				JSDOC.Parser.addSymbol(symbol);
+				
+				this.namescope.push(symbol);
+				
+				var matching = this.ts.getMatchingToken("LEFT_CURLY");
+				if (matching) matching.popNamescope = name;
+				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
+			}
+			// foo = function() {}
+			else if (this.ts.look(1).is("ASSIGN") && this.ts.look(2).is("FUNCTION")) {
+				var constructs;
+				var isConstructor = false;
+				if (doc && (constructs = doc.getTag("constructs")) && constructs.length) {
+					if (constructs[0].desc) {
+						name = constructs[0].desc;
+						isConstructor = true;
+					}
+				}
+					
+				var isInner;
+				if (this.ts.look(-1).is("VAR") || this.isInner) {
+					if (doc && doc.getTag("memberOf").length > 0) {
+						name = (doc.getTag("memberOf")[0]+"."+name).replace("#.", "#");
+						doc.deleteTag("memberOf");
+					}
+					else {
+						name = this.namescope.last().alias+"-"+name;
+						if (!this.namescope.last().is("GLOBAL")) isInner = true;
+					}
+					if (!this.namescope.last().is("GLOBAL")) isInner = true;
+				}
+				else if (name.indexOf("this.") == 0) {
+					name = this.resolveThis(name);
+				}
+
+				if (this.lastDoc) doc = this.lastDoc;
+				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
+				
+				symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
+
+				if (isInner) symbol.isInner = true;
+				if (isConstructor) symbol.isa = "CONSTRUCTOR";
+				
+				if (this.ts.look(1).is("JSDOC")) {
+					var inlineReturn = ""+this.ts.look(1).data;
+					inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, "");
+					symbol.type = inlineReturn;
+				}
+
+				JSDOC.Parser.addSymbol(symbol);
+				
+				this.namescope.push(symbol);
+				
+				var matching = this.ts.getMatchingToken("LEFT_CURLY");
+				if (matching) matching.popNamescope = name;
+				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
+			}
+			// foo = new function() {} or foo = (function() {}
+			else if (this.ts.look(1).is("ASSIGN") && (this.ts.look(2).is("NEW") || this.ts.look(2).is("LEFT_PAREN")) && this.ts.look(3).is("FUNCTION")) {
+				var isInner;
+				if (this.ts.look(-1).is("VAR") || this.isInner) {
+					name = this.namescope.last().alias+"-"+name
+					if (!this.namescope.last().is("GLOBAL")) isInner = true;
+				}
+				else if (name.indexOf("this.") == 0) {
+					name = this.resolveThis(name);
+				}
+
+				this.ts.next(3); // advance past the "new" or "("
+				
+				if (this.lastDoc) doc = this.lastDoc;
+				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
+				
+				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
+				if (isInner) symbol.isInner = true;
+				
+				if (this.ts.look(1).is("JSDOC")) {
+					var inlineReturn = ""+this.ts.look(1).data;
+					inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, "");
+					symbol.type = inlineReturn;
+				}
+				
+				JSDOC.Parser.addSymbol(symbol);
+				
+				symbol.scopeType = "INSTANCE";
+				this.namescope.push(symbol);
+				
+				var matching = this.ts.getMatchingToken("LEFT_CURLY");
+				if (matching) matching.popNamescope = name;
+				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
+			}
+			// foo: function() {}
+			else if (this.ts.look(1).is("COLON") && this.ts.look(2).is("FUNCTION")) {
+				name = (this.namescope.last().alias+"."+name).replace("#.", "#");
+				
+				if (this.lastDoc) doc = this.lastDoc;
+				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
+				
+				if (doc && doc.getTag("constructs").length) {
+					name = name.replace(/\.prototype(\.|$)/, "#");
+					
+					if (name.indexOf("#") > -1) name = name.match(/(^[^#]+)/)[0];
+					else name = this.namescope.last().alias;
+
+					symbol = new JSDOC.Symbol(name, params, "CONSTRUCTOR", doc);
+				}
+				else {
+					symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
+				}
+				
+				if (this.ts.look(1).is("JSDOC")) {
+					var inlineReturn = ""+this.ts.look(1).data;
+					inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, "");
+					symbol.type = inlineReturn;
+				}
+				
+				JSDOC.Parser.addSymbol(symbol);
+				
+				this.namescope.push(symbol);
+				
+				var matching = this.ts.getMatchingToken("LEFT_CURLY");
+				if (matching) matching.popNamescope = name;
+				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
+			}
+			// foo = {}
+			else if (this.ts.look(1).is("ASSIGN") && this.ts.look(2).is("LEFT_CURLY")) {
+				var isInner;
+				if (this.ts.look(-1).is("VAR") || this.isInner) {
+					name = this.namescope.last().alias+"-"+name
+					if (!this.namescope.last().is("GLOBAL")) isInner = true;
+				}
+				else if (name.indexOf("this.") == 0) {
+					name = this.resolveThis(name);
+				}
+				
+				if (this.lastDoc) doc = this.lastDoc;
+				
+				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
+				if (isInner) symbol.isInner = true;
+				
+			
+				if (doc) JSDOC.Parser.addSymbol(symbol);
+
+				this.namescope.push(symbol);
+				
+				var matching = this.ts.getMatchingToken("LEFT_CURLY");
+				if (matching) matching.popNamescope = name;
+				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
+			}
+			// var foo;
+			else if (this.ts.look(1).is("SEMICOLON")) {
+				var isInner;
+
+				if (this.ts.look(-1).is("VAR") || this.isInner) {
+					name = this.namescope.last().alias+"-"+name
+					if (!this.namescope.last().is("GLOBAL")) isInner = true;
+					
+					if (this.lastDoc) doc = this.lastDoc;
+				
+					symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
+					if (isInner) symbol.isInner = true;
+					
+				
+					if (doc) JSDOC.Parser.addSymbol(symbol);
+				}
+			}
+			// foo = x
+			else if (this.ts.look(1).is("ASSIGN")) {				
+				var isInner;
+				if (this.ts.look(-1).is("VAR") || this.isInner) {
+					name = this.namescope.last().alias+"-"+name
+					if (!this.namescope.last().is("GLOBAL")) isInner = true;
+				}
+				else if (name.indexOf("this.") == 0) {
+					name = this.resolveThis(name);
+				}
+				
+				if (this.lastDoc) doc = this.lastDoc;
+				
+				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
+				if (isInner) symbol.isInner = true;
+				
+			
+				if (doc) JSDOC.Parser.addSymbol(symbol);
+			}
+			// foo: {}
+			else if (this.ts.look(1).is("COLON") && this.ts.look(2).is("LEFT_CURLY")) {
+				name = (this.namescope.last().alias+"."+name).replace("#.", "#");
+				
+				if (this.lastDoc) doc = this.lastDoc;
+				
+				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
+				
+			
+				if (doc) JSDOC.Parser.addSymbol(symbol);
+				
+				this.namescope.push(symbol);
+				
+				var matching = this.ts.getMatchingToken("LEFT_CURLY");
+				if (matching) matching.popNamescope = name;
+				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
+			}
+			// foo: x
+			else if (this.ts.look(1).is("COLON")) {
+				name = (this.namescope.last().alias+"."+name).replace("#.", "#");;
+				
+				if (this.lastDoc) doc = this.lastDoc;
+				
+				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
+				
+			
+				if (doc) JSDOC.Parser.addSymbol(symbol);
+			}
+			// foo(...)
+			else if (this.ts.look(1).is("LEFT_PAREN")) {
+				if (typeof JSDOC.PluginManager != "undefined") {
+					var functionCall = {name: name};
+				
+					var cursor = this.ts.cursor;
+					params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
+					this.ts.cursor = cursor;
+					
+					for (var i = 0; i < params.length; i++)
+						functionCall["arg" + (i + 1)] = params[i].name;
+				
+					JSDOC.PluginManager.run("onFunctionCall", functionCall);
+					if (functionCall.doc) {
+						this.ts.insertAhead(new JSDOC.Token(functionCall.doc, "COMM", "JSDOC"));
+					}
+				}
+			}
+			this.lastDoc = null;
+		}
+		else if (this.token.is("FUNCTION")) { // it's an anonymous function
+			if (
+				(!this.ts.look(-1).is("COLON") || !this.ts.look(-1).is("ASSIGN"))
+				&& !this.ts.look(1).is("NAME")
+			) {
+				if (this.lastDoc) doc = this.lastDoc;
+				
+				name = "$anonymous";
+				name = this.namescope.last().alias+"-"+name
+				
+				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
+				
+				symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
+				
+				JSDOC.Parser.addSymbol(symbol);
+				
+				this.namescope.push(symbol);
+				
+				var matching = this.ts.getMatchingToken("LEFT_CURLY");
+				if (matching) matching.popNamescope = name;
+				else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
+			}
+		}
+	}
+	return true;
+}
+
+/**
+	Resolves what "this." means when it appears in a name.
+	@param name The name that starts with "this.".
+	@returns The name with "this." resolved.
+ */
+JSDOC.Walker.prototype.resolveThis = function(name) {
+	name.match(/^this\.(.+)$/)
+	var nameFragment = RegExp.$1;
+	if (!nameFragment) return name;
+	
+	var symbol = this.namescope.last();
+	var scopeType = symbol.scopeType || symbol.isa;
+
+	// if we are in a constructor function, `this` means the instance
+	if (scopeType == "CONSTRUCTOR") {
+		name = symbol.alias+"#"+nameFragment;
+	}
+	
+	// if we are in an anonymous constructor function, `this` means the instance
+	else if (scopeType == "INSTANCE") {
+		name = symbol.alias+"."+nameFragment;
+	}
+	
+	// if we are in a function, `this` means the container (possibly the global)
+	else if (scopeType == "FUNCTION") {
+		// in a method of a prototype, so `this` means the constructor
+		if (symbol.alias.match(/(^.*)[#.-][^#.-]+/)) {
+			var parentName = RegExp.$1;
+			var parent = JSDOC.Parser.symbols.getSymbol(parentName);
+
+			if (!parent) {
+				if (JSDOC.Lang.isBuiltin(parentName)) parent = JSDOC.Parser.addBuiltin(parentName);
+				else {
+					if (symbol.alias.indexOf("$anonymous") < 0) // these will be ignored eventually
+						LOG.warn("Trying to document "+symbol.alias+" without first documenting "+parentName+".");
+				}
+			}
+			if (parent) name = parentName+(parent.is("CONSTRUCTOR")?"#":".")+nameFragment;
+		}
+		else {
+			parent = this.namescope.last(1);
+			name = parent.alias+(parent.is("CONSTRUCTOR")?"#":".")+nameFragment;
+		}
+	}
+	// otherwise it means the global
+	else {
+		name = nameFragment;
+	}
+	
+	return name;
+}
+
+JSDOC.Walker.onParamList = function(/**Array*/paramTokens) {
+	if (!paramTokens) {
+		LOG.warn("Malformed parameter list. Can't parse code.");
+		return [];
+	}
+	var params = [];
+	for (var i = 0, l = paramTokens.length; i < l; i++) {
+		if (paramTokens[i].is("JSDOC")) {
+			var paramType = paramTokens[i].data.replace(/(^\/\*\* *| *\*\/$)/g, "");
+			
+			if (paramTokens[i+1] && paramTokens[i+1].is("NAME")) {
+				i++;
+				params.push({type: paramType, name: paramTokens[i].data});
+			}
+		}
+		else if (paramTokens[i].is("NAME")) {
+			params.push({name: paramTokens[i].data});
+		}
+	}
+	return params;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/main.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,111 @@
+/**
+ * @version $Id: main.js 818 2009-11-08 14:51:41Z micmath $
+ */
+
+function main() {
+	IO.include("lib/JSDOC.js");
+	IO.includeDir("plugins/");
+	
+	// process the options
+	
+	// the -c option: options are defined in a configuration file
+	if (JSDOC.opt.c) {
+		eval("JSDOC.conf = " + IO.readFile(JSDOC.opt.c));
+		
+		LOG.inform("Using configuration file at '"+JSDOC.opt.c+"'.");
+		
+		for (var c in JSDOC.conf) {
+			if (c !== "D" && !defined(JSDOC.opt[c])) { // commandline overrules config file
+				JSDOC.opt[c] = JSDOC.conf[c];
+			}
+		}
+		
+		if (typeof JSDOC.conf["_"] != "undefined") {
+			JSDOC.opt["_"] = JSDOC.opt["_"].concat(JSDOC.conf["_"]);
+		}
+		
+		LOG.inform("With configuration: ");
+		for (var o in JSDOC.opt) {
+			LOG.inform("    "+o+": "+JSDOC.opt[o]);
+		}
+	}
+	
+	// be verbose
+	if (JSDOC.opt.v) LOG.verbose = true;
+	
+	// send log messages to a file
+	if (JSDOC.opt.o) LOG.out = IO.open(JSDOC.opt.o);
+	
+	// run the unit tests
+	if (JSDOC.opt.T) {
+		LOG.inform("JsDoc Toolkit running in test mode at "+new Date()+".");
+		IO.include("frame/Testrun.js");
+		IO.include("test.js");
+	}
+	else {
+		// a template must be defined and must be a directory path
+		if (!JSDOC.opt.t && System.getProperty("jsdoc.template.dir")) {
+			JSDOC.opt.t = System.getProperty("jsdoc.template.dir");
+		}
+		if (JSDOC.opt.t && SYS.slash != JSDOC.opt.t.slice(-1)) {
+			JSDOC.opt.t += SYS.slash;
+		}
+		
+		// verbose messages about the options we were given
+		LOG.inform("JsDoc Toolkit main() running at "+new Date()+".");
+		LOG.inform("With options: ");
+		for (var o in JSDOC.opt) {
+			LOG.inform("    "+o+": "+JSDOC.opt[o]);
+		}
+		
+		// initialize and build a symbolSet from your code
+		JSDOC.JsDoc();
+		
+		// debugger's option: dump the entire symbolSet produced from your code
+		if (JSDOC.opt.Z) {
+			LOG.warn("So you want to see the data structure, eh? This might hang if you have circular refs...");
+			IO.include("frame/Dumper.js");
+			var symbols = JSDOC.JsDoc.symbolSet.toArray();
+			for (var i = 0, l = symbols.length; i < l; i++) {
+				var symbol = symbols[i];
+				print("// symbol: " + symbol.alias);
+				print(symbol.serialize());
+			}
+		}
+		else {
+			if (typeof JSDOC.opt.t != "undefined") {
+				try {
+					// a file named "publish.js" must exist in the template directory
+					load(JSDOC.opt.t+"publish.js");
+					
+					// and must define a function named "publish"
+					if (!publish) {
+						LOG.warn("No publish() function is defined in that template so nothing to do.");
+					}
+					else {
+						// which will be called with the symbolSet produced from your code
+						publish(JSDOC.JsDoc.symbolSet);
+					}
+				}
+				catch(e) {
+					LOG.warn("Sorry, that doesn't seem to be a valid template: "+JSDOC.opt.t+"publish.js : "+e);
+				}
+			}
+			else {
+				LOG.warn("No template given. Might as well read the usage notes.");
+				JSDOC.usage();
+			}
+		}
+	}
+	
+	// notify of any warnings
+	if (!JSDOC.opt.q && LOG.warnings.length) {
+		print(LOG.warnings.length+" warning"+(LOG.warnings.length != 1? "s":"")+".");
+	}
+	
+	// stop sending log messages to a file
+	if (LOG.out) {
+		LOG.out.flush();
+		LOG.out.close();
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/plugins/commentSrcJson.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,20 @@
+JSDOC.PluginManager.registerPlugin(
+	"JSDOC.commentSrcJson",
+	{
+		onDocCommentSrc: function(comment) {
+			var json;
+			if (/^\s*@json\b/.test(comment)) {
+				comment.src = new String(comment.src).replace("@json", "");
+
+				eval("json = "+comment.src);
+				var tagged = "";
+				for (var i in json) {
+					var tag = json[i];
+					// todo handle cases where tag is an object
+					tagged += "@"+i+" "+tag+"\n";
+				}
+				comment.src = tagged;
+			}
+		}
+	}
+);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/plugins/frameworkPrototype.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,16 @@
+JSDOC.PluginManager.registerPlugin(
+	"JSDOC.frameworkPrototype",
+	{
+		onPrototypeClassCreate: function(classCreator) {
+			var desc = "";
+			if (classCreator.comment) {
+				desc = classCreator.comment;
+			}
+			var insert = desc+"/** @name "+classCreator.name+"\n@constructor\n@scope "+classCreator.name+".prototype */"
+			
+			insert = insert.replace(/\*\/\/\*\*/g, "\n");
+			/*DEBUG*///print("insert is "+insert);
+			classCreator.addComment.data = insert;
+		}
+	}
+);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/plugins/functionCall.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,10 @@
+JSDOC.PluginManager.registerPlugin(
+	"JSDOC.functionCall",
+	{
+		onFunctionCall: function(functionCall) {
+			if (functionCall.name == "dojo.define" && functionCall.arg1) {
+				functionCall.doc = "/** @lends "+eval(functionCall.arg1)+".prototype */";
+			}
+		}
+	}
+);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/plugins/publishSrcHilite.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,62 @@
+JSDOC.PluginManager.registerPlugin(
+	"JSDOC.publishSrcHilite",
+	{
+		onPublishSrc: function(src) {
+			if (src.path in JsHilite.cache) {
+				return; // already generated src code
+			}
+			else JsHilite.cache[src.path] = true;
+		
+			try {
+				var sourceCode = IO.readFile(src.path);
+			}
+			catch(e) {
+				print(e.message);
+				quit();
+			}
+
+			var hiliter = new JsHilite(sourceCode, src.charset);
+			src.hilited = hiliter.hilite();
+		}
+	}
+);
+
+function JsHilite(src, charset) {
+
+	var tr = new JSDOC.TokenReader();
+	
+	tr.keepComments = true;
+	tr.keepDocs = true;
+	tr.keepWhite = true;
+	
+	this.tokens = tr.tokenize(new JSDOC.TextStream(src));
+	
+	// TODO is redefining toString() the best way?
+	JSDOC.Token.prototype.toString = function() { 
+		return "<span class=\""+this.type+"\">"+this.data.replace(/</g, "&lt;")+"</span>";
+	}
+	
+	if (!charset) charset = "utf-8";
+	
+	this.header = '<html><head><meta http-equiv="content-type" content="text/html; charset='+charset+'"> '+
+	"<style>\n\
+	.KEYW {color: #933;}\n\
+	.COMM {color: #bbb; font-style: italic;}\n\
+	.NUMB {color: #393;}\n\
+	.STRN {color: #393;}\n\
+	.REGX {color: #339;}\n\
+	.line {border-right: 1px dotted #666; color: #666; font-style: normal;}\n\
+	</style></head><body><pre>";
+	this.footer = "</pre></body></html>";
+	this.showLinenumbers = true;
+}
+
+JsHilite.cache = {};
+
+JsHilite.prototype.hilite = function() {
+	var hilited = this.tokens.join("");
+	var line = 1;
+	if (this.showLinenumbers) hilited = hilited.replace(/(^|\n)/g, function(m){return m+"<span class='line'>"+((line<10)? " ":"")+((line<100)? " ":"")+(line++)+"</span> "});
+	
+	return this.header+hilited+this.footer;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/plugins/symbolLink.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,10 @@
+JSDOC.PluginManager.registerPlugin(
+	"JSDOC.symbolLink",
+	{
+		onSymbolLink: function(link) {
+			// modify link.linkPath (the href part of the link)
+			// or link.linkText (the text displayed)
+			// or link.linkInner (the #name part of the link)
+		}
+	}
+);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/plugins/tagParamConfig.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,31 @@
+JSDOC.PluginManager.registerPlugin(
+	"JSDOC.tagParamConfig",
+	{
+		onDocCommentTags: function(comment) {
+			var currentParam = null;
+			var tags = comment.tags;
+			for (var i = 0, l = tags.length; i < l; i++) {
+				
+				if (tags[i].title == "param") {
+					if (tags[i].name.indexOf(".") == -1) {
+						currentParam = i;
+					}
+				}
+				else if (tags[i].title == "config") {
+					tags[i].title = "param";
+					if (currentParam == null) {
+						tags[i].name = "arguments"+"."+tags[i].name;
+					}
+					else if (tags[i].name.indexOf(tags[currentParam].name+".") != 0) {
+						tags[i].name = tags[currentParam].name+"."+tags[i].name;
+					}
+					currentParam != null
+					//tags[currentParam].properties.push(tags[i]);
+				}
+				else {
+					currentParam = null;
+				}
+			}
+		}
+	}
+);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/plugins/tagSynonyms.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,43 @@
+JSDOC.PluginManager.registerPlugin(
+	"JSDOC.tagSynonyms",
+	{
+		onDocCommentSrc: function(comment) {
+			comment.src = comment.src.replace(/@methodOf\b/i, "@function\n@memberOf");
+			comment.src = comment.src.replace(/@fieldOf\b/i, "@field\n@memberOf");
+		},
+		
+		onDocCommentTags: function(comment) {
+			for (var i = 0, l = comment.tags.length; i < l; i++) {
+				var title = comment.tags[i].title.toLowerCase();
+				var syn;
+				if ((syn = JSDOC.tagSynonyms.synonyms["="+title])) {
+					comment.tags[i].title = syn;
+				}
+			}
+		}
+	}
+);
+
+new Namespace(
+	"JSDOC.tagSynonyms",
+	function() {
+		JSDOC.tagSynonyms.synonyms = {
+			"=member":             "memberOf",
+			"=memberof":           "memberOf",
+			"=description":        "desc",
+			"=exception":          "throws",
+			"=argument":           "param",
+			"=returns":            "return",
+			"=classdescription":   "class",
+			"=fileoverview":       "overview",
+			"=extends":            "augments",
+			"=base":               "augments",
+			"=projectdescription": "overview",
+			"=classdescription":   "class",
+			"=link":               "see",
+			"=borrows":            "inherits",
+			"=scope":              "lends",
+			"=construct":          "constructor"
+		}
+	}
+);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/run.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,348 @@
+/**
+ * @fileOverview
+ * A bootstrap script that creates some basic required objects
+ * for loading other scripts.
+ * @author Michael Mathews, micmath@gmail.com
+ * @version $Id: run.js 756 2009-01-07 21:32:58Z micmath $
+ */
+
+/**
+ * @namespace Keep track of any messages from the running script.
+ */
+LOG = {
+	warn: function(msg, e) {
+		if (JSDOC.opt.q) return;
+		if (e) msg = e.fileName+", line "+e.lineNumber+": "+msg;
+		
+		msg = ">> WARNING: "+msg;
+		LOG.warnings.push(msg);
+		if (LOG.out) LOG.out.write(msg+"\n");
+		else print(msg);
+	},
+
+	inform: function(msg) {
+		if (JSDOC.opt.q) return;
+		msg = " > "+msg;
+		if (LOG.out) LOG.out.write(msg+"\n");
+		else if (typeof LOG.verbose != "undefined" && LOG.verbose) print(msg);
+	}
+};
+LOG.warnings = [];
+LOG.verbose = false
+LOG.out = undefined;
+
+/**
+ *	@class Manipulate a filepath.
+ */
+function FilePath(absPath, separator) {
+	this.slash =  separator || "/"; 
+	this.root = this.slash;
+	this.path = [];
+	this.file = "";
+	
+	var parts = absPath.split(/[\\\/]/);
+	if (parts) {
+		if (parts.length) this.root = parts.shift() + this.slash;
+		if (parts.length) this.file =  parts.pop()
+		if (parts.length) this.path = parts;
+	}
+	
+	this.path = this.resolvePath();
+}
+
+/** Collapse any dot-dot or dot items in a filepath. */
+FilePath.prototype.resolvePath = function() {
+	var resolvedPath = [];
+	for (var i = 0; i < this.path.length; i++) {
+		if (this.path[i] == "..") resolvedPath.pop();
+		else if (this.path[i] != ".") resolvedPath.push(this.path[i]);
+	}
+	return resolvedPath;
+}
+
+/** Trim off the filename. */
+FilePath.prototype.toDir = function() {
+	if (this.file) this.file = "";
+	return this;
+}
+
+/** Go up a directory. */
+FilePath.prototype.upDir = function() {
+	this.toDir();
+	if (this.path.length) this.path.pop();
+	return this;
+}
+
+FilePath.prototype.toString = function() {
+	return this.root
+		+ this.path.join(this.slash)
+		+ ((this.path.length > 0)? this.slash : "")
+		+ this.file;
+}
+
+/**
+ * Turn a path into just the name of the file.
+ */
+FilePath.fileName = function(path) {
+	var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
+	return path.substring(nameStart);
+}
+
+/**
+ * Get the extension of a filename
+ */
+FilePath.fileExtension = function(filename) {
+   return filename.split(".").pop().toLowerCase();
+};
+
+/**
+ * Turn a path into just the directory part.
+ */
+FilePath.dir = function(path) {
+	var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
+	return path.substring(0, nameStart-1);
+}
+
+
+importClass(java.lang.System);
+
+/**
+ * @namespace A collection of information about your system.
+ */
+SYS = {
+	/**
+	 * Information about your operating system: arch, name, version.
+	 * @type string
+	 */
+	os: [
+		new String(System.getProperty("os.arch")),
+		new String(System.getProperty("os.name")),
+		new String(System.getProperty("os.version"))
+	].join(", "),
+	
+	/**
+	 * Which way does your slash lean.
+	 * @type string
+	 */
+	slash: System.getProperty("file.separator")||"/",
+	
+	/**
+	 * The path to the working directory where you ran java.
+	 * @type string
+	 */
+	userDir: new String(System.getProperty("user.dir")),
+	
+	/**
+	 * Where is Java's home folder.
+	 * @type string
+	 */
+	javaHome: new String(System.getProperty("java.home")),
+	
+	/**
+	 * The absolute path to the directory containing this script.
+	 * @type string
+	 */
+	pwd: undefined
+};
+
+// jsrun appends an argument, with the path to here.
+if (arguments[arguments.length-1].match(/^-j=(.+)/)) {
+	if (RegExp.$1.charAt(0) == SYS.slash || RegExp.$1.charAt(1) == ":") { // absolute path to here
+		SYS.pwd = new FilePath(RegExp.$1).toDir().toString();
+	}
+	else { // relative path to here
+		SYS.pwd = new FilePath(SYS.userDir + SYS.slash + RegExp.$1).toDir().toString();
+	}
+	arguments.pop();
+}
+else {
+	print("The run.js script requires you use jsrun.jar.");
+	quit();
+}
+
+// shortcut
+var File = Packages.java.io.File;
+
+/**
+ * @namespace A collection of functions that deal with reading a writing to disk.
+ */
+IO = {
+
+	/**
+	 * Create a new file in the given directory, with the given name and contents.
+	 */
+	saveFile: function(/**string*/ outDir, /**string*/ fileName, /**string*/ content) {
+		var out = new Packages.java.io.PrintWriter(
+			new Packages.java.io.OutputStreamWriter(
+				new Packages.java.io.FileOutputStream(outDir+SYS.slash+fileName),
+				IO.encoding
+			)
+		);
+		out.write(content);
+		out.flush();
+		out.close();
+	},
+	
+	/**
+	 * @type string
+	 */
+	readFile: function(/**string*/ path) {
+		if (!IO.exists(path)) {
+			throw "File doesn't exist there: "+path;
+		}
+		return readFile(path, IO.encoding);
+	},
+
+	/**
+	 * @param inFile 
+	 * @param outDir
+	 * @param [fileName=The original filename]
+	 */
+	copyFile: function(/**string*/ inFile, /**string*/ outDir, /**string*/ fileName) {
+		if (fileName == null) fileName = FilePath.fileName(inFile);
+	
+		var inFile = new File(inFile);
+		var outFile = new File(outDir+SYS.slash+fileName);
+		
+		var bis = new Packages.java.io.BufferedInputStream(new Packages.java.io.FileInputStream(inFile), 4096);
+		var bos = new Packages.java.io.BufferedOutputStream(new Packages.java.io.FileOutputStream(outFile), 4096);
+		var theChar;
+		while ((theChar = bis.read()) != -1) {
+			bos.write(theChar);
+		}
+		bos.close();
+		bis.close();
+	},
+
+	/**
+	 * Creates a series of nested directories.
+	 */
+	mkPath: function(/**Array*/ path) {
+		if (path.constructor != Array) path = path.split(/[\\\/]/);
+		var make = "";
+		for (var i = 0, l = path.length; i < l; i++) {
+			make += path[i] + SYS.slash;
+			if (! IO.exists(make)) {
+				IO.makeDir(make);
+			}
+		}
+	},
+	
+	/**
+	 * Creates a directory at the given path.
+	 */
+	makeDir: function(/**string*/ path) {
+		(new File(path)).mkdir();
+	},
+
+	/**
+	 * @type string[]
+	 * @param dir The starting directory to look in.
+	 * @param [recurse=1] How many levels deep to scan.
+	 * @returns An array of all the paths to files in the given dir.
+	 */
+	ls: function(/**string*/ dir, /**number*/ recurse, _allFiles, _path) {
+		if (_path === undefined) { // initially
+			var _allFiles = [];
+			var _path = [dir];
+		}
+		if (_path.length == 0) return _allFiles;
+		if (recurse === undefined) recurse = 1;
+		
+		dir = new File(dir);
+		if (!dir.directory) return [String(dir)];
+		var files = dir.list();
+		
+		for (var f = 0; f < files.length; f++) {
+			var file = String(files[f]);
+			if (file.match(/^\.[^\.\/\\]/)) continue; // skip dot files
+	
+			if ((new File(_path.join(SYS.slash)+SYS.slash+file)).list()) { // it's a directory
+				_path.push(file);
+				if (_path.length-1 < recurse) IO.ls(_path.join(SYS.slash), recurse, _allFiles, _path);
+				_path.pop();
+			}
+			else {
+				_allFiles.push((_path.join(SYS.slash)+SYS.slash+file).replace(SYS.slash+SYS.slash, SYS.slash));
+			}
+		}
+	
+		return _allFiles;
+	},
+
+	/**
+	 * @type boolean
+	 */
+	exists: function(/**string*/ path) {
+		file = new File(path);
+	
+		if (file.isDirectory()){
+			return true;
+		}
+		if (!file.exists()){
+			return false;
+		}
+		if (!file.canRead()){
+			return false;
+		}
+		return true;
+	},
+
+	/**
+	 * 
+	 */
+	open: function(/**string*/ path, /**string*/ append) {
+		var append = true;
+		var outFile = new File(path);
+		var out = new Packages.java.io.PrintWriter(
+			new Packages.java.io.OutputStreamWriter(
+				new Packages.java.io.FileOutputStream(outFile, append),
+				IO.encoding
+			)
+		);
+		return out;
+	},
+
+	/**
+	 * Sets {@link IO.encoding}.
+	 * Encoding is used when reading and writing text to files,
+	 * and in the meta tags of HTML output.
+	 */
+	setEncoding: function(/**string*/ encoding) {
+		if (/ISO-8859-([0-9]+)/i.test(encoding)) {
+			IO.encoding = "ISO8859_"+RegExp.$1;
+		}
+		else {
+			IO.encoding = encoding;
+		}
+	},
+
+	/**
+	 * @default "utf-8"
+	 * @private
+	 */
+	encoding: "utf-8",
+	
+	/**
+	 * Load the given script.
+	 */
+	include: function(relativePath) {
+		load(SYS.pwd+relativePath);
+	},
+	
+	/**
+	 * Loads all scripts from the given directory path.
+	 */
+	includeDir: function(path) {
+		if (!path) return;
+		
+		for (var lib = IO.ls(SYS.pwd+path), i = 0; i < lib.length; i++) 
+			if (/\.js$/i.test(lib[i])) load(lib[i]);
+	}
+}
+
+// now run the application
+IO.include("frame.js");
+IO.include("main.js");
+
+main();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/t/TestDoc.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,144 @@
+var TestDoc = {
+	fails: 0,
+	plans: 0,
+	passes: 0,
+	results: []
+};
+
+TestDoc.record = function(result) {
+	TestDoc.results.push(result);
+	if (typeof result.verdict == "boolean") {
+		if (result.verdict === false) TestDoc.fails++;
+		if (result.verdict === true) TestDoc.passes++;
+	}
+}
+
+TestDoc.prove = function(filePath) {
+	if (typeof document != "undefined" && typeof document.write != "undefined") {
+		if (TestDoc.console) print = function(s) { TestDoc.console.appendChild(document.createTextNode(s+"\n")); }
+		else print = function(s) { document.write(s+"<br />"); }
+	}
+	TestDoc.run(TestDoc.readFile(filePath));
+}
+
+TestDoc.run = function(src) {
+	try { eval(src); } catch(e) { print("# ERROR! "+e); }
+	
+	var chunks = src.split(/\/\*t:/);
+	
+	var run = function(chunk) {
+		// local shortcuts
+		var is = TestDoc.assertEquals;
+		var isnt = TestDoc.assertNotEquals;
+		var plan = TestDoc.plan;
+		var requires = TestDoc.requires;
+		
+		try { eval(chunk); } catch(e) { print("# ERROR! "+e); }
+	}
+	for (var start = -1, end = 0; (start = src.indexOf("/*t:", end)) > end; start = end) {
+		run(
+			src.substring(
+				start+4,
+				(end = src.indexOf("*/", start))
+			)
+		);
+	}
+}
+
+TestDoc.Result = function(verdict, message) {
+	this.verdict = verdict;
+	this.message = message;
+}
+
+TestDoc.Result.prototype.toString = function() {
+	if (typeof this.verdict == "boolean") {
+		return (this.verdict? "ok" : "not ok") + " " + (++TestDoc.report.counter) + " - " + this.message;
+	}
+	
+	return "# " + this.message;
+}
+
+TestDoc.requires = function(file) {
+	if (!TestDoc.requires.loaded[file]) {
+		load(file);
+		TestDoc.requires.loaded[file] = true;
+	}
+}
+TestDoc.requires.loaded = {};
+
+TestDoc.report = function() {
+	TestDoc.report.counter = 0;
+	print("1.."+TestDoc.plans);
+	for (var i = 0; i < TestDoc.results.length; i++) {
+		print(TestDoc.results[i]);
+	}
+	print("----------------------------------------");
+	if (TestDoc.fails == 0 && TestDoc.passes == TestDoc.plans) {
+		print("All tests successful.");
+	}
+	else {
+		print("Failed " + TestDoc.fails + "/" + TestDoc.plans + " tests, "+((TestDoc.plans == 0)? 0 : Math.round(TestDoc.passes/(TestDoc.passes+TestDoc.fails)*10000)/100)+"% okay. Planned to run "+TestDoc.plans+", did run "+(TestDoc.passes+TestDoc.fails)+".")
+	}
+}
+
+TestDoc.plan = function(n, message) {
+	TestDoc.plans += n;
+	TestDoc.record(new TestDoc.Result(null, message+" ("+n+" tests)"));
+}
+
+TestDoc.assertEquals = function(a, b, message) {
+	var result = (a == b);
+	if (!result) message += "\n#\n# " + a + " does not equal " + b + "\n#";
+	TestDoc.record(new TestDoc.Result(result, message));
+}
+
+TestDoc.assertNotEquals = function(a, b, message) {
+	var result = (a != b);
+	if (!result) message += "\n#\n# " + a + " equals " + b + "\n#";
+	TestDoc.record(new TestDoc.Result(result, message));
+}
+
+TestDoc.readFile = (function(){
+	// rhino
+	if (typeof readFile == "function") {
+		return function(url) {
+			var text = readFile(url);
+			return text || "";
+		}
+	}
+
+	// a web browser
+	else {
+		return function(url) {
+			var httpRequest;
+		
+			if (window.XMLHttpRequest) { // Mozilla, Safari, etc
+				httpRequest = new XMLHttpRequest();
+			} 
+			else if (window.ActiveXObject) { // IE
+				try {
+					httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
+				} 
+				catch (e) {
+				   try {
+						httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
+					} 
+					catch (e) {
+					}
+				}
+			}
+		
+			if (!httpRequest) { throw "Cannot create HTTP Request."; }
+			
+			httpRequest.open('GET', url, false);
+			httpRequest.send('');
+			if (httpRequest.readyState == 4) {
+				if (httpRequest.status >= 400) {
+					throw "The HTTP Request returned an error code: "+httpRequest.status;
+				}
+			}
+			
+			return httpRequest.responseText || "";
+		}
+	}
+})();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/t/runner.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,13 @@
+// try: java -jar ../../jsrun.jar runner.js
+
+load("TestDoc.js");
+
+TestDoc.prove("../frame/Opt.js");
+TestDoc.prove("../lib/JSDOC.js");
+TestDoc.prove("../frame/String.js");
+TestDoc.prove("../lib/JSDOC/DocTag.js");
+TestDoc.prove("../lib/JSDOC/DocComment.js");
+TestDoc.prove("../lib/JSDOC/TokenReader.js");
+TestDoc.prove("../lib/JSDOC/Symbol.js");
+
+TestDoc.report();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,342 @@
+load("app/frame/Dumper.js");
+function symbolize(opt) {
+	symbols = null;
+	JSDOC.JsDoc(opt);
+	symbols = JSDOC.JsDoc.symbolSet;
+}
+
+var testCases = [
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/overview.js"]});
+		//print(Dumper.dump(symbols));	
+		is('symbols.getSymbolByName("My Cool Library").name', 'My Cool Library', 'File overview can be found by alias.');		
+	}
+	,
+	function() {
+		symbolize({_: [SYS.pwd+"test/name.js"]});
+
+		is('symbols.getSymbol("Response").name', "Response", 'Virtual class name is found.');
+		is('symbols.getSymbol("Response#text").alias', "Response#text", 'Virtual method name is found.');
+		is('symbols.getSymbol("Response#text").memberOf', "Response", 'Virtual method parent name is found.');
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/prototype.js"]});
+
+		is('symbols.getSymbol("Article").name', "Article", 'Function set to constructor prototype with inner constructor name is found.');
+		is('symbols.getSymbol("Article").hasMethod("init")', true, 'The initializer method name of prototype function is correct.');
+		is('symbols.getSymbol("Article").hasMember("counter")', true, 'A static property set in the prototype definition is found.');
+		is('symbols.getSymbol("Article").hasMember("title")', true, 'An instance property set in the prototype is found.');
+		is('symbols.getSymbol("Article#title").isStatic', false, 'An instance property has isStatic set to false.');
+		is('symbols.getSymbol("Article.counter").name', "counter", 'A static property set in the initializer has the name set correctly.');
+		is('symbols.getSymbol("Article.counter").memberOf', "Article", 'A static property set in the initializer has the memberOf set correctly.');
+		is('symbols.getSymbol("Article.counter").isStatic', true, 'A static property set in the initializer has isStatic set to true.');
+	}
+	,
+	function() {
+		symbolize({a:true, _: [SYS.pwd+"test/prototype_oblit.js"]});
+		
+		is('symbols.getSymbol("Article").name', "Article", 'Oblit set to constructor prototype name is found.');
+		is('typeof symbols.getSymbol("Article.prototype")', "undefined", 'The prototype oblit is not a symbol.');
+		is('symbols.getSymbol("Article#getTitle").name', "getTitle", 'The nonstatic method name of prototype oblit is correct.');
+		is('symbols.getSymbol("Article#getTitle").alias', "Article#getTitle", 'The alias of non-static method of prototype oblit is correct.');
+		is('symbols.getSymbol("Article#getTitle").isStatic', false, 'The isStatic of a nonstatic method of prototype oblit is correct.');
+		is('symbols.getSymbol("Article.getTitle").name', "getTitle", 'The static method name of prototype oblit is correct.');
+		is('symbols.getSymbol("Article.getTitle").isStatic', true, 'The isStatic of a static method of prototype oblit is correct.');
+		is('symbols.getSymbol("Article#getTitle").isa', "FUNCTION", 'The isa of non-static method of prototype oblit is correct.');
+		is('symbols.getSymbol("Article.getTitle").alias', "Article.getTitle", 'The alias of a static method of prototype oblit is correct.');
+		is('symbols.getSymbol("Article.getTitle").isa', "FUNCTION", 'The isa of static method of prototype oblit is correct.');
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/prototype_oblit_constructor.js"]});
+		
+		is('symbols.getSymbol("Article").name', "Article", 'Oblit set to constructor prototype with inner constructor name is found.');
+		is('symbols.getSymbol("Article#init").name', "init", 'The initializer method name of prototype oblit is correct.');
+		is('symbols.getSymbol("Article").hasMember("pages")', true, 'Property set by initializer method "this" is on the outer constructor.');
+		is('symbols.getSymbol("Article#Title").name', "Title", 'Name of the inner constructor name is found.');
+		is('symbols.getSymbol("Article#Title").memberOf', "Article", 'The memberOf of the inner constructor name is found.');
+		is('symbols.getSymbol("Article#Title").isa', "CONSTRUCTOR", 'The isa of the inner constructor name is constructor.');
+		is('symbols.getSymbol("Article#Title").hasMember("title")', true, 'A property set on the inner constructor "this"  is on the inner constructor.');
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/inner.js"]});
+		
+		is('symbols.getSymbol("Outer").name', "Outer", 'Outer constructor prototype name is found.');
+		is('symbols.getSymbol("Outer").methods.length', 1, 'Inner function doesnt appear as a method of the outer.');
+		is('symbols.getSymbol("Outer").hasMethod("open")', true, 'Outer constructors methods arent affected by inner function.');
+		is('symbols.getSymbol("Outer-Inner").alias', "Outer-Inner", 'Alias of inner function is found.');
+		is('symbols.getSymbol("Outer-Inner").isa', "CONSTRUCTOR", 'isa of inner function constructor is found.');
+		is('symbols.getSymbol("Outer-Inner").memberOf', "Outer", 'The memberOf of inner function is found.');
+		is('symbols.getSymbol("Outer-Inner").name', "Inner", 'The name of inner function is found.');
+		is('symbols.getSymbol("Outer-Inner#name").name', "name", 'A member of the inner function constructor, attached to "this" is found on inner.');
+		is('symbols.getSymbol("Outer-Inner#name").memberOf', "Outer-Inner", 'The memberOf of an inner function member is found.');		
+	}
+	,
+	function() {
+		symbolize({a:true, _: [SYS.pwd+"test/prototype_nested.js"]});
+		
+		is('symbols.getSymbol("Word").name', "Word", 'Base constructor name is found.');
+		is('symbols.getSymbol("Word").hasMethod("reverse")', true, 'Base constructor method is found.');
+		is('symbols.getSymbol("Word").methods.length', 1, 'Base constructor has only one method.');
+		is('symbols.getSymbol("Word").memberOf', "", 'Base constructor memberOf is empty.');
+		is('symbols.getSymbol("Word#reverse").name', "reverse", 'Member of constructor prototype name is found.');
+		is('symbols.getSymbol("Word#reverse").memberOf', "Word", 'Member of constructor prototype memberOf is found.');
+		is('symbols.getSymbol("Word#reverse.utf8").name', "utf8", 'Member of constructor prototype method name is found.');
+		is('symbols.getSymbol("Word#reverse.utf8").memberOf', "Word#reverse", 'Static nested member memberOf is found.');
+	}
+	,
+	function() {
+		symbolize({a:true, _: [SYS.pwd+"test/namespace_nested.js"]});
+		
+		is('symbols.getSymbol("ns1").name', "ns1", 'Base namespace name is found.');
+		is('symbols.getSymbol("ns1").memberOf', "", 'Base namespace memberOf is empty (its a constructor).');
+		is('symbols.getSymbol("ns1.ns2").name', "ns2", 'Nested namespace name is found.');
+ 		is('symbols.getSymbol("ns1.ns2").alias', "ns1.ns2", 'Nested namespace alias is found.');
+ 		is('symbols.getSymbol("ns1.ns2").memberOf', "ns1", 'Nested namespace memberOf is found.');
+ 		is('symbols.getSymbol("ns1.ns2.Function1").name', "Function1", 'Method of nested namespace name is found.');
+ 		is('symbols.getSymbol("ns1.ns2.Function1").memberOf', "ns1.ns2", 'Constructor of nested namespace memberOf is found.');			
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/functions_nested.js"]});
+		
+		is('symbols.getSymbol("Zop").name', "Zop", 'Any constructor name is found.');
+		is('symbols.getSymbol("Zop").isa', "CONSTRUCTOR", 'It isa constructor.');
+		is('symbols.getSymbol("Zop").hasMethod("zap")', true, 'Its method name, set later, is in methods array.');
+		is('symbols.getSymbol("Foo").name', "Foo", 'The containing constructor name is found.');
+		is('symbols.getSymbol("Foo").hasMethod("methodOne")', true, 'Its method name is found.');
+		is('symbols.getSymbol("Foo").hasMethod("methodTwo")', true, 'Its second method name is found.');
+		is('symbols.getSymbol("Foo#methodOne").alias', "Foo#methodOne", 'A methods alias is found.');
+		is('symbols.getSymbol("Foo#methodOne").isStatic', false, 'A methods is not static.');
+		is('symbols.getSymbol("Bar").name', "Bar", 'A global function declared inside another function is found.');
+		is('symbols.getSymbol("Bar").isa', "FUNCTION", 'It isa function.');
+		is('symbols.getSymbol("Bar").memberOf', "_global_", 'It is global.');
+		is('symbols.getSymbol("Foo-inner").name', "inner", 'An inner functions name is found.');
+		is('symbols.getSymbol("Foo-inner").memberOf', "Foo", 'It is member of the outer function.');
+		is('symbols.getSymbol("Foo-inner").isInner', true, 'It is an inner function.');
+	}
+	,
+	function() {
+		symbolize({a:true, _: [SYS.pwd+"test/memberof_constructor.js"]});
+		
+		is('symbols.getSymbol("Circle#Tangent").name', "Tangent", 'Constructor set on prototype using @member has correct name.');
+ 		is('symbols.getSymbol("Circle#Tangent").memberOf', "Circle", 'Constructor set on prototype using @member has correct memberOf.');
+ 		is('symbols.getSymbol("Circle#Tangent").alias', "Circle#Tangent", 'Constructor set on prototype using @member has correct alias.');
+ 		is('symbols.getSymbol("Circle#Tangent").isa', "CONSTRUCTOR", 'Constructor set on prototype using @member has correct isa.');
+		is('symbols.getSymbol("Circle#Tangent").isStatic', false, 'Constructor set on prototype using @member is not static.');
+		is('symbols.getSymbol("Circle#Tangent#getDiameter").name', "getDiameter", 'Method set on prototype using @member has correct name.');
+		is('symbols.getSymbol("Circle#Tangent#getDiameter").memberOf', "Circle#Tangent", 'Method set on prototype using @member has correct memberOf.');
+		is('symbols.getSymbol("Circle#Tangent#getDiameter").alias', "Circle#Tangent#getDiameter", 'Method set on prototype using @member has correct alias.');
+		is('symbols.getSymbol("Circle#Tangent#getDiameter").isa', "FUNCTION", 'Method set on prototype using @member has correct isa.');
+		is('symbols.getSymbol("Circle#Tangent#getDiameter").isStatic', false, 'Method set on prototype using @member is not static.');
+	}
+	,
+	function() {
+		symbolize({a:true, p: true,  _: [SYS.pwd+"test/memberof.js"]});
+		
+		is('symbols.getSymbol("pack.install").alias', "pack.install", 'Using @memberOf sets alias, when parent name is in memberOf tag.');
+		is('symbols.getSymbol("pack.install.overwrite").name', "install.overwrite", 'Using @memberOf sets name, even if the name is dotted.');
+		is('symbols.getSymbol("pack.install.overwrite").memberOf', "pack", 'Using @memberOf sets memberOf.');
+ 		is('symbols.getSymbol("pack.install.overwrite").isStatic', true, 'Using @memberOf with value not ending in octothorp sets isStatic to true.');
+	}
+	,
+	function() {
+		symbolize({a:true, p: true,  _: [SYS.pwd+"test/memberof2.js"]});
+		
+		is('symbols.getSymbol("Foo#bar").alias', "Foo#bar", 'An inner function can be documented as an instance method.');
+		is('symbols.getSymbol("Foo.zip").alias', "Foo.zip", 'An inner function can be documented as a static method.');
+		is('symbols.getSymbol("Foo.Fiz").alias', "Foo.Fiz", 'An inner function can be documented as a static constructor.');
+		is('symbols.getSymbol("Foo.Fiz#fipple").alias', "Foo.Fiz#fipple", 'An inner function can be documented as a static constructor with a method.');
+		is('symbols.getSymbol("Foo#blat").alias', "Foo#blat", 'An global function can be documented as an instance method.');
+	}
+	,
+	function() {
+		symbolize({a:true, p: true,  _: [SYS.pwd+"test/memberof3.js"]});
+		
+		is('symbols.getSymbol("Foo#bar").alias', "Foo#bar", 'A virtual field can be documented as an instance method.');
+		is('symbols.getSymbol("Foo2#bar").alias', "Foo2#bar", 'A virtual field with the same name can be documented as an instance method.');
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/borrows.js"]});
+
+		is('symbols.getSymbol("Layout").name', "Layout", 'Constructor can be found.');
+		is('symbols.getSymbol("Layout").hasMethod("init")', true, 'Constructor method name can be found.');
+		is('symbols.getSymbol("Layout").hasMember("orientation")', true, 'Constructor property name can be found.');
+		
+		is('symbols.getSymbol("Page").hasMethod("reset")', true, 'Second constructor method name can be found.');
+		is('symbols.getSymbol("Page").hasMember("orientation")', true, 'Second constructor borrowed property name can be found in properties.');
+		is('symbols.getSymbol("Page#orientation").memberOf', "Page", 'Second constructor borrowed property memberOf can be found.');
+		is('symbols.getSymbol("Page-getInnerElements").alias', "Page-getInnerElements", 'Can borrow an inner function and it is still inner.');
+		is('symbols.getSymbol("Page.units").alias', "Page.units", 'Can borrow a static function and it is still static.');
+		
+		is('symbols.getSymbol("ThreeColumnPage#init").alias', "ThreeColumnPage#init", 'Third constructor method can be found even though method with same name is borrowed.');
+		is('symbols.getSymbol("ThreeColumnPage#reset").alias', "ThreeColumnPage#reset", 'Borrowed method can be found.');
+		is('symbols.getSymbol("ThreeColumnPage#orientation").alias', "ThreeColumnPage#orientation", 'Twice borrowed method can be found.');
+	
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/borrows2.js"]});
+
+		is('symbols.getSymbol("Foo").hasMethod("my_zop")', true, 'Borrowed method can be found.');		
+		is('symbols.getSymbol("Bar").hasMethod("my_zip")', true, 'Second borrowed method can be found.');
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/constructs.js"]});
+
+		is('symbols.getSymbol("Person").hasMethod("say")', true, 'The constructs tag creates a class that lends can add a method to.');		
+	}
+	,
+	function() {
+		symbolize({a: true, _: [SYS.pwd+"test/augments.js", SYS.pwd+"test/augments2.js"]});
+		
+		is('symbols.getSymbol("Page").augments[0]', "Layout", 'An augmented class can be found.');
+		is('symbols.getSymbol("Page#reset").alias', "Page#reset", 'Method of augmenter can be found.');
+		is('symbols.getSymbol("Page").hasMethod("Layout#init")', true, 'Method from augmented can be found.');
+		is('symbols.getSymbol("Page").hasMember("Layout#orientation")', true, 'Property from augmented can be found.');
+		is('symbols.getSymbol("Page").methods.length', 3, 'Methods of augmented class are included in methods array.');
+	
+		is('symbols.getSymbol("ThreeColumnPage").augments[0]', "Page", 'The extends tag is a synonym for augments.');
+		is('symbols.getSymbol("ThreeColumnPage").hasMethod("ThreeColumnPage#init")', true, 'Local method overrides augmented method of same name.');
+		is('symbols.getSymbol("ThreeColumnPage").methods.length', 3, 'Local method count is right.');
+		
+		is('symbols.getSymbol("NewsletterPage").augments[0]', "ThreeColumnPage", 'Can augment across file boundaries.');
+		is('symbols.getSymbol("NewsletterPage").augments.length', 2, 'Multiple augments are supported.');
+		is('symbols.getSymbol("NewsletterPage").inherits[0].alias', "Junkmail#annoy", 'Inherited method with augments.');
+		is('symbols.getSymbol("NewsletterPage").methods.length', 6, 'Methods of augmented class are included in methods array across files.');
+		is('symbols.getSymbol("NewsletterPage").properties.length', 1, 'Properties of augmented class are included in properties array across files.');
+	}
+	,
+	function() {
+		symbolize({a:true, _: [SYS.pwd+"test/static_this.js"]});
+		
+		is('symbols.getSymbol("box.holder").name', "holder", 'Static namespace name can be found.');
+		is('symbols.getSymbol("box.holder.foo").name', "foo", 'Static namespace method name can be found.');
+		is('symbols.getSymbol("box.holder").isStatic', true, 'Static namespace method is static.');
+		
+		is('symbols.getSymbol("box.holder.counter").name', "counter", 'Instance namespace property name set on "this" can be found.');
+		is('symbols.getSymbol("box.holder.counter").alias', "box.holder.counter", 'Instance namespace property alias set on "this" can be found.');
+		is('symbols.getSymbol("box.holder.counter").memberOf', "box.holder", 'Static namespace property memberOf set on "this" can be found.');
+	}
+	,
+	function() {
+		symbolize({a:true, p: true, _: [SYS.pwd+"test/lend.js"]});
+
+		is('symbols.getSymbol("Person").name', "Person", 'Class defined in lend comment is found.');
+		is('symbols.getSymbol("Person").hasMethod("initialize")', true, 'Lent instance method name can be found.');
+		is('symbols.getSymbol("Person").hasMethod("say")', true, 'Second instance method can be found.');
+		is('symbols.getSymbol("Person#sing").isStatic', false, 'Instance method is known to be not static.');
+		
+		is('symbols.getSymbol("Person.getCount").name', "getCount", 'Static method name from second lend comment can be found.');
+		is('symbols.getSymbol("Person.getCount").isStatic', true, 'Static method from second lend comment is known to be static.');
+	
+		is('LOG.warnings.filter(function($){if($.indexOf("notok") > -1) return $}).length', 1, 'A warning is emitted when lending to an undocumented parent.');
+	}
+	,
+	function() {
+		symbolize({a:true, _: [SYS.pwd+"test/param_inline.js"]});
+	
+		is('symbols.getSymbol("Layout").params[0].type', "int", 'Inline param name is set.');
+		is('symbols.getSymbol("Layout").params[0].desc', "The number of columns.", 'Inline param desc is set from comment.');
+		is('symbols.getSymbol("Layout#getElement").params[0].name', "id", 'User defined param documentation takes precedence over parser defined.');
+		is('symbols.getSymbol("Layout#getElement").params[0].isOptional', true, 'Default for param is to not be optional.');
+		is('symbols.getSymbol("Layout#getElement").params[1].isOptional', false, 'Can mark a param as being optional.');
+		is('symbols.getSymbol("Layout#getElement").params[1].type', "number|string", 'Type of inline param doc can have multiple values.');
+		is('symbols.getSymbol("Layout#Canvas").params[0].type', "", 'Type can be not defined for some params.');
+		is('symbols.getSymbol("Layout#Canvas").params[2].type', "int", 'Type can be defined inline for only some params.');
+		is('symbols.getSymbol("Layout#rotate").params.length', 0, 'Docomments inside function sig is ignored without a param.');
+		is('symbols.getSymbol("Layout#init").params[2].type', "zoppler", 'Doc comment type overrides inline type for param with same name.');
+	}
+	,
+	function() {
+		symbolize({a: true, _: [SYS.pwd+"test/shared.js", SYS.pwd+"test/shared2.js"]});
+
+		is('symbols.getSymbol("Array#some").name', 'some', 'The name of a symbol in a shared section is found.');
+		is('symbols.getSymbol("Array#some").alias', 'Array#some', 'The alias of a symbol in a shared section is found.');
+		is('symbols.getSymbol("Array#some").desc', "Extension to builtin array.", 'A description can be shared.');
+		is('symbols.getSymbol("Array#filter").desc', "Extension to builtin array.\nChange every element of an array.", 'A shared description is appended.');
+		is('symbols.getSymbol("Queue").desc', "A first in, first out data structure.", 'A description is not shared when outside a shared section.');
+		is('symbols.getSymbol("Queue.rewind").alias', "Queue.rewind", 'Second shared tag can be started.');
+		is('symbols.getSymbol("startOver").alias', "startOver", 'Shared tag doesnt cross over files.');
+	}
+	,
+	function() {
+		symbolize({a: true, _: [SYS.pwd+"test/config.js"]});
+		is('symbols.getSymbol("Contact").params[0].name', 'person', 'The name of a param is found.');
+		is('symbols.getSymbol("Contact").params[1].name', 'person.name', 'The name of a param set with a dot name is found.');
+		is('symbols.getSymbol("Contact").params[2].name', 'person.age', 'The name of a second param set with a dot name is found.');
+		is('symbols.getSymbol("Contact").params[4].name', 'connection', 'The name of a param after config is found.');
+		
+		is('symbols.getSymbol("Family").params[0].name', 'persons', 'Another name of a param is found.');
+		is('symbols.getSymbol("Family").params[1].name', 'persons.Father', 'The name of a param+config is found.');
+		is('symbols.getSymbol("Family").params[2].name', 'persons.Mother', 'The name of a second param+config is found.');
+		is('symbols.getSymbol("Family").params[3].name', 'persons.Children', 'The name of a third param+config is found.');	
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/ignore.js"]});
+		is('LOG.warnings.filter(function($){if($.indexOf("undocumented symbol Ignored") > -1) return $}).length', 1, 'A warning is emitted when documenting members of an ignored parent.');
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/functions_anon.js"]});
+		is('symbols.getSymbol("a.b").alias', 'a.b', 'In anonymous constructor this is found to be the container object.');
+		is('symbols.getSymbol("a.f").alias', 'a.f', 'In anonymous constructor this can have a method.');
+		is('symbols.getSymbol("a.c").alias', 'a.c', 'In anonymous constructor method this is found to be the container object.');
+		is('symbols.getSymbol("g").alias', 'g', 'In anonymous function executed inline this is the global.');
+		is('symbols.getSymbol("bar2.p").alias', 'bar2.p', 'In named constructor executed inline this is the container object.');
+		is('symbols.getSymbol("module.pub").alias', 'module.pub', 'In parenthesized anonymous function executed inline function scoped variables arent documented.');
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/oblit_anon.js"]});
+		is('symbols.getSymbol("opt").name', 'opt', 'Anonymous object properties are created.');
+		is('symbols.getSymbol("opt.conf.keep").alias', 'opt.conf.keep', 'Anonymous object first property is assigned to $anonymous.');
+		is('symbols.getSymbol("opt.conf.base").alias', 'opt.conf.base', 'Anonymous object second property is assigned to $anonymous.');
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/params_optional.js"]});
+		is('symbols.getSymbol("Document").params.length', 3, 'Correct number of params are found when optional param syntax is used.');
+		is('symbols.getSymbol("Document").params[1].name', "id", 'Name of optional param is found.');
+		is('symbols.getSymbol("Document").params[1].isOptional', true, 'Optional param is marked isOptional.');
+		is('symbols.getSymbol("Document").params[2].name', "title", 'Name of optional param with default value is found.');
+		is('symbols.getSymbol("Document").params[2].isOptional', true, 'Optional param with default value is marked isOptional.');
+		is('symbols.getSymbol("Document").params[2].defaultValue', " This is untitled.", 'Optional param default value is found.');
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/synonyms.js"]});
+		is('symbols.getSymbol("myObject.myFunc").type', 'function', 'Type can be set to function.');
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/event.js"]});
+		is('symbols.getSymbol("Kitchen#event:cakeEaten").isEvent', true, 'Function with event prefix is an event.');
+		is('symbols.getSymbol("Kitchen#cakeEaten").isa', "FUNCTION", 'Function with same name as event isa function.');
+	}
+	,
+	function() {
+		symbolize({x:"js", a:true, _: [SYS.pwd+"test/scripts/"]});
+		is('JSDOC.JsDoc.srcFiles.length', 1, 'Only js files are scanned when -x=js.');
+	}
+	,
+	function() {
+		symbolize({x:"js", a:true, _: [SYS.pwd+"test/exports.js"]});
+		is('symbols.getSymbol("mxn.Map#doThings").name', 'doThings', 'Exports creates a documentation alias that can have methods.');
+	}
+	,
+	function() {
+		symbolize({p:true, a:true, _: [SYS.pwd+"test/module.js"]});
+		is('symbols.getSymbol("myProject.myModule.myPublicMethod").name', 'myPublicMethod', 'A function wrapped in parens can be recognized.');
+		is('symbols.getSymbol("myProject.myModule-myPrivateMethod").name', 'myPrivateMethod', 'A private method in the scope of a function wrapped in parens can be recognized.');
+		is('symbols.getSymbol("myProject.myModule-myPrivateVar").name', 'myPrivateVar', 'A private member in the scope of a function wrapped in parens can be recognized.');
+	}
+];
+
+//// run and print results
+print(testrun(testCases));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/addon.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,24 @@
+String.prototype.reverse = function() {
+}
+
+String.prototype.reverse.utf8 = function() {
+}
+
+Function.count = function() {
+}
+
+/** @memberOf Function */
+Function.count.reset = function() {
+}
+
+/** @memberOf Function */
+count.getValue = function() {
+}
+
+/** @memberOf Function.prototype */
+getSig = function() {
+}
+
+/** @memberOf Function.prototype */
+Function.prototype.getProps = function() {
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/anon_inner.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,14 @@
+/**
+ * @name bar
+ * @namespace
+ */
+ 
+new function() {
+    /**
+     * @name bar-foo
+     * @function
+     * @param {number} x
+     */
+    function foo(x) {
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/augments.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,31 @@
+/**
+@constructor
+*/
+function Layout(p) {
+	this.init = function(p) {
+	}
+	
+	this.getId = function() {
+	}
+	
+	/** @type Page */
+	this.orientation = "landscape";
+}
+
+/**
+@constructor
+@augments Layout
+*/
+function Page() {
+	this.reset = function(b) {
+	}
+}
+
+/**
+@extends Page
+@constructor
+*/
+function ThreeColumnPage() {
+	this.init = function(resetCode) {
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/augments2.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,26 @@
+/**
+@constructor
+*/
+function LibraryItem() {
+	this.reserve = function() {
+	}
+}
+
+/**
+@constructor
+*/
+function Junkmail() {
+	this.annoy = function() {
+	}
+}
+
+/**
+@inherits Junkmail.prototype.annoy as pester
+@augments ThreeColumnPage
+@augments LibraryItem
+@constructor
+*/
+function NewsletterPage() {
+	this.getHeadline = function() {
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/borrows.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,46 @@
+/**
+@constructor
+*/
+function Layout(p) {
+	/** initilize 1 */
+	this.init = function(p) {
+	}
+	
+	/** get the id */
+	this.getId = function() {
+	}
+	
+	/** @type string */
+	this.orientation = "landscape";
+	
+	function getInnerElements(elementSecretId){
+	}
+}
+
+/** A static method. */
+Layout.units = function() {
+}
+
+/**
+@constructor
+@borrows Layout#orientation
+@borrows Layout-getInnerElements
+@borrows Layout.units
+*/
+function Page() {
+	/** reset the page */
+	this.reset = function(b) {
+	}
+}
+
+/**
+@constructor
+@borrows Layout.prototype.orientation as this.orientation
+@borrows Layout.prototype.init as #init
+@inherits Page.prototype.reset as #reset
+*/
+function ThreeColumnPage() {
+	/** initilize 2 */
+	this.init = function(p) {
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/borrows2.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,23 @@
+// testing circular borrows
+
+/**
+	@class
+	@borrows Bar#zop as this.my_zop
+*/
+function Foo() {
+	/** this is a zip. */
+	this.zip = function() {}
+	
+	this.my_zop = new Bar().zop;
+}
+
+/**
+	@class
+	@borrows Foo#zip as this.my_zip
+*/
+function Bar() {
+	/** this is a zop. */
+	this.zop = function() {}
+	
+	this.my_zip = new Foo().zip;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/config.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,22 @@
+/**
+ * @constructor
+ * @param person The person.
+ * @param {string} person.name The person's name.
+ * @config {integer} age The person's age.
+ * @config [id=1] Optional id number to use.
+ * @param connection
+ */
+function Contact(person, connection) {
+
+}
+
+/**
+ * @constructor
+ * @param persons
+ * @config {string} Father The paternal person.
+ * @config {string} Mother The maternal person.
+ * @config {string[]} Children And the rest.
+ */
+function Family(/**Object*/persons) {
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/constructs.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,18 @@
+var Person = makeClass(
+    /**
+      @scope Person
+    */
+    {
+        /**
+        	This is just another way to define a constructor.
+        	@constructs
+        	@param {string} name The name of the person.
+         */
+        initialize: function(name) {
+            this.name = name;
+        },
+        say: function(message) {
+            return this.name + " says: " + message;
+        }
+    }
+);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/encoding.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,10 @@
+
+/**
+ * @Constructor
+ * @desc é…置文件
+ * @class 什么也ä¸è¿”回
+ */
+function Test(conf) {
+    // do something;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/encoding_other.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,12 @@
+
+/**
+ * @Constructor
+ * @desc ðïîÛ
+ * @class ßàáâãäåæçèçìëêíîï °±²³´µ¡¶·¸¹
+ */
+function Test(conf) {
+    // do something;
+}
+
+// run with commanline option -e=iso-8859-5
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/event.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,54 @@
+/**
+ * @name Kitchen
+ * @constructor
+ * @fires Bakery#event:donutOrdered
+ */
+
+/**
+ * Fired when some cake is eaten.
+ * @name Kitchen#event:cakeEaten
+ * @function
+ * @param {Number} pieces The number of pieces eaten.
+ */
+
+/**
+ * Find out if cake was eaten.
+ * @name Kitchen#cakeEaten
+ * @function
+ * @param {Boolean} wasEaten
+ */
+
+/**
+ * @name getDesert
+ * @function
+ * @fires Kitchen#event:cakeEaten
+ */
+ 
+/**
+ * @name Bakery
+ * @constructor
+ * @extends Kitchen
+ */
+
+/**
+ * Fired when a donut order is made.
+ * @name Bakery#event:donutOrdered
+ * @event
+ * @param {Event} e The event object.
+ * @param {String} [e.topping] Optional sprinkles.
+ */
+
+/**
+ * @constructor
+ * @borrows Bakery#event:donutOrdered as this.event:cakeOrdered
+ */
+function CakeShop() {
+}
+
+/** @event */
+CakeShop.prototype.icingReady = function(isPink) {
+}
+
+/** @event */
+function amHungry(/**Boolean*/enoughToEatAHorse) {
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/exports.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,14 @@
+/** @namespace */
+var mxn = {};
+
+(function(){ 
+    /** @exports Map as mxn.Map */
+    var Map =
+        /** @constructor */
+        mxn.Map = function() {
+        };
+    
+    /** A method. */
+    Map.prototype.doThings = function() {
+    };
+})();
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/functions_anon.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,39 @@
+/** an anonymous constructor executed inline */
+a = new function() {
+	/** a.b*/
+    this.b = 1;
+    /** a.f */
+    this.f = function() {
+    	/** a.c */
+    	this.c = 2;
+    }
+}
+
+
+/**
+	named function executed inline
+*/
+bar1 = function Zoola1() {
+	/** property of global */
+	this.g = 1;
+}();
+
+/**
+	named constructor executed inline
+*/
+bar2 = new function Zoola2() {
+	/** property of bar */
+	this.p = 1;
+};
+
+/** module pattern */
+module = (function () {
+	/** won't appear in documentation */
+	var priv = 1;
+	
+	/** @scope module */
+	return {
+		/** will appear as a property of module */
+		pub: 1
+	}
+})();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/functions_nested.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,33 @@
+/** @constructor */
+function Zop() {
+}
+
+/**
+ @class
+*/
+Foo = function(id) {
+	// this is a bit twisted, but if you call Foo() you will then
+	// modify Foo(). This is kinda, sorta non-insane, because you
+	// would have to call Foo() 100% of the time to use Foo's methods
+	Foo.prototype.methodOne = function(bar) {
+	  alert(bar);
+	};
+	
+	// same again
+	Foo.prototype.methodTwo = function(bar2) {
+	  alert(bar2);
+	};
+	
+	// and these are only executed if the enclosing function is actually called
+	// and who knows if that will ever happen?
+	Bar = function(pez) {
+	  alert(pez);
+	};
+	Zop.prototype.zap = function(p){
+		alert(p);
+	};
+	
+	// but this is only visible inside Foo
+	function inner() {
+	}
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/global.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,13 @@
+/** ecks */
+var x = [1, 2, 4];
+
+var y = {
+	foo: function(){
+	}
+}
+
+bar = function() {
+}
+
+function zop() {
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/globals.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,25 @@
+function example(/**Circle*/a, b) {
+	/** a global defined in function  */
+	var number = a;
+	
+	var hideNumber = function(){
+	}
+	
+	setNumber = function(){
+	}
+	alert('You have chosen: ' + b);
+}
+
+function initPage() {
+	var supported = document.createElement && document.getElementsByTagName;
+	if (!supported) return;
+	// start of DOM script
+	var x = document.getElementById('writeroot');
+	// etc.
+}
+
+/** an example var */
+var document = new Document(x, y);
+
+var getNumber = function(){
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/ignore.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,10 @@
+/**
+ * A test constructor.
+ * @constructor
+ * @ignore
+ */
+function Ignored() {
+	/** a method */
+    this.bar = function() {
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/inner.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,16 @@
+/**
+ * @constructor
+ */
+function Outer() {
+  /**
+   * @constructor
+   */
+  function Inner(name) {
+    /** The name of this. */
+    this.name = name;
+  }
+
+  this.open = function(name) {
+    return (new Inner(name));
+  }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/jsdoc_test.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,477 @@
+/** 
+ * @fileoverview This file is to be used for testing the JSDoc parser
+ * It is not intended to be an example of good JavaScript OO-programming,
+ * nor is it intended to fulfill any specific purpose apart from 
+ * demonstrating the functionality of the 
+ * <a href='http://sourceforge.net/projects/jsdoc'>JSDoc</a> parser
+ *
+ * @author Gabriel Reid gab_reid@users.sourceforge.net
+ * @version 0.1 
+ */
+
+
+/**
+ * Construct a new Shape object.
+ * @class This is the basic Shape class.  
+ * It can be considered an abstract class, even though no such thing
+ * really existing in JavaScript
+ * @constructor
+ * @throws MemoryException if there is no more memory 
+ * @throws GeneralShapeException rarely (if ever)
+ * @return {Shape|Coordinate} A new shape.
+ */
+function Shape(){
+  
+   /**
+    * This is an example of a function that is not given as a property
+    * of a prototype, but instead it is assigned within a constructor.
+    * For inner functions like this to be picked up by the parser, the
+    * function that acts as a constructor <b>must</b> be denoted with
+    * the <b>&#64;constructor</b> tag in its comment.
+    * @type String
+    */
+   this.getClassName = function(){
+      return "Shape";
+   }
+
+   /** 
+    * This is an inner method, just used here as an example
+    * @since version 0.5
+    * @author Sue Smart
+    */
+   function addReference(){
+       // Do nothing...
+   }
+   
+}
+
+/**
+ * Create a new Hexagon instance.
+ * @extends Shape
+ * @class Hexagon is a class that is a <i>logical</i> sublcass of 
+ * {@link Shape} (thanks to the <code>&#64;extends</code> tag), but in 
+ * reality it is completely unrelated to Shape.
+ * @param {int} sideLength The length of one side for the new Hexagon
+ * @example
+ * var h = new Hexagon(2);
+ * @example
+ * if (hasHex) {
+ *     hex   = new Hexagon(5);
+ *     color = hex.getColor();
+ * }
+ */
+function Hexagon(sideLength) {
+}
+
+
+/**
+ * This is an unattached (static) function that adds two integers together.
+ * @param {int} One The first number to add 
+ * @param {int} Two The second number to add 
+ * @author Gabriel Reid
+ * @deprecated So you shouldn't use it anymore! Use {@link Shape#getClassName} instead.
+ */
+function Add(One, Two){
+    return One + Two;
+}
+
+
+/**
+ * The color of this shape
+ * @type Color
+ */
+Shape.prototype.color = null;
+
+/**
+ * The border of this shape. 
+ * @field
+ * @type int
+ */
+Shape.prototype.border = function(){return border;};
+
+/*
+ * These are all the instance method implementations for Shape
+ */
+
+/**
+ * Get the coordinates of this shape. It is assumed that we're always talking
+ * about shapes in a 2D location here.
+ * @requires The {@link Shape} class
+ * @returns A Coordinate object representing the location of this Shape
+ * @type Coordinate[]
+ */
+Shape.prototype.getCoords = function(){
+   return this.coords;
+}
+
+/**
+ * Get the color of this shape.
+ * @see #setColor
+ * @see The <a href="http://example.com">Color</a> library.
+ * @link Shape
+ * @type Color
+ */
+Shape.prototype.getColor = function(){
+   return this.color;
+}
+
+/**
+ * Set the coordinates for this Shape
+ * @param {Coordinate} coordinates The coordinates to set for this Shape
+ */
+Shape.prototype.setCoords = function(coordinates){
+   this.coords = coordinates;
+}
+
+/**
+ * Set the color for this Shape
+ * @param {Color} color The color to set for this Shape
+ * @param other There is no other param, but it can still be documented if
+ *              optional parameters are used
+ * @throws NonExistantColorException (no, not really!)
+ * @see #getColor
+ */
+Shape.prototype.setColor = function(color){
+   this.color = color;
+}
+
+/**
+ * Clone this shape
+ * @returns A copy of this shape
+ * @type Shape
+ * @author Gabriel Reid
+ */
+Shape.prototype.clone = function(){
+   return new Shape();
+}
+
+/**
+ * Create a new Rectangle instance. 
+ * @class A basic rectangle class, inherits from Shape.
+ * This class could be considered a concrete implementation class
+ * @constructor
+ * @param {int} width The optional width for this Rectangle
+ * @param {int} height Thie optional height for this Rectangle
+ * @author Gabriel Reid
+ * @see Shape is the base class for this
+ * @augments Shape
+ * @hilited
+ */
+function Rectangle(width, // This is the width 
+                  height // This is the height
+                  ){
+   if (width){
+      this.width = width;
+      if (height){
+	 this.height = height;
+      }
+   }
+}
+
+
+/* Inherit from Shape */
+Rectangle.prototype = new Shape();
+
+/**
+ * Value to represent the width of the Rectangle.
+ * <br>Text in <b>bold</b> and <i>italic</i> and a 
+ * link to <a href="http://sf.net">SourceForge</a>
+ * @private
+ * @type int
+ */
+Rectangle.prototype.width = 0;
+
+/**
+ * Value to represent the height of the Rectangle
+ * @private
+ * @type int
+ */
+Rectangle.prototype.height = 0;
+
+/**
+ * Get the type of this object. 
+ * @type String
+ */
+Rectangle.prototype.getClassName= function(){
+    return "Rectangle";
+}
+
+/**
+ * Get the value of the width for the Rectangle
+ * @type int
+ * @see Rectangle#setWidth
+ */
+Rectangle.prototype.getWidth = function(){
+   return this.width;
+}
+
+/**
+ * Get the value of the height for the Rectangle.
+ * Another getter is the {@link Shape#getColor} method in the 
+ * {@link Shape} base class.  
+ * @return The height of this Rectangle
+ * @type int
+ * @see Rectangle#setHeight
+ */
+Rectangle.prototype.getHeight = function(){
+    return this.height;
+}
+
+/**
+ * Set the width value for this Rectangle.
+ * @param {int} width The width value to be set
+ * @see #setWidth
+ */
+Rectangle.prototype.setWidth = function(width){
+   this.width = width;
+}
+
+/**
+ * Set the height value for this Rectangle.
+ * @param {int} height The height value to be set
+ * @see #getHeight
+ */
+Rectangle.prototype.setHeight = function(height){
+   this.height = height;
+}
+
+/**
+ * Get the value for the total area of this Rectangle
+ * @return total area of this Rectangle
+ * @type int
+ */
+Rectangle.prototype.getArea = function(){
+   return width * height;
+}
+
+
+/**
+ * Create a new Square instance.
+ * @class A Square is a subclass of {@link Rectangle}
+ * @param {int} width The optional width for this Rectangle
+ * @param {int} height The optional height for this Rectangle
+ * @augments Rectangle
+ */
+function Square(width, height){
+   if (width){
+      this.width = width;
+      if (height){
+	 this.height = height;
+      }
+   } 
+   
+}
+
+/* Square is a subclass of Rectangle */
+Square.prototype = new Rectangle();
+
+/**
+ * Set the width value for this Shape.
+ * @param {int} width The width value to be set
+ * @see #getWidth
+ */
+Square.prototype.setWidth = function(width){
+   this.width = this.height = width;
+}
+
+/**
+ * Set the height value for this Shape 
+ * Sets the {@link Rectangle#height} attribute in the Rectangle.
+ * @param {int} height The height value to be set
+ */
+Square.prototype.setHeight = function(height){
+   this.height = this.width = height;
+}
+
+
+/**
+ * Create a new Circle instance based on a radius.
+ * @class Circle class is another subclass of Shape
+ * @extends Shape
+ * @param {int} radius The optional radius of this {@link Circle }
+ * @mixin Square.prototype.setWidth as this.setDiameter
+ */
+function Circle(radius){
+   if (radius) {
+      /** The radius of the this Circle. */
+      this.radius = radius;
+   }
+}
+
+/* Circle inherits from {@link Shape} */
+Circle.prototype = new Shape();
+
+/** 
+ * The radius value for this Circle 
+ * @private
+ * @type int
+ */
+Circle.prototype.radius = 0;
+
+/** 
+ * A very simple class (static) field that is also a constant
+ * @final
+ * @type float
+ */
+Circle.PI = 3.14;
+
+/**
+ * Get the radius value for this Circle
+ * @type int
+ * @see #setRadius
+ */
+Circle.prototype.getRadius = function(){
+   return this.radius;
+}
+
+/** 
+ * Set the radius value for this Circle
+ * @param {int} radius The {@link Circle#radius} value to set
+ * @see #getRadius
+ */
+Circle.prototype.setRadius = function(radius){
+   this.radius = radius;
+}
+
+/** 
+ * An example of a  class (static) method that acts as a factory for Circle
+ * objects. Given a radius value, this method creates a new Circle.
+ * @param {int} radius The radius value to use for the new Circle.
+ * @type Circle
+ */
+Circle.createCircle = function(radius){
+    return new Circle(radius);
+}
+
+
+/**
+ * Create a new Coordinate instance based on x and y grid data.
+ * @class Coordinate is a class that can encapsulate location information.
+ * @param {int} [x=0] The optional x portion of the Coordinate
+ * @param {int} [y=0] The optinal y portion of the Coordinate
+ */
+function Coordinate(x, y){
+   if (x){
+      this.x = x;
+      if (y){
+	 this.y = y;
+      }
+   }
+}
+
+/** 
+ * The x portion of the Coordinate 
+ * @type int
+ * @see #getX
+ * @see #setX
+ */
+Coordinate.prototype.x = 0;
+
+/** 
+ * The y portion of the Coordinate 
+ * @type int
+ * @see #getY
+ * @see #setY
+ */
+Coordinate.prototype.y = 0;
+
+/**
+ * Gets the x portion of the Coordinate.
+ * @type int
+ * @see #setX
+ */
+Coordinate.prototype.getX = function(){
+   return this.x;
+}
+
+/** 
+ * Get the y portion of the Coordinate.
+ * @type int
+ * @see #setY
+ */
+Coordinate.prototype.getY = function(){
+   return this.y;
+}
+
+/**
+ * Sets the x portion of the Coordinate.
+ * @param {int} x The x value to set
+ * @see #getX
+ */
+Coordinate.prototype.setX = function(x){
+   this.x = x;
+}
+
+/** 
+ * Sets the y portion of the Coordinate.
+ * @param {int} y The y value to set
+ * @see #getY
+ */
+Coordinate.prototype.setY = function(y){
+   this.y = y;
+}
+
+/**
+ * @class This class exists to demonstrate the assignment of a class prototype
+ * as an anonymous block.
+ */
+function ShapeFactory(){
+}
+
+ShapeFactory.prototype = {
+   /** 
+    * Creates a new {@link Shape} instance.
+    * @return A new {@link Shape}
+    * @type Shape
+    */
+   createShape: function(){
+      return new Shape();
+   }
+}
+
+/**
+ * An example of a singleton class
+ * @param ... Arguments represent {@link coordinate}s in the shape.
+ * @constructor
+ */
+MySingletonShapeFactory = function(){
+
+   /**
+    * Get the next {@link Shape}
+    * @type Shape
+    * @return A new {@link Shape}
+    */
+   this.getShape = function(){ 
+      return null; 
+   }
+
+}
+
+
+/** 
+ * Create a new Foo instance.
+ * @class This is the Foo class. It exists to demonstrate 'nested' classes.
+ * @constructor 
+ * @see Foo.Bar
+ */
+function Foo(){}
+
+/** 
+ * Creates a new instance of Bar.
+ * @class This class exists to demonstrate 'nested' classes.
+ * @constructor 
+ * @see Foo.Bar
+ */
+function Bar(){}
+
+/** 
+ * Nested class
+ * @constructor 
+ */
+Foo.Bar = function(){
+	/** The x. */ this.x = 2;
+}
+
+Foo.Bar.prototype = new Bar();
+/** The y. */ 
+Foo.Bar.prototype.y = '3';
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/lend.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,33 @@
+ /** @class  */
+var Person = Class.create(
+    /**
+      @lends Person.prototype
+    */
+    {
+      initialize: function(name) {
+            this.name = name;
+        },
+        say: function(message) {
+            return this.name + ': ' + message;
+        }
+    }
+ );
+
+/** @lends Person.prototype */
+{
+	/** like say but more musical */
+	sing: function(song) {
+	}
+}
+
+/** @lends Person */
+{
+	getCount: function() {
+	}
+}
+
+/** @lends Unknown.prototype */
+{
+	notok: function() {
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/memberof.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,19 @@
+/** @constructor */
+pack = function() {
+	this.init = function(){}
+	function config(){}
+}
+ 
+ pack.build = function(task) {};
+
+/** @memberOf pack */
+pack.install = function() {}
+
+/** @memberOf pack */
+pack.install.overwrite = function() {}
+
+/** @memberOf pack */
+clean = function() {}
+
+/** @memberOf pack-config */
+install = function() {};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/memberof2.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,38 @@
+/**
+ * @constructor
+ */
+function Foo() {
+    /**
+    	@memberOf Foo.prototype
+    */
+    function bar(a, b) {
+    }
+    
+    /**
+    	@memberOf Foo
+    */
+    var zip = function(p, q) {
+    }
+    
+    /**
+    	@memberOf Foo
+    */
+    function zop( x,y ) {
+    }
+    
+    /**
+    	@memberOf Foo
+    	@constructor
+    */
+    function Fiz() {
+    	/** A method of Foo#Fiz. */
+    	this.fipple = function(fop){}
+    }
+}
+
+/**
+	@memberOf Foo#
+ */
+var blat = function() {
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/memberof3.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,33 @@
+/**
+* @name Foo
+* @class
+*/
+
+/**#@+
+* @memberOf Foo#
+* @field
+*/
+
+/**
+* @name bar
+* @type Object[]
+*/
+
+/**#@-*/
+
+/**
+* @name Foo2
+* @class
+*/
+
+/**#@+
+* @memberOf Foo2#
+* @field
+*/
+
+/**
+* @name bar
+* @type Object[]
+*/
+
+/**#@-*/
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/memberof_constructor.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,17 @@
+/** @constructor */
+function Circle(){}
+
+/**
+	@constructor
+	@memberOf Circle#
+ */
+Circle.prototype.Tangent = function(){};
+
+// renaming Circle#Tangent to Circle#Circle#Tangent
+
+/**
+	@memberOf Circle#Tangent#
+ */
+Circle.prototype.Tangent.prototype.getDiameter = function(){};
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/module.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,17 @@
+/** @namespace */
+myProject = myProject || {};
+
+/** @namespace */
+myProject.myModule = (function () {
+	/** describe myPrivateVar here */
+	var myPrivateVar = "";
+
+	var myPrivateMethod = function () {
+	}
+
+	/** @scope myProject.myModule */
+	return {
+		myPublicMethod: function () {
+		}
+	};
+})();
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/multi_methods.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,25 @@
+
+/**
+	Get the entire flavor.
+	@name flavor^3
+	@function
+	@returns {Object} The entire flavor hash.
+*/
+/**
+	Get a named flavor.
+	@name flavor^2
+	@function
+	@param {String} name The name of the flavor to get.
+	@returns {String} The value of that flavor.
+*/
+/**
+	Set the flavor.
+	@param {String} name The name of the flavor to set.
+	@param {String} value The value of the flavor.
+	@returns {String} The value of that flavor.
+*/
+function flavor(name, value) {
+	if (arguments.length > 1) flavor[name] = value;
+	else if (arguments.length == 1) return flavor[name];
+	else return flavor;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/name.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,19 @@
+/**
+ @name Response
+ @class
+*/
+
+Response.prototype = {
+	/**
+	 @name Response#text
+	 @function
+	 @description
+		Gets the body of the response as plain text
+	 @returns {String}
+		Response as text
+	*/
+
+	text: function() {
+		return this.nativeResponse.responseText;
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/namespace_nested.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,23 @@
+/** 
+	@namespace This is the first namespace.
+*/
+ns1 = {};
+
+/** 
+	This is the second namespace.
+	@namespace
+*/
+ns1.ns2 = {};
+
+/**
+	This part of ns1.ns2
+	@constructor
+*/
+ns1.ns2.Function1 = function() {
+};
+
+ns1.staticFunction = function() {
+};
+
+/** A static field in a namespace. */
+ns1.ns2.staticField = 1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/nocode.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,13 @@
+/**#nocode+*/
+    /**
+      @name star
+      @function
+    */
+    function blahblah() {
+    
+    }
+/**#nocode-*/
+
+function yaddayadda() {
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/oblit_anon.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,20 @@
+/** the options */
+opt = Opt.get(
+	arguments, 
+	{
+	 d: "directory",
+	 c: "conf",
+	 "D[]": "define"
+	}
+);
+
+/** configuration */
+opt.conf = {
+	/** keep */
+	keep: true,
+	/** base */
+	base: getBase(this, {p: properties})
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/overview.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,20 @@
+/**
+ * @overview This "library" contains a 
+ *               lot of classes and functions.
+ * @example
+ <pre>
+	var x (x < 1);
+	alert("This 'is' \"code\"");
+ </pre>
+ * @name My Cool Library
+ * @author 	Joe Smith jsmith@company.com
+ * @version 	0.1 
+ */
+ 
+/** 
+ * Gets the current foo 
+ * @param {String} fooId	The unique identifier for the foo.
+ * @return {Object}	Returns the current foo.
+ */
+function getFoo(fooID){
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/param_inline.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,37 @@
+/**
+	@constructor
+	@param columns The number of columns.
+*/
+function Layout(/**int*/columns){
+	/**
+		@param [id] The id of the element.
+		@param elName The name of the element.
+	*/
+	this.getElement = function(
+		/** string */ elName,
+		/** number|string */ id
+	) {
+	};
+	
+	/** 
+		@constructor
+	 */
+	this.Canvas = function(top, left, /**int*/width, height) {
+		/** Is it initiated yet? */
+		this.initiated = true;
+	}
+	
+	this.rotate = function(/**nothing*/) {
+	}
+	
+	/** 
+	@param x
+	@param y
+	@param {zoppler} z*/
+	this.init = function(x, y, /**abbler*/z) {
+		/** The xyz. */
+		this.xyz = x+y+z;
+		this.getXyz = function() {
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/params_optional.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,8 @@
+
+/**
+ * @param {Page[]} pages
+ * @param {number} [id] Specifies the id, if applicable.
+ * @param {String} [title = This is untitled.] Specifies the title.
+ */
+function Document(pages, id, title){
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/prototype.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,17 @@
+/** @constructor */
+function Article() {
+}
+
+Article.prototype.init = function(title) {
+	/** the instance title */
+	this.title = title;
+	
+	/** the static counter */
+	Article.counter = 1;
+}
+
+a = new Article();
+a.Init("my title");
+
+print(a.title);
+print(Article.counter);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/prototype_nested.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,9 @@
+/** @constructor */
+function Word() {
+}
+
+Word.prototype.reverse = function() {
+}
+
+Word.prototype.reverse.utf8 = function() {
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/prototype_oblit.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,13 @@
+/** @constructor */
+function Article() {
+}
+
+Article.prototype = {
+	/** instance get title */
+	getTitle: function(){
+	}
+}
+
+/** static get title */
+Article.getTitle = function(){
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/prototype_oblit_constructor.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,24 @@
+/** @constructor */
+function Article() {
+}
+
+Article.prototype = {
+	/** @constructor */
+	Title: function(title) {
+		/** the value of the Title instance */
+		this.title = title;
+	},
+	
+	init: function(pages) {
+		/** the value of the pages of the Article instance */
+		this.pages = pages;
+	}
+}
+
+f = new Article();
+f.init("one two three");
+
+t = new f.Title("my title");
+
+print(f.pages);
+print(t.title);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/public.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,10 @@
+/**@constructor*/
+function Foo() {
+	/**
+		@public
+		@static
+		@field
+	*/
+	var bar = function(x) {
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/scripts/code.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,5 @@
+/**
+	@class
+ */
+function thisiscode() {
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/scripts/notcode.txt	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,5 @@
+(This is not code)
+function foo(){{{{
+(
+!
+@
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/shared.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,42 @@
+
+/**
+ * Builtin object.
+ * @class
+ * @name Array
+ */
+ 
+/**#@+
+ * Extension to builtin array.
+ * @memberOf Array
+ * @method
+ */
+ 
+/**
+ * @returns Boolen if some array members...
+ */
+Array.prototype.some = function(){};
+
+/**
+ * Change every element of an array.
+ * @returns Filtered array copy.
+ */
+Array.prototype.filter = function(){};
+
+/**#@-*/
+
+
+/**
+ * A first in, first out data structure.
+ * @constructor
+ */
+Queue = function(){};
+
+/**#@+
+ * Extension to Queue.
+ * @memberOf Queue
+ */
+
+rewind = function(){
+}
+
+// should close automatically here.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/shared2.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,2 @@
+startOver = function(){
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/shortcuts.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,22 @@
+// /**#=+
+//  * {
+//  *	'D': 'Date.prototype',
+//  *	'$N': 'Number'
+//  * }
+//  */
+// var D = Date.prototype,
+// $N = Number;
+// 
+// D.locale = function(){
+// };
+// 
+// /**
+// 	@return {string} The cardinal number string.
+// */
+// $N.nth = function(n){
+// };
+// 
+// LOAD.file = function(){
+// }
+// 
+// /**#=-*/
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/static_this.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,13 @@
+/** the parent */
+var box = {};
+
+/** @namespace */
+box.holder = {}
+
+box.holder.foo = function() {
+	/** the counter */
+	this.counter = 1;
+}
+
+box.holder.foo();
+print(box.holder.counter);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/synonyms.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,31 @@
+/**
+	@class
+	@inherits Bar#zop as #my_zop
+*/
+function Foo() {
+	/** this is a zip. */
+	this.zip = function() {}
+	
+	/** from Bar */
+	this.my_zop = new Bar().zop;
+}
+
+/**
+	@class
+	@borrows Foo#zip as this.my_zip
+*/
+function Bar() {
+	/** this is a zop. */
+	this.zop = function() {}
+	
+	/** from Foo */
+	this.my_zip = new Foo().zip;
+}
+
+/** @namespace */
+var myObject = {
+	/**
+		@type function
+	*/
+	myFunc: getFunction()
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/tosource.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,23 @@
+/**
+ * @param {Object} object
+ * @return {string}
+ */
+function valueOf(object) {}
+
+/**
+ * @param {Object} object
+ * @return {string}
+ */
+function toString(object) {}
+
+/**
+ * @param {Object} object
+ * @return {string}
+ */
+function toSource(object) {}
+
+/**
+ * @param {Object} object
+ * @return {string}
+ */
+function constructor(object) {}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/app/test/variable_redefine.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,14 @@
+/** @constructor */
+function Foo() {
+	var bar = 1;
+	bar = 2; // redefining a private
+	
+	this.baz = 1;
+	baz = 2; // global
+	
+	/** a private */
+	var blap = {
+		/** in here */
+		tada: 1
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/changes.txt	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,124 @@
+== 2.4.0 ==
+
+  * Fixed bug that added mutiple symbols with the same name to docs.
+  * Added support for the -m option to suppress warnings for multiple docs.
+  * Added patch by brownsea42 to support quoted user variables on the command line. ( issue #281 )
+  * Fixed bug that sometimes caused links to events to be incorrect. ( issue #292 )
+  
+== 2.3.3 ==
+
+  * Fixed bug that made all fields declared with the @property tag static. ( issue #262 )
+  * Minor fix to better handle trailing slash on path to template (from jwmetrocat). ( issue #237 )
+  * Fix for @memberOf when applied to inner members. ( issue #264 )
+  * Fix for @memberOf when applied to symbols documented with @name. ( issue #260 )
+  * Applied patch from kunhualqk, fix for bug where @link to borrowed member did not resolve to parent class. ( issue #218 )
+  * Fix for @requires not linking back to the required class
+  * Added experimental support for @constructs to have an argument, the class name, when applied to a function assignment.
+  
+== 2.3.2 ==
+
+ * Minor update to the usage notes and corrected the version number displayed in the output.
+
+== 2.3.1 ==
+
+ * Fixed HTML typo in allfiles template. ( issue #228 )
+ * Modified template to display version information for classes.
+ * Modified template to better support multiple methods with the same name.
+ * Fixed bug that caused template to error when backtick characters appeared around class names.
+
+== 2.3.0 ==
+
+  * Added option -u, --unique to avoid bug that causes multiple symbols with names that differ only by case to overwrite each others output on case-insensitive filesystems. ( issue #162 )
+  * Fixed bug where {@links} in @deprecated tags did not resolve. ( issue #220 )
+  * Fixed bug that caused parens around a function to make it to be unrecognized. ( issue #213 )
+  * Fixed bug prevented explicit links to named anchors from working (thanks katgao.pku). ( issue #215 )
+  * Fixed bug that prevented full description from appearing in file overview. ( issue #224 )
+  
+== 2.2.1 ==
+
+  * Fixed bug with class template, where sorting of methods was accidentally removed (thanks dezfowler).
+  * Added missing test files for the @exports unit tests.
+
+== 2.2.0 ==
+
+  * Fixed bug that caused exception when given a folder containing non-js files, even with the x commandline option set to "js". ( issue #193 )
+  * Fixed typo in index template [patch submitted by olle]. ( issue #198 )
+  * Modified @borrows tag experimentally to allow for missing "as ..." clause.
+  * Added support for the @exports tag, to allow one symbol to be documented as another.
+  * Added support for the -S option to document code following the Secure Modules pattern.
+  
+== 2.1.0 ==
+
+  * Added support for the @event tag.
+  * Fixed bug that prevented the : character from appearing in symbol names.
+  * Fixed bug that prevented underscored symbols marked with @public being tagged as private. (issue #184 )
+  * Fixed bug that randomly affected the @memberOf tag when the name of the symbol did not include the parent name.
+  * Fixed bug that prevented templates that were not in the jsdoc-toolkit folder from being found. ( issue #176 )
+  * Added ability to check for trailing slash on template path. ( issue #177 )
+  * Modified classDesc so that it no longer is appended with the constructor desc.
+  * Fixed call to plugin onDocCommentSrc.
+  * Added missing support for inline doc comments for function return types. ( issue #189 )
+  * Added command line option -q, --quiet.
+  * Added command line option -E, --exclude. ( issue #143 )
+  * Added 2 more hooks for plugins. ( issue #163 )
+  * Added support for extending built-ins. ( issue #160 )
+  * Added "compact" option to JSDOC.JsPlate.prototype.process. ( issue #159 )
+  * @augments no longer documents static members as inherited. ( issue #138 )
+  * @link to a class now goes to the page for that class, not the constructor. ( issue #178 )
+  * Warnings of mismatched curly brace now include filename. ( issue #166 )
+  * Fixed bug affecting template paths loaded via a configuration file when the trailing slash is missing. ( issue #191 )
+  * Minor optimizations.
+
+== 2.0.2 ==
+
+  * Fixed bug that sometimes caused an example of division in the source code to be interpretted as a regex by the JsDoc Toolkit analyzer. ( issue #158 )
+  * Fixed a bug that prevented private variables marked as @public from appearing in the documentation. ( issue #161 )
+  * Fixed bug that prevented variable names with underscored properties from appearing in summaries. ( issue #173 )
+
+== 2.0.1 ==
+
+  * Fixed bug that prevented @fileOverview tag from being recognized.
+  * Added support for @fieldOf as a synonym for @field plus @memberOf.
+  * Added support for @name tag in a @fileOverview comment to control the displayed name of the file.
+  * Added support for multiple @example tags. ( issue #152 )
+  * Modified style sheet of jsdoc template to make more readable. ( issue #151 )
+  * Fixed bug that prevented @since documentation from displaying correctly when it appeared in a class. ( issue #150 )
+  * Fixed bug that caused inhertited properties to sometimes not resolve correctly. ( issue #144 )
+  * Modified so that trailing whitespace in @example is always trimmed. ( issue #153 )
+  * Added support for elseif to JsPlate. (hat tip to fredck)
+  * Added support for @location urls in the @overview comment to the jsdoc template.
+
+== Changes From Versions 1.4.0 to 2.0.0 ==
+
+  * Upgraded included version of Rhino from 1.6 to 1.7R1.
+  * Removed circular references in parsed documentation objects.
+  * Improved inheritance handling, now properties and events can be inherited same as methods.
+  * Improved handling of cross-file relationships, now having two related objects in separate files is not a problem.
+  * Improved ability to recognize membership of previously defined objects.
+  * Added ability to redefine parsing behavior with plugins.
+  * @methodOf is a synonym for @function and @memberOf.
+  * Added @default to document default values of members that are objects.
+  * Added ability to parse and refer to inner functions.
+  * Fixed bug that appeared when calling a method to set properties of the instance referred to by "this".
+  * Added ability to automatically create links to other symbols.
+  * New "jsdoc" template now produces fully W3C valid XHTML.
+  * Inline parameter type hint comments are now documented.
+  * Fixed error: Locally scoped variables (declared with var) no longer appear as global.
+  * It is now possible to run JsDoc Toolkit from any directory.
+  * Added support for inline {@link ...} tags.
+  * Added support for the -H command-line option to allow for custom content handlers.
+  * Tag names @inherits and @scope changed to @borrows and @lends.
+  ? Combining @constructor in a doclet with @lends now supported.
+  * Multiple @lend tags now supported.
+  * Added support for the @constructs tag, used inside a @lends block.
+  * Added support for the @constant tag.
+  * Fixed bug that prevented the use of [] as a default value.
+  * Added support for the @field tag.
+  * Added support for the @public tag (applied to inner functions).
+  * @namespace tag can now be applied to functions, not just object literals.
+  * Added support for the -s command line option to suppress source code output.
+  * Added new unit test framework.
+  * Underscored symbols are now treated as if they have a @private tag by default.
+  * Improved support for anonymous constructors.
+  * Added support for the nocode meta tag.
+  
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/conf/sample.conf	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,31 @@
+/*
+	This is an example of one way you could set up a configuration file to more
+	conveniently define some commandline options. You might like to do this if
+	you frequently reuse the same options. Note that you don't need to define
+	every option in this file, you can combine a configuration file with
+	additional options on the commandline if your wish.
+	
+	You would include this configuration file by running JsDoc Toolkit like so:
+	java -jar jsrun.jar app/run.js -c=conf/sample.conf
+
+*/
+
+{
+	// source files to use
+	_: ['app/test/jsdoc_test.js'],
+	
+	// document all functions, even uncommented ones
+	a: true,
+	
+	// including those marked @private
+	p: true,
+	
+	// some extra variables I want to include
+	D: {generatedBy: "Michael Mathews", copyright: "2008"},
+	
+	// use this directory as the output directory
+	d: "docs",
+	
+	// use this template
+	t: "templates/jsdoc"
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/java/build.xml	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,36 @@
+<project>
+   <target name="clean">
+        <delete dir="build"/>
+    </target>
+
+    <target name="compile">
+        <mkdir dir="build/classes"/>
+        <javac 
+         srcdir="src" destdir="build/classes"
+         classpath="./classes/js.jar"
+        />
+    </target>
+
+    <target name="jar">
+        <mkdir dir="build/jar"/>
+        <jar destfile="build/jar/jsrun.jar" basedir="build/classes">
+            <manifest>
+               <attribute name="Main-Class" value="JsRun"/>
+               <attribute name="Class-Path" value="./java/classes/js.jar"/>
+            </manifest>
+        </jar>
+    </target>
+    
+    <target name="debugjar">
+        <mkdir dir="build/jar"/>
+        <jar destfile="build/jar/jsdebug.jar" basedir="build/classes">
+            <manifest>
+               <attribute name="Main-Class" value="JsDebugRun"/>
+               <attribute name="Class-Path" value="./java/classes/js.jar"/>
+            </manifest>
+        </jar>
+    </target>
+
+    <target name="clean-build" depends="clean,compile,jar"/>
+    <target name="clean-debug" depends="clean,compile,debugjar"/>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/java/build_1.4.xml	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,36 @@
+<project default="clean-build"><!-- use this build script if you are stuck with ant version 1.4 -->
+   <target name="clean">
+        <delete dir="build"/>
+    </target>
+
+    <target name="compile">
+        <mkdir dir="build/classes"/>
+        <javac 
+         srcdir="src" destdir="build/classes"
+         classpath="./classes/js.jar"
+        />
+    </target>
+
+    <target name="jar">
+        <mkdir dir="build/jar"/>
+        <jar jarfile="build/jar/jsrun.jar" basedir="build/classes">
+            <manifest>
+               <attribute name="Main-Class" value="JsRun"/>
+               <attribute name="Class-Path" value="./java/classes/js.jar"/>
+            </manifest>
+        </jar>
+    </target>
+    
+    <target name="debugjar">
+        <mkdir dir="build/jar"/>
+        <jar jarfile="build/jar/jsdebug.jar" basedir="build/classes">
+            <manifest>
+               <attribute name="Main-Class" value="JsDebugRun"/>
+               <attribute name="Class-Path" value="./java/classes/js.jar"/>
+            </manifest>
+        </jar>
+    </target>
+
+    <target name="clean-build" depends="clean,compile,jar"/>
+    <target name="clean-debug" depends="clean,compile,debugjar"/>
+</project>
Binary file sbin/res/jsdoc/java/classes/js.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/java/src/JsDebugRun.java	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,21 @@
+/**
+ * A trivial bootstrap class that simply adds the path to the
+ * .js file as an argument to the Rhino call. This little hack
+ * allows the code in the .js file to have access to it's own 
+ * path via the Rhino arguments object. This is necessary to 
+ * allow the .js code to find resource files in a location 
+ * relative to itself.
+ *
+ * USAGE: java -jar jsdebug.jar path/to/file.js
+ */
+public class JsDebugRun {
+	public static void main(String[] args) {
+		String[] jsargs = {"-j="+args[0]};
+		
+		String[] allArgs = new String[jsargs.length + args.length];
+		System.arraycopy(args, 0, allArgs, 0, args.length);
+		System.arraycopy(jsargs, 0, allArgs, args.length ,jsargs.length);
+
+		org.mozilla.javascript.tools.debugger.Main.main(allArgs);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/java/src/JsRun.java	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,21 @@
+/**
+ * A trivial bootstrap class that simply adds the path to the
+ * .js file as an argument to the Rhino call. This little hack
+ * allows the code in the .js file to have access to it's own 
+ * path via the Rhino arguments object. This is necessary to 
+ * allow the .js code to find resource files in a location 
+ * relative to itself.
+ *
+ * USAGE: java -jar jsrun.jar path/to/file.js
+ */
+public class JsRun {
+	public static void main(String[] args) {
+		String[] jsargs = {"-j="+args[0]};
+		
+		String[] allArgs = new String[jsargs.length + args.length];
+		System.arraycopy(args, 0, allArgs, 0, args.length);
+		System.arraycopy(jsargs, 0, allArgs, args.length ,jsargs.length);
+
+		org.mozilla.javascript.tools.shell.Main.main(allArgs);
+    }
+}
Binary file sbin/res/jsdoc/jsdebug.jar has changed
Binary file sbin/res/jsdoc/jsrun.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/jsrun.sh	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,52 @@
+#!/bin/ksh
+
+# launcher script for jsdoc
+# Author: Avi Deitcher
+#
+# This program is released under the MIT License as follows:
+
+# Copyright (c) 2008-2009 Atomic Inc <avi@jsorm.com>
+#
+#Permission is hereby granted, free of charge, to any person
+#obtaining a copy of this software and associated documentation
+#files (the "Software"), to deal in the Software without
+#restriction, including without limitation the rights to use,
+#copy, modify, merge, publish, distribute, sublicense, and/or sell
+#copies of the Software, and to permit persons to whom the
+#Software is furnished to do so, subject to the following
+#conditions:
+##
+#The above copyright notice and this permission notice shall be
+#included in all copies or substantial portions of the Software.
+#
+#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+#EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+#OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+#NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+#HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+#WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+#FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+#OTHER DEALINGS IN THE SOFTWARE.
+#
+
+
+if [[ -n "$JSDOCDIR" ]]; then
+        _DOCDIR="-Djsdoc.dir=$JSDOCDIR"
+        _APPDIR="$JSDOCDIR/app"
+	_BASEDIR="$JSDOCDIR"
+else
+        _DOCDIR=""
+        _APPDIR="./app"
+	_BASEDIR="."
+fi
+
+if [[ -n "$JSDOCTEMPLATEDIR" ]]; then
+        _TDIR="-Djsdoc.template.dir=$JSDOCTEMPLATEDIR"
+else
+        _TDIR=""
+fi
+
+CMD="java $_DOCDIR $_TDIR -jar $_BASEDIR/jsrun.jar $_APPDIR/run.js $@"
+echo $CMD
+$CMD
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/out/jsdoc/files.html	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,216 @@
+<!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" xml:lang="en" lang="en">
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		
+		<title>JsDoc Reference - File Index</title>
+		<meta name="generator" content="JsDoc Toolkit" />
+		
+		<style type="text/css">
+		/* default.css */
+body
+{
+	font: 12px "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;
+	width: 800px;
+}
+
+.header
+{
+	clear: both;
+	background-color: #ccc;
+	padding: 8px;
+}
+
+h1
+{
+	font-size: 150%;
+	font-weight: bold;
+	padding: 0;
+	margin: 1em 0 0 .3em;
+}
+
+hr
+{
+	border: none 0;
+	border-top: 1px solid #7F8FB1;
+	height: 1px;
+}
+
+pre.code
+{
+	display: block;
+	padding: 8px;
+	border: 1px dashed #ccc;
+}
+
+#index
+{
+	margin-top: 24px;
+	float: left;
+	width: 160px;
+	position: absolute;
+	left: 8px;
+	background-color: #F3F3F3;
+	padding: 8px;
+}
+
+#content
+{
+	margin-left: 190px;
+	width: 600px;
+}
+
+.classList
+{
+	list-style-type: none;
+	padding: 0;
+	margin: 0 0 0 8px;
+	font-family: arial, sans-serif;
+	font-size: 1em;
+	overflow: auto;
+}
+
+.classList li
+{
+	padding: 0;
+	margin: 0 0 8px 0;
+}
+
+.summaryTable { width: 100%; }
+
+h1.classTitle
+{
+	font-size:170%;
+	line-height:130%;
+}
+
+h2 { font-size: 110%; }
+caption, div.sectionTitle
+{
+	background-color: #7F8FB1;
+	color: #fff;
+	font-size:130%;
+	text-align: left;
+	padding: 2px 6px 2px 6px;
+	border: 1px #7F8FB1 solid;
+}
+
+div.sectionTitle { margin-bottom: 8px; }
+.summaryTable thead { display: none; }
+
+.summaryTable td
+{
+	vertical-align: top;
+	padding: 4px;
+	border-bottom: 1px #7F8FB1 solid;
+	border-right: 1px #7F8FB1 solid;
+}
+
+/*col#summaryAttributes {}*/
+.summaryTable td.attributes
+{
+	border-left: 1px #7F8FB1 solid;
+	width: 140px;
+	text-align: right;
+}
+
+td.attributes, .fixedFont
+{
+	line-height: 15px;
+	color: #002EBE;
+	font-family: "Courier New",Courier,monospace;
+	font-size: 13px;
+}
+
+.summaryTable td.nameDescription
+{
+	text-align: left;
+	font-size: 13px;
+	line-height: 15px;
+}
+
+.summaryTable td.nameDescription, .description
+{
+	line-height: 15px;
+	padding: 4px;
+	padding-left: 4px;
+}
+
+.summaryTable { margin-bottom: 8px; }
+
+ul.inheritsList
+{
+	list-style: square;
+	margin-left: 20px;
+	padding-left: 0;
+}
+
+.detailList {
+	margin-left: 20px; 
+	line-height: 15px;
+}
+.detailList dt { margin-left: 20px; }
+
+.detailList .heading
+{
+	font-weight: bold;
+	padding-bottom: 6px;
+	margin-left: 0;
+}
+
+.light, td.attributes, .light a:link, .light a:visited
+{
+	color: #777;
+	font-style: italic;
+}
+
+.fineprint
+{
+	text-align: right;
+	font-size: 10px;
+}
+		</style>
+	</head>
+	
+	<body>
+		<div id="header">
+</div>
+		
+		<div id="index">
+			<div align="center"><a href="index.html">Class Index</a>
+| <a href="files.html">File Index</a></div>
+<hr />
+<h2>Classes</h2>
+<ul class="classList">
+	
+	<li><i><a href="symbols/_global_.html">_global_</a></i></li>
+	
+</ul>
+<hr />
+		</div>
+		
+		<div id="content">
+			<h1 class="classTitle">File Index</h1>
+			
+			
+			<div>
+				<h2><a href="symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a></h2>
+				
+				<dl>
+					
+					
+					
+					
+				</dl>
+			</div>
+			<hr />
+			
+			
+		</div>
+		<div class="fineprint" style="clear:both">
+			
+			Documentation generated by <a href="http://code.google.com/p/jsdoc-toolkit/" target="_blankt">JsDoc Toolkit</a> 2.4.0 on Fri Dec 23 2011 10:50:32 GMT+0100 (CET)
+		</div>
+	</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/out/jsdoc/index.html	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,210 @@
+<!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" xml:lang="en" lang="en">
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		
+		<title>JsDoc Reference - Index</title>
+		<meta name="generator" content="JsDoc Toolkit" />
+		
+		<style type="text/css">
+		/* default.css */
+body
+{
+	font: 12px "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;
+	width: 800px;
+}
+
+.header
+{
+	clear: both;
+	background-color: #ccc;
+	padding: 8px;
+}
+
+h1
+{
+	font-size: 150%;
+	font-weight: bold;
+	padding: 0;
+	margin: 1em 0 0 .3em;
+}
+
+hr
+{
+	border: none 0;
+	border-top: 1px solid #7F8FB1;
+	height: 1px;
+}
+
+pre.code
+{
+	display: block;
+	padding: 8px;
+	border: 1px dashed #ccc;
+}
+
+#index
+{
+	margin-top: 24px;
+	float: left;
+	width: 160px;
+	position: absolute;
+	left: 8px;
+	background-color: #F3F3F3;
+	padding: 8px;
+}
+
+#content
+{
+	margin-left: 190px;
+	width: 600px;
+}
+
+.classList
+{
+	list-style-type: none;
+	padding: 0;
+	margin: 0 0 0 8px;
+	font-family: arial, sans-serif;
+	font-size: 1em;
+	overflow: auto;
+}
+
+.classList li
+{
+	padding: 0;
+	margin: 0 0 8px 0;
+}
+
+.summaryTable { width: 100%; }
+
+h1.classTitle
+{
+	font-size:170%;
+	line-height:130%;
+}
+
+h2 { font-size: 110%; }
+caption, div.sectionTitle
+{
+	background-color: #7F8FB1;
+	color: #fff;
+	font-size:130%;
+	text-align: left;
+	padding: 2px 6px 2px 6px;
+	border: 1px #7F8FB1 solid;
+}
+
+div.sectionTitle { margin-bottom: 8px; }
+.summaryTable thead { display: none; }
+
+.summaryTable td
+{
+	vertical-align: top;
+	padding: 4px;
+	border-bottom: 1px #7F8FB1 solid;
+	border-right: 1px #7F8FB1 solid;
+}
+
+/*col#summaryAttributes {}*/
+.summaryTable td.attributes
+{
+	border-left: 1px #7F8FB1 solid;
+	width: 140px;
+	text-align: right;
+}
+
+td.attributes, .fixedFont
+{
+	line-height: 15px;
+	color: #002EBE;
+	font-family: "Courier New",Courier,monospace;
+	font-size: 13px;
+}
+
+.summaryTable td.nameDescription
+{
+	text-align: left;
+	font-size: 13px;
+	line-height: 15px;
+}
+
+.summaryTable td.nameDescription, .description
+{
+	line-height: 15px;
+	padding: 4px;
+	padding-left: 4px;
+}
+
+.summaryTable { margin-bottom: 8px; }
+
+ul.inheritsList
+{
+	list-style: square;
+	margin-left: 20px;
+	padding-left: 0;
+}
+
+.detailList {
+	margin-left: 20px; 
+	line-height: 15px;
+}
+.detailList dt { margin-left: 20px; }
+
+.detailList .heading
+{
+	font-weight: bold;
+	padding-bottom: 6px;
+	margin-left: 0;
+}
+
+.light, td.attributes, .light a:link, .light a:visited
+{
+	color: #777;
+	font-style: italic;
+}
+
+.fineprint
+{
+	text-align: right;
+	font-size: 10px;
+}
+		</style>
+	</head>
+	
+	<body>
+		<div id="header">
+</div>
+		
+		<div id="index">
+			<div align="center"><a href="index.html">Class Index</a>
+| <a href="files.html">File Index</a></div>
+<hr />
+<h2>Classes</h2>
+<ul class="classList">
+	
+	<li><i><a href="symbols/_global_.html">_global_</a></i></li>
+	
+</ul>
+<hr />
+		</div>
+		
+		<div id="content">
+			<h1 class="classTitle">Class Index</h1>
+			
+			
+			<div>
+				<h2><a href="symbols/_global_.html">_global_</a></h2>
+				
+			</div>
+			<hr />
+			
+			
+		</div>
+		<div class="fineprint" style="clear:both">
+			
+			Documentation generated by <a href="http://code.google.com/p/jsdoc-toolkit/" target="_blankt">JsDoc Toolkit</a> 2.4.0 on Fri Dec 23 2011 10:50:32 GMT+0100 (CET)
+		</div>
+	</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/out/jsdoc/symbols/_global_.html	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,778 @@
+<!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" xml:lang="en" lang="en">
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+		<meta name="generator" content="JsDoc Toolkit" />
+		
+		<title>JsDoc Reference - _global_</title>
+
+		<style type="text/css">
+			/* default.css */
+body
+{
+	font: 12px "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;
+	width: 800px;
+}
+
+.header
+{
+	clear: both;
+	background-color: #ccc;
+	padding: 8px;
+}
+
+h1
+{
+	font-size: 150%;
+	font-weight: bold;
+	padding: 0;
+	margin: 1em 0 0 .3em;
+}
+
+hr
+{
+	border: none 0;
+	border-top: 1px solid #7F8FB1;
+	height: 1px;
+}
+
+pre.code
+{
+	display: block;
+	padding: 8px;
+	border: 1px dashed #ccc;
+}
+
+#index
+{
+	margin-top: 24px;
+	float: left;
+	width: 160px;
+	position: absolute;
+	left: 8px;
+	background-color: #F3F3F3;
+	padding: 8px;
+}
+
+#content
+{
+	margin-left: 190px;
+	width: 600px;
+}
+
+.classList
+{
+	list-style-type: none;
+	padding: 0;
+	margin: 0 0 0 8px;
+	font-family: arial, sans-serif;
+	font-size: 1em;
+	overflow: auto;
+}
+
+.classList li
+{
+	padding: 0;
+	margin: 0 0 8px 0;
+}
+
+.summaryTable { width: 100%; }
+
+h1.classTitle
+{
+	font-size:170%;
+	line-height:130%;
+}
+
+h2 { font-size: 110%; }
+caption, div.sectionTitle
+{
+	background-color: #7F8FB1;
+	color: #fff;
+	font-size:130%;
+	text-align: left;
+	padding: 2px 6px 2px 6px;
+	border: 1px #7F8FB1 solid;
+}
+
+div.sectionTitle { margin-bottom: 8px; }
+.summaryTable thead { display: none; }
+
+.summaryTable td
+{
+	vertical-align: top;
+	padding: 4px;
+	border-bottom: 1px #7F8FB1 solid;
+	border-right: 1px #7F8FB1 solid;
+}
+
+/*col#summaryAttributes {}*/
+.summaryTable td.attributes
+{
+	border-left: 1px #7F8FB1 solid;
+	width: 140px;
+	text-align: right;
+}
+
+td.attributes, .fixedFont
+{
+	line-height: 15px;
+	color: #002EBE;
+	font-family: "Courier New",Courier,monospace;
+	font-size: 13px;
+}
+
+.summaryTable td.nameDescription
+{
+	text-align: left;
+	font-size: 13px;
+	line-height: 15px;
+}
+
+.summaryTable td.nameDescription, .description
+{
+	line-height: 15px;
+	padding: 4px;
+	padding-left: 4px;
+}
+
+.summaryTable { margin-bottom: 8px; }
+
+ul.inheritsList
+{
+	list-style: square;
+	margin-left: 20px;
+	padding-left: 0;
+}
+
+.detailList {
+	margin-left: 20px; 
+	line-height: 15px;
+}
+.detailList dt { margin-left: 20px; }
+
+.detailList .heading
+{
+	font-weight: bold;
+	padding-bottom: 6px;
+	margin-left: 0;
+}
+
+.light, td.attributes, .light a:link, .light a:visited
+{
+	color: #777;
+	font-style: italic;
+}
+
+.fineprint
+{
+	text-align: right;
+	font-size: 10px;
+}
+		</style>
+	</head>
+
+	<body>
+<!-- ============================== header ================================= -->	
+		<!-- begin static/header.html -->
+		<div id="header">
+</div>
+		<!-- end static/header.html -->
+
+<!-- ============================== classes index ============================ -->
+		<div id="index">
+			<!-- begin publish.classesIndex -->
+			<div align="center"><a href="../index.html">Class Index</a>
+| <a href="../files.html">File Index</a></div>
+<hr />
+<h2>Classes</h2>
+<ul class="classList">
+	
+	<li><i><a href="../symbols/_global_.html">_global_</a></i></li>
+	
+</ul>
+<hr />
+			<!-- end publish.classesIndex -->
+		</div>
+		
+		<div id="content">
+<!-- ============================== class title ============================ -->
+			<h1 class="classTitle">
+				
+				Built-In Namespace _global_
+			</h1>
+
+<!-- ============================== class summary ========================== -->			
+			<p class="description">
+				
+				
+			
+				
+				
+				
+			</p>
+
+<!-- ============================== constructor summary ==================== -->			
+			
+
+<!-- ============================== properties summary ===================== -->
+			
+				
+				
+				<table class="summaryTable" cellspacing="0" summary="A summary of the fields documented in the class _global_.">
+					<caption>Field Summary</caption>
+					<thead>
+						<tr>
+							<th scope="col">Field Attributes</th>
+							<th scope="col">Field Name and Description</th>
+						</tr>
+					</thead>
+					<tbody>
+					
+						<tr>
+							<td class="attributes">&nbsp;</td>
+							<td class="nameDescription">
+								<div class="fixedFont">
+								<b><a href="../symbols/_global_.html#Mustache">Mustache</a></b>
+								</div>
+								<div class="description"></div>
+							</td>
+						</tr>
+					
+					</tbody>
+				</table>
+				
+				
+				
+			
+
+<!-- ============================== methods summary ======================== -->
+			
+				
+				
+				<table class="summaryTable" cellspacing="0" summary="A summary of the methods documented in the class _global_.">
+					<caption>Method Summary</caption>
+					<thead>
+						<tr>
+							<th scope="col">Method Attributes</th>
+							<th scope="col">Method Name and Description</th>
+						</tr>
+					</thead>
+					<tbody>
+					
+						<tr>
+							<td class="attributes">&nbsp;</td>
+							<td class="nameDescription">
+								<div class="fixedFont"><b><a href="../symbols/_global_.html#b">b</a></b>(a)
+								</div>
+								<div class="description"></div>
+							</td>
+						</tr>
+					
+						<tr>
+							<td class="attributes">&nbsp;</td>
+							<td class="nameDescription">
+								<div class="fixedFont"><b><a href="../symbols/_global_.html#Clusters">Clusters</a></b>(json)
+								</div>
+								<div class="description"></div>
+							</td>
+						</tr>
+					
+						<tr>
+							<td class="attributes">&nbsp;</td>
+							<td class="nameDescription">
+								<div class="fixedFont"><b><a href="../symbols/_global_.html#d">d</a></b>()
+								</div>
+								<div class="description"></div>
+							</td>
+						</tr>
+					
+						<tr>
+							<td class="attributes">&nbsp;</td>
+							<td class="nameDescription">
+								<div class="fixedFont"><b><a href="../symbols/_global_.html#finished_cb">finished_cb</a></b>()
+								</div>
+								<div class="description"></div>
+							</td>
+						</tr>
+					
+						<tr>
+							<td class="attributes">&nbsp;</td>
+							<td class="nameDescription">
+								<div class="fixedFont"><b><a href="../symbols/_global_.html#Frames">Frames</a></b>(json)
+								</div>
+								<div class="description"></div>
+							</td>
+						</tr>
+					
+						<tr>
+							<td class="attributes">&nbsp;</td>
+							<td class="nameDescription">
+								<div class="fixedFont"><b><a href="../symbols/_global_.html#handler">handler</a></b>()
+								</div>
+								<div class="description"></div>
+							</td>
+						</tr>
+					
+						<tr>
+							<td class="attributes">&nbsp;</td>
+							<td class="nameDescription">
+								<div class="fixedFont"><b><a href="../symbols/_global_.html#J">J</a></b>(a, c)
+								</div>
+								<div class="description"></div>
+							</td>
+						</tr>
+					
+						<tr>
+							<td class="attributes">&nbsp;</td>
+							<td class="nameDescription">
+								<div class="fixedFont"><b><a href="../symbols/_global_.html#log_error">log_error</a></b>(msg, err)
+								</div>
+								<div class="description"></div>
+							</td>
+						</tr>
+					
+						<tr>
+							<td class="attributes">&nbsp;</td>
+							<td class="nameDescription">
+								<div class="fixedFont"><b><a href="../symbols/_global_.html#log_msg">log_msg</a></b>(msg)
+								</div>
+								<div class="description"></div>
+							</td>
+						</tr>
+					
+						<tr>
+							<td class="attributes">&nbsp;</td>
+							<td class="nameDescription">
+								<div class="fixedFont"><b><a href="../symbols/_global_.html#ready_cb">ready_cb</a></b>()
+								</div>
+								<div class="description"></div>
+							</td>
+						</tr>
+					
+					</tbody>
+				</table>
+				
+				
+				
+			
+<!-- ============================== events summary ======================== -->
+			
+
+<!-- ============================== constructor details ==================== -->		
+			
+
+<!-- ============================== field details ========================== -->		
+			
+				<div class="sectionTitle">
+					Field Detail
+				</div>
+				
+					<a name="Mustache"> </a>
+					<div class="fixedFont">
+					
+					
+					<b>Mustache</b>
+					
+					</div>
+					<div class="description">
+						
+						
+							<br />
+							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
+						
+						
+					</div>
+					
+					
+
+						
+						
+						
+						
+
+					
+				
+			
+
+<!-- ============================== method details ========================= -->		
+			
+				<div class="sectionTitle">
+					Method Detail
+				</div>
+				
+					<a name="b"> </a>
+					<div class="fixedFont">
+					
+					
+					<b>b</b>(a)
+					
+					</div>
+					<div class="description">
+						
+						
+							<br />
+							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
+						
+						
+					</div>
+					
+					
+					
+						
+							<dl class="detailList">
+							<dt class="heading">Parameters:</dt>
+							
+								<dt>
+									<b>a</b>
+									
+								</dt>
+								<dd></dd>
+							
+							</dl>
+						
+						
+						
+						
+						
+						
+						
+
+					<hr />
+				
+					<a name="Clusters"> </a>
+					<div class="fixedFont">
+					
+					
+					<b>Clusters</b>(json)
+					
+					</div>
+					<div class="description">
+						
+						
+							<br />
+							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
+						
+						
+					</div>
+					
+					
+					
+						
+							<dl class="detailList">
+							<dt class="heading">Parameters:</dt>
+							
+								<dt>
+									<b>json</b>
+									
+								</dt>
+								<dd></dd>
+							
+							</dl>
+						
+						
+						
+						
+						
+						
+						
+
+					<hr />
+				
+					<a name="d"> </a>
+					<div class="fixedFont">
+					
+					
+					<b>d</b>()
+					
+					</div>
+					<div class="description">
+						
+						
+							<br />
+							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
+						
+						
+					</div>
+					
+					
+					
+						
+						
+						
+						
+						
+						
+						
+
+					<hr />
+				
+					<a name="finished_cb"> </a>
+					<div class="fixedFont">
+					
+					
+					<b>finished_cb</b>()
+					
+					</div>
+					<div class="description">
+						
+						
+							<br />
+							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
+						
+						
+					</div>
+					
+					
+					
+						
+						
+						
+						
+						
+						
+						
+
+					<hr />
+				
+					<a name="Frames"> </a>
+					<div class="fixedFont">
+					
+					
+					<b>Frames</b>(json)
+					
+					</div>
+					<div class="description">
+						
+						
+							<br />
+							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
+						
+						
+					</div>
+					
+					
+					
+						
+							<dl class="detailList">
+							<dt class="heading">Parameters:</dt>
+							
+								<dt>
+									<b>json</b>
+									
+								</dt>
+								<dd></dd>
+							
+							</dl>
+						
+						
+						
+						
+						
+						
+						
+
+					<hr />
+				
+					<a name="handler"> </a>
+					<div class="fixedFont">
+					
+					
+					<b>handler</b>()
+					
+					</div>
+					<div class="description">
+						
+						
+							<br />
+							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
+						
+						
+					</div>
+					
+					
+					
+						
+						
+						
+						
+						
+						
+						
+
+					<hr />
+				
+					<a name="J"> </a>
+					<div class="fixedFont">
+					
+					
+					<b>J</b>(a, c)
+					
+					</div>
+					<div class="description">
+						
+						
+							<br />
+							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
+						
+						
+					</div>
+					
+					
+					
+						
+							<dl class="detailList">
+							<dt class="heading">Parameters:</dt>
+							
+								<dt>
+									<b>a</b>
+									
+								</dt>
+								<dd></dd>
+							
+								<dt>
+									<b>c</b>
+									
+								</dt>
+								<dd></dd>
+							
+							</dl>
+						
+						
+						
+						
+						
+						
+						
+
+					<hr />
+				
+					<a name="log_error"> </a>
+					<div class="fixedFont">
+					
+					
+					<b>log_error</b>(msg, err)
+					
+					</div>
+					<div class="description">
+						
+						
+							<br />
+							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
+						
+						
+					</div>
+					
+					
+					
+						
+							<dl class="detailList">
+							<dt class="heading">Parameters:</dt>
+							
+								<dt>
+									<b>msg</b>
+									
+								</dt>
+								<dd></dd>
+							
+								<dt>
+									<b>err</b>
+									
+								</dt>
+								<dd></dd>
+							
+							</dl>
+						
+						
+						
+						
+						
+						
+						
+
+					<hr />
+				
+					<a name="log_msg"> </a>
+					<div class="fixedFont">
+					
+					
+					<b>log_msg</b>(msg)
+					
+					</div>
+					<div class="description">
+						
+						
+							<br />
+							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
+						
+						
+					</div>
+					
+					
+					
+						
+							<dl class="detailList">
+							<dt class="heading">Parameters:</dt>
+							
+								<dt>
+									<b>msg</b>
+									
+								</dt>
+								<dd></dd>
+							
+							</dl>
+						
+						
+						
+						
+						
+						
+						
+
+					<hr />
+				
+					<a name="ready_cb"> </a>
+					<div class="fixedFont">
+					
+					
+					<b>ready_cb</b>()
+					
+					</div>
+					<div class="description">
+						
+						
+							<br />
+							<i>Defined in: </i> <a href="../symbols/src/LdtPlayer-release.js.html">LdtPlayer-release.js</a>.
+						
+						
+					</div>
+					
+					
+					
+						
+						
+						
+						
+						
+						
+						
+
+					
+				
+			
+			
+<!-- ============================== event details ========================= -->		
+			
+			
+			<hr />
+		</div>
+
+		
+<!-- ============================== footer ================================= -->
+		<div class="fineprint" style="clear:both">
+			
+			Documentation generated by <a href="http://code.google.com/p/jsdoc-toolkit/" target="_blank">JsDoc Toolkit</a> 2.4.0 on Fri Dec 23 2011 10:50:32 GMT+0100 (CET)
+		</div>
+	</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/out/jsdoc/symbols/src/LdtPlayer-release.js.html	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,3549 @@
+<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"> <style>
+	.KEYW {color: #933;}
+	.COMM {color: #bbb; font-style: italic;}
+	.NUMB {color: #393;}
+	.STRN {color: #393;}
+	.REGX {color: #339;}
+	.line {border-right: 1px dotted #666; color: #666; font-style: normal;}
+	</style></head><body><pre><span class='line'>  1</span> <span class="COMM">/* 
+<span class='line'>  2</span>  * 	
+<span class='line'>  3</span>  *	Copyright 2010 Institut de recherche et d'innovation 
+<span class='line'>  4</span>  *	contributor(s) : Samuel Huron 
+<span class='line'>  5</span>  *	 
+<span class='line'>  6</span>  *	contact@iri.centrepompidou.fr
+<span class='line'>  7</span>  *	http://www.iri.centrepompidou.fr 
+<span class='line'>  8</span>  *	 
+<span class='line'>  9</span>  *	This software is a computer program whose purpose is to show and add annotations on a video .
+<span class='line'> 10</span>  *	This software is governed by the CeCILL-C license under French law and
+<span class='line'> 11</span>  *	abiding by the rules of distribution of free software. You can  use, 
+<span class='line'> 12</span>  *	modify and/ or redistribute the software under the terms of the CeCILL-C
+<span class='line'> 13</span>  *	license as circulated by CEA, CNRS and INRIA at the following URL
+<span class='line'> 14</span>  *	"http://www.cecill.info". 
+<span class='line'> 15</span>  *	
+<span class='line'> 16</span>  *	The fact that you are presently reading this means that you have had
+<span class='line'> 17</span>  *	knowledge of the CeCILL-C license and that you accept its terms.
+<span class='line'> 18</span> */</span><span class="WHIT">
+<span class='line'> 19</span> </span><span class="COMM">/*! LAB.js (LABjs :: Loading And Blocking JavaScript)
+<span class='line'> 20</span>     v2.0.3 (c) Kyle Simpson
+<span class='line'> 21</span>     MIT License
+<span class='line'> 22</span> */</span><span class="WHIT">
+<span class='line'> 23</span> 
+<span class='line'> 24</span> </span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">global</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'> 25</span> </span><span class="WHIT">	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_$LAB</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">global.$LAB</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'> 26</span> </span><span class="WHIT">	
+<span class='line'> 27</span> 		</span><span class="COMM">// constants for the valid keys of the options object</span><span class="WHIT">
+<span class='line'> 28</span> </span><span class="WHIT">		</span><span class="NAME">_UseLocalXHR</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"UseLocalXHR"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'> 29</span> </span><span class="WHIT">		</span><span class="NAME">_AlwaysPreserveOrder</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"AlwaysPreserveOrder"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'> 30</span> </span><span class="WHIT">		</span><span class="NAME">_AllowDuplicates</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"AllowDuplicates"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'> 31</span> </span><span class="WHIT">		</span><span class="NAME">_CacheBust</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"CacheBust"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'> 32</span> </span><span class="WHIT">		</span><span class="COMM">/*!START_DEBUG*/</span><span class="NAME">_Debug</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"Debug"</span><span class="PUNC">,</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
+<span class='line'> 33</span> </span><span class="WHIT">		</span><span class="NAME">_BasePath</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"BasePath"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'> 34</span> </span><span class="WHIT">		
+<span class='line'> 35</span> 		</span><span class="COMM">// stateless variables used across all $LAB instances</span><span class="WHIT">
+<span class='line'> 36</span> </span><span class="WHIT">		</span><span class="NAME">root_page</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="REGX">/^[^?#]*\//</span><span class="PUNC">.</span><span class="NAME">exec</span><span class="PUNC">(</span><span class="NAME">location.href</span><span class="PUNC">)</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'> 37</span> </span><span class="WHIT">		</span><span class="NAME">root_domain</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="REGX">/^\w+\:\/\/\/?[^\/]+/</span><span class="PUNC">.</span><span class="NAME">exec</span><span class="PUNC">(</span><span class="NAME">root_page</span><span class="PUNC">)</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'> 38</span> </span><span class="WHIT">		</span><span class="NAME">append_to</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">document.head</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">document.getElementsByTagName</span><span class="PUNC">(</span><span class="STRN">"head"</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'> 39</span> </span><span class="WHIT">		
+<span class='line'> 40</span> 		</span><span class="COMM">// inferences... ick, but still necessary</span><span class="WHIT">
+<span class='line'> 41</span> </span><span class="WHIT">		</span><span class="NAME">opera_or_gecko</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">global.opera</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">Object.prototype.toString.call</span><span class="PUNC">(</span><span class="NAME">global.opera</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"[object Opera]"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="STRN">"MozAppearance"</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">document.documentElement.style</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'> 42</span> 
+<span class='line'> 43</span> </span><span class="COMM">/*!START_DEBUG*/</span><span class="WHIT">
+<span class='line'> 44</span> </span><span class="WHIT">		</span><span class="COMM">// console.log() and console.error() wrappers</span><span class="WHIT">
+<span class='line'> 45</span> </span><span class="WHIT">		</span><span class="NAME">log_msg</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> 
+<span class='line'> 46</span> 		</span><span class="NAME">log_error</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">log_msg</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'> 47</span> </span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
+<span class='line'> 48</span> </span><span class="WHIT">		
+<span class='line'> 49</span> 		</span><span class="COMM">// feature sniffs (yay!)</span><span class="WHIT">
+<span class='line'> 50</span> </span><span class="WHIT">		</span><span class="NAME">test_script_elem</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">document.createElement</span><span class="PUNC">(</span><span class="STRN">"script"</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'> 51</span> </span><span class="WHIT">		</span><span class="NAME">explicit_preloading</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">test_script_elem.preload</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"boolean"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="COMM">// http://wiki.whatwg.org/wiki/Script_Execution_Control#Proposal_1_.28Nicholas_Zakas.29</span><span class="WHIT">
+<span class='line'> 52</span> </span><span class="WHIT">		</span><span class="NAME">real_preloading</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">explicit_preloading</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">test_script_elem.readyState</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">test_script_elem.readyState</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"uninitialized"</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="COMM">// will a script preload with `src` set before DOM append?</span><span class="WHIT">
+<span class='line'> 53</span> </span><span class="WHIT">		</span><span class="NAME">script_ordered_async</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">real_preloading</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">test_script_elem.async</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="COMM">// http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order</span><span class="WHIT">
+<span class='line'> 54</span> </span><span class="WHIT">		
+<span class='line'> 55</span> 		</span><span class="COMM">// XHR preloading (same-domain) and cache-preloading (remote-domain) are the fallbacks (for some browsers)</span><span class="WHIT">
+<span class='line'> 56</span> </span><span class="WHIT">		</span><span class="NAME">xhr_or_cache_preloading</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">real_preloading</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">script_ordered_async</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">opera_or_gecko</span><span class="WHIT">
+<span class='line'> 57</span> </span><span class="WHIT">	</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'> 58</span> 
+<span class='line'> 59</span> </span><span class="COMM">/*!START_DEBUG*/</span><span class="WHIT">
+<span class='line'> 60</span> </span><span class="WHIT">	</span><span class="COMM">// define console wrapper functions if applicable</span><span class="WHIT">
+<span class='line'> 61</span> </span><span class="WHIT">	</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">global.console</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">global.console.log</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'> 62</span> </span><span class="WHIT">		</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">global.console.error</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">global.console.error</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">global.console.log</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'> 63</span> </span><span class="WHIT">		</span><span class="NAME">log_msg</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">msg</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">global.console.log</span><span class="PUNC">(</span><span class="NAME">msg</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'> 64</span> </span><span class="WHIT">		</span><span class="NAME">log_error</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">msg</span><span class="PUNC">,</span><span class="NAME">err</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">global.console.error</span><span class="PUNC">(</span><span class="NAME">msg</span><span class="PUNC">,</span><span class="NAME">err</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'> 65</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'> 66</span> </span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
+<span class='line'> 67</span> 
+<span class='line'> 68</span> </span><span class="WHIT">	</span><span class="COMM">// test for function</span><span class="WHIT">
+<span class='line'> 69</span> </span><span class="WHIT">	</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">is_func</span><span class="PUNC">(</span><span class="NAME">func</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Object.prototype.toString.call</span><span class="PUNC">(</span><span class="NAME">func</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"[object Function]"</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'> 70</span> 
+<span class='line'> 71</span> </span><span class="WHIT">	</span><span class="COMM">// test for array</span><span class="WHIT">
+<span class='line'> 72</span> </span><span class="WHIT">	</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">is_array</span><span class="PUNC">(</span><span class="NAME">arr</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Object.prototype.toString.call</span><span class="PUNC">(</span><span class="NAME">arr</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"[object Array]"</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'> 73</span> 
+<span class='line'> 74</span> </span><span class="WHIT">	</span><span class="COMM">// make script URL absolute/canonical</span><span class="WHIT">
+<span class='line'> 75</span> </span><span class="WHIT">	</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">canonical_uri</span><span class="PUNC">(</span><span class="NAME">src</span><span class="PUNC">,</span><span class="NAME">base_path</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'> 76</span> </span><span class="WHIT">		</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">absolute_regex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="REGX">/^\w+\:\/\//</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'> 77</span> </span><span class="WHIT">		
+<span class='line'> 78</span> 		</span><span class="COMM">// is `src` is protocol-relative (begins with // or ///), prepend protocol</span><span class="WHIT">
+<span class='line'> 79</span> </span><span class="WHIT">		</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="REGX">/^\/\/\/?/</span><span class="PUNC">.</span><span class="NAME">test</span><span class="PUNC">(</span><span class="NAME">src</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'> 80</span> </span><span class="WHIT">			</span><span class="NAME">src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">location.protocol</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">src</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'> 81</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'> 82</span> </span><span class="WHIT">		</span><span class="COMM">// is `src` page-relative? (not an absolute URL, and not a domain-relative path, beginning with /)</span><span class="WHIT">
+<span class='line'> 83</span> </span><span class="WHIT">		</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">absolute_regex.test</span><span class="PUNC">(</span><span class="NAME">src</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">src.charAt</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">"/"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'> 84</span> </span><span class="WHIT">			</span><span class="COMM">// prepend `base_path`, if any</span><span class="WHIT">
+<span class='line'> 85</span> </span><span class="WHIT">			</span><span class="NAME">src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">base_path</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">src</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'> 86</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'> 87</span> </span><span class="WHIT">		</span><span class="COMM">// make sure to return `src` as absolute</span><span class="WHIT">
+<span class='line'> 88</span> </span><span class="WHIT">		</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">absolute_regex.test</span><span class="PUNC">(</span><span class="NAME">src</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">src</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">src.charAt</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"/"</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">root_domain</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">root_page</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'> 89</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'> 90</span> 
+<span class='line'> 91</span> </span><span class="WHIT">	</span><span class="COMM">// merge `source` into `target`</span><span class="WHIT">
+<span class='line'> 92</span> </span><span class="WHIT">	</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">merge_objs</span><span class="PUNC">(</span><span class="NAME">source</span><span class="PUNC">,</span><span class="NAME">target</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'> 93</span> </span><span class="WHIT">		</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">source</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">source.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">k</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'> 94</span> </span><span class="WHIT">			</span><span class="NAME">target</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">source</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// TODO: does this need to be recursive for our purposes?</span><span class="WHIT">
+<span class='line'> 95</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'> 96</span> </span><span class="WHIT">		</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">target</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'> 97</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'> 98</span> 
+<span class='line'> 99</span> </span><span class="WHIT">	</span><span class="COMM">// does the chain group have any ready-to-execute scripts?</span><span class="WHIT">
+<span class='line'>100</span> </span><span class="WHIT">	</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">check_chain_group_scripts_ready</span><span class="PUNC">(</span><span class="NAME">chain_group</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>101</span> </span><span class="WHIT">		</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">any_scripts_ready</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>102</span> </span><span class="WHIT">		</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">&lt;</span><span class="NAME">chain_group.scripts.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>103</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_group.scripts</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">ready</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">chain_group.scripts</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">exec_trigger</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>104</span> </span><span class="WHIT">				</span><span class="NAME">any_scripts_ready</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>105</span> </span><span class="WHIT">				</span><span class="NAME">chain_group.scripts</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">exec_trigger</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>106</span> </span><span class="WHIT">				</span><span class="NAME">chain_group.scripts</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">exec_trigger</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>107</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>108</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>109</span> </span><span class="WHIT">		</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">any_scripts_ready</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>110</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>111</span> 
+<span class='line'>112</span> </span><span class="WHIT">	</span><span class="COMM">// creates a script load listener</span><span class="WHIT">
+<span class='line'>113</span> </span><span class="WHIT">	</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">create_script_load_listener</span><span class="PUNC">(</span><span class="NAME">elem</span><span class="PUNC">,</span><span class="NAME">registry_item</span><span class="PUNC">,</span><span class="NAME">flag</span><span class="PUNC">,</span><span class="NAME">onload</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>114</span> </span><span class="WHIT">		</span><span class="NAME">elem.onload</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">elem.onreadystatechange</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>115</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">elem.readyState</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">elem.readyState</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">"complete"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">elem.readyState</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">"loaded"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">registry_item</span><span class="PUNC">[</span><span class="NAME">flag</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>116</span> </span><span class="WHIT">			</span><span class="NAME">elem.onload</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">elem.onreadystatechange</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>117</span> </span><span class="WHIT">			</span><span class="NAME">onload</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>118</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>119</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>120</span> 
+<span class='line'>121</span> </span><span class="WHIT">	</span><span class="COMM">// script executed handler</span><span class="WHIT">
+<span class='line'>122</span> </span><span class="WHIT">	</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">script_executed</span><span class="PUNC">(</span><span class="NAME">registry_item</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>123</span> </span><span class="WHIT">		</span><span class="NAME">registry_item.ready</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">registry_item.finished</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>124</span> </span><span class="WHIT">		</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">&lt;</span><span class="NAME">registry_item.finished_listeners.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>125</span> </span><span class="WHIT">			</span><span class="NAME">registry_item.finished_listeners</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>126</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>127</span> </span><span class="WHIT">		</span><span class="NAME">registry_item.ready_listeners</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>128</span> </span><span class="WHIT">		</span><span class="NAME">registry_item.finished_listeners</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>129</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>130</span> 
+<span class='line'>131</span> </span><span class="WHIT">	</span><span class="COMM">// make the request for a scriptha</span><span class="WHIT">
+<span class='line'>132</span> </span><span class="WHIT">	</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">request_script</span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">,</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">registry_item</span><span class="PUNC">,</span><span class="NAME">onload</span><span class="PUNC">,</span><span class="NAME">preload_this_script</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>133</span> </span><span class="WHIT">		</span><span class="COMM">// setTimeout() "yielding" prevents some weird race/crash conditions in older browsers</span><span class="WHIT">
+<span class='line'>134</span> </span><span class="WHIT">		</span><span class="NAME">setTimeout</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>135</span> </span><span class="WHIT">			</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">script</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_obj.real_src</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">xhr</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>136</span> </span><span class="WHIT">			
+<span class='line'>137</span> 			</span><span class="COMM">// don't proceed until `append_to` is ready to append to</span><span class="WHIT">
+<span class='line'>138</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="STRN">"item"</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">append_to</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// check if `append_to` ref is still a live node list</span><span class="WHIT">
+<span class='line'>139</span> </span><span class="WHIT">				</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">append_to</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// `append_to` node not yet ready</span><span class="WHIT">
+<span class='line'>140</span> </span><span class="WHIT">					</span><span class="COMM">// try again in a little bit -- note: will re-call the anonymous function in the outer setTimeout, not the parent `request_script()`</span><span class="WHIT">
+<span class='line'>141</span> </span><span class="WHIT">					</span><span class="NAME">setTimeout</span><span class="PUNC">(</span><span class="NAME">arguments.callee</span><span class="PUNC">,</span><span class="NUMB">25</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>142</span> </span><span class="WHIT">					</span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>143</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>144</span> </span><span class="WHIT">				</span><span class="COMM">// reassign from live node list ref to pure node ref -- avoids nasty IE bug where changes to DOM invalidate live node lists</span><span class="WHIT">
+<span class='line'>145</span> </span><span class="WHIT">				</span><span class="NAME">append_to</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">append_to</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>146</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>147</span> </span><span class="WHIT">			</span><span class="NAME">script</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">document.createElement</span><span class="PUNC">(</span><span class="STRN">"script"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>148</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">script_obj.type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">script.type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_obj.type</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>149</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">script_obj.charset</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">script.charset</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_obj.charset</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>150</span> </span><span class="WHIT">			
+<span class='line'>151</span> 			</span><span class="COMM">// should preloading be used for this script?</span><span class="WHIT">
+<span class='line'>152</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">preload_this_script</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>153</span> </span><span class="WHIT">				</span><span class="COMM">// real script preloading?</span><span class="WHIT">
+<span class='line'>154</span> </span><span class="WHIT">				</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">real_preloading</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>155</span> </span><span class="WHIT">					</span><span class="COMM">/*!START_DEBUG*/</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">log_msg</span><span class="PUNC">(</span><span class="STRN">"start script preload: "</span><span class="PUNC">+</span><span class="NAME">src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
+<span class='line'>156</span> </span><span class="WHIT">					</span><span class="NAME">registry_item.elem</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>157</span> </span><span class="WHIT">					</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">explicit_preloading</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// explicit preloading (aka, Zakas' proposal)</span><span class="WHIT">
+<span class='line'>158</span> </span><span class="WHIT">						</span><span class="NAME">script.preload</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>159</span> </span><span class="WHIT">						</span><span class="NAME">script.onpreload</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">onload</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>160</span> </span><span class="WHIT">					</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>161</span> </span><span class="WHIT">					</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>162</span> </span><span class="WHIT">						</span><span class="NAME">script.onreadystatechange</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>163</span> </span><span class="WHIT">							</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">script.readyState</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"loaded"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">onload</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>164</span> </span><span class="WHIT">						</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>165</span> </span><span class="WHIT">					</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>166</span> </span><span class="WHIT">					</span><span class="NAME">script.src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">src</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>167</span> </span><span class="WHIT">					</span><span class="COMM">// NOTE: no append to DOM yet, appending will happen when ready to execute</span><span class="WHIT">
+<span class='line'>168</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>169</span> </span><span class="WHIT">				</span><span class="COMM">// same-domain and XHR allowed? use XHR preloading</span><span class="WHIT">
+<span class='line'>170</span> </span><span class="WHIT">				</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">preload_this_script</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">src.indexOf</span><span class="PUNC">(</span><span class="NAME">root_domain</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_UseLocalXHR</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>171</span> </span><span class="WHIT">					</span><span class="NAME">xhr</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">XMLHttpRequest</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// note: IE never uses XHR (it supports true preloading), so no more need for ActiveXObject fallback for IE &lt;= 7</span><span class="WHIT">
+<span class='line'>172</span> </span><span class="WHIT">					</span><span class="COMM">/*!START_DEBUG*/</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">log_msg</span><span class="PUNC">(</span><span class="STRN">"start script preload (xhr): "</span><span class="PUNC">+</span><span class="NAME">src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
+<span class='line'>173</span> </span><span class="WHIT">					</span><span class="NAME">xhr.onreadystatechange</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>174</span> </span><span class="WHIT">						</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">xhr.readyState</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NUMB">4</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>175</span> </span><span class="WHIT">							</span><span class="NAME">xhr.onreadystatechange</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// fix a memory leak in IE</span><span class="WHIT">
+<span class='line'>176</span> </span><span class="WHIT">							</span><span class="NAME">registry_item.text</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">xhr.responseText</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"\n//@ sourceURL="</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">src</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// http://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/</span><span class="WHIT">
+<span class='line'>177</span> </span><span class="WHIT">							</span><span class="NAME">onload</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>178</span> </span><span class="WHIT">						</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>179</span> </span><span class="WHIT">					</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>180</span> </span><span class="WHIT">					</span><span class="NAME">xhr.open</span><span class="PUNC">(</span><span class="STRN">"GET"</span><span class="PUNC">,</span><span class="NAME">src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>181</span> </span><span class="WHIT">					</span><span class="NAME">xhr.send</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>182</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>183</span> </span><span class="WHIT">				</span><span class="COMM">// as a last resort, use cache-preloading</span><span class="WHIT">
+<span class='line'>184</span> </span><span class="WHIT">				</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>185</span> </span><span class="WHIT">					</span><span class="COMM">/*!START_DEBUG*/</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">log_msg</span><span class="PUNC">(</span><span class="STRN">"start script preload (cache): "</span><span class="PUNC">+</span><span class="NAME">src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
+<span class='line'>186</span> </span><span class="WHIT">					</span><span class="NAME">script.type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"text/cache-script"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>187</span> </span><span class="WHIT">					</span><span class="NAME">create_script_load_listener</span><span class="PUNC">(</span><span class="NAME">script</span><span class="PUNC">,</span><span class="NAME">registry_item</span><span class="PUNC">,</span><span class="STRN">"ready"</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>188</span> </span><span class="WHIT">						</span><span class="NAME">append_to.removeChild</span><span class="PUNC">(</span><span class="NAME">script</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>189</span> </span><span class="WHIT">						</span><span class="NAME">onload</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>190</span> </span><span class="WHIT">					</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>191</span> </span><span class="WHIT">					</span><span class="NAME">script.src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">src</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>192</span> </span><span class="WHIT">					</span><span class="NAME">append_to.insertBefore</span><span class="PUNC">(</span><span class="NAME">script</span><span class="PUNC">,</span><span class="NAME">append_to.firstChild</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>193</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>194</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>195</span> </span><span class="WHIT">			</span><span class="COMM">// use async=false for ordered async? parallel-load-serial-execute http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order</span><span class="WHIT">
+<span class='line'>196</span> </span><span class="WHIT">			</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">script_ordered_async</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>197</span> </span><span class="WHIT">				</span><span class="COMM">/*!START_DEBUG*/</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">log_msg</span><span class="PUNC">(</span><span class="STRN">"start script load (ordered async): "</span><span class="PUNC">+</span><span class="NAME">src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
+<span class='line'>198</span> </span><span class="WHIT">				</span><span class="NAME">script.async</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>199</span> </span><span class="WHIT">				</span><span class="NAME">create_script_load_listener</span><span class="PUNC">(</span><span class="NAME">script</span><span class="PUNC">,</span><span class="NAME">registry_item</span><span class="PUNC">,</span><span class="STRN">"finished"</span><span class="PUNC">,</span><span class="NAME">onload</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>200</span> </span><span class="WHIT">				</span><span class="NAME">script.src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">src</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>201</span> </span><span class="WHIT">				</span><span class="NAME">append_to.insertBefore</span><span class="PUNC">(</span><span class="NAME">script</span><span class="PUNC">,</span><span class="NAME">append_to.firstChild</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>202</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>203</span> </span><span class="WHIT">			</span><span class="COMM">// otherwise, just a normal script element</span><span class="WHIT">
+<span class='line'>204</span> </span><span class="WHIT">			</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>205</span> </span><span class="WHIT">				</span><span class="COMM">/*!START_DEBUG*/</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">log_msg</span><span class="PUNC">(</span><span class="STRN">"start script load: "</span><span class="PUNC">+</span><span class="NAME">src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
+<span class='line'>206</span> </span><span class="WHIT">				</span><span class="NAME">create_script_load_listener</span><span class="PUNC">(</span><span class="NAME">script</span><span class="PUNC">,</span><span class="NAME">registry_item</span><span class="PUNC">,</span><span class="STRN">"finished"</span><span class="PUNC">,</span><span class="NAME">onload</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>207</span> </span><span class="WHIT">				</span><span class="NAME">script.src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">src</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>208</span> </span><span class="WHIT">				</span><span class="NAME">append_to.insertBefore</span><span class="PUNC">(</span><span class="NAME">script</span><span class="PUNC">,</span><span class="NAME">append_to.firstChild</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>209</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>210</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>211</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>212</span> </span><span class="WHIT">		
+<span class='line'>213</span> 	</span><span class="COMM">// create a clean instance of $LAB</span><span class="WHIT">
+<span class='line'>214</span> </span><span class="WHIT">	</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">create_sandbox</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>215</span> </span><span class="WHIT">		</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">global_defaults</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>216</span> </span><span class="WHIT">			</span><span class="NAME">can_use_preloading</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">real_preloading</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">xhr_or_cache_preloading</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>217</span> </span><span class="WHIT">			</span><span class="NAME">queue</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>218</span> </span><span class="WHIT">			</span><span class="NAME">registry</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>219</span> </span><span class="WHIT">			</span><span class="NAME">instanceAPI</span><span class="WHIT">
+<span class='line'>220</span> </span><span class="WHIT">		</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>221</span> </span><span class="WHIT">		
+<span class='line'>222</span> 		</span><span class="COMM">// global defaults</span><span class="WHIT">
+<span class='line'>223</span> </span><span class="WHIT">		</span><span class="NAME">global_defaults</span><span class="PUNC">[</span><span class="NAME">_UseLocalXHR</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>224</span> </span><span class="WHIT">		</span><span class="NAME">global_defaults</span><span class="PUNC">[</span><span class="NAME">_AlwaysPreserveOrder</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>225</span> </span><span class="WHIT">		</span><span class="NAME">global_defaults</span><span class="PUNC">[</span><span class="NAME">_AllowDuplicates</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>226</span> </span><span class="WHIT">		</span><span class="NAME">global_defaults</span><span class="PUNC">[</span><span class="NAME">_CacheBust</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>227</span> </span><span class="WHIT">		</span><span class="COMM">/*!START_DEBUG*/</span><span class="NAME">global_defaults</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
+<span class='line'>228</span> </span><span class="WHIT">		</span><span class="NAME">global_defaults</span><span class="PUNC">[</span><span class="NAME">_BasePath</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>229</span> 
+<span class='line'>230</span> </span><span class="WHIT">		</span><span class="COMM">// execute a script that has been preloaded already</span><span class="WHIT">
+<span class='line'>231</span> </span><span class="WHIT">		</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">execute_preloaded_script</span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">,</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">registry_item</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>232</span> </span><span class="WHIT">			</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">script</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>233</span> </span><span class="WHIT">			
+<span class='line'>234</span> 			</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">preload_execute_finished</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>235</span> </span><span class="WHIT">				</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">script</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// make sure this only ever fires once</span><span class="WHIT">
+<span class='line'>236</span> </span><span class="WHIT">					</span><span class="NAME">script</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>237</span> </span><span class="WHIT">					</span><span class="NAME">script_executed</span><span class="PUNC">(</span><span class="NAME">registry_item</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>238</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>239</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>240</span> </span><span class="WHIT">			
+<span class='line'>241</span> 			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">registry</span><span class="PUNC">[</span><span class="NAME">script_obj.src</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">finished</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>242</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_AllowDuplicates</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">registry</span><span class="PUNC">[</span><span class="NAME">script_obj.src</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">finished</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>243</span> </span><span class="WHIT">			
+<span class='line'>244</span> 			</span><span class="NAME">script</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">registry_item.elem</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">document.createElement</span><span class="PUNC">(</span><span class="STRN">"script"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>245</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">script_obj.type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">script.type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_obj.type</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>246</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">script_obj.charset</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">script.charset</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_obj.charset</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>247</span> </span><span class="WHIT">			</span><span class="NAME">create_script_load_listener</span><span class="PUNC">(</span><span class="NAME">script</span><span class="PUNC">,</span><span class="NAME">registry_item</span><span class="PUNC">,</span><span class="STRN">"finished"</span><span class="PUNC">,</span><span class="NAME">preload_execute_finished</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>248</span> </span><span class="WHIT">			
+<span class='line'>249</span> 			</span><span class="COMM">// script elem was real-preloaded</span><span class="WHIT">
+<span class='line'>250</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">registry_item.elem</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>251</span> </span><span class="WHIT">				</span><span class="NAME">registry_item.elem</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>252</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>253</span> </span><span class="WHIT">			</span><span class="COMM">// script was XHR preloaded</span><span class="WHIT">
+<span class='line'>254</span> </span><span class="WHIT">			</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">registry_item.text</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>255</span> </span><span class="WHIT">				</span><span class="NAME">script.onload</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script.onreadystatechange</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">	</span><span class="COMM">// script injection doesn't fire these events</span><span class="WHIT">
+<span class='line'>256</span> </span><span class="WHIT">				</span><span class="NAME">script.text</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">registry_item.text</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>257</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>258</span> </span><span class="WHIT">			</span><span class="COMM">// script was cache-preloaded</span><span class="WHIT">
+<span class='line'>259</span> </span><span class="WHIT">			</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>260</span> </span><span class="WHIT">				</span><span class="NAME">script.src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_obj.real_src</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>261</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>262</span> </span><span class="WHIT">			</span><span class="NAME">append_to.insertBefore</span><span class="PUNC">(</span><span class="NAME">script</span><span class="PUNC">,</span><span class="NAME">append_to.firstChild</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>263</span> 
+<span class='line'>264</span> </span><span class="WHIT">			</span><span class="COMM">// manually fire execution callback for injected scripts, since events don't fire</span><span class="WHIT">
+<span class='line'>265</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">registry_item.text</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>266</span> </span><span class="WHIT">				</span><span class="NAME">preload_execute_finished</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>267</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>268</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>269</span> </span><span class="WHIT">	
+<span class='line'>270</span> 		</span><span class="COMM">// process the script request setup</span><span class="WHIT">
+<span class='line'>271</span> </span><span class="WHIT">		</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">do_script</span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">,</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">chain_group</span><span class="PUNC">,</span><span class="NAME">preload_this_script</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>272</span> </span><span class="WHIT">			</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">registry_item</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>273</span> </span><span class="WHIT">				</span><span class="NAME">registry_items</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>274</span> </span><span class="WHIT">				</span><span class="NAME">ready_cb</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">script_obj.ready_cb</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">execute_preloaded_script</span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">,</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">registry_item</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>275</span> </span><span class="WHIT">				</span><span class="NAME">finished_cb</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">script_obj.finished_cb</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">chain_group</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>276</span> </span><span class="WHIT">			</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>277</span> </span><span class="WHIT">			
+<span class='line'>278</span> 			</span><span class="NAME">script_obj.src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">canonical_uri</span><span class="PUNC">(</span><span class="NAME">script_obj.src</span><span class="PUNC">,</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_BasePath</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>279</span> </span><span class="WHIT">			</span><span class="NAME">script_obj.real_src</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_obj.src</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> 
+<span class='line'>280</span> 				</span><span class="COMM">// append cache-bust param to URL?</span><span class="WHIT">
+<span class='line'>281</span> </span><span class="WHIT">				</span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_CacheBust</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="REGX">/\?.*$/</span><span class="PUNC">.</span><span class="NAME">test</span><span class="PUNC">(</span><span class="NAME">script_obj.src</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">"&_"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"?_"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">~</span><span class="PUNC">~</span><span class="PUNC">(</span><span class="NAME">Math.random</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">*</span><span class="NUMB">1</span><span class="NAME">E9</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"="</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>282</span> </span><span class="WHIT">			</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>283</span> </span><span class="WHIT">			
+<span class='line'>284</span> 			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">registry</span><span class="PUNC">[</span><span class="NAME">script_obj.src</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">registry</span><span class="PUNC">[</span><span class="NAME">script_obj.src</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">items</span><span class="PUNC">:</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">finished</span><span class="PUNC">:</span><span class="KEYW">false</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>285</span> </span><span class="WHIT">			</span><span class="NAME">registry_items</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">registry</span><span class="PUNC">[</span><span class="NAME">script_obj.src</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">items</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>286</span> 
+<span class='line'>287</span> </span><span class="WHIT">			</span><span class="COMM">// allowing duplicates, or is this the first recorded load of this script?</span><span class="WHIT">
+<span class='line'>288</span> </span><span class="WHIT">			</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_AllowDuplicates</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">registry_items.length</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>289</span> </span><span class="WHIT">				</span><span class="NAME">registry_item</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">registry_items</span><span class="PUNC">[</span><span class="NAME">registry_items.length</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>290</span> </span><span class="WHIT">					</span><span class="NAME">ready</span><span class="PUNC">:</span><span class="KEYW">false</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>291</span> </span><span class="WHIT">					</span><span class="NAME">finished</span><span class="PUNC">:</span><span class="KEYW">false</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>292</span> </span><span class="WHIT">					</span><span class="NAME">ready_listeners</span><span class="PUNC">:</span><span class="PUNC">[</span><span class="NAME">ready_cb</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>293</span> </span><span class="WHIT">					</span><span class="NAME">finished_listeners</span><span class="PUNC">:</span><span class="PUNC">[</span><span class="NAME">finished_cb</span><span class="PUNC">]</span><span class="WHIT">
+<span class='line'>294</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>295</span> 
+<span class='line'>296</span> </span><span class="WHIT">				</span><span class="NAME">request_script</span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">,</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">registry_item</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>297</span> </span><span class="WHIT">					</span><span class="COMM">// which callback type to pass?</span><span class="WHIT">
+<span class='line'>298</span> </span><span class="WHIT">					</span><span class="PUNC">(</span><span class="WHIT">
+<span class='line'>299</span> </span><span class="WHIT">					 	</span><span class="PUNC">(</span><span class="NAME">preload_this_script</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="COMM">// depends on script-preloading</span><span class="WHIT">
+<span class='line'>300</span> </span><span class="WHIT">						</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>301</span> </span><span class="WHIT">							</span><span class="NAME">registry_item.ready</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>302</span> </span><span class="WHIT">							</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">&lt;</span><span class="NAME">registry_item.ready_listeners.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>303</span> </span><span class="WHIT">								</span><span class="NAME">registry_item.ready_listeners</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>304</span> </span><span class="WHIT">							</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>305</span> </span><span class="WHIT">							</span><span class="NAME">registry_item.ready_listeners</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>306</span> </span><span class="WHIT">						</span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT">
+<span class='line'>307</span> </span><span class="WHIT">						</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">script_executed</span><span class="PUNC">(</span><span class="NAME">registry_item</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>308</span> </span><span class="WHIT">					</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>309</span> </span><span class="WHIT">					</span><span class="COMM">// signal if script-preloading should be used or not</span><span class="WHIT">
+<span class='line'>310</span> </span><span class="WHIT">					</span><span class="NAME">preload_this_script</span><span class="WHIT">
+<span class='line'>311</span> </span><span class="WHIT">				</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>312</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>313</span> </span><span class="WHIT">			</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>314</span> </span><span class="WHIT">				</span><span class="NAME">registry_item</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">registry_items</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>315</span> </span><span class="WHIT">				</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">registry_item.finished</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>316</span> </span><span class="WHIT">					</span><span class="NAME">finished_cb</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>317</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>318</span> </span><span class="WHIT">				</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>319</span> </span><span class="WHIT">					</span><span class="NAME">registry_item.finished_listeners.push</span><span class="PUNC">(</span><span class="NAME">finished_cb</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>320</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>321</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>322</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>323</span> 
+<span class='line'>324</span> </span><span class="WHIT">		</span><span class="COMM">// creates a closure for each separate chain spawned from this $LAB instance, to keep state cleanly separated between chains</span><span class="WHIT">
+<span class='line'>325</span> </span><span class="WHIT">		</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">create_chain</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>326</span> </span><span class="WHIT">			</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">chainedAPI</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>327</span> </span><span class="WHIT">				</span><span class="NAME">chain_opts</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">merge_objs</span><span class="PUNC">(</span><span class="NAME">global_defaults</span><span class="PUNC">,</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>328</span> </span><span class="WHIT">				</span><span class="NAME">chain</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>329</span> </span><span class="WHIT">				</span><span class="NAME">exec_cursor</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>330</span> </span><span class="WHIT">				</span><span class="NAME">scripts_currently_loading</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>331</span> </span><span class="WHIT">				</span><span class="NAME">group</span><span class="WHIT">
+<span class='line'>332</span> </span><span class="WHIT">			</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>333</span> </span><span class="WHIT">			
+<span class='line'>334</span> 			</span><span class="COMM">// called when a script has finished preloading</span><span class="WHIT">
+<span class='line'>335</span> </span><span class="WHIT">			</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">chain_script_ready</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">exec_trigger</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>336</span> </span><span class="WHIT">				</span><span class="COMM">/*!START_DEBUG*/</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">log_msg</span><span class="PUNC">(</span><span class="STRN">"script preload finished: "</span><span class="PUNC">+</span><span class="NAME">script_obj.real_src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
+<span class='line'>337</span> </span><span class="WHIT">				</span><span class="NAME">script_obj.ready</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>338</span> </span><span class="WHIT">				</span><span class="NAME">script_obj.exec_trigger</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">exec_trigger</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>339</span> </span><span class="WHIT">				</span><span class="NAME">advance_exec_cursor</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// will only check for 'ready' scripts to be executed</span><span class="WHIT">
+<span class='line'>340</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>341</span> 
+<span class='line'>342</span> </span><span class="WHIT">			</span><span class="COMM">// called when a script has finished executing</span><span class="WHIT">
+<span class='line'>343</span> </span><span class="WHIT">			</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">chain_script_executed</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">chain_group</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>344</span> </span><span class="WHIT">				</span><span class="COMM">/*!START_DEBUG*/</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">log_msg</span><span class="PUNC">(</span><span class="STRN">"script execution finished: "</span><span class="PUNC">+</span><span class="NAME">script_obj.real_src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
+<span class='line'>345</span> </span><span class="WHIT">				</span><span class="NAME">script_obj.ready</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_obj.finished</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>346</span> </span><span class="WHIT">				</span><span class="NAME">script_obj.exec_trigger</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>347</span> </span><span class="WHIT">				</span><span class="COMM">// check if chain group is all finished</span><span class="WHIT">
+<span class='line'>348</span> </span><span class="WHIT">				</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">&lt;</span><span class="NAME">chain_group.scripts.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>349</span> </span><span class="WHIT">					</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">chain_group.scripts</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">finished</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>350</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>351</span> </span><span class="WHIT">				</span><span class="COMM">// chain_group is all finished if we get this far</span><span class="WHIT">
+<span class='line'>352</span> </span><span class="WHIT">				</span><span class="NAME">chain_group.finished</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>353</span> </span><span class="WHIT">				</span><span class="NAME">advance_exec_cursor</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>354</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>355</span> 
+<span class='line'>356</span> </span><span class="WHIT">			</span><span class="COMM">// main driver for executing each part of the chain</span><span class="WHIT">
+<span class='line'>357</span> </span><span class="WHIT">			</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">advance_exec_cursor</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>358</span> </span><span class="WHIT">				</span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">exec_cursor</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">chain.length</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>359</span> </span><span class="WHIT">					</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">is_func</span><span class="PUNC">(</span><span class="NAME">chain</span><span class="PUNC">[</span><span class="NAME">exec_cursor</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>360</span> </span><span class="WHIT">						</span><span class="COMM">/*!START_DEBUG*/</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">log_msg</span><span class="PUNC">(</span><span class="STRN">"$LAB.wait() executing: "</span><span class="PUNC">+</span><span class="NAME">chain</span><span class="PUNC">[</span><span class="NAME">exec_cursor</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
+<span class='line'>361</span> </span><span class="WHIT">						</span><span class="KEYW">try</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">chain</span><span class="PUNC">[</span><span class="NAME">exec_cursor</span><span class="PUNC">++</span><span class="PUNC">]</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">catch</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">err</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>362</span> </span><span class="WHIT">							</span><span class="COMM">/*!START_DEBUG*/</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_Debug</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">log_error</span><span class="PUNC">(</span><span class="STRN">"$LAB.wait() error caught: "</span><span class="PUNC">,</span><span class="NAME">err</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*!END_DEBUG*/</span><span class="WHIT">
+<span class='line'>363</span> </span><span class="WHIT">						</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>364</span> </span><span class="WHIT">						</span><span class="KEYW">continue</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>365</span> </span><span class="WHIT">					</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>366</span> </span><span class="WHIT">					</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">chain</span><span class="PUNC">[</span><span class="NAME">exec_cursor</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">finished</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>367</span> </span><span class="WHIT">						</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">check_chain_group_scripts_ready</span><span class="PUNC">(</span><span class="NAME">chain</span><span class="PUNC">[</span><span class="NAME">exec_cursor</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="KEYW">continue</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>368</span> </span><span class="WHIT">						</span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>369</span> </span><span class="WHIT">					</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>370</span> </span><span class="WHIT">					</span><span class="NAME">exec_cursor</span><span class="PUNC">++</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>371</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>372</span> </span><span class="WHIT">				</span><span class="COMM">// we've reached the end of the chain (so far)</span><span class="WHIT">
+<span class='line'>373</span> </span><span class="WHIT">				</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">exec_cursor</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">chain.length</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>374</span> </span><span class="WHIT">					</span><span class="NAME">scripts_currently_loading</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>375</span> </span><span class="WHIT">					</span><span class="NAME">group</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>376</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>377</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>378</span> </span><span class="WHIT">			
+<span class='line'>379</span> 			</span><span class="COMM">// setup next chain script group</span><span class="WHIT">
+<span class='line'>380</span> </span><span class="WHIT">			</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">init_script_chain_group</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>381</span> </span><span class="WHIT">				</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">group</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">group.scripts</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>382</span> </span><span class="WHIT">					</span><span class="NAME">chain.push</span><span class="PUNC">(</span><span class="NAME">group</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">scripts</span><span class="PUNC">:</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">finished</span><span class="PUNC">:</span><span class="KEYW">true</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>383</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>384</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>385</span> 
+<span class='line'>386</span> </span><span class="WHIT">			</span><span class="COMM">// API for $LAB chains</span><span class="WHIT">
+<span class='line'>387</span> </span><span class="WHIT">			</span><span class="NAME">chainedAPI</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>388</span> </span><span class="WHIT">				</span><span class="COMM">// start loading one or more scripts</span><span class="WHIT">
+<span class='line'>389</span> </span><span class="WHIT">				</span><span class="NAME">script</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>390</span> </span><span class="WHIT">					</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">&lt;</span><span class="NAME">arguments.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>391</span> </span><span class="WHIT">						</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">script_list</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>392</span> </span><span class="WHIT">							</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">splice_args</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>393</span> </span><span class="WHIT">							
+<span class='line'>394</span> 							</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">is_array</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>395</span> </span><span class="WHIT">								</span><span class="NAME">script_list</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="NAME">script_obj</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>396</span> </span><span class="WHIT">							</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>397</span> </span><span class="WHIT">							</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">&lt;</span><span class="NAME">script_list.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>398</span> </span><span class="WHIT">								</span><span class="NAME">init_script_chain_group</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>399</span> </span><span class="WHIT">								</span><span class="NAME">script_obj</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_list</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>400</span> </span><span class="WHIT">								
+<span class='line'>401</span> 								</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">is_func</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">script_obj</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">script_obj</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>402</span> </span><span class="WHIT">								</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">script_obj</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="KEYW">continue</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>403</span> </span><span class="WHIT">								</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">is_array</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>404</span> </span><span class="WHIT">									</span><span class="COMM">// set up an array of arguments to pass to splice()</span><span class="WHIT">
+<span class='line'>405</span> </span><span class="WHIT">									</span><span class="NAME">splice_args</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">slice.call</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// first include the actual array elements we want to splice in</span><span class="WHIT">
+<span class='line'>406</span> </span><span class="WHIT">									</span><span class="NAME">splice_args.unshift</span><span class="PUNC">(</span><span class="NAME">j</span><span class="PUNC">,</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// next, put the `index` and `howMany` parameters onto the beginning of the splice-arguments array</span><span class="WHIT">
+<span class='line'>407</span> </span><span class="WHIT">									</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">splice.apply</span><span class="PUNC">(</span><span class="NAME">script_list</span><span class="PUNC">,</span><span class="NAME">splice_args</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// use the splice-arguments array as arguments for splice()</span><span class="WHIT">
+<span class='line'>408</span> </span><span class="WHIT">									</span><span class="NAME">j</span><span class="PUNC">--</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// adjust `j` to account for the loop's subsequent `j++`, so that the next loop iteration uses the same `j` index value</span><span class="WHIT">
+<span class='line'>409</span> </span><span class="WHIT">									</span><span class="KEYW">continue</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>410</span> </span><span class="WHIT">								</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>411</span> </span><span class="WHIT">								</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">script_obj</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"string"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">script_obj</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">src</span><span class="PUNC">:</span><span class="NAME">script_obj</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>412</span> </span><span class="WHIT">								</span><span class="NAME">script_obj</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">merge_objs</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>413</span> </span><span class="WHIT">									</span><span class="NAME">ready</span><span class="PUNC">:</span><span class="KEYW">false</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>414</span> </span><span class="WHIT">									</span><span class="NAME">ready_cb</span><span class="PUNC">:</span><span class="NAME">chain_script_ready</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>415</span> </span><span class="WHIT">									</span><span class="NAME">finished</span><span class="PUNC">:</span><span class="KEYW">false</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>416</span> </span><span class="WHIT">									</span><span class="NAME">finished_cb</span><span class="PUNC">:</span><span class="NAME">chain_script_executed</span><span class="WHIT">
+<span class='line'>417</span> </span><span class="WHIT">								</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>418</span> </span><span class="WHIT">								</span><span class="NAME">group.finished</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>419</span> </span><span class="WHIT">								</span><span class="NAME">group.scripts.push</span><span class="PUNC">(</span><span class="NAME">script_obj</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>420</span> </span><span class="WHIT">								
+<span class='line'>421</span> 								</span><span class="NAME">do_script</span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">,</span><span class="NAME">script_obj</span><span class="PUNC">,</span><span class="NAME">group</span><span class="PUNC">,</span><span class="PUNC">(</span><span class="NAME">can_use_preloading</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">scripts_currently_loading</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>422</span> </span><span class="WHIT">								</span><span class="NAME">scripts_currently_loading</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>423</span> </span><span class="WHIT">								
+<span class='line'>424</span> 								</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">chain_opts</span><span class="PUNC">[</span><span class="NAME">_AlwaysPreserveOrder</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="NAME">chainedAPI.wait</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>425</span> </span><span class="WHIT">							</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>426</span> </span><span class="WHIT">						</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>427</span> </span><span class="WHIT">					</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>428</span> </span><span class="WHIT">					</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">chainedAPI</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>429</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>430</span> </span><span class="WHIT">				</span><span class="COMM">// force LABjs to pause in execution at this point in the chain, until the execution thus far finishes, before proceeding</span><span class="WHIT">
+<span class='line'>431</span> </span><span class="WHIT">				</span><span class="NAME">wait</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>432</span> </span><span class="WHIT">					</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">arguments.length</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>433</span> </span><span class="WHIT">						</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">&lt;</span><span class="NAME">arguments.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>434</span> </span><span class="WHIT">							</span><span class="NAME">chain.push</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>435</span> </span><span class="WHIT">						</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>436</span> </span><span class="WHIT">						</span><span class="NAME">group</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">chain</span><span class="PUNC">[</span><span class="NAME">chain.length</span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>437</span> </span><span class="WHIT">					</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>438</span> </span><span class="WHIT">					</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="NAME">group</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>439</span> </span><span class="WHIT">					
+<span class='line'>440</span> 					</span><span class="NAME">advance_exec_cursor</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>441</span> </span><span class="WHIT">					
+<span class='line'>442</span> 					</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">chainedAPI</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>443</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>444</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>445</span> 
+<span class='line'>446</span> </span><span class="WHIT">			</span><span class="COMM">// the first chain link API (includes `setOptions` only this first time)</span><span class="WHIT">
+<span class='line'>447</span> </span><span class="WHIT">			</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>448</span> </span><span class="WHIT">				</span><span class="NAME">script</span><span class="PUNC">:</span><span class="NAME">chainedAPI.script</span><span class="PUNC">,</span><span class="WHIT"> 
+<span class='line'>449</span> 				</span><span class="NAME">wait</span><span class="PUNC">:</span><span class="NAME">chainedAPI.wait</span><span class="PUNC">,</span><span class="WHIT"> 
+<span class='line'>450</span> 				</span><span class="NAME">setOptions</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">opts</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>451</span> </span><span class="WHIT">					</span><span class="NAME">merge_objs</span><span class="PUNC">(</span><span class="NAME">opts</span><span class="PUNC">,</span><span class="NAME">chain_opts</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>452</span> </span><span class="WHIT">					</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">chainedAPI</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>453</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>454</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>455</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>456</span> 
+<span class='line'>457</span> </span><span class="WHIT">		</span><span class="COMM">// API for each initial $LAB instance (before chaining starts)</span><span class="WHIT">
+<span class='line'>458</span> </span><span class="WHIT">		</span><span class="NAME">instanceAPI</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>459</span> </span><span class="WHIT">			</span><span class="COMM">// main API functions</span><span class="WHIT">
+<span class='line'>460</span> </span><span class="WHIT">			</span><span class="NAME">setGlobalDefaults</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">opts</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>461</span> </span><span class="WHIT">				</span><span class="NAME">merge_objs</span><span class="PUNC">(</span><span class="NAME">opts</span><span class="PUNC">,</span><span class="NAME">global_defaults</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>462</span> </span><span class="WHIT">				</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">instanceAPI</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>463</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>464</span> </span><span class="WHIT">			</span><span class="NAME">setOptions</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>465</span> </span><span class="WHIT">				</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">create_chain</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">setOptions.apply</span><span class="PUNC">(</span><span class="KEYW">null</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>466</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>467</span> </span><span class="WHIT">			</span><span class="NAME">script</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>468</span> </span><span class="WHIT">				</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">create_chain</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">script.apply</span><span class="PUNC">(</span><span class="KEYW">null</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>469</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>470</span> </span><span class="WHIT">			</span><span class="NAME">wait</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>471</span> </span><span class="WHIT">				</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">create_chain</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">wait.apply</span><span class="PUNC">(</span><span class="KEYW">null</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>472</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>473</span> 
+<span class='line'>474</span> </span><span class="WHIT">			</span><span class="COMM">// built-in queuing for $LAB `script()` and `wait()` calls</span><span class="WHIT">
+<span class='line'>475</span> </span><span class="WHIT">			</span><span class="COMM">// useful for building up a chain programmatically across various script locations, and simulating</span><span class="WHIT">
+<span class='line'>476</span> </span><span class="WHIT">			</span><span class="COMM">// execution of the chain</span><span class="WHIT">
+<span class='line'>477</span> </span><span class="WHIT">			</span><span class="NAME">queueScript</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>478</span> </span><span class="WHIT">				</span><span class="NAME">queue</span><span class="PUNC">[</span><span class="NAME">queue.length</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">type</span><span class="PUNC">:</span><span class="STRN">"script"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">args</span><span class="PUNC">:</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">slice.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>479</span> </span><span class="WHIT">				</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">instanceAPI</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>480</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>481</span> </span><span class="WHIT">			</span><span class="NAME">queueWait</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>482</span> </span><span class="WHIT">				</span><span class="NAME">queue</span><span class="PUNC">[</span><span class="NAME">queue.length</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">type</span><span class="PUNC">:</span><span class="STRN">"wait"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">args</span><span class="PUNC">:</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">slice.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>483</span> </span><span class="WHIT">				</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">instanceAPI</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>484</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>485</span> </span><span class="WHIT">			</span><span class="NAME">runQueue</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>486</span> </span><span class="WHIT">				</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">$L</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">instanceAPI</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">len</span><span class="PUNC">=</span><span class="NAME">queue.length</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">=</span><span class="NAME">len</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">val</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>487</span> </span><span class="WHIT">				</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">;</span><span class="PUNC">--</span><span class="NAME">i</span><span class="PUNC">>=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>488</span> </span><span class="WHIT">					</span><span class="NAME">val</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">queue.shift</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>489</span> </span><span class="WHIT">					</span><span class="NAME">$L</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">$L</span><span class="PUNC">[</span><span class="NAME">val.type</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">apply</span><span class="PUNC">(</span><span class="KEYW">null</span><span class="PUNC">,</span><span class="NAME">val.args</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>490</span> </span><span class="WHIT">				</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>491</span> </span><span class="WHIT">				</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">$L</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>492</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>493</span> 
+<span class='line'>494</span> </span><span class="WHIT">			</span><span class="COMM">// rollback `[global].$LAB` to what it was before this file was loaded, the return this current instance of $LAB</span><span class="WHIT">
+<span class='line'>495</span> </span><span class="WHIT">			</span><span class="NAME">noConflict</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>496</span> </span><span class="WHIT">				</span><span class="NAME">global.$LAB</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_$LAB</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>497</span> </span><span class="WHIT">				</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">instanceAPI</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>498</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>499</span> 
+<span class='line'>500</span> </span><span class="WHIT">			</span><span class="COMM">// create another clean instance of $LAB</span><span class="WHIT">
+<span class='line'>501</span> </span><span class="WHIT">			</span><span class="NAME">sandbox</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>502</span> </span><span class="WHIT">				</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">create_sandbox</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>503</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>504</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>505</span> 
+<span class='line'>506</span> </span><span class="WHIT">		</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">instanceAPI</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>507</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>508</span> 
+<span class='line'>509</span> </span><span class="WHIT">	</span><span class="COMM">// create the main instance of $LAB</span><span class="WHIT">
+<span class='line'>510</span> </span><span class="WHIT">	</span><span class="NAME">global.$LAB</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">create_sandbox</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>511</span> 
+<span class='line'>512</span> 
+<span class='line'>513</span> </span><span class="WHIT">	</span><span class="COMM">/* The following "hack" was suggested by Andrea Giammarchi and adapted from: http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html
+<span class='line'>514</span> 	   NOTE: this hack only operates in FF and then only in versions where document.readyState is not present (FF &lt; 3.6?).
+<span class='line'>515</span> 	   
+<span class='line'>516</span> 	   The hack essentially "patches" the **page** that LABjs is loaded onto so that it has a proper conforming document.readyState, so that if a script which does 
+<span class='line'>517</span> 	   proper and safe dom-ready detection is loaded onto a page, after dom-ready has passed, it will still be able to detect this state, by inspecting the now hacked 
+<span class='line'>518</span> 	   document.readyState property. The loaded script in question can then immediately trigger any queued code executions that were waiting for the DOM to be ready. 
+<span class='line'>519</span> 	   For instance, jQuery 1.4+ has been patched to take advantage of document.readyState, which is enabled by this hack. But 1.3.2 and before are **not** safe or 
+<span class='line'>520</span> 	   fixed by this hack, and should therefore **not** be lazy-loaded by script loader tools such as LABjs.
+<span class='line'>521</span> 	*/</span><span class="WHIT"> 
+<span class='line'>522</span> 	</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">addEvent</span><span class="PUNC">,</span><span class="NAME">domLoaded</span><span class="PUNC">,</span><span class="NAME">handler</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>523</span> </span><span class="WHIT">		</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">document.readyState</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">document</span><span class="PUNC">[</span><span class="NAME">addEvent</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>524</span> </span><span class="WHIT">			</span><span class="NAME">document.readyState</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"loading"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>525</span> </span><span class="WHIT">			</span><span class="NAME">document</span><span class="PUNC">[</span><span class="NAME">addEvent</span><span class="PUNC">]</span><span class="PUNC">(</span><span class="NAME">domLoaded</span><span class="PUNC">,</span><span class="NAME">handler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>526</span> </span><span class="WHIT">				</span><span class="NAME">document.removeEventListener</span><span class="PUNC">(</span><span class="NAME">domLoaded</span><span class="PUNC">,</span><span class="NAME">handler</span><span class="PUNC">,</span><span class="KEYW">false</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>527</span> </span><span class="WHIT">				</span><span class="NAME">document.readyState</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"complete"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>528</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="KEYW">false</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>529</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>530</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">(</span><span class="STRN">"addEventListener"</span><span class="PUNC">,</span><span class="STRN">"DOMContentLoaded"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>531</span> 
+<span class='line'>532</span> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="COMM">/*
+<span class='line'>533</span>   mustache.js — Logic-less templates in JavaScript
+<span class='line'>534</span> 
+<span class='line'>535</span>   See http://mustache.github.com/ for more info.
+<span class='line'>536</span> */</span><span class="WHIT">
+<span class='line'>537</span> 
+<span class='line'>538</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">Mustache</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>539</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">Renderer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>540</span> 
+<span class='line'>541</span> </span><span class="WHIT">  </span><span class="NAME">Renderer.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>542</span> </span><span class="WHIT">    </span><span class="NAME">otag</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"{{"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>543</span> </span><span class="WHIT">    </span><span class="NAME">ctag</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"}}"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>544</span> </span><span class="WHIT">    </span><span class="NAME">pragmas</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>545</span> </span><span class="WHIT">    </span><span class="NAME">buffer</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>546</span> </span><span class="WHIT">    </span><span class="NAME">pragmas_implemented</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>547</span> </span><span class="WHIT">      </span><span class="STRN">"IMPLICIT-ITERATOR"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="WHIT">
+<span class='line'>548</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>549</span> </span><span class="WHIT">    </span><span class="NAME">context</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>550</span> 
+<span class='line'>551</span> </span><span class="WHIT">    </span><span class="NAME">render</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">in_recursion</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>552</span> </span><span class="WHIT">      </span><span class="COMM">// reset buffer & set context</span><span class="WHIT">
+<span class='line'>553</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">in_recursion</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>554</span> </span><span class="WHIT">        </span><span class="NAME">this.context</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>555</span> </span><span class="WHIT">        </span><span class="NAME">this.buffer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// TODO: make this non-lazy</span><span class="WHIT">
+<span class='line'>556</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>557</span> 
+<span class='line'>558</span> </span><span class="WHIT">      </span><span class="COMM">// fail fast</span><span class="WHIT">
+<span class='line'>559</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">this.includes</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">template</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>560</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">in_recursion</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>561</span> </span><span class="WHIT">          </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">template</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>562</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>563</span> </span><span class="WHIT">          </span><span class="NAME">this.send</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>564</span> </span><span class="WHIT">          </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>565</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>566</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>567</span> 
+<span class='line'>568</span> </span><span class="WHIT">      </span><span class="NAME">template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.render_pragmas</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>569</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">html</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.render_section</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>570</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">in_recursion</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>571</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.render_tags</span><span class="PUNC">(</span><span class="NAME">html</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">in_recursion</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>572</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>573</span> 
+<span class='line'>574</span> </span><span class="WHIT">      </span><span class="NAME">this.render_tags</span><span class="PUNC">(</span><span class="NAME">html</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">in_recursion</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>575</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>576</span> 
+<span class='line'>577</span> </span><span class="WHIT">    </span><span class="COMM">/*
+<span class='line'>578</span>       Sends parsed lines
+<span class='line'>579</span>     */</span><span class="WHIT">
+<span class='line'>580</span> </span><span class="WHIT">    </span><span class="NAME">send</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">line</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>581</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">line</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>582</span> </span><span class="WHIT">        </span><span class="NAME">this.buffer.push</span><span class="PUNC">(</span><span class="NAME">line</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>583</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>584</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>585</span> 
+<span class='line'>586</span> </span><span class="WHIT">    </span><span class="COMM">/*
+<span class='line'>587</span>       Looks for %PRAGMAS
+<span class='line'>588</span>     */</span><span class="WHIT">
+<span class='line'>589</span> </span><span class="WHIT">    </span><span class="NAME">render_pragmas</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>590</span> </span><span class="WHIT">      </span><span class="COMM">// no pragmas</span><span class="WHIT">
+<span class='line'>591</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">this.includes</span><span class="PUNC">(</span><span class="STRN">"%"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">template</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>592</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">template</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>593</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>594</span> 
+<span class='line'>595</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">that</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>596</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">regex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="NAME">this.otag</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"%([\\w-]+) ?([\\w]+=[\\w]+)?"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
+<span class='line'>597</span> </span><span class="WHIT">            </span><span class="NAME">this.ctag</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"g"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>598</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">template.replace</span><span class="PUNC">(</span><span class="NAME">regex</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">match</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">pragma</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">options</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>599</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">that.pragmas_implemented</span><span class="PUNC">[</span><span class="NAME">pragma</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>600</span> </span><span class="WHIT">          </span><span class="KEYW">throw</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">message</span><span class="PUNC">:</span><span class="WHIT"> 
+<span class='line'>601</span>             </span><span class="STRN">"This implementation of mustache doesn't understand the '"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
+<span class='line'>602</span> </span><span class="WHIT">            </span><span class="NAME">pragma</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"' pragma"</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>603</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>604</span> </span><span class="WHIT">        </span><span class="NAME">that.pragmas</span><span class="PUNC">[</span><span class="NAME">pragma</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>605</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">options</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>606</span> </span><span class="WHIT">          </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">opts</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">options.split</span><span class="PUNC">(</span><span class="STRN">"="</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>607</span> </span><span class="WHIT">          </span><span class="NAME">that.pragmas</span><span class="PUNC">[</span><span class="NAME">pragma</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="NAME">opts</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">opts</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>608</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>609</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>610</span> </span><span class="WHIT">        </span><span class="COMM">// ignore unknown pragmas silently</span><span class="WHIT">
+<span class='line'>611</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>612</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>613</span> 
+<span class='line'>614</span> </span><span class="WHIT">    </span><span class="COMM">/*
+<span class='line'>615</span>       Tries to find a partial in the curent scope and render it
+<span class='line'>616</span>     */</span><span class="WHIT">
+<span class='line'>617</span> </span><span class="WHIT">    </span><span class="NAME">render_partial</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>618</span> </span><span class="WHIT">      </span><span class="NAME">name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.trim</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>619</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">partials</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>620</span> </span><span class="WHIT">        </span><span class="KEYW">throw</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">message</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"unknown_partial '"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"'"</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>621</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>622</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">context</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">"object"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>623</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.render</span><span class="PUNC">(</span><span class="NAME">partials</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>624</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>625</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.render</span><span class="PUNC">(</span><span class="NAME">partials</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>626</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>627</span> 
+<span class='line'>628</span> </span><span class="WHIT">    </span><span class="COMM">/*
+<span class='line'>629</span>       Renders inverted (^) and normal (#) sections
+<span class='line'>630</span>     */</span><span class="WHIT">
+<span class='line'>631</span> </span><span class="WHIT">    </span><span class="NAME">render_section</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>632</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">this.includes</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">template</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">this.includes</span><span class="PUNC">(</span><span class="STRN">"^"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">template</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>633</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">template</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>634</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>635</span> 
+<span class='line'>636</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">that</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>637</span> </span><span class="WHIT">      </span><span class="COMM">// CSW - Added "+?" so it finds the tighest bound, not the widest</span><span class="WHIT">
+<span class='line'>638</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">regex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="NAME">this.otag</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"(\\^|\\#)\\s*(.+)\\s*"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">this.ctag</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
+<span class='line'>639</span> </span><span class="WHIT">              </span><span class="STRN">"\n*([\\s\\S]+?)"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">this.otag</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"\\/\\s*\\2\\s*"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">this.ctag</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
+<span class='line'>640</span> </span><span class="WHIT">              </span><span class="STRN">"\\s*"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"mg"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>641</span> 
+<span class='line'>642</span> </span><span class="WHIT">      </span><span class="COMM">// for each {{#foo}}{{/foo}} section do...</span><span class="WHIT">
+<span class='line'>643</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">template.replace</span><span class="PUNC">(</span><span class="NAME">regex</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">match</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">type</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">content</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>644</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">that.find</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>645</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"^"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// inverted section</span><span class="WHIT">
+<span class='line'>646</span> </span><span class="WHIT">          </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">that.is_array</span><span class="PUNC">(</span><span class="NAME">value</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">value.length</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>647</span> </span><span class="WHIT">            </span><span class="COMM">// false or empty list, render it</span><span class="WHIT">
+<span class='line'>648</span> </span><span class="WHIT">            </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">that.render</span><span class="PUNC">(</span><span class="NAME">content</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>649</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>650</span> </span><span class="WHIT">            </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>651</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>652</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"#"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// normal section</span><span class="WHIT">
+<span class='line'>653</span> </span><span class="WHIT">          </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">that.is_array</span><span class="PUNC">(</span><span class="NAME">value</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// Enumerable, Let's loop!</span><span class="WHIT">
+<span class='line'>654</span> </span><span class="WHIT">            </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">that.map</span><span class="PUNC">(</span><span class="NAME">value</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">row</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>655</span> </span><span class="WHIT">              </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">that.render</span><span class="PUNC">(</span><span class="NAME">content</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">that.create_context</span><span class="PUNC">(</span><span class="NAME">row</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>656</span> </span><span class="WHIT">                </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>657</span> </span><span class="WHIT">            </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">join</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>658</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">that.is_object</span><span class="PUNC">(</span><span class="NAME">value</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// Object, Use it as subcontext!</span><span class="WHIT">
+<span class='line'>659</span> </span><span class="WHIT">            </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">that.render</span><span class="PUNC">(</span><span class="NAME">content</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">that.create_context</span><span class="PUNC">(</span><span class="NAME">value</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>660</span> </span><span class="WHIT">              </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>661</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"function"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>662</span> </span><span class="WHIT">            </span><span class="COMM">// higher order section</span><span class="WHIT">
+<span class='line'>663</span> </span><span class="WHIT">            </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">value.call</span><span class="PUNC">(</span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">content</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">text</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>664</span> </span><span class="WHIT">              </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">that.render</span><span class="PUNC">(</span><span class="NAME">text</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>665</span> </span><span class="WHIT">            </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>666</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">value</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// boolean section</span><span class="WHIT">
+<span class='line'>667</span> </span><span class="WHIT">            </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">that.render</span><span class="PUNC">(</span><span class="NAME">content</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>668</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>669</span> </span><span class="WHIT">            </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>670</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>671</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>672</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>673</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>674</span> 
+<span class='line'>675</span> </span><span class="WHIT">    </span><span class="COMM">/*
+<span class='line'>676</span>       Replace {{foo}} and friends with values from our view
+<span class='line'>677</span>     */</span><span class="WHIT">
+<span class='line'>678</span> </span><span class="WHIT">    </span><span class="NAME">render_tags</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">in_recursion</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>679</span> </span><span class="WHIT">      </span><span class="COMM">// tit for tat</span><span class="WHIT">
+<span class='line'>680</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">that</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>681</span> 
+<span class='line'>682</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">new_regex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>683</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="NAME">that.otag</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"(=|!|>|\\{|%)?([^\\/#\\^]+?)\\1?"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
+<span class='line'>684</span> </span><span class="WHIT">          </span><span class="NAME">that.ctag</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"+"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"g"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>685</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>686</span> 
+<span class='line'>687</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">regex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">new_regex</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>688</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">tag_replace_callback</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">match</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">operator</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">name</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>689</span> </span><span class="WHIT">        </span><span class="KEYW">switch</span><span class="PUNC">(</span><span class="NAME">operator</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>690</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"!"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="COMM">// ignore comments</span><span class="WHIT">
+<span class='line'>691</span> </span><span class="WHIT">          </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>692</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"="</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="COMM">// set new delimiters, rebuild the replace regexp</span><span class="WHIT">
+<span class='line'>693</span> </span><span class="WHIT">          </span><span class="NAME">that.set_delimiters</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>694</span> </span><span class="WHIT">          </span><span class="NAME">regex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">new_regex</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>695</span> </span><span class="WHIT">          </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>696</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">">"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="COMM">// render partial</span><span class="WHIT">
+<span class='line'>697</span> </span><span class="WHIT">          </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">that.render_partial</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>698</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"{"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="COMM">// the triple mustache is unescaped</span><span class="WHIT">
+<span class='line'>699</span> </span><span class="WHIT">          </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">that.find</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>700</span> </span><span class="WHIT">        </span><span class="KEYW">default</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="COMM">// escape the value</span><span class="WHIT">
+<span class='line'>701</span> </span><span class="WHIT">          </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">that.escape</span><span class="PUNC">(</span><span class="NAME">that.find</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>702</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>703</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>704</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">lines</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">template.split</span><span class="PUNC">(</span><span class="STRN">"\n"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>705</span> </span><span class="WHIT">      </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">lines.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>706</span> </span><span class="WHIT">        </span><span class="NAME">lines</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">lines</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="NAME">regex</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">tag_replace_callback</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>707</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">in_recursion</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>708</span> </span><span class="WHIT">          </span><span class="NAME">this.send</span><span class="PUNC">(</span><span class="NAME">lines</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>709</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>710</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>711</span> 
+<span class='line'>712</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">in_recursion</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>713</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">lines.join</span><span class="PUNC">(</span><span class="STRN">"\n"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>714</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>715</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>716</span> 
+<span class='line'>717</span> </span><span class="WHIT">    </span><span class="NAME">set_delimiters</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">delimiters</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>718</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">dels</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">delimiters.split</span><span class="PUNC">(</span><span class="STRN">" "</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>719</span> </span><span class="WHIT">      </span><span class="NAME">this.otag</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.escape_regex</span><span class="PUNC">(</span><span class="NAME">dels</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>720</span> </span><span class="WHIT">      </span><span class="NAME">this.ctag</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.escape_regex</span><span class="PUNC">(</span><span class="NAME">dels</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>721</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>722</span> 
+<span class='line'>723</span> </span><span class="WHIT">    </span><span class="NAME">escape_regex</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">text</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>724</span> </span><span class="WHIT">      </span><span class="COMM">// thank you Simon Willison</span><span class="WHIT">
+<span class='line'>725</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">arguments.callee.sRE</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>726</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">specials</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="WHIT">
+<span class='line'>727</span> </span><span class="WHIT">          </span><span class="STRN">'/'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'.'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'*'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'+'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'?'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'|'</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>728</span> </span><span class="WHIT">          </span><span class="STRN">'('</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">')'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'['</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">']'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'{'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'}'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'\\'</span><span class="WHIT">
+<span class='line'>729</span> </span><span class="WHIT">        </span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>730</span> </span><span class="WHIT">        </span><span class="NAME">arguments.callee.sRE</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="WHIT">
+<span class='line'>731</span> </span><span class="WHIT">          </span><span class="STRN">'(\\'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">specials.join</span><span class="PUNC">(</span><span class="STRN">'|\\'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">')'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'g'</span><span class="WHIT">
+<span class='line'>732</span> </span><span class="WHIT">        </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>733</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>734</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">text.replace</span><span class="PUNC">(</span><span class="NAME">arguments.callee.sRE</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'\\$1'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>735</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>736</span> 
+<span class='line'>737</span> </span><span class="WHIT">    </span><span class="COMM">/*
+<span class='line'>738</span>       find `name` in current `context`. That is find me a value
+<span class='line'>739</span>       from the view object
+<span class='line'>740</span>     */</span><span class="WHIT">
+<span class='line'>741</span> </span><span class="WHIT">    </span><span class="NAME">find</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>742</span> </span><span class="WHIT">      </span><span class="NAME">name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.trim</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>743</span> 
+<span class='line'>744</span> </span><span class="WHIT">      </span><span class="COMM">// Checks whether a value is thruthy or false or 0</span><span class="WHIT">
+<span class='line'>745</span> </span><span class="WHIT">      </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">is_kinda_truthy</span><span class="PUNC">(</span><span class="NAME">bool</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>746</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">bool</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">bool</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">bool</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>747</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>748</span> 
+<span class='line'>749</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">value</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>750</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">is_kinda_truthy</span><span class="PUNC">(</span><span class="NAME">context</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>751</span> </span><span class="WHIT">        </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">context</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>752</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">is_kinda_truthy</span><span class="PUNC">(</span><span class="NAME">this.context</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>753</span> </span><span class="WHIT">        </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.context</span><span class="PUNC">[</span><span class="NAME">name</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>754</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>755</span> 
+<span class='line'>756</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"function"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>757</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">value.apply</span><span class="PUNC">(</span><span class="NAME">context</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>758</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>759</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>760</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">value</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>761</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>762</span> </span><span class="WHIT">      </span><span class="COMM">// silently ignore unkown variables</span><span class="WHIT">
+<span class='line'>763</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>764</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>765</span> 
+<span class='line'>766</span> </span><span class="WHIT">    </span><span class="COMM">// Utility methods</span><span class="WHIT">
+<span class='line'>767</span> 
+<span class='line'>768</span> </span><span class="WHIT">    </span><span class="COMM">/* includes tag */</span><span class="WHIT">
+<span class='line'>769</span> </span><span class="WHIT">    </span><span class="NAME">includes</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">needle</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">haystack</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>770</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">haystack.indexOf</span><span class="PUNC">(</span><span class="NAME">this.otag</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">needle</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>771</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>772</span> 
+<span class='line'>773</span> </span><span class="WHIT">    </span><span class="COMM">/*
+<span class='line'>774</span>       Does away with nasty characters
+<span class='line'>775</span>     */</span><span class="WHIT">
+<span class='line'>776</span> </span><span class="WHIT">    </span><span class="NAME">escape</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">s</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>777</span> </span><span class="WHIT">      </span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">String</span><span class="PUNC">(</span><span class="NAME">s</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">""</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>778</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">s.replace</span><span class="PUNC">(</span><span class="REGX">/&(?!\w+;)|["'&lt;>\\]/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">s</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>779</span> </span><span class="WHIT">        </span><span class="KEYW">switch</span><span class="PUNC">(</span><span class="NAME">s</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>780</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"&"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">"&amp;"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>781</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"\\"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">"\\\\"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>782</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">'"'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">'&quot;'</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>783</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"'"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">'&#39;'</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>784</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"&lt;"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">"&lt;"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>785</span> </span><span class="WHIT">        </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">">"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">"&gt;"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>786</span> </span><span class="WHIT">        </span><span class="KEYW">default</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>787</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>788</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>789</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>790</span> 
+<span class='line'>791</span> </span><span class="WHIT">    </span><span class="COMM">// by @langalex, support for arrays of strings</span><span class="WHIT">
+<span class='line'>792</span> </span><span class="WHIT">    </span><span class="NAME">create_context</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">_context</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>793</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">this.is_object</span><span class="PUNC">(</span><span class="NAME">_context</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>794</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">_context</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>795</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>796</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">iterator</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"."</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>797</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">this.pragmas</span><span class="PUNC">[</span><span class="STRN">"IMPLICIT-ITERATOR"</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>798</span> </span><span class="WHIT">          </span><span class="NAME">iterator</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.pragmas</span><span class="PUNC">[</span><span class="STRN">"IMPLICIT-ITERATOR"</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">iterator</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>799</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>800</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ctx</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>801</span> </span><span class="WHIT">        </span><span class="NAME">ctx</span><span class="PUNC">[</span><span class="NAME">iterator</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_context</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>802</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">ctx</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>803</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>804</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>805</span> 
+<span class='line'>806</span> </span><span class="WHIT">    </span><span class="NAME">is_object</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>807</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"object"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>808</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>809</span> 
+<span class='line'>810</span> </span><span class="WHIT">    </span><span class="NAME">is_array</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>811</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Object.prototype.toString.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'[object Array]'</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>812</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>813</span> 
+<span class='line'>814</span> </span><span class="WHIT">    </span><span class="COMM">/*
+<span class='line'>815</span>       Gets rid of leading and trailing whitespace
+<span class='line'>816</span>     */</span><span class="WHIT">
+<span class='line'>817</span> </span><span class="WHIT">    </span><span class="NAME">trim</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">s</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>818</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">s.replace</span><span class="PUNC">(</span><span class="REGX">/^\s*|\s*$/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>819</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>820</span> 
+<span class='line'>821</span> </span><span class="WHIT">    </span><span class="COMM">/*
+<span class='line'>822</span>       Why, why, why? Because IE. Cry, cry cry.
+<span class='line'>823</span>     */</span><span class="WHIT">
+<span class='line'>824</span> </span><span class="WHIT">    </span><span class="NAME">map</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">array</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">fn</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>825</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">array.map</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"function"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>826</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">array.map</span><span class="PUNC">(</span><span class="NAME">fn</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>827</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>828</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">r</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>829</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">array.length</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>830</span> </span><span class="WHIT">        </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>831</span> </span><span class="WHIT">          </span><span class="NAME">r.push</span><span class="PUNC">(</span><span class="NAME">fn</span><span class="PUNC">(</span><span class="NAME">array</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>832</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>833</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">r</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>834</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>835</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>836</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>837</span> 
+<span class='line'>838</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>839</span> </span><span class="WHIT">    </span><span class="NAME">name</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"mustache.js"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>840</span> </span><span class="WHIT">    </span><span class="NAME">version</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"0.3.1-dev"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>841</span> 
+<span class='line'>842</span> </span><span class="WHIT">    </span><span class="COMM">/*
+<span class='line'>843</span>       Turns a template and view into HTML
+<span class='line'>844</span>     */</span><span class="WHIT">
+<span class='line'>845</span> </span><span class="WHIT">    </span><span class="NAME">to_html</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">view</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">send_fun</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>846</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">renderer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Renderer</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>847</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">send_fun</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>848</span> </span><span class="WHIT">        </span><span class="NAME">renderer.send</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">send_fun</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>849</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>850</span> </span><span class="WHIT">      </span><span class="NAME">renderer.render</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">view</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">partials</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>851</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">send_fun</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>852</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">renderer.buffer.join</span><span class="PUNC">(</span><span class="STRN">"\n"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>853</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>854</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>855</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>856</span> </span><span class="PUNC">}</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>857</span> </span><span class="COMM">// Underscore.js 1.2.3</span><span class="WHIT">
+<span class='line'>858</span> </span><span class="COMM">// (c) 2009-2011 Jeremy Ashkenas, DocumentCloud Inc.</span><span class="WHIT">
+<span class='line'>859</span> </span><span class="COMM">// Underscore is freely distributable under the MIT license.</span><span class="WHIT">
+<span class='line'>860</span> </span><span class="COMM">// Portions of Underscore are inspired or borrowed from Prototype,</span><span class="WHIT">
+<span class='line'>861</span> </span><span class="COMM">// Oliver Steele's Functional, and John Resig's Micro-Templating.</span><span class="WHIT">
+<span class='line'>862</span> </span><span class="COMM">// For all details and documentation:</span><span class="WHIT">
+<span class='line'>863</span> </span><span class="COMM">// http://documentcloud.github.com/underscore</span><span class="WHIT">
+<span class='line'>864</span> </span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">r</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">===</span><span class="NAME">c</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">!==</span><span class="NUMB">0</span><span class="PUNC">||</span><span class="NUMB">1</span><span class="PUNC">/</span><span class="NAME">a</span><span class="PUNC">==</span><span class="NUMB">1</span><span class="PUNC">/</span><span class="NAME">c</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">||</span><span class="NAME">c</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">===</span><span class="NAME">c</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a._chain</span><span class="PUNC">)</span><span class="NAME">a</span><span class="PUNC">=</span><span class="NAME">a._wrapped</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">c._chain</span><span class="PUNC">)</span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">c._wrapped</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a.isEqual</span><span class="PUNC">&&</span><span class="NAME">b.isFunction</span><span class="PUNC">(</span><span class="NAME">a.isEqual</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.isEqual</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">c.isEqual</span><span class="PUNC">&&</span><span class="NAME">b.isFunction</span><span class="PUNC">(</span><span class="NAME">c.isEqual</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">c.isEqual</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">!=</span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="KEYW">switch</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"[object String]"</span><span class="PUNC">:</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">==</span><span class="NAME">String</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"[object Number]"</span><span class="PUNC">:</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">!=</span><span class="PUNC">+</span><span class="NAME">a</span><span class="PUNC">?</span><span class="NAME">c</span><span class="PUNC">!=</span><span class="PUNC">+</span><span class="NAME">c</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">==</span><span class="NUMB">0</span><span class="PUNC">?</span><span class="NUMB">1</span><span class="PUNC">/</span><span class="NAME">a</span><span class="PUNC">==</span><span class="NUMB">1</span><span class="PUNC">/</span><span class="NAME">c</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">==</span><span class="PUNC">+</span><span class="NAME">c</span><span class="PUNC">;</span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"[object Date]"</span><span class="PUNC">:</span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"[object Boolean]"</span><span class="PUNC">:</span><span class="KEYW">return</span><span class="PUNC">+</span><span class="NAME">a</span><span class="PUNC">==</span><span class="PUNC">+</span><span class="NAME">c</span><span class="PUNC">;</span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"[object RegExp]"</span><span class="PUNC">:</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.source</span><span class="PUNC">==</span><span class="WHIT">
+<span class='line'>865</span> </span><span class="NAME">c.source</span><span class="PUNC">&&</span><span class="NAME">a.global</span><span class="PUNC">==</span><span class="NAME">c.global</span><span class="PUNC">&&</span><span class="NAME">a.multiline</span><span class="PUNC">==</span><span class="NAME">c.multiline</span><span class="PUNC">&&</span><span class="NAME">a.ignoreCase</span><span class="PUNC">==</span><span class="NAME">c.ignoreCase</span><span class="PUNC">}</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">!=</span><span class="STRN">"object"</span><span class="PUNC">||</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">!=</span><span class="STRN">"object"</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">f</span><span class="PUNC">=</span><span class="NAME">d.length</span><span class="PUNC">;</span><span class="NAME">f</span><span class="PUNC">--</span><span class="PUNC">;</span><span class="PUNC">)</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">[</span><span class="NAME">f</span><span class="PUNC">]</span><span class="PUNC">==</span><span class="NAME">a</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="NAME">d.push</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">f</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">=</span><span class="KEYW">true</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">==</span><span class="STRN">"[object Array]"</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">f</span><span class="PUNC">=</span><span class="NAME">a.length</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">=</span><span class="NAME">f</span><span class="PUNC">==</span><span class="NAME">c.length</span><span class="PUNC">)</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="PUNC">;</span><span class="NAME">f</span><span class="PUNC">--</span><span class="PUNC">;</span><span class="PUNC">)</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">g</span><span class="PUNC">=</span><span class="NAME">f</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">==</span><span class="NAME">f</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">&&</span><span class="NAME">r</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">f</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">[</span><span class="NAME">f</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">break</span><span class="PUNC">}</span><span class="KEYW">else</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="STRN">"constructor"</span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">!=</span><span class="STRN">"constructor"</span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">||</span><span class="NAME">a.constructor</span><span class="PUNC">!=</span><span class="NAME">c.constructor</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">h</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">)</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">m.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">f</span><span class="PUNC">++</span><span class="PUNC">,</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">g</span><span class="PUNC">=</span><span class="NAME">m.call</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">&&</span><span class="NAME">r</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">h</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">[</span><span class="NAME">h</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">break</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">g</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">h</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">)</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">m.call</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>866</span> </span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">&&</span><span class="PUNC">!</span><span class="NAME">f</span><span class="PUNC">--</span><span class="PUNC">)</span><span class="KEYW">break</span><span class="PUNC">;</span><span class="NAME">g</span><span class="PUNC">=</span><span class="PUNC">!</span><span class="NAME">f</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="NAME">d.pop</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">g</span><span class="PUNC">}</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">s</span><span class="PUNC">=</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="NAME">F</span><span class="PUNC">=</span><span class="NAME">s._</span><span class="PUNC">,</span><span class="NAME">o</span><span class="PUNC">=</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="NAME">k</span><span class="PUNC">=</span><span class="NAME">Array.prototype</span><span class="PUNC">,</span><span class="NAME">p</span><span class="PUNC">=</span><span class="NAME">Object.prototype</span><span class="PUNC">,</span><span class="NAME">i</span><span class="PUNC">=</span><span class="NAME">k.slice</span><span class="PUNC">,</span><span class="NAME">G</span><span class="PUNC">=</span><span class="NAME">k.concat</span><span class="PUNC">,</span><span class="NAME">H</span><span class="PUNC">=</span><span class="NAME">k.unshift</span><span class="PUNC">,</span><span class="NAME">l</span><span class="PUNC">=</span><span class="NAME">p.toString</span><span class="PUNC">,</span><span class="NAME">m</span><span class="PUNC">=</span><span class="NAME">p.hasOwnProperty</span><span class="PUNC">,</span><span class="NAME">v</span><span class="PUNC">=</span><span class="NAME">k.forEach</span><span class="PUNC">,</span><span class="NAME">w</span><span class="PUNC">=</span><span class="NAME">k.map</span><span class="PUNC">,</span><span class="NAME">x</span><span class="PUNC">=</span><span class="NAME">k.reduce</span><span class="PUNC">,</span><span class="NAME">y</span><span class="PUNC">=</span><span class="NAME">k.reduceRight</span><span class="PUNC">,</span><span class="NAME">z</span><span class="PUNC">=</span><span class="NAME">k.filter</span><span class="PUNC">,</span><span class="NAME">A</span><span class="PUNC">=</span><span class="NAME">k.every</span><span class="PUNC">,</span><span class="NAME">B</span><span class="PUNC">=</span><span class="NAME">k.some</span><span class="PUNC">,</span><span class="NAME">q</span><span class="PUNC">=</span><span class="NAME">k.indexOf</span><span class="PUNC">,</span><span class="NAME">C</span><span class="PUNC">=</span><span class="NAME">k.lastIndexOf</span><span class="PUNC">,</span><span class="NAME">p</span><span class="PUNC">=</span><span class="NAME">Array.isArray</span><span class="PUNC">,</span><span class="NAME">I</span><span class="PUNC">=</span><span class="NAME">Object.keys</span><span class="PUNC">,</span><span class="NAME">t</span><span class="PUNC">=</span><span class="NAME">Function.prototype.bind</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">n</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">exports</span><span class="PUNC">!==</span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">module</span><span class="PUNC">!==</span><span class="STRN">"undefined"</span><span class="PUNC">&&</span><span class="NAME">module.exports</span><span class="PUNC">)</span><span class="NAME">exports</span><span class="PUNC">=</span><span class="NAME">module.exports</span><span class="PUNC">=</span><span class="NAME">b</span><span class="PUNC">;</span><span class="NAME">exports._</span><span class="PUNC">=</span><span class="NAME">b</span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">define</span><span class="PUNC">===</span><span class="STRN">"function"</span><span class="PUNC">&&</span><span class="WHIT">
+<span class='line'>867</span> </span><span class="NAME">define.amd</span><span class="PUNC">?</span><span class="NAME">define</span><span class="PUNC">(</span><span class="STRN">"underscore"</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">s._</span><span class="PUNC">=</span><span class="NAME">b</span><span class="PUNC">;</span><span class="NAME">b.VERSION</span><span class="PUNC">=</span><span class="STRN">"1.2.3"</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">=</span><span class="NAME">b.each</span><span class="PUNC">=</span><span class="NAME">b.forEach</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">!=</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">v</span><span class="PUNC">&&</span><span class="NAME">a.forEach</span><span class="PUNC">===</span><span class="NAME">v</span><span class="PUNC">)</span><span class="NAME">a.forEach</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a.length</span><span class="PUNC">===</span><span class="PUNC">+</span><span class="NAME">a.length</span><span class="PUNC">)</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">=</span><span class="NAME">a.length</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">&lt;</span><span class="NAME">f</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">e</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">&&</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">e</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">===</span><span class="NAME">o</span><span class="PUNC">)</span><span class="KEYW">break</span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">e</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">)</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">m.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">&&</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">e</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">===</span><span class="NAME">o</span><span class="PUNC">)</span><span class="KEYW">break</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.map</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">w</span><span class="PUNC">&&</span><span class="NAME">a.map</span><span class="PUNC">===</span><span class="NAME">w</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.map</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">e</span><span class="PUNC">[</span><span class="NAME">e.length</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.reduce</span><span class="PUNC">=</span><span class="NAME">b.foldl</span><span class="PUNC">=</span><span class="NAME">b.inject</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>868</span> </span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">f</span><span class="PUNC">=</span><span class="NAME">arguments.length</span><span class="PUNC">></span><span class="NUMB">2</span><span class="PUNC">;</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">x</span><span class="PUNC">&&</span><span class="NAME">a.reduce</span><span class="PUNC">===</span><span class="NAME">x</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">b.bind</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">?</span><span class="NAME">a.reduce</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">a.reduce</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">f</span><span class="PUNC">?</span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">=</span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">f</span><span class="PUNC">)</span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">TypeError</span><span class="PUNC">(</span><span class="STRN">"Reduce of empty array with no initial value"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.reduceRight</span><span class="PUNC">=</span><span class="NAME">b.foldr</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">f</span><span class="PUNC">=</span><span class="NAME">arguments.length</span><span class="PUNC">></span><span class="NUMB">2</span><span class="PUNC">;</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">y</span><span class="PUNC">&&</span><span class="NAME">a.reduceRight</span><span class="PUNC">===</span><span class="NAME">y</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">b.bind</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">?</span><span class="NAME">a.reduceRight</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">a.reduceRight</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">g</span><span class="PUNC">=</span><span class="NAME">b.toArray</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">reverse</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">&&</span><span class="PUNC">!</span><span class="NAME">f</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">b.bind</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">f</span><span class="PUNC">?</span><span class="NAME">b.reduce</span><span class="PUNC">(</span><span class="NAME">g</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>869</span> </span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">b.reduce</span><span class="PUNC">(</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.find</span><span class="PUNC">=</span><span class="NAME">b.detect</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="NAME">D</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">true</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.filter</span><span class="PUNC">=</span><span class="NAME">b.select</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">z</span><span class="PUNC">&&</span><span class="NAME">a.filter</span><span class="PUNC">===</span><span class="NAME">z</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.filter</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">[</span><span class="NAME">e.length</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.reject</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">||</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">[</span><span class="NAME">e.length</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.every</span><span class="PUNC">=</span><span class="NAME">b.all</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="KEYW">true</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">A</span><span class="PUNC">&&</span><span class="NAME">a.every</span><span class="PUNC">===</span><span class="NAME">A</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.every</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>870</span> </span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">e</span><span class="PUNC">&&</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">o</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">D</span><span class="PUNC">=</span><span class="NAME">b.some</span><span class="PUNC">=</span><span class="NAME">b.any</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">c</span><span class="PUNC">||</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">b.identity</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="KEYW">false</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">B</span><span class="PUNC">&&</span><span class="NAME">a.some</span><span class="PUNC">===</span><span class="NAME">B</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.some</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">||</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">o</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="PUNC">!</span><span class="PUNC">!</span><span class="NAME">e</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.include</span><span class="PUNC">=</span><span class="NAME">b.contains</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="KEYW">false</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">q</span><span class="PUNC">&&</span><span class="NAME">a.indexOf</span><span class="PUNC">===</span><span class="NAME">q</span><span class="PUNC">?</span><span class="NAME">a.indexOf</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">!=</span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">:</span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">D</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">===</span><span class="NAME">c</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.invoke</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.map</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="PUNC">(</span><span class="NAME">c.call</span><span class="PUNC">?</span><span class="NAME">c</span><span class="PUNC">||</span><span class="NAME">a</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">c</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">apply</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>871</span> </span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.pluck</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.map</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">c</span><span class="PUNC">]</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.max</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">c</span><span class="PUNC">&&</span><span class="NAME">b.isArray</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Math.max.apply</span><span class="PUNC">(</span><span class="NAME">Math</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">c</span><span class="PUNC">&&</span><span class="NAME">b.isEmpty</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="PUNC">-</span><span class="NAME">Infinity</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="PUNC">{</span><span class="NAME">computed</span><span class="PUNC">:</span><span class="PUNC">-</span><span class="NAME">Infinity</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">c</span><span class="PUNC">?</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">;</span><span class="NAME">b</span><span class="PUNC">>=</span><span class="NAME">e.computed</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">=</span><span class="PUNC">{</span><span class="NAME">value</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">computed</span><span class="PUNC">:</span><span class="NAME">b</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e.value</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.min</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">c</span><span class="PUNC">&&</span><span class="NAME">b.isArray</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Math.min.apply</span><span class="PUNC">(</span><span class="NAME">Math</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">c</span><span class="PUNC">&&</span><span class="NAME">b.isEmpty</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Infinity</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="PUNC">{</span><span class="NAME">computed</span><span class="PUNC">:</span><span class="NAME">Infinity</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">c</span><span class="PUNC">?</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">;</span><span class="NAME">b</span><span class="PUNC">&lt;</span><span class="NAME">e.computed</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">=</span><span class="PUNC">{</span><span class="NAME">value</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>872</span> </span><span class="NAME">computed</span><span class="PUNC">:</span><span class="NAME">b</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e.value</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.shuffle</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">f</span><span class="PUNC">==</span><span class="NUMB">0</span><span class="PUNC">?</span><span class="NAME">c</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">:</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">Math.random</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">*</span><span class="PUNC">(</span><span class="NAME">f</span><span class="PUNC">+</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">[</span><span class="NAME">f</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">c</span><span class="PUNC">[</span><span class="NAME">b</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">[</span><span class="NAME">b</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.sortBy</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.pluck</span><span class="PUNC">(</span><span class="NAME">b.map</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="PUNC">{</span><span class="NAME">value</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">criteria</span><span class="PUNC">:</span><span class="NAME">c.call</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">sort</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">a.criteria</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">c.criteria</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">&lt;</span><span class="NAME">d</span><span class="PUNC">?</span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">:</span><span class="NAME">b</span><span class="PUNC">></span><span class="NAME">d</span><span class="PUNC">?</span><span class="NUMB">1</span><span class="PUNC">:</span><span class="NUMB">0</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="STRN">"value"</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.groupBy</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">b.isFunction</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">?</span><span class="NAME">c</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">c</span><span class="PUNC">]</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">e</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">[</span><span class="NAME">c</span><span class="PUNC">]</span><span class="PUNC">||</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">[</span><span class="NAME">c</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">push</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.sortedIndex</span><span class="PUNC">=</span><span class="WHIT">
+<span class='line'>873</span> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">d</span><span class="PUNC">||</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">b.identity</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">=</span><span class="NAME">a.length</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">&lt;</span><span class="NAME">f</span><span class="PUNC">;</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">g</span><span class="PUNC">=</span><span class="NAME">e</span><span class="PUNC">+</span><span class="NAME">f</span><span class="PUNC">>></span><span class="NUMB">1</span><span class="PUNC">;</span><span class="NAME">d</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">g</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">&lt;</span><span class="NAME">d</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">?</span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">g</span><span class="PUNC">+</span><span class="NUMB">1</span><span class="PUNC">:</span><span class="NAME">f</span><span class="PUNC">=</span><span class="NAME">g</span><span class="PUNC">}</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.toArray</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="PUNC">!</span><span class="NAME">a</span><span class="PUNC">?</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">:</span><span class="NAME">a.toArray</span><span class="PUNC">?</span><span class="NAME">a.toArray</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">b.isArray</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">?</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">b.isArguments</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">?</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">b.values</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.size</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.toArray</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">length</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.first</span><span class="PUNC">=</span><span class="NAME">b.head</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">!=</span><span class="KEYW">null</span><span class="PUNC">&&</span><span class="PUNC">!</span><span class="NAME">d</span><span class="PUNC">?</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.initial</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">a.length</span><span class="PUNC">-</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">||</span><span class="NAME">d</span><span class="PUNC">?</span><span class="NUMB">1</span><span class="PUNC">:</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.last</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">!=</span><span class="KEYW">null</span><span class="PUNC">&&</span><span class="PUNC">!</span><span class="NAME">d</span><span class="PUNC">?</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">Math.max</span><span class="PUNC">(</span><span class="NAME">a.length</span><span class="PUNC">-</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">a.length</span><span class="PUNC">-</span><span class="WHIT">
+<span class='line'>874</span> </span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.rest</span><span class="PUNC">=</span><span class="NAME">b.tail</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">||</span><span class="NAME">d</span><span class="PUNC">?</span><span class="NUMB">1</span><span class="PUNC">:</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.compact</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.filter</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="PUNC">!</span><span class="PUNC">!</span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.flatten</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.reduce</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">b.isArray</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.concat</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">?</span><span class="NAME">e</span><span class="PUNC">:</span><span class="NAME">b.flatten</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">a.length</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">e</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.without</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.difference</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.uniq</span><span class="PUNC">=</span><span class="NAME">b.unique</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">d</span><span class="PUNC">?</span><span class="NAME">b.map</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="NAME">b.reduce</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">==</span><span class="NAME">h</span><span class="PUNC">||</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">===</span><span class="KEYW">true</span><span class="PUNC">?</span><span class="NAME">b.last</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">!=</span><span class="NAME">g</span><span class="PUNC">:</span><span class="PUNC">!</span><span class="NAME">b.include</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="NAME">d</span><span class="PUNC">[</span><span class="NAME">d.length</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">[</span><span class="NAME">e.length</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">h</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>875</span> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.union</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.uniq</span><span class="PUNC">(</span><span class="NAME">b.flatten</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.intersection</span><span class="PUNC">=</span><span class="NAME">b.intersect</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.filter</span><span class="PUNC">(</span><span class="NAME">b.uniq</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.every</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.indexOf</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">>=</span><span class="NUMB">0</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.difference</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">b.flatten</span><span class="PUNC">(</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.filter</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="PUNC">!</span><span class="NAME">b.include</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.zip</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">=</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">b.max</span><span class="PUNC">(</span><span class="NAME">b.pluck</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="STRN">"length"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">Array</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">&lt;</span><span class="NAME">c</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="NAME">d</span><span class="PUNC">[</span><span class="NAME">e</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">b.pluck</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="STRN">""</span><span class="PUNC">+</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.indexOf</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>876</span> </span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">b.sortedIndex</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">===</span><span class="NAME">c</span><span class="PUNC">?</span><span class="NAME">d</span><span class="PUNC">:</span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">q</span><span class="PUNC">&&</span><span class="NAME">a.indexOf</span><span class="PUNC">===</span><span class="NAME">q</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.indexOf</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">a.length</span><span class="PUNC">;</span><span class="NAME">d</span><span class="PUNC">&lt;</span><span class="NAME">e</span><span class="PUNC">;</span><span class="NAME">d</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">d</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">&&</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">===</span><span class="NAME">c</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.lastIndexOf</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">C</span><span class="PUNC">&&</span><span class="NAME">a.lastIndexOf</span><span class="PUNC">===</span><span class="NAME">C</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.lastIndexOf</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">a.length</span><span class="PUNC">;</span><span class="NAME">d</span><span class="PUNC">--</span><span class="PUNC">;</span><span class="PUNC">)</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">d</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">&&</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">===</span><span class="NAME">b</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.range</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">arguments.length</span><span class="PUNC">&lt;=</span><span class="NUMB">1</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">||</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">arguments</span><span class="PUNC">[</span><span class="NUMB">2</span><span class="PUNC">]</span><span class="PUNC">||</span><span class="NUMB">1</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">Math.max</span><span class="PUNC">(</span><span class="NAME">Math.ceil</span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">-</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">/</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">=</span><span class="NAME">Array</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">f</span><span class="PUNC">&lt;</span><span class="NAME">e</span><span class="PUNC">;</span><span class="PUNC">)</span><span class="NAME">g</span><span class="PUNC">[</span><span class="NAME">f</span><span class="PUNC">++</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">+</span><span class="PUNC">=</span><span class="NAME">d</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">g</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>877</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">E</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.bind</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a.bind</span><span class="PUNC">===</span><span class="NAME">t</span><span class="PUNC">&&</span><span class="NAME">t</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">t.apply</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">b.isFunction</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">TypeError</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="WHIT"> </span><span class="KEYW">instanceof</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.apply</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">e.concat</span><span class="PUNC">(</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">E.prototype</span><span class="PUNC">=</span><span class="NAME">a.prototype</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">E</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">=</span><span class="NAME">a.apply</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">e.concat</span><span class="PUNC">(</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Object</span><span class="PUNC">(</span><span class="NAME">g</span><span class="PUNC">)</span><span class="PUNC">===</span><span class="NAME">g</span><span class="PUNC">?</span><span class="NAME">g</span><span class="PUNC">:</span><span class="NAME">b</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.bindAll</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">c.length</span><span class="PUNC">==</span><span class="NUMB">0</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">b.functions</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">c</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">b.bind</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">c</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.memoize</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>878</span> </span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">c</span><span class="PUNC">||</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">=</span><span class="NAME">b.identity</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">c.apply</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">m.call</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">?</span><span class="NAME">d</span><span class="PUNC">[</span><span class="NAME">b</span><span class="PUNC">]</span><span class="PUNC">:</span><span class="NAME">d</span><span class="PUNC">[</span><span class="NAME">b</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">a.apply</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.delay</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">setTimeout</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.apply</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.defer</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.delay.apply</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="PUNC">[</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">concat</span><span class="PUNC">(</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.throttle</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">h</span><span class="PUNC">,</span><span class="NAME">i</span><span class="PUNC">=</span><span class="NAME">b.debounce</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">h</span><span class="PUNC">=</span><span class="NAME">g</span><span class="PUNC">=</span><span class="KEYW">false</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">d</span><span class="PUNC">=</span><span class="KEYW">this</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">=</span><span class="NAME">arguments</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">;</span><span class="NAME">f</span><span class="PUNC">||</span><span class="PUNC">(</span><span class="NAME">f</span><span class="PUNC">=</span><span class="NAME">setTimeout</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">f</span><span class="PUNC">=</span><span class="KEYW">null</span><span class="PUNC">;</span><span class="NAME">h</span><span class="PUNC">&&</span><span class="NAME">a.apply</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">i</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">g</span><span class="PUNC">?</span><span class="NAME">h</span><span class="PUNC">=</span><span class="KEYW">true</span><span class="PUNC">:</span><span class="WHIT">
+<span class='line'>879</span> </span><span class="NAME">a.apply</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">i</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">g</span><span class="PUNC">=</span><span class="KEYW">true</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.debounce</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">=</span><span class="NAME">arguments</span><span class="PUNC">;</span><span class="NAME">clearTimeout</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">setTimeout</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">d</span><span class="PUNC">=</span><span class="KEYW">null</span><span class="PUNC">;</span><span class="NAME">a.apply</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">,</span><span class="NAME">f</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.once</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="KEYW">false</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">;</span><span class="NAME">b</span><span class="PUNC">=</span><span class="KEYW">true</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">a.apply</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.wrap</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">G.apply</span><span class="PUNC">(</span><span class="PUNC">[</span><span class="NAME">a</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.apply</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.compose</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">=</span><span class="NAME">arguments</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">a.length</span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="NAME">d</span><span class="PUNC">>=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="NAME">d</span><span class="PUNC">--</span><span class="PUNC">)</span><span class="NAME">b</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">apply</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.after</span><span class="PUNC">=</span><span class="WHIT">
+<span class='line'>880</span> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">&lt;=</span><span class="NUMB">0</span><span class="PUNC">?</span><span class="NAME">b</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">--</span><span class="NAME">a</span><span class="PUNC">&lt;</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.apply</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.keys</span><span class="PUNC">=</span><span class="NAME">I</span><span class="PUNC">||</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">!==</span><span class="NAME">Object</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">throw</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">TypeError</span><span class="PUNC">(</span><span class="STRN">"Invalid object"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">;</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">d</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">)</span><span class="NAME">m.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">[</span><span class="NAME">b.length</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.values</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">b.map</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b.identity</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.functions</span><span class="PUNC">=</span><span class="NAME">b.methods</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">;</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">d</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">)</span><span class="NAME">b.isFunction</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">&&</span><span class="NAME">c.push</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">c.sort</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.extend</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">)</span><span class="NAME">b</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">!==</span><span class="KEYW">void</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">b</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.defaults</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>881</span> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">)</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">==</span><span class="KEYW">null</span><span class="PUNC">&&</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">b</span><span class="PUNC">[</span><span class="NAME">d</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.clone</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="PUNC">!</span><span class="NAME">b.isObject</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">?</span><span class="NAME">a</span><span class="PUNC">:</span><span class="NAME">b.isArray</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">?</span><span class="NAME">a.slice</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">b.extend</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.tap</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">b</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isEqual</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">r</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isEmpty</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">b.isArray</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">||</span><span class="NAME">b.isString</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a.length</span><span class="PUNC">===</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">)</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">m.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isElement</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="PUNC">!</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">&&</span><span class="NAME">a.nodeType</span><span class="PUNC">==</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isArray</span><span class="PUNC">=</span><span class="NAME">p</span><span class="PUNC">||</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">==</span><span class="STRN">"[object Array]"</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isObject</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">===</span><span class="WHIT">
+<span class='line'>882</span> </span><span class="NAME">Object</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isArguments</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">==</span><span class="STRN">"[object Arguments]"</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">b.isArguments</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="NAME">b.isArguments</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">a</span><span class="PUNC">||</span><span class="PUNC">!</span><span class="NAME">m.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="STRN">"callee"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isFunction</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">==</span><span class="STRN">"[object Function]"</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isString</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">==</span><span class="STRN">"[object String]"</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isNumber</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">==</span><span class="STRN">"[object Number]"</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isNaN</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">!==</span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isBoolean</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">===</span><span class="KEYW">true</span><span class="PUNC">||</span><span class="NAME">a</span><span class="PUNC">===</span><span class="KEYW">false</span><span class="PUNC">||</span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">==</span><span class="STRN">"[object Boolean]"</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isDate</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">==</span><span class="WHIT">
+<span class='line'>883</span> </span><span class="STRN">"[object Date]"</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isRegExp</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">l.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">==</span><span class="STRN">"[object RegExp]"</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isNull</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">===</span><span class="KEYW">null</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.isUndefined</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">===</span><span class="KEYW">void</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.noConflict</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">s._</span><span class="PUNC">=</span><span class="NAME">F</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.identity</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.times</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">&lt;</span><span class="NAME">a</span><span class="PUNC">;</span><span class="NAME">e</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="NAME">b.call</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.escape</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">+</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/&/g</span><span class="PUNC">,</span><span class="STRN">"&amp;"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/&lt;/g</span><span class="PUNC">,</span><span class="STRN">"&lt;"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/>/g</span><span class="PUNC">,</span><span class="STRN">"&gt;"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/"/g</span><span class="PUNC">,</span><span class="STRN">"&quot;"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/'/g</span><span class="PUNC">,</span><span class="STRN">"&#x27;"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\//g</span><span class="PUNC">,</span><span class="STRN">"&#x2F;"</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.mixin</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">j</span><span class="PUNC">(</span><span class="NAME">b.functions</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">J</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>884</span> </span><span class="NAME">b</span><span class="PUNC">[</span><span class="NAME">c</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">c</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">K</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="NAME">b.uniqueId</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">K</span><span class="PUNC">++</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">?</span><span class="NAME">a</span><span class="PUNC">+</span><span class="NAME">b</span><span class="PUNC">:</span><span class="NAME">b</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.templateSettings</span><span class="PUNC">=</span><span class="PUNC">{</span><span class="NAME">evaluate</span><span class="PUNC">:</span><span class="REGX">/&lt;%([\s\S]+?)%>/g</span><span class="PUNC">,</span><span class="NAME">interpolate</span><span class="PUNC">:</span><span class="REGX">/&lt;%=([\s\S]+?)%>/g</span><span class="PUNC">,</span><span class="NAME">escape</span><span class="PUNC">:</span><span class="REGX">/&lt;%-([\s\S]+?)%>/g</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.template</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">b.templateSettings</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">=</span><span class="STRN">"var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"</span><span class="PUNC">+</span><span class="NAME">a.replace</span><span class="PUNC">(</span><span class="REGX">/\\/g</span><span class="PUNC">,</span><span class="STRN">"\\\\"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/'/g</span><span class="PUNC">,</span><span class="STRN">"\\'"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="NAME">d.escape</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="STRN">"',_.escape("</span><span class="PUNC">+</span><span class="NAME">b.replace</span><span class="PUNC">(</span><span class="REGX">/\\'/g</span><span class="PUNC">,</span><span class="STRN">"'"</span><span class="PUNC">)</span><span class="PUNC">+</span><span class="STRN">"),'"</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="NAME">d.interpolate</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="STRN">"',"</span><span class="PUNC">+</span><span class="NAME">b.replace</span><span class="PUNC">(</span><span class="REGX">/\\'/g</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>885</span> </span><span class="STRN">"'"</span><span class="PUNC">)</span><span class="PUNC">+</span><span class="STRN">",'"</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="NAME">d.evaluate</span><span class="PUNC">||</span><span class="KEYW">null</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="STRN">"');"</span><span class="PUNC">+</span><span class="NAME">b.replace</span><span class="PUNC">(</span><span class="REGX">/\\'/g</span><span class="PUNC">,</span><span class="STRN">"'"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/[\r\n\t]/g</span><span class="PUNC">,</span><span class="STRN">" "</span><span class="PUNC">)</span><span class="PUNC">+</span><span class="STRN">";__p.push('"</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\r/g</span><span class="PUNC">,</span><span class="STRN">"\\r"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\n/g</span><span class="PUNC">,</span><span class="STRN">"\\n"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\t/g</span><span class="PUNC">,</span><span class="STRN">"\\t"</span><span class="PUNC">)</span><span class="PUNC">+</span><span class="STRN">"');}return __p.join('');"</span><span class="PUNC">,</span><span class="NAME">e</span><span class="PUNC">=</span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Function</span><span class="PUNC">(</span><span class="STRN">"obj"</span><span class="PUNC">,</span><span class="STRN">"_"</span><span class="PUNC">,</span><span class="NAME">d</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">?</span><span class="NAME">e</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">e.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">n</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">this._wrapped</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.prototype</span><span class="PUNC">=</span><span class="NAME">n.prototype</span><span class="PUNC">;</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">u</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">?</span><span class="NAME">b</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">chain</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">:</span><span class="NAME">a</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="NAME">J</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">n.prototype</span><span class="PUNC">[</span><span class="NAME">a</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">=</span><span class="NAME">i.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">H.call</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">this._wrapped</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">u</span><span class="PUNC">(</span><span class="NAME">c.apply</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>886</span> </span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">this._chain</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">b.mixin</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="STRN">"pop,push,reverse,shift,sort,splice,unshift"</span><span class="PUNC">.</span><span class="NAME">split</span><span class="PUNC">(</span><span class="STRN">","</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">k</span><span class="PUNC">[</span><span class="NAME">a</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="NAME">n.prototype</span><span class="PUNC">[</span><span class="NAME">a</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">b.apply</span><span class="PUNC">(</span><span class="NAME">this._wrapped</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">u</span><span class="PUNC">(</span><span class="NAME">this._wrapped</span><span class="PUNC">,</span><span class="NAME">this._chain</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">(</span><span class="PUNC">[</span><span class="STRN">"concat"</span><span class="PUNC">,</span><span class="STRN">"join"</span><span class="PUNC">,</span><span class="STRN">"slice"</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">=</span><span class="NAME">k</span><span class="PUNC">[</span><span class="NAME">a</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="NAME">n.prototype</span><span class="PUNC">[</span><span class="NAME">a</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">u</span><span class="PUNC">(</span><span class="NAME">b.apply</span><span class="PUNC">(</span><span class="NAME">this._wrapped</span><span class="PUNC">,</span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">this._chain</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="NAME">n.prototype.chain</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">this._chain</span><span class="PUNC">=</span><span class="KEYW">true</span><span class="PUNC">;</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="NAME">n.prototype.value</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this._wrapped</span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>887</span> </span><span class="COMM">/* main file */</span><span class="WHIT">
+<span class='line'>888</span> 
+<span class='line'>889</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">window.IriSP</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">window.__IriSP</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
+<span class='line'>890</span> 	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">IriSP</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT"> 
+<span class='line'>891</span> 	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">__IriSP</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">/* for backward compatibility */</span><span class="WHIT">
+<span class='line'>892</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>893</span> 
+<span class='line'>894</span> </span><span class="NAME">IriSP.loadLibs</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">libs</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">metadata_url</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>895</span> </span><span class="WHIT">    </span><span class="COMM">// Localize jQuery variable</span><span class="WHIT">
+<span class='line'>896</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>897</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">$L</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">$LAB.script</span><span class="PUNC">(</span><span class="NAME">libs.jQuery</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">script</span><span class="PUNC">(</span><span class="NAME">libs.swfObject</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>898</span> </span><span class="WHIT">                </span><span class="PUNC">.</span><span class="NAME">script</span><span class="PUNC">(</span><span class="NAME">libs.jQueryUI</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>899</span> </span><span class="WHIT">                                   
+<span class='line'>900</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.player.type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"jwplayer"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>901</span> </span><span class="WHIT">      </span><span class="COMM">// load our popcorn.js lookalike</span><span class="WHIT">
+<span class='line'>902</span> </span><span class="WHIT">      </span><span class="NAME">$L</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">$L.script</span><span class="PUNC">(</span><span class="NAME">libs.jwplayer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>903</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>904</span> </span><span class="WHIT">      </span><span class="COMM">// load the real popcorn</span><span class="WHIT">
+<span class='line'>905</span> </span><span class="WHIT">      </span><span class="NAME">$L</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">$L.script</span><span class="PUNC">(</span><span class="NAME">libs.popcorn</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">script</span><span class="PUNC">(</span><span class="NAME">libs</span><span class="PUNC">[</span><span class="STRN">"popcorn.code"</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>906</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.player.type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"youtube"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>907</span> </span><span class="WHIT">        </span><span class="NAME">$L</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">$L.script</span><span class="PUNC">(</span><span class="NAME">libs</span><span class="PUNC">[</span><span class="STRN">"popcorn.youtube"</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>908</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> 
+<span class='line'>909</span>       </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.player.type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"vimeo"</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>910</span> </span><span class="WHIT">        </span><span class="NAME">$L</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">$L.script</span><span class="PUNC">(</span><span class="NAME">libs</span><span class="PUNC">[</span><span class="STRN">"popcorn.vimeo"</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>911</span> </span><span class="WHIT">      
+<span class='line'>912</span>       </span><span class="COMM">/* do nothing for html5 */</span><span class="WHIT">
+<span class='line'>913</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">       
+<span class='line'>914</span>     
+<span class='line'>915</span>     </span><span class="COMM">/* widget specific requirements */</span><span class="WHIT">
+<span class='line'>916</span> </span><span class="WHIT">    </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">idx</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">config.gui.widgets</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>917</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.gui.widgets</span><span class="PUNC">[</span><span class="NAME">idx</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"PolemicWidget"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">        
+<span class='line'>918</span>         </span><span class="NAME">$L.script</span><span class="PUNC">(</span><span class="NAME">libs.raphael</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>919</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>920</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>921</span> </span><span class="WHIT">    
+<span class='line'>922</span>     </span><span class="COMM">// same for modules</span><span class="WHIT">
+<span class='line'>923</span> </span><span class="WHIT">    </span><span class="COMM">/*
+<span class='line'>924</span>     for (var idx in config.modules) {
+<span class='line'>925</span>       if (config.modules[idx].type === "PolemicWidget")
+<span class='line'>926</span>         $L.script(libs.raphaelJs);
+<span class='line'>927</span>     }
+<span class='line'>928</span>     */</span><span class="WHIT">
+<span class='line'>929</span> 
+<span class='line'>930</span> </span><span class="WHIT">    </span><span class="NAME">$L.wait</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>931</span> </span><span class="WHIT">      </span><span class="NAME">IriSP.jQuery</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">window.jQuery.noConflict</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>932</span> </span><span class="WHIT">      </span><span class="NAME">IriSP._</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">window._.noConflict</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>933</span> </span><span class="WHIT">      </span><span class="NAME">IriSP.underscore</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP._</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>934</span> </span><span class="WHIT">      
+<span class='line'>935</span>       </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">css_link_jquery</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"&lt;link>"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
+<span class='line'>936</span>         </span><span class="NAME">rel</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"stylesheet"</span><span class="PUNC">,</span><span class="WHIT"> 
+<span class='line'>937</span>         </span><span class="NAME">type</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"text/css"</span><span class="PUNC">,</span><span class="WHIT"> 
+<span class='line'>938</span>         </span><span class="NAME">href</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">libs.cssjQueryUI</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>939</span> </span><span class="WHIT">        </span><span class="STRN">'class'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"dynamic_css"</span><span class="WHIT">
+<span class='line'>940</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>941</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">css_link_custom</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"&lt;link>"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
+<span class='line'>942</span>         </span><span class="NAME">rel</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"stylesheet"</span><span class="PUNC">,</span><span class="WHIT"> 
+<span class='line'>943</span>         </span><span class="NAME">type</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"text/css"</span><span class="PUNC">,</span><span class="WHIT"> 
+<span class='line'>944</span>         </span><span class="NAME">href</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">config.gui.css</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>945</span> </span><span class="WHIT">        </span><span class="STRN">'class'</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"dynamic_css"</span><span class="WHIT">
+<span class='line'>946</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>947</span> </span><span class="WHIT">      
+<span class='line'>948</span>       </span><span class="NAME">css_link_jquery.appendTo</span><span class="PUNC">(</span><span class="STRN">'head'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>949</span> </span><span class="WHIT">      </span><span class="NAME">css_link_custom.appendTo</span><span class="PUNC">(</span><span class="STRN">'head'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>950</span> </span><span class="WHIT">          
+<span class='line'>951</span>       </span><span class="NAME">IriSP.setupDataLoader</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>952</span> </span><span class="WHIT">      </span><span class="NAME">IriSP.__dataloader.get</span><span class="PUNC">(</span><span class="NAME">metadata_url</span><span class="PUNC">,</span><span class="WHIT"> 
+<span class='line'>953</span>           </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>954</span> </span><span class="WHIT">            </span><span class="COMM">/* save the data so that we could re-use it to
+<span class='line'>955</span>                configure the video
+<span class='line'>956</span>             */</span><span class="WHIT">
+<span class='line'>957</span> </span><span class="WHIT">            </span><span class="NAME">IriSP.__jsonMetadata</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">data</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>958</span> </span><span class="WHIT">            </span><span class="NAME">callback.call</span><span class="PUNC">(</span><span class="NAME">window</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>959</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>960</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>961</span> </span><span class="NAME">IriSP.annotation_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! template for an annotation displayed in a segmentWidget }}&lt;div title='{{divTitle}}' id='{{id}}'	class='Ldt-iri-chapter' 	style='left: {{startPixel}}px;          width: {{pxWidth}}px;          background-color:#{{hexa_color}};' 	>&lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>962</span> </span><span class="NAME">IriSP.annotationWidget_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! template for the annotation widget }}&lt;div class='Ldt-AnnotationsWidget'>  &lt;!-- ugly div because we want to have a double border -->  &lt;div class='Ldt-Annotation-DoubleBorder'>      &lt;div class='Ldt-AnnotationContent'>        &lt;div class='Ldt-AnnotationShareIcons'>         &lt;a class='Ldt-fbShare' href=''>&lt;img src='{{img_dir}}/facebook.png' alt='share on facebook'>&lt;/img>&lt;/a>         &lt;a class='Ldt-TwShare' href=''>&lt;img src='{{img_dir}}/twitter.png' alt='share on twitter'>&lt;/img>&lt;/a>         &lt;a class='Ldt-GplusShare' href=''>&lt;img src='{{img_dir}}/google.png' alt='share on google+'>&lt;/img>&lt;/a>      &lt;/div>		  &lt;div class='Ldt-SaTitle'>&lt;/div>	  	&lt;div class='Ldt-SaDescription'>&lt;/div>    &lt;/div>  &lt;/div>&lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>963</span> </span><span class="NAME">IriSP.annotation_loading_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! template shown while the annotation widget is loading }}&lt;div id='Ldt-load-container'>&lt;div id='Ldt-loader'>&nbsp;&lt;/div> Chargement... &lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>964</span> </span><span class="NAME">IriSP.arrowWidget_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"&lt;div class='Ldt-arrowWidget'>&lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>965</span> </span><span class="NAME">IriSP.overlay_marker_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! the template for the small bars which is z-indexed over our segment widget }}&lt;div class='Ldt-SegmentPositionMarker' style='background-color: #F7268E;'>&lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>966</span> </span><span class="NAME">IriSP.player_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! template for the radio player }}&lt;div class='Ldt-controler demo'>	&lt;div class='Ldt-LeftPlayerControls'>    &lt;div class='Ldt-button Ldt-CtrlPlay'>&lt;/div>		&lt;div class='Ldt-button Ldt-CtrlAnnotate'>&lt;/div>    &lt;div class='Ldt-button Ldt-CtrlSearch'>&lt;/div>	&lt;/div>		&lt;div class='Ldt-RightPlayerControls'>    &lt;div class='Ldt-Time'>      &lt;div class='Ldt-ElapsedTime'>&lt;/div>      &lt;div class='Ldt-TimeSeparator'>/&lt;/div>      &lt;div class='Ldt-TotalTime'>&lt;/div>    &lt;/div>		&lt;div class='Ldt-button Ldt-CtrlSound'>&lt;/div>	&lt;/div>&lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>967</span> </span><span class="NAME">IriSP.search_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! template for the search container }}&lt;div class='LdtSearchContainer'	style='margin-left: {{margin_left}}; position: absolute; margin-top: -60px;'>	&lt;div class='LdtSearch'		style='display: none; background-color: #EEE; width: 165px; boder: 1px; border-color: #CFCFCF; position: absolute; text-align: center;'>		&lt;input class='LdtSearchInput'			style='margin-top: 2px; margin-bottom: 2px;' />	&lt;/div>&lt;/div>&lt;div class='cleaner'>&lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>968</span> </span><span class="NAME">IriSP.share_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! social network sharing template }}&lt;a onclick='__IriSP.MyApiPlayer.share(\'delicious\');' title='partager avec delicious'>&lt;span class='share shareDelicious'>&nbsp;&lt;/span>&lt;/a>		&lt;a onclick='__IriSP.MyApiPlayer.share(\'facebook\');' title='partager avec facebook'> &lt;span class='share shareFacebook'>&nbsp;&lt;/span>&lt;/a>&lt;a onclick='__IriSP.MyApiPlayer.share(\'twitter\');' title='partager avec twitter'>  &lt;span class='share shareTwitter'>&nbsp;&lt;/span>&lt;/a>&lt;a onclick='__IriSP.MyApiPlayer.share(\'myspace\');' title='partager avec Myspace'>  &lt;span class='share shareMySpace'>&nbsp;&lt;/span>&lt;/a>"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>969</span> </span><span class="NAME">IriSP.sliderWidget_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! template for the slider widget - it's composed of two divs we one overlayed on top    of the other }}&lt;div class='Ldt-sliderBackground'>&lt;/div>&lt;div class='Ldt-sliderForeground'>&lt;/div>&lt;div class='Ldt-sliderPositionMarker'>&lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>970</span> </span><span class="NAME">IriSP.tooltip_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! template used by the jquery ui tooltip }}&lt;div class='Ldt-tooltip'>  &lt;div class='title'>{{title}}&lt;/div>  &lt;div class='time'>{{begin}} : {{end}} &lt;/div>  &lt;div class='description'>{{description}}&lt;/div>&lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>971</span> </span><span class="NAME">IriSP.tooltipWidget_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! template for the tooltip widget }}&lt;div class='tip'>	&lt;div class='tipcolor' style='height:10px;width:10px'>&lt;/div>	&lt;div class='tiptext'>&lt;/div>"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>972</span> </span><span class="NAME">IriSP.tweetWidget_template</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{! template for the tweet widget }}&lt;div class='Ldt-tweetWidget'>  &lt;div class='Ldt-tweet-DoubleBorder'>      &lt;img src='{{img_dir}}/minimize.png' class='Ldt-tweetWidgetKeepOpen' alt='dont minimize automatically'>&lt;/img>      &lt;img src='{{img_dir}}/minimize.png' class='Ldt-tweetWidgetMinimize' alt='minimize window'>&lt;/img>      &lt;div class='Ldt-tweetAvatar'>&lt;/div>      &lt;img src='{{img_dir}}/profile_arrow.png' class='Ldt-tweetAvatar-profileArrow'>&lt;/img>      &lt;div class='Ldt-tweetContents'>&lt;/div>      &lt;a href='' target='_blank' class='Ldt-Retweet'>&lt;div class='Ldt-RetweetIcon'>&lt;/div> - Retweet &lt;/a>      &lt;a href='' target='_blank' class='Ldt-TweetReply'>&lt;div class='Ldt-TweetReplyIcon'>&lt;/div> - Reply&lt;/a>  &lt;/div>&lt;/div>"</span><span class="PUNC">;</span><span class="COMM">/* wrapper that simulates popcorn.js because
+<span class='line'>973</span>    popcorn is a bit unstable at the time */</span><span class="WHIT">
+<span class='line'>974</span> 
+<span class='line'>975</span> </span><span class="NAME">IriSP.PopcornReplacement</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>976</span> </span><span class="WHIT">  </span><span class="NAME">msgPump</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="WHIT"> </span><span class="COMM">/* used by jquery to receive and send messages */</span><span class="WHIT">
+<span class='line'>977</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>978</span> 
+<span class='line'>979</span> </span><span class="NAME">IriSP.PopcornReplacement.media</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
+<span class='line'>980</span>   </span><span class="STRN">"paused"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>981</span> </span><span class="WHIT">  </span><span class="STRN">"muted"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="WHIT">
+<span class='line'>982</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>983</span> 
+<span class='line'>984</span> </span><span class="NAME">IriSP.PopcornReplacement.listen</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">msg</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>985</span> </span><span class="COMM">//  IriSP.jQuery(IriSP.PopcornReplacement.msgPump).bind(msg, function(event, rest) { callback(rest); });</span><span class="WHIT">
+<span class='line'>986</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">IriSP.PopcornReplacement.msgPump.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">msg</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>987</span> </span><span class="WHIT">    </span><span class="NAME">IriSP.PopcornReplacement.msgPump</span><span class="PUNC">[</span><span class="NAME">msg</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>988</span> 
+<span class='line'>989</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.msgPump</span><span class="PUNC">[</span><span class="NAME">msg</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">push</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>990</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>991</span> 
+<span class='line'>992</span> </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">msg</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">params</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>993</span> </span><span class="COMM">//  IriSP.jQuery(IriSP.PopcornReplacement.msgPump).trigger(msg, params);</span><span class="WHIT">
+<span class='line'>994</span> </span><span class="WHIT">  
+<span class='line'>995</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">IriSP.PopcornReplacement.msgPump.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">msg</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>996</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>997</span> 
+<span class='line'>998</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.msgPump</span><span class="PUNC">[</span><span class="NAME">msg</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>999</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">entry</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1000</span> </span><span class="WHIT">    </span><span class="NAME">d</span><span class="PUNC">[</span><span class="NAME">entry</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">call</span><span class="PUNC">(</span><span class="NAME">window</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">params</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1001</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1002</span> 
+<span class='line'>1003</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1004</span> 
+<span class='line'>1005</span> </span><span class="NAME">IriSP.PopcornReplacement.guid</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">prefix</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1006</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">str</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/[xy]/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1007</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">r</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.random</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">*</span><span class="NUMB">16</span><span class="PUNC">|</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">v</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">c</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">'x'</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">r</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">r</span><span class="PUNC">&</span><span class="NUMB">0x3</span><span class="PUNC">|</span><span class="NUMB">0x8</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1008</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">v.toString</span><span class="PUNC">(</span><span class="NUMB">16</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1009</span> </span><span class="WHIT">   </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1010</span> 
+<span class='line'>1011</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">prefix</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">str</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1012</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1013</span> 
+<span class='line'>1014</span> </span><span class="NAME">IriSP.PopcornReplacement.__initApi</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1015</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="PUNC">(</span><span class="STRN">"loadedmetadata"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// we've done more than loading metadata of course,</span><span class="WHIT">
+<span class='line'>1016</span> </span><span class="WHIT">                                                      </span><span class="COMM">// but popcorn doesn't need to know more.</span><span class="WHIT">
+<span class='line'>1017</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.media.muted</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">getMute</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1018</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1019</span> 
+<span class='line'>1020</span> </span><span class="NAME">IriSP.PopcornReplacement.jwplayer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">container</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">options</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1021</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">container.slice</span><span class="PUNC">(</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">//eschew the '#'</span><span class="WHIT">
+<span class='line'>1022</span> </span><span class="WHIT">  </span><span class="NAME">options.events</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1023</span> </span><span class="WHIT">      </span><span class="NAME">onReady</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__initApi</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1024</span> </span><span class="WHIT">      </span><span class="NAME">onTime</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__timeHandler</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1025</span> </span><span class="WHIT">      </span><span class="NAME">onPlay</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__playHandler</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1026</span> </span><span class="WHIT">      </span><span class="NAME">onPause</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__pauseHandler</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1027</span> </span><span class="WHIT">      </span><span class="NAME">onSeek</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__seekHandler</span><span class="WHIT"> 
+<span class='line'>1028</span>       </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1029</span> </span><span class="WHIT">    
+<span class='line'>1030</span>   </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">setup</span><span class="PUNC">(</span><span class="NAME">options</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1031</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.media.duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">options.duration</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1032</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1033</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1034</span> 
+<span class='line'>1035</span> </span><span class="NAME">IriSP.PopcornReplacement.currentTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">time</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1036</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">time</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1037</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">getPosition</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">            
+<span class='line'>1038</span>   </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1039</span> </span><span class="WHIT">     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">currentTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">time</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1040</span> </span><span class="WHIT">     </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">seek</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">currentTime</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1041</span> </span><span class="WHIT">     </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="PUNC">(</span><span class="STRN">"seeked"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1042</span> </span><span class="WHIT">     </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">getPosition</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">            
+<span class='line'>1043</span>   </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1044</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1045</span> 
+<span class='line'>1046</span> </span><span class="NAME">IriSP.PopcornReplacement.play</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1047</span> </span><span class="WHIT">      </span><span class="NAME">IriSP.PopcornReplacement.media.paused</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1048</span> </span><span class="WHIT">      </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="PUNC">(</span><span class="STRN">"play"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1049</span> </span><span class="COMM">//      IriSP.PopcornReplacement.trigger("playing");</span><span class="WHIT">
+<span class='line'>1050</span> </span><span class="WHIT">      </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">play</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1051</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1052</span> </span><span class="WHIT">    
+<span class='line'>1053</span> </span><span class="NAME">IriSP.PopcornReplacement.pause</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1054</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">IriSP.PopcornReplacement.media.paused</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1055</span> </span><span class="WHIT">        </span><span class="NAME">IriSP.PopcornReplacement.media.paused</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1056</span> </span><span class="WHIT">        </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"pause"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1057</span> </span><span class="WHIT">        </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">pause</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1058</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1059</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1060</span> 
+<span class='line'>1061</span> </span><span class="NAME">IriSP.PopcornReplacement.muted</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">val</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1062</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">val</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1063</span> 
+<span class='line'>1064</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">getMute</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">val</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1065</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">val</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1066</span> </span><span class="WHIT">        </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">setMute</span><span class="PUNC">(</span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1067</span> </span><span class="WHIT">        </span><span class="NAME">IriSP.PopcornReplacement.media.muted</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1068</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1069</span> </span><span class="WHIT">        </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">setMute</span><span class="PUNC">(</span><span class="KEYW">false</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1070</span> </span><span class="WHIT">        </span><span class="NAME">IriSP.PopcornReplacement.media.muted</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1071</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1072</span> 
+<span class='line'>1073</span> </span><span class="WHIT">      </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"volumechange"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1074</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1075</span> </span><span class="WHIT">    
+<span class='line'>1076</span>     </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">getMute</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1077</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1078</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">getMute</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1079</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1080</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1081</span> 
+<span class='line'>1082</span> </span><span class="NAME">IriSP.PopcornReplacement.mute</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.muted</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1083</span> 
+<span class='line'>1084</span> </span><span class="NAME">IriSP.PopcornReplacement.__codes</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1085</span> </span><span class="NAME">IriSP.PopcornReplacement.code</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">options</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1086</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.__codes.push</span><span class="PUNC">(</span><span class="NAME">options</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1087</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1088</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1089</span> 
+<span class='line'>1090</span> </span><span class="NAME">IriSP.PopcornReplacement.__runCode</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1091</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">currentTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">jwplayer</span><span class="PUNC">(</span><span class="NAME">IriSP.PopcornReplacement._container</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">getPosition</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1092</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1093</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__codes.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1094</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__codes</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1095</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">currentTime</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">c.start</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1096</span> </span><span class="WHIT">      </span><span class="NAME">c.onStart</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1097</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1098</span> </span><span class="WHIT">    
+<span class='line'>1099</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">currentTime</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">c.end</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1100</span> </span><span class="WHIT">      </span><span class="NAME">c.onEnd</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1101</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1102</span> 
+<span class='line'>1103</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1104</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1105</span> 
+<span class='line'>1106</span> </span><span class="COMM">/* called everytime the player updates itself 
+<span class='line'>1107</span>    (onTime event)
+<span class='line'>1108</span>  */</span><span class="WHIT">
+<span class='line'>1109</span> 
+<span class='line'>1110</span> </span><span class="NAME">IriSP.PopcornReplacement.__timeHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1111</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">pos</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">event.position</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1112</span> 
+<span class='line'>1113</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1114</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__codes.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1115</span> </span><span class="WHIT">     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__codes</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1116</span> </span><span class="WHIT">     
+<span class='line'>1117</span>      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">pos</span><span class="WHIT"> </span><span class="PUNC">>=</span><span class="WHIT"> </span><span class="NAME">c.start</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">pos</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">c.end</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> 
+<span class='line'>1118</span>          </span><span class="NAME">pos</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">0.1</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NAME">c.start</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">       
+<span class='line'>1119</span>         </span><span class="NAME">c.onStart</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1120</span> </span><span class="WHIT">     </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1121</span> </span><span class="WHIT"> 
+<span class='line'>1122</span>      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">pos</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NAME">c.start</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">pos</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NAME">c.end</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> 
+<span class='line'>1123</span>          </span><span class="NAME">pos</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">0.1</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NAME">c.end</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1124</span> </span><span class="WHIT">         </span><span class="NAME">console.log</span><span class="PUNC">(</span><span class="STRN">"eonedn"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1125</span> </span><span class="WHIT">        </span><span class="NAME">c.onEnd</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1126</span> </span><span class="WHIT">     </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1127</span> </span><span class="WHIT">   
+<span class='line'>1128</span>   </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1129</span> </span><span class="WHIT"> 
+<span class='line'>1130</span>   </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="PUNC">(</span><span class="STRN">"timeupdate"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1131</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1132</span> 
+<span class='line'>1133</span> </span><span class="NAME">IriSP.PopcornReplacement.__seekHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1134</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1135</span> </span><span class="WHIT">  
+<span class='line'>1136</span>   </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__codes.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1137</span> </span><span class="WHIT">     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__codes</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1138</span> </span><span class="WHIT">    
+<span class='line'>1139</span>      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">event.position</span><span class="WHIT"> </span><span class="PUNC">>=</span><span class="WHIT"> </span><span class="NAME">c.start</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">event.position</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">c.end</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">        
+<span class='line'>1140</span>         </span><span class="NAME">c.onEnd</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1141</span> </span><span class="WHIT">     </span><span class="PUNC">}</span><span class="WHIT">         
+<span class='line'>1142</span>    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1143</span> 
+<span class='line'>1144</span> </span><span class="WHIT">   </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__codes.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1145</span> </span><span class="WHIT">     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">c</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.__codes</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1146</span> 
+<span class='line'>1147</span> </span><span class="WHIT">     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">event.offset</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>1148</span> </span><span class="WHIT">       </span><span class="NAME">event.offset</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1149</span> </span><span class="WHIT">           
+<span class='line'>1150</span>      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">event.offset</span><span class="WHIT"> </span><span class="PUNC">>=</span><span class="WHIT"> </span><span class="NAME">c.start</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">event.offset</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">c.end</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
+<span class='line'>1151</span>        </span><span class="NAME">c.onStart</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1152</span> </span><span class="WHIT">     </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1153</span> </span><span class="WHIT">     
+<span class='line'>1154</span>    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1155</span> 
+<span class='line'>1156</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="PUNC">(</span><span class="STRN">"timeupdate"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1157</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1158</span> 
+<span class='line'>1159</span> 
+<span class='line'>1160</span> </span><span class="NAME">IriSP.PopcornReplacement.__playHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1161</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.media.paused</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1162</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="PUNC">(</span><span class="STRN">"play"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1163</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1164</span> 
+<span class='line'>1165</span> </span><span class="NAME">IriSP.PopcornReplacement.__pauseHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1166</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.media.paused</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1167</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.PopcornReplacement.trigger</span><span class="PUNC">(</span><span class="STRN">"pause"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1168</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1169</span> 
+<span class='line'>1170</span> </span><span class="NAME">IriSP.PopcornReplacement.roundTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1171</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">currentTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.currentTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1172</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Math.round</span><span class="PUNC">(</span><span class="NAME">currentTime</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1173</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1174</span> </span><span class="COMM">/* utils.js - various utils that don't belong anywhere else */</span><span class="WHIT">
+<span class='line'>1175</span> 
+<span class='line'>1176</span> </span><span class="COMM">/* trace function, for debugging */</span><span class="WHIT">
+<span class='line'>1177</span> 
+<span class='line'>1178</span> </span><span class="NAME">IriSP.traceNum</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1179</span> </span><span class="NAME">IriSP.trace</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">msg</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1180</span> </span><span class="COMM">/*
+<span class='line'>1181</span> 	if( IriSP.config.gui.debug === true ) {
+<span class='line'>1182</span> 		IriSP.traceNum += 1;
+<span class='line'>1183</span> 		IriSP.jQuery( "&lt;div>"+IriSP.traceNum+" - "+msg+" : "+value+"&lt;/div>" ).appendTo( "#Ldt-output" );
+<span class='line'>1184</span> 	}
+<span class='line'>1185</span> */</span><span class="WHIT">
+<span class='line'>1186</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1187</span> 
+<span class='line'>1188</span> </span><span class="COMM">/* used in callbacks - because in callbacks we lose "this",
+<span class='line'>1189</span>    we need to have a special function which wraps "this" in 
+<span class='line'>1190</span>    a closure. This way, the 
+<span class='line'>1191</span> */</span><span class="WHIT">   
+<span class='line'>1192</span> </span><span class="NAME">IriSP.wrap</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">obj</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">fn</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1193</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">    
+<span class='line'>1194</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">args</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Array.prototype.slice.call</span><span class="PUNC">(</span><span class="NAME">arguments</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1195</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">fn.apply</span><span class="PUNC">(</span><span class="NAME">obj</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">args</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1196</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1197</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1198</span> 
+<span class='line'>1199</span> </span><span class="COMM">/* convert a time to a percentage in the media */</span><span class="WHIT">
+<span class='line'>1200</span> </span><span class="NAME">IriSP.timeToPourcent</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">time</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">timetotal</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1201</span> </span><span class="WHIT">	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">time</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.abs</span><span class="PUNC">(</span><span class="NAME">time</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1202</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">timetotal</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.abs</span><span class="PUNC">(</span><span class="NAME">timetotal</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1203</span> </span><span class="WHIT">  
+<span class='line'>1204</span> 	</span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">time</span><span class="PUNC">/</span><span class="NAME">timetotal</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1205</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1206</span> 
+<span class='line'>1207</span> </span><span class="NAME">IriSP.padWithZeros</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">num</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1208</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">Math.abs</span><span class="PUNC">(</span><span class="NAME">num</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">10</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1209</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="STRN">"0"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">num.toString</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1210</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1211</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">num.toString</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1212</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1213</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1214</span> </span><span class="COMM">/* convert a number of seconds to a tuple of the form 
+<span class='line'>1215</span>    [hours, minutes, seconds]
+<span class='line'>1216</span> */</span><span class="WHIT">
+<span class='line'>1217</span> </span><span class="NAME">IriSP.secondsToTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">secs</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
+<span class='line'>1218</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">hours</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.abs</span><span class="PUNC">(</span><span class="NAME">parseInt</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">secs</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">3600</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">%</span><span class="WHIT"> </span><span class="NUMB">24</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1219</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">minutes</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.abs</span><span class="PUNC">(</span><span class="NAME">parseInt</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">secs</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">60</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">%</span><span class="WHIT"> </span><span class="NUMB">60</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1220</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">seconds</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">parseFloat</span><span class="PUNC">(</span><span class="NAME">Math.abs</span><span class="PUNC">(</span><span class="NAME">secs</span><span class="WHIT"> </span><span class="PUNC">%</span><span class="WHIT"> </span><span class="NUMB">60</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">toFixed</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1221</span> </span><span class="WHIT">  
+<span class='line'>1222</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">toString_fn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1223</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1224</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">hours</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>1225</span> </span><span class="WHIT">       </span><span class="NAME">ret</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.padWithZeros</span><span class="PUNC">(</span><span class="NAME">this.hours</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">":"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1226</span> </span><span class="WHIT">    </span><span class="NAME">ret</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.padWithZeros</span><span class="PUNC">(</span><span class="NAME">this.minutes</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">":"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">IriSP.padWithZeros</span><span class="PUNC">(</span><span class="NAME">this.seconds</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1227</span> 
+<span class='line'>1228</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1229</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1230</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="STRN">"hours"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">hours</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"minutes"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">minutes</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"seconds"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">seconds</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">toString</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">toString_fn</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1231</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1232</span> 
+<span class='line'>1233</span> </span><span class="NAME">IriSP.secondsToString</span><span class="WHIT">
+<span class='line'>1234</span> 
+<span class='line'>1235</span> </span><span class="COMM">/* format a tweet - replaces @name by a link to the profile, #hashtag, etc. */</span><span class="WHIT">
+<span class='line'>1236</span> </span><span class="NAME">IriSP.formatTweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">tweet</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1237</span> </span><span class="WHIT">  </span><span class="COMM">/*
+<span class='line'>1238</span>     an array of arrays which hold a regexp and its replacement.
+<span class='line'>1239</span>   */</span><span class="WHIT">
+<span class='line'>1240</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">regExps</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="WHIT">
+<span class='line'>1241</span> </span><span class="WHIT">    </span><span class="COMM">/* copied from http://codegolf.stackexchange.com/questions/464/shortest-url-regex-match-in-javascript/480#480 */</span><span class="WHIT">
+<span class='line'>1242</span> </span><span class="WHIT">    </span><span class="PUNC">[</span><span class="REGX">/((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)/gi</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"&lt;a href='$1'>$1&lt;/a>"</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1243</span> </span><span class="WHIT">    </span><span class="PUNC">[</span><span class="REGX">/@(\w+)/gi</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"&lt;a href='http://twitter.com/$1'>@$1&lt;/a>"</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="COMM">// matches a @handle</span><span class="WHIT">
+<span class='line'>1244</span> </span><span class="WHIT">    </span><span class="PUNC">[</span><span class="REGX">/#(\w+)/gi</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"&lt;a href='http://twitter.com/search?q=%23$1'>#$1&lt;/a>"</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="COMM">// matches a hashtag</span><span class="WHIT">
+<span class='line'>1245</span> </span><span class="WHIT">    </span><span class="PUNC">[</span><span class="REGX">/(\+\+)/gi</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"&lt;span class='Ldt-PolemicPlusPlus'>$1&lt;/span>"</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1246</span> </span><span class="WHIT">    </span><span class="PUNC">[</span><span class="REGX">/(--)/gi</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"&lt;span class='Ldt-PolemicMinusMinus'>$1&lt;/span>"</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1247</span> </span><span class="WHIT">    </span><span class="PUNC">[</span><span class="REGX">/(==)/gi</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"&lt;span class='Ldt-PolemicEqualEqual'>$1&lt;/span>"</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1248</span> </span><span class="WHIT">    </span><span class="PUNC">[</span><span class="REGX">/(\?\?)/gi</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"&lt;span class='Ldt-PolemicQuestion'>$1&lt;/span>"</span><span class="PUNC">]</span><span class="WHIT">
+<span class='line'>1249</span> </span><span class="WHIT">  </span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT"> 
+<span class='line'>1250</span> 
+<span class='line'>1251</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1252</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">regExps.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1253</span> </span><span class="WHIT">     </span><span class="NAME">tweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">tweet.replace</span><span class="PUNC">(</span><span class="NAME">regExps</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">regExps</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1254</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1255</span> </span><span class="WHIT">  
+<span class='line'>1256</span>   </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">tweet</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1257</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1258</span> 
+<span class='line'>1259</span> </span><span class="NAME">IriSP.countProperties</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">obj</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1260</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">count</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1261</span> 
+<span class='line'>1262</span> </span><span class="WHIT">    </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">prop</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">obj</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1263</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">obj.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">prop</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>1264</span> </span><span class="WHIT">                </span><span class="PUNC">++</span><span class="NAME">count</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1265</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1266</span> 
+<span class='line'>1267</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">count</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1268</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1269</span> 
+<span class='line'>1270</span> </span><span class="COMM">// conversion de couleur Decimal vers HexaDecimal || 000 si fff</span><span class="WHIT">
+<span class='line'>1271</span> </span><span class="NAME">IriSP.DEC_HEXA_COLOR</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">dec</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1272</span> </span><span class="WHIT">	 </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">hexa</span><span class="PUNC">=</span><span class="STRN">'0123456789ABCDEF'</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1273</span> </span><span class="WHIT">   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">hex</span><span class="PUNC">=</span><span class="STRN">''</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1274</span> </span><span class="WHIT">	 </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">tmp</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1275</span> </span><span class="WHIT">	 </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">dec</span><span class="PUNC">></span><span class="NUMB">15</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1276</span> </span><span class="WHIT">		  </span><span class="NAME">tmp</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">dec</span><span class="PUNC">-</span><span class="PUNC">(</span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">dec</span><span class="PUNC">/</span><span class="NUMB">16</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">*</span><span class="NUMB">16</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1277</span> </span><span class="WHIT">		  </span><span class="NAME">hex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">hexa.charAt</span><span class="PUNC">(</span><span class="NAME">tmp</span><span class="PUNC">)</span><span class="PUNC">+</span><span class="NAME">hex</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1278</span> </span><span class="WHIT">		  </span><span class="NAME">dec</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">dec</span><span class="PUNC">/</span><span class="NUMB">16</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1279</span> </span><span class="WHIT">	 </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1280</span> </span><span class="WHIT">	 </span><span class="NAME">hex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">hexa.charAt</span><span class="PUNC">(</span><span class="NAME">dec</span><span class="PUNC">)</span><span class="PUNC">+</span><span class="NAME">hex</span><span class="PUNC">;</span><span class="WHIT">	 
+<span class='line'>1281</span> 	 </span><span class="KEYW">return</span><span class="PUNC">(</span><span class="NAME">hex</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1282</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1283</span> 
+<span class='line'>1284</span> </span><span class="COMM">/* shortcut to have global variables in templates */</span><span class="WHIT">
+<span class='line'>1285</span> </span><span class="NAME">IriSP.templToHTML</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">values</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1286</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">params</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery.extend</span><span class="PUNC">(</span><span class="NAME">IriSP.default_templates_vars</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">values</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1287</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">params</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1288</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1289</span> 
+<span class='line'>1290</span> </span><span class="COMM">/* we need to be stricter than encodeURIComponent,
+<span class='line'>1291</span>    because of twitter
+<span class='line'>1292</span> */</span><span class="WHIT">  
+<span class='line'>1293</span> </span><span class="NAME">IriSP.encodeURI</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">str</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1294</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">encodeURIComponent</span><span class="PUNC">(</span><span class="NAME">str</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/!/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'%21'</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/'/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'%27'</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\(/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'%28'</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="WHIT">  
+<span class='line'>1295</span>                                  </span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\)/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'%29'</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\*/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'%2A'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>1296</span> </span><span class="PUNC">}</span><span class="WHIT">  
+<span class='line'>1297</span> 
+<span class='line'>1298</span> </span><span class="NAME">IriSP.__guidCounter</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1299</span> </span><span class="NAME">IriSP.guid</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">prefix</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1300</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.__guidCounter</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1301</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">prefix</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">IriSP.__guidCounter</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1302</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1303</span> </span><span class="COMM">/* for ie compatibility
+<span class='line'>1304</span> if (Object.prototype.__defineGetter__&&!Object.defineProperty) {
+<span class='line'>1305</span>    Object.defineProperty=function(obj,prop,desc) {
+<span class='line'>1306</span>       if ("get" in desc) obj.__defineGetter__(prop,desc.get);
+<span class='line'>1307</span>       if ("set" in desc) obj.__defineSetter__(prop,desc.set);
+<span class='line'>1308</span>    }
+<span class='line'>1309</span> }
+<span class='line'>1310</span> */</span><span class="WHIT">
+<span class='line'>1311</span> </span><span class="COMM">/* data.js - this file deals with how the players gets and sends data */</span><span class="WHIT">
+<span class='line'>1312</span> 
+<span class='line'>1313</span> </span><span class="NAME">IriSP.DataLoader</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1314</span> </span><span class="WHIT">  </span><span class="NAME">this._cache</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1315</span> </span><span class="WHIT">  
+<span class='line'>1316</span>   </span><span class="COMM">/*
+<span class='line'>1317</span>     A structure to hold callbacks for specific urls. We need it because
+<span class='line'>1318</span>     ajax calls are asynchronous, so it means that sometimes we ask
+<span class='line'>1319</span>     multiple times for a ressource because the first call hasn't been
+<span class='line'>1320</span>     received yet.
+<span class='line'>1321</span>   */</span><span class="WHIT">
+<span class='line'>1322</span> </span><span class="WHIT">  </span><span class="NAME">this._callbacks</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1323</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1324</span> 
+<span class='line'>1325</span> </span><span class="NAME">IriSP.DataLoader.prototype.get</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">url</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">callback</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1326</span> 
+<span class='line'>1327</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">base_url</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">url.split</span><span class="PUNC">(</span><span class="STRN">"&"</span><span class="PUNC">)</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="WHIT">
+<span class='line'>1328</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._cache.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">base_url</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1329</span> </span><span class="WHIT">    </span><span class="NAME">callback</span><span class="PUNC">(</span><span class="NAME">this._cache</span><span class="PUNC">[</span><span class="NAME">base_url</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1330</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
+<span class='line'>1331</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">this._callbacks.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">base_url</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1332</span> </span><span class="WHIT">      </span><span class="NAME">this._callbacks</span><span class="PUNC">[</span><span class="NAME">base_url</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1333</span> </span><span class="WHIT">      </span><span class="NAME">this._callbacks</span><span class="PUNC">[</span><span class="NAME">base_url</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">push</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">   
+<span class='line'>1334</span>       </span><span class="COMM">/* we need a closure because this gets lost when it's called back */</span><span class="WHIT">
+<span class='line'>1335</span> </span><span class="WHIT">  
+<span class='line'>1336</span>       </span><span class="COMM">// uncomment you don't want to use caching.</span><span class="WHIT">
+<span class='line'>1337</span> </span><span class="WHIT">      </span><span class="COMM">// IriSP.jQuery.get(url, callback);</span><span class="WHIT">
+<span class='line'>1338</span> </span><span class="WHIT">      
+<span class='line'>1339</span>       </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">func</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1340</span> </span><span class="WHIT">                  </span><span class="NAME">this._cache</span><span class="PUNC">[</span><span class="NAME">base_url</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">data</span><span class="PUNC">;</span><span class="WHIT">                                
+<span class='line'>1341</span>                   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1342</span> </span><span class="WHIT">                  
+<span class='line'>1343</span>                   </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">this._callbacks</span><span class="PUNC">[</span><span class="NAME">base_url</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1344</span> </span><span class="WHIT">                    </span><span class="NAME">this._callbacks</span><span class="PUNC">[</span><span class="NAME">base_url</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">(</span><span class="NAME">this._cache</span><span class="PUNC">[</span><span class="NAME">base_url</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">                                  
+<span class='line'>1345</span>                   </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1346</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1347</span> </span><span class="WHIT">      
+<span class='line'>1348</span>       </span><span class="COMM">/* automagically choose between json and jsonp */</span><span class="WHIT">
+<span class='line'>1349</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">url.indexOf</span><span class="PUNC">(</span><span class="NAME">document.location.hostname</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT">
+<span class='line'>1350</span> </span><span class="WHIT">          </span><span class="NAME">url.indexOf</span><span class="PUNC">(</span><span class="STRN">"http://"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="WHIT"> </span><span class="COMM">/* not a relative url */</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1351</span> </span><span class="WHIT">        </span><span class="COMM">// we contacting a foreign domain, use JSONP</span><span class="WHIT">
+<span class='line'>1352</span> 
+<span class='line'>1353</span> </span><span class="WHIT">        </span><span class="NAME">IriSP.jQuery.get</span><span class="PUNC">(</span><span class="NAME">url</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">func</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"jsonp"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1354</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1355</span> 
+<span class='line'>1356</span> </span><span class="WHIT">        </span><span class="COMM">// otherwise, hey, whatever rows your boat</span><span class="WHIT">
+<span class='line'>1357</span> </span><span class="WHIT">        </span><span class="NAME">IriSP.jQuery.get</span><span class="PUNC">(</span><span class="NAME">url</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">func</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1358</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1359</span> </span><span class="WHIT">    
+<span class='line'>1360</span>     </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1361</span> </span><span class="WHIT">      </span><span class="COMM">/* simply push the callback - it'll get called when the ressource
+<span class='line'>1362</span>          has been received */</span><span class="WHIT">
+<span class='line'>1363</span> </span><span class="WHIT">      
+<span class='line'>1364</span>       </span><span class="NAME">this._callbacks</span><span class="PUNC">[</span><span class="NAME">base_url</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">push</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">   
+<span class='line'>1365</span>    
+<span class='line'>1366</span>     </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1367</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1368</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1369</span> 
+<span class='line'>1370</span> </span><span class="COMM">/* the base abstract "class" */</span><span class="WHIT">
+<span class='line'>1371</span> </span><span class="NAME">IriSP.Serializer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">DataLoader</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">url</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1372</span> </span><span class="WHIT">  </span><span class="NAME">this._DataLoader</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">DataLoader</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1373</span> </span><span class="WHIT">  </span><span class="NAME">this._url</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">url</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1374</span> </span><span class="WHIT">  </span><span class="NAME">this._data</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1375</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1376</span> 
+<span class='line'>1377</span> </span><span class="NAME">IriSP.Serializer.prototype.serialize</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1378</span> </span><span class="NAME">IriSP.Serializer.prototype.deserialize</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1379</span> 
+<span class='line'>1380</span> </span><span class="NAME">IriSP.Serializer.prototype.currentMedia</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
+<span class='line'>1381</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1382</span> 
+<span class='line'>1383</span> </span><span class="NAME">IriSP.Serializer.prototype.sync</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
+<span class='line'>1384</span>   </span><span class="NAME">callback.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this._data</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>1385</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1386</span> 
+<span class='line'>1387</span> </span><span class="NAME">IriSP.SerializerFactory</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">DataLoader</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1388</span> </span><span class="WHIT">  </span><span class="NAME">this._dataloader</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">DataLoader</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1389</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1390</span> 
+<span class='line'>1391</span> </span><span class="NAME">IriSP.SerializerFactory.prototype.getSerializer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">metadataOptions</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1392</span> </span><span class="WHIT">  </span><span class="COMM">/* This function returns serializer set-up with the correct
+<span class='line'>1393</span>      configuration - takes a metadata struct describing the metadata source
+<span class='line'>1394</span>   */</span><span class="WHIT">
+<span class='line'>1395</span> </span><span class="WHIT">  
+<span class='line'>1396</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">metadataOptions</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>1397</span> </span><span class="WHIT">    </span><span class="COMM">/* return an empty serializer */</span><span class="WHIT">
+<span class='line'>1398</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">IriSP.Serializer</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1399</span> </span><span class="WHIT">            
+<span class='line'>1400</span>   </span><span class="KEYW">switch</span><span class="PUNC">(</span><span class="NAME">metadataOptions.type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1401</span> </span><span class="WHIT">    </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"json"</span><span class="PUNC">:</span><span class="WHIT">
+<span class='line'>1402</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.JSONSerializer</span><span class="PUNC">(</span><span class="NAME">this._dataloader</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">metadataOptions.src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1403</span> </span><span class="WHIT">      </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1404</span> </span><span class="WHIT">    
+<span class='line'>1405</span>     </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"dummy"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="COMM">/* only used for unit testing - not defined in production */</span><span class="WHIT">
+<span class='line'>1406</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.MockSerializer</span><span class="PUNC">(</span><span class="NAME">this._dataloader</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">metadataOptions.src</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1407</span> </span><span class="WHIT">      </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1408</span> </span><span class="WHIT">    
+<span class='line'>1409</span>     </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"empty"</span><span class="PUNC">:</span><span class="WHIT">
+<span class='line'>1410</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Serializer</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"empty"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1411</span> </span><span class="WHIT">      </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1412</span> </span><span class="WHIT">      
+<span class='line'>1413</span>     </span><span class="KEYW">default</span><span class="PUNC">:</span><span class="WHIT">      
+<span class='line'>1414</span>       </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1415</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1416</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1417</span> </span><span class="COMM">/* site.js - all our site-dependent config : player chrome, cdn locations, etc...*/</span><span class="WHIT">
+<span class='line'>1418</span> 
+<span class='line'>1419</span> </span><span class="NAME">IriSP.lib</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
+<span class='line'>1420</span> 		</span><span class="NAME">jQuery</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1421</span> </span><span class="WHIT">		</span><span class="NAME">jQueryUI</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/jquery-ui.js"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1422</span> </span><span class="WHIT">		</span><span class="NAME">jQueryToolTip</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"http://cdn.jquerytools.org/1.2.4/all/jquery.tools.min.js"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1423</span> </span><span class="WHIT">		</span><span class="NAME">swfObject</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1424</span> </span><span class="WHIT">		</span><span class="NAME">cssjQueryUI</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/themes/base/jquery-ui.css"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1425</span> </span><span class="WHIT">    </span><span class="NAME">popcorn</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"/mdp/src/js/libs/popcorn.js"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1426</span> </span><span class="WHIT">    </span><span class="NAME">jwplayer</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"/mdp/src/js/libs/jwplayer.js"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1427</span> </span><span class="WHIT">    </span><span class="NAME">popcornReplacement</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"/mdp/src/js/libs/pop.js"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1428</span> </span><span class="WHIT">    </span><span class="NAME">raphael</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"/mdp/src/js/libs/raphael.js"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1429</span> </span><span class="WHIT">    </span><span class="STRN">"popcorn.mediafragment"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"/mdp/src/js/libs/popcorn.mediafragment.js"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1430</span> </span><span class="WHIT">    </span><span class="STRN">"popcorn.code"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"/mdp/src/js/libs/popcorn.code.js"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1431</span> </span><span class="WHIT">    </span><span class="STRN">"popcorn.jwplayer"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"/mdp/src/js/libs/popcorn.jwplayer.js"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1432</span> </span><span class="WHIT">    </span><span class="STRN">"popcorn.youtube"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"/mdp/src/js/libs/popcorn.youtube.js"</span><span class="WHIT">
+<span class='line'>1433</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1434</span> 
+<span class='line'>1435</span> </span><span class="COMM">//Player Configuration </span><span class="WHIT">
+<span class='line'>1436</span> </span><span class="NAME">IriSP.config</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1437</span> 
+<span class='line'>1438</span> </span><span class="NAME">IriSP.widgetsDefaults</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1439</span> </span><span class="WHIT">  </span><span class="STRN">"LayoutManager"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">spacer_div_height</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"0px"</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1440</span> </span><span class="WHIT">  </span><span class="STRN">"PlayerWidget"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1441</span> </span><span class="WHIT">  </span><span class="STRN">"AnnotationsWidget"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1442</span> </span><span class="WHIT">    </span><span class="STRN">"share_text"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"I'm watching "</span><span class="PUNC">,</span><span class="WHIT">     
+<span class='line'>1443</span>     </span><span class="STRN">"fb_link"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"http://www.facebook.com/share.php?u="</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1444</span> </span><span class="WHIT">    </span><span class="STRN">"tw_link"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"http://twitter.com/home?status="</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1445</span> </span><span class="WHIT">    </span><span class="STRN">"gplus_link"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">""</span><span class="WHIT">
+<span class='line'>1446</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1447</span> </span><span class="WHIT">  </span><span class="STRN">"TweetsWidget"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1448</span> </span><span class="WHIT">      </span><span class="NAME">default_profile_picture</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"https://si0.twimg.com/sticky/default_profile_images/default_profile_1_normal.png"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1449</span> </span><span class="WHIT">      </span><span class="NAME">tweet_display_period</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">10000</span><span class="WHIT"> </span><span class="COMM">// how long do we show a tweet ?</span><span class="WHIT">
+<span class='line'>1450</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1451</span> </span><span class="WHIT">  </span><span class="STRN">"SliderWidget"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1452</span> </span><span class="WHIT">      </span><span class="NAME">minimize_period</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">850</span><span class="WHIT"> </span><span class="COMM">// how long does the slider stays maximized after the user leaves the zone ?</span><span class="WHIT">
+<span class='line'>1453</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1454</span> </span><span class="WHIT">  </span><span class="STRN">"Main"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1455</span> </span><span class="WHIT">      </span><span class="NAME">autoplay</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="WHIT">
+<span class='line'>1456</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1457</span> </span><span class="WHIT">  
+<span class='line'>1458</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1459</span> 
+<span class='line'>1460</span> </span><span class="NAME">IriSP.paths</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1461</span> </span><span class="COMM">//  "imgs": "/tweetlive/res/metadataplayer/src/css/imgs"</span><span class="WHIT">
+<span class='line'>1462</span> </span><span class="WHIT">  </span><span class="STRN">"imgs"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"/mdp/src/css/imgs"</span><span class="WHIT">
+<span class='line'>1463</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1464</span> </span><span class="NAME">IriSP.default_templates_vars</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1465</span> </span><span class="WHIT">  </span><span class="STRN">"img_dir"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.paths.imgs</span><span class="WHIT"> 
+<span class='line'>1466</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1467</span> 
+<span class='line'>1468</span> </span><span class="COMM">/* ui.js - ui related functions */</span><span class="WHIT">
+<span class='line'>1469</span> 
+<span class='line'>1470</span> </span><span class="COMM">/* FIXME: use an sharing library */</span><span class="WHIT">
+<span class='line'>1471</span> </span><span class="NAME">IriSP.LdtShareTool</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.share_template</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">/* the contents come from share.html */</span><span class="WHIT">
+<span class='line'>1472</span> 
+<span class='line'>1473</span> </span><span class="NAME">IriSP.createPlayerChrome</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1474</span> </span><span class="WHIT">	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">width</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.config.gui.width</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1475</span> </span><span class="WHIT">	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">height</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.config.gui.height</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1476</span> </span><span class="WHIT">	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">heightS</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.config.gui.height</span><span class="PUNC">-</span><span class="NUMB">20</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1477</span> </span><span class="WHIT">	
+<span class='line'>1478</span> 	</span><span class="COMM">// AUDIO  */</span><span class="WHIT">
+<span class='line'>1479</span> </span><span class="WHIT">	</span><span class="COMM">// PB dans le html : ; </span><span class="WHIT">
+<span class='line'>1480</span> </span><span class="WHIT">	</span><span class="NAME">IriSP.trace</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"__IriSP.createMyHtml"</span><span class="PUNC">,</span><span class="NAME">IriSP.config.gui.container</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1481</span> 
+<span class='line'>1482</span> </span><span class="WHIT">	
+<span class='line'>1483</span> 	</span><span class="COMM">/* FIXME : factor this in another file */</span><span class="WHIT">
+<span class='line'>1484</span> </span><span class="WHIT">	</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">IriSP.config.gui.mode</span><span class="PUNC">==</span><span class="STRN">"radio"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1485</span> 
+<span class='line'>1486</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#"</span><span class="PUNC">+</span><span class="NAME">IriSP.config.gui.container</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">before</span><span class="PUNC">(</span><span class="NAME">IriSP.search_template</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1487</span> </span><span class="WHIT">		</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">radioPlayer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">IriSP.radio_template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="STRN">"share_template"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.share_template</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1488</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="NAME">radioPlayer</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">appendTo</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="PUNC">+</span><span class="NAME">IriSP.config.gui.container</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1489</span> 
+<span class='line'>1490</span> </span><span class="WHIT">		</span><span class="COMM">// special tricks for IE 7</span><span class="WHIT">
+<span class='line'>1491</span> </span><span class="WHIT">		</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">IriSP.jQuery.browser.msie</span><span class="PUNC">==</span><span class="KEYW">true</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery.browser.version</span><span class="PUNC">==</span><span class="STRN">"7.0"</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1492</span> </span><span class="WHIT">			</span><span class="COMM">//LdtSearchContainer</span><span class="WHIT">
+<span class='line'>1493</span> </span><span class="WHIT">			</span><span class="COMM">//__IriSP.jQuery("#LdtPlayer").attr("margin-top","50px");</span><span class="WHIT">
+<span class='line'>1494</span> </span><span class="WHIT">			</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-Root"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"padding-top"</span><span class="PUNC">,</span><span class="STRN">"25px"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1495</span> </span><span class="WHIT">			</span><span class="NAME">IriSP.trace</span><span class="PUNC">(</span><span class="STRN">"__IriSP.createHtml"</span><span class="PUNC">,</span><span class="STRN">"IE7 SPECIAL "</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1496</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1497</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">IriSP.config.gui.mode</span><span class="PUNC">==</span><span class="STRN">"video"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1498</span> </span><span class="WHIT">	
+<span class='line'>1499</span> 		</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">videoPlayer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">IriSP.video_template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="STRN">"share_template"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.share_template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"heightS"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">heightS</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1500</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="NAME">videoPlayer</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">appendTo</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="PUNC">+</span><span class="NAME">IriSP.config.gui.container</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1501</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1502</span> </span><span class="WHIT">	
+<span class='line'>1503</span> 	</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-Annotations"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="NAME">width</span><span class="PUNC">-</span><span class="PUNC">(</span><span class="NUMB">75</span><span class="PUNC">*</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1504</span> </span><span class="WHIT">	</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-Show-Arrow-container"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="NAME">width</span><span class="PUNC">-</span><span class="PUNC">(</span><span class="NUMB">75</span><span class="PUNC">*</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1505</span> </span><span class="WHIT">	</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-ShowAnnotation-audio"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="NAME">width</span><span class="PUNC">-</span><span class="NUMB">10</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1506</span> </span><span class="WHIT">	</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-ShowAnnotation-video"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="NAME">width</span><span class="PUNC">-</span><span class="NUMB">10</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1507</span> </span><span class="WHIT">	</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-SaKeyword"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="NAME">width</span><span class="PUNC">-</span><span class="NUMB">10</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1508</span> </span><span class="WHIT">	</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-controler"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="NAME">width</span><span class="PUNC">-</span><span class="NUMB">10</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1509</span> </span><span class="WHIT">	</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-Control"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"z-index"</span><span class="PUNC">,</span><span class="STRN">"100"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1510</span> </span><span class="WHIT">	</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-controler"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">hide</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1511</span> </span><span class="WHIT">	
+<span class='line'>1512</span> 	</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="NAME">IriSP.annotation_loading_template</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">appendTo</span><span class="PUNC">(</span><span class="STRN">"#Ldt-ShowAnnotation-audio"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1513</span> 
+<span class='line'>1514</span> </span><span class="WHIT">	</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">IriSP.config.gui.mode</span><span class="PUNC">==</span><span class="STRN">'radio'</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1515</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-load-container"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"width"</span><span class="PUNC">,</span><span class="NAME">IriSP.config.gui.width</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1516</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1517</span> </span><span class="WHIT">	</span><span class="COMM">// Show or not the output</span><span class="WHIT">
+<span class='line'>1518</span> </span><span class="WHIT">	</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">IriSP.config.gui.debug</span><span class="PUNC">===</span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1519</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-output"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">show</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1520</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1521</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-output"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">hide</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1522</span> </span><span class="WHIT">	</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1523</span> </span><span class="WHIT">	
+<span class='line'>1524</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1525</span> 
+<span class='line'>1526</span> 
+<span class='line'>1527</span> </span><span class="COMM">/* create the buttons and the slider   */</span><span class="WHIT">
+<span class='line'>1528</span> </span><span class="NAME">IriSP.createInterface</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">width</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">height</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1529</span> </span><span class="WHIT">		
+<span class='line'>1530</span> 		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#Ldt-controler"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">show</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1531</span> </span><span class="WHIT">		</span><span class="COMM">//__IriSP.jQuery("#Ldt-Root").css('display','visible');</span><span class="WHIT">
+<span class='line'>1532</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.trace</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"__IriSP.createInterface"</span><span class="WHIT"> </span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">width</span><span class="PUNC">+</span><span class="STRN">","</span><span class="PUNC">+</span><span class="NAME">height</span><span class="PUNC">+</span><span class="STRN">","</span><span class="PUNC">+</span><span class="NAME">duration</span><span class="PUNC">+</span><span class="STRN">","</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1533</span> </span><span class="WHIT">		
+<span class='line'>1534</span> 		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#Ldt-ShowAnnotation"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">click</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
+<span class='line'>1535</span> 			 </span><span class="COMM">//__IriSP.jQuery(this).slideUp(); </span><span class="WHIT">
+<span class='line'>1536</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1537</span> 
+<span class='line'>1538</span> </span><span class="WHIT">		</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">LdtpPlayerY</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-PlaceHolder"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"top"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1539</span> </span><span class="WHIT">		</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">LdtpPlayerX</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#Ldt-PlaceHolder"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"left"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1540</span> </span><span class="WHIT">		
+<span class='line'>1541</span> 		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#slider-range-min"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">slider</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">//range: "min",</span><span class="WHIT">
+<span class='line'>1542</span> </span><span class="WHIT">			</span><span class="NAME">value</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1543</span> </span><span class="WHIT">			</span><span class="NAME">min</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1544</span> </span><span class="WHIT">			</span><span class="NAME">max</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">/</span><span class="NUMB">1000</span><span class="PUNC">,</span><span class="COMM">//1:54:52.66 = 3600+3240+</span><span class="WHIT">
+<span class='line'>1545</span> </span><span class="WHIT">			</span><span class="NAME">step</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0.1</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1546</span> </span><span class="WHIT">			</span><span class="NAME">slide</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">ui</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1547</span> </span><span class="WHIT">				
+<span class='line'>1548</span> 				</span><span class="COMM">//__IriSP.jQuery("#amount").val(ui.value+" s");</span><span class="WHIT">
+<span class='line'>1549</span> </span><span class="WHIT">				</span><span class="COMM">//player.sendEvent('SEEK', ui.value)</span><span class="WHIT">
+<span class='line'>1550</span> </span><span class="WHIT">				</span><span class="NAME">IriSP.MyApiPlayer.seek</span><span class="PUNC">(</span><span class="NAME">ui.value</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1551</span> </span><span class="WHIT">				</span><span class="COMM">//changePageUrlOffset(ui.value);</span><span class="WHIT">
+<span class='line'>1552</span> </span><span class="WHIT">				</span><span class="COMM">//player.sendEvent('PAUSE')</span><span class="WHIT">
+<span class='line'>1553</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1554</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1555</span> </span><span class="WHIT">		
+<span class='line'>1556</span> 		</span><span class="NAME">IriSP.trace</span><span class="PUNC">(</span><span class="STRN">"__IriSP.createInterface"</span><span class="PUNC">,</span><span class="STRN">"ICI"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1557</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#amount"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">val</span><span class="PUNC">(</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#slider-range-min"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">slider</span><span class="PUNC">(</span><span class="STRN">"value"</span><span class="PUNC">)</span><span class="PUNC">+</span><span class="STRN">" s"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1558</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">".Ldt-Control1 button:first"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">button</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1559</span> </span><span class="WHIT">			</span><span class="NAME">icons</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1560</span> </span><span class="WHIT">				</span><span class="NAME">primary</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'ui-icon-play'</span><span class="WHIT">
+<span class='line'>1561</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1562</span> </span><span class="WHIT">			</span><span class="NAME">text</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="WHIT">
+<span class='line'>1563</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">next</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">button</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1564</span> </span><span class="WHIT">			</span><span class="NAME">icons</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1565</span> </span><span class="WHIT">				</span><span class="NAME">primary</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'ui-icon-seek-next'</span><span class="WHIT">
+<span class='line'>1566</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1567</span> </span><span class="WHIT">			 </span><span class="NAME">text</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="WHIT">
+<span class='line'>1568</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1569</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">".Ldt-Control2 button:first"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">button</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1570</span> </span><span class="WHIT">			</span><span class="NAME">icons</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1571</span> </span><span class="WHIT">				</span><span class="NAME">primary</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'ui-icon-search'</span><span class="COMM">//,</span><span class="WHIT">
+<span class='line'>1572</span> </span><span class="WHIT">				</span><span class="COMM">//secondary: 'ui-icon-volume-off'</span><span class="WHIT">
+<span class='line'>1573</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1574</span> </span><span class="WHIT">			</span><span class="NAME">text</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="WHIT">
+<span class='line'>1575</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">next</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">button</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1576</span> </span><span class="WHIT">			</span><span class="NAME">icons</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1577</span> </span><span class="WHIT">				</span><span class="NAME">primary</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'ui-icon-volume-on'</span><span class="WHIT">
+<span class='line'>1578</span> </span><span class="WHIT">			</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1579</span> </span><span class="WHIT">			 </span><span class="NAME">text</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="WHIT">
+<span class='line'>1580</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1581</span> 
+<span class='line'>1582</span> </span><span class="WHIT">		</span><span class="COMM">// /!\ PB A MODIFIER </span><span class="WHIT">
+<span class='line'>1583</span> </span><span class="WHIT">		</span><span class="COMM">//__IriSP.MyTags.draw();</span><span class="WHIT">
+<span class='line'>1584</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.trace</span><span class="PUNC">(</span><span class="STRN">"__IriSP.createInterface"</span><span class="PUNC">,</span><span class="STRN">"ICI2"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1585</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#ldt-CtrlPlay"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"style"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"background-color:#CD21C24;"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1586</span> </span><span class="WHIT">		
+<span class='line'>1587</span> 		</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#Ldt-load-container"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">hide</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1588</span> </span><span class="WHIT">		
+<span class='line'>1589</span> 		</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">IriSP.config.gui.mode</span><span class="PUNC">==</span><span class="STRN">"radio"</span><span class="WHIT"> </span><span class="PUNC">&</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery.browser.msie</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1590</span> </span><span class="WHIT">			</span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#Ldtplayer1"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"height"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"0"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1591</span> </span><span class="WHIT">		</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1592</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.trace</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"__IriSP.createInterface"</span><span class="WHIT"> </span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"3"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1593</span> 
+<span class='line'>1594</span> </span><span class="WHIT">		</span><span class="NAME">IriSP.trace</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"__IriSP.createInterface"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"END"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1595</span> </span><span class="WHIT">		
+<span class='line'>1596</span> 	</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1597</span> </span><span class="COMM">/* the widget classes and definitions */</span><span class="WHIT">
+<span class='line'>1598</span> 
+<span class='line'>1599</span> </span><span class="NAME">IriSP.Widget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1600</span> 
+<span class='line'>1601</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">config</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1602</span> </span><span class="WHIT">    </span><span class="NAME">config</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1603</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1604</span> </span><span class="WHIT">  
+<span class='line'>1605</span>   </span><span class="NAME">this._Popcorn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1606</span> </span><span class="WHIT">  </span><span class="NAME">this._config</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>1607</span>   </span><span class="NAME">this._serializer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1608</span> </span><span class="WHIT">  
+<span class='line'>1609</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">"container"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1610</span> </span><span class="WHIT">     </span><span class="NAME">this._id</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">config.container</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1611</span> </span><span class="WHIT">     </span><span class="NAME">this.selector</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">this._id</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1612</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1613</span> 
+<span class='line'>1614</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">"spacer"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1615</span> </span><span class="WHIT">     </span><span class="NAME">this._spacerId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">config.spacer</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1616</span> </span><span class="WHIT">     </span><span class="NAME">this.spacer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">this._spacerId</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1617</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1618</span> 
+<span class='line'>1619</span> 
+<span class='line'>1620</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">"width"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1621</span> </span><span class="WHIT">     </span><span class="COMM">// this.width and not this._width because we consider it public.</span><span class="WHIT">
+<span class='line'>1622</span> </span><span class="WHIT">     </span><span class="NAME">this.width</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">config.width</span><span class="PUNC">;</span><span class="WHIT">     
+<span class='line'>1623</span>   </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1624</span> </span><span class="WHIT">  
+<span class='line'>1625</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">"height"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">    
+<span class='line'>1626</span>      </span><span class="NAME">this.height</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">config.height</span><span class="PUNC">;</span><span class="WHIT">     
+<span class='line'>1627</span>   </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1628</span> </span><span class="WHIT">  
+<span class='line'>1629</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">"heightmax"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1630</span> </span><span class="WHIT">     </span><span class="NAME">this.heightmax</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">config.heightmax</span><span class="PUNC">;</span><span class="WHIT">     
+<span class='line'>1631</span>   </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1632</span> 
+<span class='line'>1633</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">"widthmax"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1634</span> </span><span class="WHIT">     </span><span class="NAME">this.widthmax</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">config.widthmax</span><span class="PUNC">;</span><span class="WHIT">     
+<span class='line'>1635</span>   </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1636</span> </span><span class="WHIT">  
+<span class='line'>1637</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1638</span> 
+<span class='line'>1639</span> </span><span class="NAME">IriSP.Widget.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1640</span> </span><span class="WHIT">  </span><span class="COMM">/* implemented by "sub-classes" */</span><span class="WHIT">  
+<span class='line'>1641</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1642</span> 
+<span class='line'>1643</span> </span><span class="NAME">IriSP.Widget.prototype.redraw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1644</span> </span><span class="WHIT">  </span><span class="COMM">/* implemented by "sub-classes" */</span><span class="WHIT">  
+<span class='line'>1645</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1646</span> </span><span class="COMM">/* modules are non-graphical entities, similar to widgets */</span><span class="WHIT">
+<span class='line'>1647</span> 
+<span class='line'>1648</span> </span><span class="NAME">IriSP.Module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1649</span> 
+<span class='line'>1650</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">config</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">config</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1651</span> </span><span class="WHIT">    </span><span class="NAME">config</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1652</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1653</span> </span><span class="WHIT">  
+<span class='line'>1654</span>   </span><span class="NAME">this._Popcorn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1655</span> </span><span class="WHIT">  </span><span class="NAME">this._config</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>1656</span>   </span><span class="NAME">this._serializer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1657</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1658</span> </span><span class="COMM">/* layout.js - very basic layout management */</span><span class="WHIT">
+<span class='line'>1659</span> 
+<span class='line'>1660</span> </span><span class="COMM">/*
+<span class='line'>1661</span>   a layout manager manages a div and the layout of objects
+<span class='line'>1662</span>   inside it.
+<span class='line'>1663</span> */</span><span class="WHIT">
+<span class='line'>1664</span> 
+<span class='line'>1665</span> </span><span class="NAME">IriSP.LayoutManager</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">options</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1666</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1667</span> </span><span class="WHIT">    </span><span class="NAME">this._widgets</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1668</span> </span><span class="WHIT">    
+<span class='line'>1669</span>     </span><span class="NAME">this._div</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"LdtPlayer"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1670</span> </span><span class="WHIT">    </span><span class="NAME">this._width</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">640</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1671</span> </span><span class="WHIT">    
+<span class='line'>1672</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">options</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1673</span> </span><span class="WHIT">      </span><span class="NAME">options</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1674</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1675</span> </span><span class="WHIT">    
+<span class='line'>1676</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">options.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">'container'</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1677</span> </span><span class="WHIT">      </span><span class="NAME">this._div</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">options.container</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1678</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1679</span> 
+<span class='line'>1680</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">options.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">'width'</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1681</span> </span><span class="WHIT">      </span><span class="NAME">this._width</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">options.width</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1682</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">    
+<span class='line'>1683</span>     
+<span class='line'>1684</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">options.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">'height'</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1685</span> </span><span class="WHIT">      </span><span class="NAME">this._height</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">options.height</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1686</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT"> 
+<span class='line'>1687</span>     
+<span class='line'>1688</span>     </span><span class="COMM">/* this is a shortcut */</span><span class="WHIT">
+<span class='line'>1689</span> </span><span class="WHIT">    </span><span class="NAME">this.selector</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">this._div</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1690</span> </span><span class="WHIT">    
+<span class='line'>1691</span>     </span><span class="NAME">this.selector.css</span><span class="PUNC">(</span><span class="STRN">"width"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this._width</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1692</span> </span><span class="WHIT">    
+<span class='line'>1693</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._height</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>1694</span> </span><span class="WHIT">      </span><span class="NAME">this.selector.css</span><span class="PUNC">(</span><span class="STRN">"height"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this._height</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1695</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1696</span> 
+<span class='line'>1697</span> </span><span class="COMM">/* we need this special setter because of a chicken and egg problem :
+<span class='line'>1698</span>    we want the manager to use popcorn but the popcorn div will be managed
+<span class='line'>1699</span>    by the manager. So we need a way to set the instance the manager uses
+<span class='line'>1700</span> */</span><span class="WHIT">
+<span class='line'>1701</span> </span><span class="WHIT">   
+<span class='line'>1702</span> </span><span class="NAME">IriSP.LayoutManager.prototype.setPopcornInstance</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">popcorn</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1703</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">popcorn</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1704</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1705</span> 
+<span class='line'>1706</span> </span><span class="COMM">/* stem is a string to append to the id of the widget */</span><span class="WHIT">
+<span class='line'>1707</span> </span><span class="NAME">IriSP.LayoutManager.prototype.createDiv</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">stem</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1708</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">stem</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>1709</span> </span><span class="WHIT">       </span><span class="NAME">stem</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1710</span> 
+<span class='line'>1711</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">newDiv</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.guid</span><span class="PUNC">(</span><span class="NAME">this._div</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"_widget_"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">stem</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"_"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1712</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">spacerDiv</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.guid</span><span class="PUNC">(</span><span class="STRN">"LdtPlayer_spacer_"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1713</span> </span><span class="WHIT">    </span><span class="NAME">this._widgets.push</span><span class="PUNC">(</span><span class="NAME">newDiv</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1714</span> 
+<span class='line'>1715</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">divTempl</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"&lt;div id='{{id}}' style='width: {{width}}px; position: relative;'>&lt;/div"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1716</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">spacerTempl</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"&lt;div id='{{spacer_id}}' style='width: {{width}}px; position: relative; height: {{spacer_div_height}};'>&lt;/div"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1717</span> </span><span class="WHIT">    
+<span class='line'>1718</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">divCode</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">divTempl</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">id</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">newDiv</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">width</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">this._width</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1719</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">spacerCode</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">spacerTempl</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">spacer_id</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">spacerDiv</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">width</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">this._width</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>1720</span> </span><span class="WHIT">                                                    </span><span class="NAME">spacer_div_height</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.widgetsDefaults.LayoutManager.spacer_div_height</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1721</span> 
+<span class='line'>1722</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">divCode</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1723</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">spacerCode</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1724</span> 
+<span class='line'>1725</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="NAME">newDiv</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">spacerDiv</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1726</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1727</span> </span><span class="COMM">/* init.js - initialization and configuration of Popcorn and the widgets
+<span class='line'>1728</span> exemple json configuration:
+<span class='line'>1729</span>  
+<span class='line'>1730</span>  */</span><span class="WHIT">
+<span class='line'>1731</span> 
+<span class='line'>1732</span> </span><span class="NAME">IriSP.setupDataLoader</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1733</span> </span><span class="WHIT">  </span><span class="COMM">/* we set it up separately because we need to
+<span class='line'>1734</span>      get data at the very beginning, for instance when
+<span class='line'>1735</span>      setting up the video */</span><span class="WHIT">
+<span class='line'>1736</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.__dataloader</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.DataLoader</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1737</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1738</span> 
+<span class='line'>1739</span> </span><span class="NAME">IriSP.configurePopcorn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">layoutManager</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">options</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1740</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">pop</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1741</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">layoutManager.createDiv</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> 
+<span class='line'>1742</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">containerDiv</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1743</span> </span><span class="WHIT">    
+<span class='line'>1744</span>     </span><span class="KEYW">switch</span><span class="PUNC">(</span><span class="NAME">options.type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1745</span> </span><span class="WHIT">      </span><span class="COMM">/*
+<span class='line'>1746</span>         todo : dynamically create the div/video tag which
+<span class='line'>1747</span>         will contain the video.
+<span class='line'>1748</span>       */</span><span class="WHIT">
+<span class='line'>1749</span> </span><span class="WHIT">      </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"html5"</span><span class="PUNC">:</span><span class="WHIT">
+<span class='line'>1750</span> </span><span class="WHIT">           </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">tmpId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Popcorn.guid</span><span class="PUNC">(</span><span class="STRN">"video"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> 
+<span class='line'>1751</span>            </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">containerDiv</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">append</span><span class="PUNC">(</span><span class="STRN">"&lt;video src='"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">options.file</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"' id='"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">tmpId</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"'>&lt;/video>"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1752</span> 
+<span class='line'>1753</span> </span><span class="WHIT">           </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">options.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">"width"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>1754</span> </span><span class="WHIT">             </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">containerDiv</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"width"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">options.width</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1755</span> </span><span class="WHIT">           
+<span class='line'>1756</span>            </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">options.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">"height"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>1757</span> </span><span class="WHIT">             </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">containerDiv</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"height"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">options.height</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1758</span> 
+<span class='line'>1759</span> </span><span class="WHIT">           </span><span class="NAME">pop</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">tmpId</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1760</span> </span><span class="WHIT">        </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1761</span> </span><span class="WHIT">        
+<span class='line'>1762</span>       </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"jwplayer"</span><span class="PUNC">:</span><span class="WHIT">
+<span class='line'>1763</span> </span><span class="WHIT">          </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">opts</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery.extend</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">options</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1764</span> </span><span class="WHIT">          </span><span class="KEYW">delete</span><span class="WHIT"> </span><span class="NAME">opts.container</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1765</span> 
+<span class='line'>1766</span> </span><span class="WHIT">          </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">options.provider</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"rtmp"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1767</span> </span><span class="WHIT">            </span><span class="COMM">/* exit if we can't access the metadata */</span><span class="WHIT">
+<span class='line'>1768</span> </span><span class="WHIT">            </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">IriSP.__jsonMetadata</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1769</span> </span><span class="WHIT">                </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1770</span> </span><span class="WHIT">            </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1771</span> 
+<span class='line'>1772</span> 
+<span class='line'>1773</span> </span><span class="WHIT">            </span><span class="COMM">// the json format is totally illogical</span><span class="WHIT">
+<span class='line'>1774</span> </span><span class="WHIT">            </span><span class="NAME">opts.streamer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.__jsonMetadata</span><span class="PUNC">[</span><span class="STRN">"medias"</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="STRN">"meta"</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="STRN">"item"</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="STRN">"value"</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1775</span> </span><span class="WHIT">            </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">source</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.__jsonMetadata</span><span class="PUNC">[</span><span class="STRN">"medias"</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="STRN">"href"</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1776</span> 
+<span class='line'>1777</span> </span><span class="WHIT">            </span><span class="COMM">// the source if a full url but jwplayer wants an url relative to the</span><span class="WHIT">
+<span class='line'>1778</span> </span><span class="WHIT">            </span><span class="COMM">// streamer url, so we've got to remove the common part.</span><span class="WHIT">
+<span class='line'>1779</span> </span><span class="WHIT">            </span><span class="NAME">opts.file</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">source.slice</span><span class="PUNC">(</span><span class="NAME">opts.streamer.length</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1780</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1781</span> </span><span class="WHIT">            </span><span class="COMM">/* other providers type, video for instance -
+<span class='line'>1782</span>                pass everything as is */</span><span class="WHIT">
+<span class='line'>1783</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1784</span> 
+<span class='line'>1785</span> </span><span class="WHIT">          </span><span class="NAME">pop</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.PopcornReplacement.jwplayer</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">containerDiv</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">opts</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1786</span> </span><span class="WHIT">        </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1787</span> </span><span class="WHIT">      
+<span class='line'>1788</span>       </span><span class="KEYW">case</span><span class="WHIT"> </span><span class="STRN">"youtube"</span><span class="PUNC">:</span><span class="WHIT">
+<span class='line'>1789</span> </span><span class="WHIT">          </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">opts</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery.extend</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">options</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1790</span> </span><span class="WHIT">          </span><span class="KEYW">delete</span><span class="WHIT"> </span><span class="NAME">opts.container</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1791</span> </span><span class="WHIT">          </span><span class="NAME">opts.controls</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1792</span> </span><span class="WHIT">          </span><span class="NAME">opts.autostart</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1793</span> </span><span class="WHIT">          </span><span class="NAME">templ</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"width: {{width}}px; height: {{height}}px;"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1794</span> </span><span class="WHIT">          </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">str</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">templ</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">width</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">opts.width</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">height</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">opts.height</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">    
+<span class='line'>1795</span>           </span><span class="COMM">// Popcorn.youtube wants us to specify the size of the player in the style attribute of its container div.</span><span class="WHIT">
+<span class='line'>1796</span> </span><span class="WHIT">          </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">containerDiv</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"style"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">str</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1797</span> </span><span class="WHIT">          
+<span class='line'>1798</span>           </span><span class="NAME">pop</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Popcorn.youtube</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">containerDiv</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">opts.video</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">opts</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1799</span> </span><span class="WHIT">        </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1800</span> </span><span class="WHIT">        
+<span class='line'>1801</span>       </span><span class="KEYW">default</span><span class="PUNC">:</span><span class="WHIT">
+<span class='line'>1802</span> </span><span class="WHIT">        </span><span class="NAME">pop</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1803</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1804</span> </span><span class="WHIT">    
+<span class='line'>1805</span>     </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">pop</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1806</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1807</span> 
+<span class='line'>1808</span> </span><span class="NAME">IriSP.configureWidgets</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">popcornInstance</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">layoutManager</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">guiOptions</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1809</span> </span><span class="WHIT"> 
+<span class='line'>1810</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">serialFactory</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.SerializerFactory</span><span class="PUNC">(</span><span class="NAME">IriSP.__dataloader</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1811</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">params</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">width</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">guiOptions.width</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">height</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">guiOptions.height</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1812</span> 
+<span class='line'>1813</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ret_widgets</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1814</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">index</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1815</span> </span><span class="WHIT">  
+<span class='line'>1816</span>   </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">index</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">index</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">guiOptions.widgets.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">index</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">    
+<span class='line'>1817</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">widgetConfig</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">guiOptions.widgets</span><span class="PUNC">[</span><span class="NAME">index</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1818</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">widget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.instantiateWidget</span><span class="PUNC">(</span><span class="NAME">popcornInstance</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">serialFactory</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">layoutManager</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">widgetConfig</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1819</span> </span><span class="WHIT">    </span><span class="NAME">ret_widgets.push</span><span class="PUNC">(</span><span class="NAME">widget</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1820</span> </span><span class="WHIT">   
+<span class='line'>1821</span>   </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1822</span> 
+<span class='line'>1823</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">ret_widgets</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1824</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1825</span> 
+<span class='line'>1826</span> </span><span class="NAME">IriSP.configureModules</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">popcornInstance</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">modulesList</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1827</span> </span><span class="WHIT"> 
+<span class='line'>1828</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">serialFactory</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.SerializerFactory</span><span class="PUNC">(</span><span class="NAME">IriSP.__dataloader</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1829</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ret_modules</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1830</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">index</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1831</span> </span><span class="WHIT">  
+<span class='line'>1832</span>   </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">index</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">index</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">modulesList.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">index</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">    
+<span class='line'>1833</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">moduleConfig</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">modulesList</span><span class="PUNC">[</span><span class="NAME">index</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1834</span> </span><span class="WHIT">    
+<span class='line'>1835</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">serializer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">serialFactory.getSerializer</span><span class="PUNC">(</span><span class="NAME">moduleConfig.metadata</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1836</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">module</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP</span><span class="PUNC">[</span><span class="NAME">moduleConfig.type</span><span class="PUNC">]</span><span class="PUNC">(</span><span class="NAME">popcornInstance</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">moduleConfig</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">    
+<span class='line'>1837</span>     </span><span class="NAME">ret_modules.push</span><span class="PUNC">(</span><span class="NAME">module</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1838</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1839</span> 
+<span class='line'>1840</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">ret_modules</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1841</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1842</span> 
+<span class='line'>1843</span> </span><span class="NAME">IriSP.instantiateWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">popcornInstance</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">serialFactory</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">layoutManager</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">widgetConfig</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1844</span> </span><span class="WHIT">    </span><span class="COMM">/* create div returns us a container for the widget and a spacer */</span><span class="WHIT">
+<span class='line'>1845</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">layoutManager.createDiv</span><span class="PUNC">(</span><span class="NAME">widgetConfig.type</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">        
+<span class='line'>1846</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">container</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1847</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">spacer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1848</span> 
+<span class='line'>1849</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">arr</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery.extend</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">widgetConfig</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1850</span> </span><span class="WHIT">    </span><span class="NAME">arr.container</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">container</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1851</span> </span><span class="WHIT">    </span><span class="NAME">arr.spacer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">spacer</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1852</span> </span><span class="WHIT">    
+<span class='line'>1853</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">serializer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">serialFactory.getSerializer</span><span class="PUNC">(</span><span class="NAME">widgetConfig.metadata</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">    
+<span class='line'>1854</span>     
+<span class='line'>1855</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">serializer</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="WHIT">   
+<span class='line'>1856</span>       </span><span class="NAME">debugger</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1857</span> </span><span class="WHIT">    
+<span class='line'>1858</span>     </span><span class="COMM">// instantiate the object passed as a string</span><span class="WHIT">
+<span class='line'>1859</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">widget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP</span><span class="PUNC">[</span><span class="NAME">widgetConfig.type</span><span class="PUNC">]</span><span class="PUNC">(</span><span class="NAME">popcornInstance</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">arr</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">    
+<span class='line'>1860</span>     
+<span class='line'>1861</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">widgetConfig.hasOwnProperty</span><span class="PUNC">(</span><span class="STRN">"requires"</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1862</span> </span><span class="WHIT">      </span><span class="COMM">// also create the widgets this one depends on.</span><span class="WHIT">
+<span class='line'>1863</span> </span><span class="WHIT">      </span><span class="COMM">// the dependency widget is available in the parent widget context as</span><span class="WHIT">
+<span class='line'>1864</span> </span><span class="WHIT">      </span><span class="COMM">// this.WidgetName (for instance, this.TipWidget);</span><span class="WHIT">
+<span class='line'>1865</span> </span><span class="WHIT">      
+<span class='line'>1866</span>       </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1867</span> </span><span class="WHIT">      </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">widgetConfig.requires.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1868</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">widgetName</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">widgetConfig.requires</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="STRN">"type"</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1869</span> </span><span class="WHIT">        </span><span class="NAME">widget</span><span class="PUNC">[</span><span class="NAME">widgetName</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.instantiateWidget</span><span class="PUNC">(</span><span class="NAME">popcornInstance</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">serialFactory</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">layoutManager</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">widgetConfig.requires</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1870</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1871</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">       
+<span class='line'>1872</span>      
+<span class='line'>1873</span>     </span><span class="NAME">serializer.sync</span><span class="PUNC">(</span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="NAME">widget</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">this.draw</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1874</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">widget</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1875</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1876</span> </span><span class="COMM">/* mediafragment module */</span><span class="WHIT">
+<span class='line'>1877</span> 
+<span class='line'>1878</span> </span><span class="NAME">IriSP.MediaFragment</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1879</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Module.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1880</span> 
+<span class='line'>1881</span> </span><span class="WHIT">  </span><span class="NAME">this.mutex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">/* a mutex because we access the url from two different functions */</span><span class="WHIT">
+<span class='line'>1882</span> 
+<span class='line'>1883</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"loadedmetadata"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.MediaFragment.advanceTime</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1884</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"pause"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.MediaFragment.updateTime</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1885</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"seeked"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.MediaFragment.updateTime</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1886</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"IriSP.PolemicTweet.click"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.MediaFragment.updateAnnotation</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1887</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"IriSP.SegmentsWidget.click"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.MediaFragment.updateAnnotation</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1888</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1889</span> 
+<span class='line'>1890</span> </span><span class="NAME">IriSP.MediaFragment.advanceTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1891</span> </span><span class="WHIT">             </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">url</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">window.location.href</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1892</span> 
+<span class='line'>1893</span> </span><span class="WHIT">              </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">url.split</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">[</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1894</span> </span><span class="WHIT">                  </span><span class="NAME">pageoffset</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">url.split</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1895</span> 
+<span class='line'>1896</span> </span><span class="WHIT">                  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">pageoffset.substring</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"t="</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1897</span> </span><span class="WHIT">                    </span><span class="COMM">// timecode </span><span class="WHIT">
+<span class='line'>1898</span> </span><span class="WHIT">                    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">pageoffset.substring</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1899</span> </span><span class="WHIT">                    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">offsettime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">pageoffset.substring</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1900</span> </span><span class="WHIT">                    </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">parseFloat</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">offsettime</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1901</span> </span><span class="WHIT">                    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1902</span> </span><span class="WHIT">                  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">pageoffset.substring</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"a="</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1903</span> </span><span class="WHIT">                    </span><span class="COMM">// annotation</span><span class="WHIT">
+<span class='line'>1904</span> </span><span class="WHIT">                    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotationId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">pageoffset.substring</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1905</span> 
+<span class='line'>1906</span> </span><span class="WHIT">                    </span><span class="COMM">// there's no better way than that because</span><span class="WHIT">
+<span class='line'>1907</span> </span><span class="WHIT">                    </span><span class="COMM">// of possible race conditions</span><span class="WHIT">
+<span class='line'>1908</span> </span><span class="WHIT">                    </span><span class="NAME">this._serializer.sync</span><span class="PUNC">(</span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1909</span> </span><span class="WHIT">                          </span><span class="NAME">IriSP.MediaFragment.lookupAnnotation.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">annotationId</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> 
+<span class='line'>1910</span>                           </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1911</span> </span><span class="WHIT">                  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1912</span> </span><span class="WHIT">              </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1913</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1914</span> 
+<span class='line'>1915</span> </span><span class="NAME">IriSP.MediaFragment.updateTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1916</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.mutex</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1917</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1918</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1919</span> 
+<span class='line'>1920</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">history</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">window.history</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1921</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">history.pushState</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1922</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1923</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1924</span> </span><span class="WHIT">  
+<span class='line'>1925</span>   </span><span class="NAME">splitArr</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">window.location.href.split</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>1926</span> </span><span class="WHIT">  </span><span class="NAME">history.replaceState</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">splitArr</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"#t="</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">toFixed</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1927</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1928</span> 
+<span class='line'>1929</span> 
+<span class='line'>1930</span> </span><span class="NAME">IriSP.MediaFragment.updateAnnotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotationId</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1931</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_this</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1932</span> </span><span class="WHIT">  </span><span class="NAME">this.mutex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1933</span> 
+<span class='line'>1934</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">history</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">window.history</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1935</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">history.pushState</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1936</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1937</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1938</span> </span><span class="WHIT">  
+<span class='line'>1939</span>   </span><span class="NAME">splitArr</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">window.location.href.split</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>1940</span> </span><span class="WHIT">  </span><span class="NAME">history.replaceState</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">splitArr</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"#a="</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotationId</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1941</span> </span><span class="WHIT"> 
+<span class='line'>1942</span>   </span><span class="NAME">window.setTimeout</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">_this.mutex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">50</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1943</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1944</span> 
+<span class='line'>1945</span> </span><span class="COMM">// lookup and seek to the beginning of an annotation</span><span class="WHIT">
+<span class='line'>1946</span> </span><span class="NAME">IriSP.MediaFragment.lookupAnnotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotationId</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1947</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1948</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer._data.annotations</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1949</span> 
+<span class='line'>1950</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1951</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">annotations.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1952</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">annotations</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">id</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">annotationId</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1953</span> </span><span class="WHIT">        </span><span class="NAME">annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">annotations</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1954</span> </span><span class="WHIT">        </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1955</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1956</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1957</span> 
+<span class='line'>1958</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1959</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="NAME">annotation.begin</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1960</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>1961</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1962</span> </span><span class="NAME">IriSP.AnnotationsWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1963</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Widget.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1964</span> </span><span class="WHIT">  
+<span class='line'>1965</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1966</span> 
+<span class='line'>1967</span> 
+<span class='line'>1968</span> </span><span class="NAME">IriSP.AnnotationsWidget.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Widget</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1969</span> 
+<span class='line'>1970</span> </span><span class="NAME">IriSP.AnnotationsWidget.prototype.clear</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>1971</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-SaTitle"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">text</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1972</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-SaDescription"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">text</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1973</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-SaKeywordText"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">text</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1974</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1975</span> 
+<span class='line'>1976</span> </span><span class="NAME">IriSP.AnnotationsWidget.prototype.displayAnnotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">   
+<span class='line'>1977</span> 
+<span class='line'>1978</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">title</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">annotation.content.title</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1979</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">description</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">annotation.content.description</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1980</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">keywords</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT">  </span><span class="STRN">""</span><span class="WHIT"> </span><span class="COMM">// FIXME;</span><span class="WHIT">
+<span class='line'>1981</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">begin</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">annotation.begin</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1982</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">end</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">annotation.end</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1983</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1984</span> </span><span class="WHIT">    
+<span class='line'>1985</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">title_templ</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"{{title}} - ( {{begin}} - {{end}} )"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1986</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">endstr</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">title_templ</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">title</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">title</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">begin</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.secondsToTime</span><span class="PUNC">(</span><span class="NAME">begin</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">end</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.secondsToTime</span><span class="PUNC">(</span><span class="NAME">end</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1987</span> 
+<span class='line'>1988</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-SaTitle"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">text</span><span class="PUNC">(</span><span class="NAME">endstr</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1989</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-SaDescription"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">text</span><span class="PUNC">(</span><span class="NAME">description</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1990</span> </span><span class="WHIT">    
+<span class='line'>1991</span>     </span><span class="COMM">// update sharing buttons</span><span class="WHIT">
+<span class='line'>1992</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">defaults</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.widgetsDefaults.AnnotationsWidget</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1993</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">text</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">defaults.share_text</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1994</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">fb_link</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">defaults.fb_link</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1995</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">tw_link</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">defaults.tw_link</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1996</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">gplus_link</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">defaults.gplus_link</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1997</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">url</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">document.location.href</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"#a="</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotation.id</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1998</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-fbShare"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"href"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">fb_link</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">IriSP.encodeURI</span><span class="PUNC">(</span><span class="NAME">text</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">IriSP.encodeURI</span><span class="PUNC">(</span><span class="NAME">url</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>1999</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-TwShare"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"href"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">tw_link</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">IriSP.encodeURI</span><span class="PUNC">(</span><span class="NAME">text</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">IriSP.encodeURI</span><span class="PUNC">(</span><span class="NAME">url</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2000</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-GplusShare"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"href"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">fb_link</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">IriSP.encodeURI</span><span class="PUNC">(</span><span class="NAME">text</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">IriSP.encodeURI</span><span class="PUNC">(</span><span class="NAME">url</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2001</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2002</span> 
+<span class='line'>2003</span> </span><span class="NAME">IriSP.AnnotationsWidget.prototype.clearWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2004</span> 
+<span class='line'>2005</span> </span><span class="WHIT">    
+<span class='line'>2006</span>     </span><span class="COMM">/* retract the pane between two annotations */</span><span class="WHIT">
+<span class='line'>2007</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-SaTitle"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">text</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2008</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-SaDescription"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">text</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2009</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-SaKeywordText"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">html</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2010</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-ShowAnnotation"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">slideUp</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2011</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2012</span> 
+<span class='line'>2013</span> </span><span class="NAME">IriSP.AnnotationsWidget.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2014</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_this</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2015</span> 
+<span class='line'>2016</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotationMarkup</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.templToHTML</span><span class="PUNC">(</span><span class="NAME">IriSP.annotationWidget_template</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2017</span> </span><span class="WHIT">	</span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">annotationMarkup</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2018</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">view</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2019</span> 
+<span class='line'>2020</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">this._serializer._data.views</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">this._serializer._data.views</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>2021</span> </span><span class="WHIT">     </span><span class="NAME">view</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer._data.views</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2022</span> 
+<span class='line'>2023</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">view_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2024</span> 
+<span class='line'>2025</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">view</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">view.annotation_types</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">view.annotation_types.length</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2026</span> </span><span class="WHIT">          </span><span class="NAME">view_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">view.annotation_types</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2027</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2028</span> </span><span class="WHIT"> 
+<span class='line'>2029</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer._data.annotations</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2030</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2031</span> </span><span class="WHIT">  
+<span class='line'>2032</span> 	</span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">annotations</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">    
+<span class='line'>2033</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">annotations</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2034</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">begin</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.round</span><span class="PUNC">(</span><span class="PUNC">(</span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotation.begin</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2035</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">end</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.round</span><span class="PUNC">(</span><span class="PUNC">(</span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotation.end</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2036</span> 
+<span class='line'>2037</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">view_type</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT">
+<span class='line'>2038</span> </span><span class="WHIT">          </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">view_type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2039</span> </span><span class="WHIT">        </span><span class="KEYW">continue</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2040</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2041</span> 
+<span class='line'>2042</span> 
+<span class='line'>2043</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">conf</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">start</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">begin</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">end</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">end</span><span class="PUNC">,</span><span class="WHIT"> 
+<span class='line'>2044</span>                 </span><span class="NAME">onStart</span><span class="PUNC">:</span><span class="WHIT"> 
+<span class='line'>2045</span>                        </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
+<span class='line'>2046</span>                         </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
+<span class='line'>2047</span>                             </span><span class="NAME">_this.displayAnnotation</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> 
+<span class='line'>2048</span>                           
+<span class='line'>2049</span>                         </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2050</span> </span><span class="WHIT">                </span><span class="NAME">onEnd</span><span class="PUNC">:</span><span class="WHIT"> 
+<span class='line'>2051</span>                        </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">_this.clearWidget.call</span><span class="PUNC">(</span><span class="NAME">_this</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2052</span> </span><span class="WHIT">                </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2053</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.code</span><span class="PUNC">(</span><span class="NAME">conf</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">                                             
+<span class='line'>2054</span>   </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2055</span> 
+<span class='line'>2056</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2057</span> </span><span class="NAME">IriSP.ArrowWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2058</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Widget.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2059</span> 
+<span class='line'>2060</span> </span><span class="WHIT">  </span><span class="NAME">this._oldAnnotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2061</span> </span><span class="WHIT">  
+<span class='line'>2062</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2063</span> 
+<span class='line'>2064</span> 
+<span class='line'>2065</span> </span><span class="NAME">IriSP.ArrowWidget.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Widget</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2066</span> 
+<span class='line'>2067</span> </span><span class="NAME">IriSP.ArrowWidget.prototype.clear</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2068</span> 
+<span class='line'>2069</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2070</span> 
+<span class='line'>2071</span> </span><span class="NAME">IriSP.ArrowWidget.prototype.clearWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2072</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2073</span> 
+<span class='line'>2074</span> </span><span class="NAME">IriSP.ArrowWidget.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2075</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">IriSP.arrowWidget_template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2076</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">templ</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2077</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"timeupdate"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.timeUpdateHandler</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2078</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2079</span> 
+<span class='line'>2080</span> </span><span class="NAME">IriSP.ArrowWidget.prototype.timeUpdateHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">percents</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2081</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">currentTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2082</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">currentAnnotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.currentAnnotations</span><span class="PUNC">(</span><span class="NAME">currentTime</span><span class="PUNC">)</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// FIXME : use the others ?</span><span class="WHIT">
+<span class='line'>2083</span> 
+<span class='line'>2084</span> </span><span class="WHIT">  </span><span class="COMM">/* move the arrow only if the current annotation changes */</span><span class="WHIT">
+<span class='line'>2085</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">currentAnnotation</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">this._oldAnnotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2086</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">begin</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">currentAnnotation.begin</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2087</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">end</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">currentAnnotation.end</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2088</span> 
+<span class='line'>2089</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2090</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">middle_time</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">begin</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">end</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2091</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">percents</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">middle_time</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2092</span> 
+<span class='line'>2093</span> </span><span class="WHIT">    </span><span class="COMM">// we need to apply a fix because the arrow has a certain length</span><span class="WHIT">
+<span class='line'>2094</span> </span><span class="WHIT">    </span><span class="COMM">// it's half the length of the arrow (27 / 2). We need to convert</span><span class="WHIT">
+<span class='line'>2095</span> </span><span class="WHIT">    </span><span class="COMM">// it in percents though.</span><span class="WHIT">
+<span class='line'>2096</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">totalWidth</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.selector.width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2097</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">correction</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NUMB">27</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">totalWidth</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2098</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">corrected_percents</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">percents</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">correction</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2099</span> 
+<span class='line'>2100</span> </span><span class="WHIT">    </span><span class="COMM">/* don't move out of the screen */</span><span class="WHIT">
+<span class='line'>2101</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">corrected_percents</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>2102</span> </span><span class="WHIT">      </span><span class="NAME">corrected_percents</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2103</span> 
+<span class='line'>2104</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.children</span><span class="PUNC">(</span><span class="STRN">".Ldt-arrowWidget"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">"left"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">corrected_percents</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"%"</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2105</span> 
+<span class='line'>2106</span> </span><span class="WHIT">    </span><span class="NAME">this._oldAnnotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">currentAnnotation</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2107</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2108</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2109</span> </span><span class="NAME">IriSP.PlayerWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2110</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Widget.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2111</span> </span><span class="WHIT">  
+<span class='line'>2112</span>   </span><span class="NAME">this._searchBlockOpen</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2113</span> </span><span class="WHIT">  </span><span class="NAME">this._searchLastValue</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2114</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2115</span> 
+<span class='line'>2116</span> </span><span class="NAME">IriSP.PlayerWidget.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Widget</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2117</span> 
+<span class='line'>2118</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2119</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">self</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2120</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">width</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.width</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2121</span> </span><span class="WHIT">	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">height</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.height</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2122</span> </span><span class="WHIT">	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">heightS</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.height</span><span class="PUNC">-</span><span class="NUMB">20</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2123</span> </span><span class="WHIT">	  
+<span class='line'>2124</span> 	</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">Player_templ</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">IriSP.player_template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="STRN">"share_template"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.share_template</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2125</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">Player_templ</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">		
+<span class='line'>2126</span> 	
+<span class='line'>2127</span>   </span><span class="NAME">this.selector.children</span><span class="PUNC">(</span><span class="STRN">".Ldt-controler"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">show</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2128</span> </span><span class="WHIT">    
+<span class='line'>2129</span>   </span><span class="COMM">// handle clicks by the user on the video.</span><span class="WHIT">
+<span class='line'>2130</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"play"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.playButtonUpdater</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2131</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"pause"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.playButtonUpdater</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2132</span> </span><span class="WHIT">  
+<span class='line'>2133</span>   </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"volumechange"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.muteButtonUpdater</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2134</span> 
+<span class='line'>2135</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"timeupdate"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.timeDisplayUpdater</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2136</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.matchFound"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.searchMatch</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2137</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.noMatchFound"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.searchNoMatch</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2138</span> </span><span class="WHIT">  
+<span class='line'>2139</span>   
+<span class='line'>2140</span>   </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlPlay"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">click</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.playHandler.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2141</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlNext"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">click</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2142</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlSearch"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">click</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.searchButtonHandler.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2143</span> </span><span class="WHIT">  
+<span class='line'>2144</span>   </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">'.Ldt-CtrlSound'</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">click</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.muteHandler.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2145</span> 
+<span class='line'>2146</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlPlay"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="STRN">"style"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"background-color:#CD21C24;"</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2147</span> </span><span class="WHIT">  
+<span class='line'>2148</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">searchButtonPos</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlSearch"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">position</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2149</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">searchBox</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">IriSP.search_template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">margin_left</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">searchButtonPos.left</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"px"</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2150</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">searchBox</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2151</span> </span><span class="WHIT">  
+<span class='line'>2152</span>   </span><span class="COMM">// trigger an IriSP.PlayerWidget.MouseOver to the widgets that are interested (i.e : sliderWidget)</span><span class="WHIT">
+<span class='line'>2153</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.hover</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.PlayerWidget.MouseOver"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> 
+<span class='line'>2154</span>                       </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.PlayerWidget.MouseOut"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2155</span> </span><span class="WHIT"> 
+<span class='line'>2156</span>   </span><span class="NAME">this.muteButtonUpdater</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">/* some player - jwplayer notable - save the state of the mute button between sessions */</span><span class="WHIT">
+<span class='line'>2157</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2158</span> 
+<span class='line'>2159</span> </span><span class="COMM">/* Update the elasped time div */</span><span class="WHIT">
+<span class='line'>2160</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.timeDisplayUpdater</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2161</span> </span><span class="WHIT">  
+<span class='line'>2162</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._previousSecond</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>2163</span> </span><span class="WHIT">    </span><span class="NAME">this._previousSecond</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.roundTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2164</span> </span><span class="WHIT">  
+<span class='line'>2165</span>   </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2166</span> </span><span class="WHIT">    </span><span class="COMM">/* we're still in the same second, so it's not necessary to update time */</span><span class="WHIT">
+<span class='line'>2167</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._Popcorn.roundTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">this._previousSecond</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>2168</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2169</span> </span><span class="WHIT">      
+<span class='line'>2170</span>   </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2171</span> </span><span class="WHIT">  
+<span class='line'>2172</span>   </span><span class="COMM">// we get it at each call because it may change.</span><span class="WHIT">
+<span class='line'>2173</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT"> 
+<span class='line'>2174</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">totalTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.secondsToTime</span><span class="PUNC">(</span><span class="NAME">duration</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2175</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">elapsedTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.secondsToTime</span><span class="PUNC">(</span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2176</span> </span><span class="WHIT">  
+<span class='line'>2177</span>   </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-ElapsedTime"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">html</span><span class="PUNC">(</span><span class="NAME">elapsedTime.toString</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2178</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-TotalTime"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">html</span><span class="PUNC">(</span><span class="NAME">totalTime.toString</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2179</span> </span><span class="WHIT">  </span><span class="NAME">this._previousSecond</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.roundTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2180</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2181</span> 
+<span class='line'>2182</span> </span><span class="COMM">/* update the icon of the button - separate function from playHandler
+<span class='line'>2183</span>    because in some cases (for instance, when the user directly clicks on
+<span class='line'>2184</span>    the jwplayer window) we have to change the icon without playing/pausing
+<span class='line'>2185</span> */</span><span class="WHIT">
+<span class='line'>2186</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.playButtonUpdater</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2187</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">status</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.media.paused</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2188</span> </span><span class="WHIT">  
+<span class='line'>2189</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">status</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">        
+<span class='line'>2190</span>     </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlPlay"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"title"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"Play"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2191</span> </span><span class="WHIT">   
+<span class='line'>2192</span>     </span><span class="COMM">// we use templToHTML because it has some predefined</span><span class="WHIT">
+<span class='line'>2193</span> </span><span class="WHIT">    </span><span class="COMM">// vars like where to get the images</span><span class="WHIT">
+<span class='line'>2194</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.templToHTML</span><span class="PUNC">(</span><span class="STRN">"url({{img_dir}}/play_sprite.png)"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2195</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlPlay"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"background-image"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2196</span> 
+<span class='line'>2197</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2198</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlPlay"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"title"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"Pause"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2199</span> 
+<span class='line'>2200</span> </span><span class="WHIT">    </span><span class="COMM">// we use templToHTML because it has some predefined</span><span class="WHIT">
+<span class='line'>2201</span> </span><span class="WHIT">    </span><span class="COMM">// vars like where to get the images</span><span class="WHIT">
+<span class='line'>2202</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.templToHTML</span><span class="PUNC">(</span><span class="STRN">"url({{img_dir}}/pause_sprite.png)"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2203</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlPlay"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"background-image"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2204</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">  
+<span class='line'>2205</span> 
+<span class='line'>2206</span>   </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2207</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2208</span> 
+<span class='line'>2209</span> 
+<span class='line'>2210</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.playHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2211</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">status</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.media.paused</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2212</span> </span><span class="WHIT">  
+<span class='line'>2213</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">status</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">        
+<span class='line'>2214</span>     </span><span class="NAME">this._Popcorn.play</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">   
+<span class='line'>2215</span>   </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2216</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn.pause</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2217</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">  
+<span class='line'>2218</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2219</span> 
+<span class='line'>2220</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.muteHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2221</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">this._Popcorn.muted</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">    
+<span class='line'>2222</span>       </span><span class="NAME">this._Popcorn.mute</span><span class="PUNC">(</span><span class="KEYW">true</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2223</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2224</span> </span><span class="WHIT">      </span><span class="NAME">this._Popcorn.mute</span><span class="PUNC">(</span><span class="KEYW">false</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2225</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2226</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2227</span> 
+<span class='line'>2228</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.muteButtonUpdater</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2229</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">status</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.media.muted</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2230</span> </span><span class="WHIT">  
+<span class='line'>2231</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">status</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">        
+<span class='line'>2232</span>     </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlSound"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"title"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"Unmute"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2233</span> </span><span class="WHIT">   
+<span class='line'>2234</span>     </span><span class="COMM">// we use templToHTML because it has some predefined</span><span class="WHIT">
+<span class='line'>2235</span> </span><span class="WHIT">    </span><span class="COMM">// vars like where to get the images</span><span class="WHIT">
+<span class='line'>2236</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.templToHTML</span><span class="PUNC">(</span><span class="STRN">"url({{img_dir}}/sound_sprite.png)"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2237</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlSound"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"background-image"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2238</span> 
+<span class='line'>2239</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2240</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlSound"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"title"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"Mute"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2241</span> 
+<span class='line'>2242</span> </span><span class="WHIT">    </span><span class="COMM">// we use templToHTML because it has some predefined</span><span class="WHIT">
+<span class='line'>2243</span> </span><span class="WHIT">    </span><span class="COMM">// vars like where to get the images</span><span class="WHIT">
+<span class='line'>2244</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.templToHTML</span><span class="PUNC">(</span><span class="STRN">"url({{img_dir}}/mute_sprite.png)"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2245</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-CtrlSound"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"background-image"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2246</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">  
+<span class='line'>2247</span> 
+<span class='line'>2248</span>   </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2249</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2250</span> 
+<span class='line'>2251</span> 
+<span class='line'>2252</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.searchButtonHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2253</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">self</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2254</span> 
+<span class='line'>2255</span> </span><span class="WHIT">    </span><span class="COMM">/* show the search field if it is not shown */</span><span class="WHIT">
+<span class='line'>2256</span> </span><span class="WHIT">  	</span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">this._searchBlockOpen</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">      
+<span class='line'>2257</span>       </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearch"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">show</span><span class="PUNC">(</span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2258</span> </span><span class="WHIT">      
+<span class='line'>2259</span>       </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">'background-color'</span><span class="PUNC">,</span><span class="STRN">'#fff'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2260</span> </span><span class="WHIT">      </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">focus</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2261</span> </span><span class="WHIT">      </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">'value'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this._searchLastValue</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">      
+<span class='line'>2262</span>       </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.search"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this._searchLastValue</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// trigger the search to make it more natural.</span><span class="WHIT">
+<span class='line'>2263</span> </span><span class="WHIT">      
+<span class='line'>2264</span>       </span><span class="NAME">this._searchBlockOpen</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">           
+<span class='line'>2265</span>       </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">bind</span><span class="PUNC">(</span><span class="STRN">'keyup'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.searchHandler.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2266</span> </span><span class="WHIT">      
+<span class='line'>2267</span>       </span><span class="COMM">// we need this variable because some widget can find a match in</span><span class="WHIT">
+<span class='line'>2268</span> </span><span class="WHIT">      </span><span class="COMM">// their data while at the same time other's don't. As we want the</span><span class="WHIT">
+<span class='line'>2269</span> </span><span class="WHIT">      </span><span class="COMM">// search field to become green when there's a match, we need a </span><span class="WHIT">
+<span class='line'>2270</span> </span><span class="WHIT">      </span><span class="COMM">// variable to remember that we had one.</span><span class="WHIT">
+<span class='line'>2271</span> </span><span class="WHIT">      </span><span class="NAME">this._positiveMatch</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2272</span> 
+<span class='line'>2273</span> </span><span class="WHIT">      </span><span class="COMM">// tell the world the field is open</span><span class="WHIT">
+<span class='line'>2274</span> </span><span class="WHIT">      </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.open"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2275</span> </span><span class="WHIT">      
+<span class='line'>2276</span> 	</span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2277</span> </span><span class="WHIT">      </span><span class="NAME">this._searchLastValue</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">'value'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2278</span> </span><span class="WHIT">      </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">'value'</span><span class="PUNC">,</span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2279</span> </span><span class="WHIT">      </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearch"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">hide</span><span class="PUNC">(</span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2280</span> </span><span class="WHIT">      
+<span class='line'>2281</span>       </span><span class="COMM">// unbind the watcher event.</span><span class="WHIT">
+<span class='line'>2282</span> </span><span class="WHIT">      </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">unbind</span><span class="PUNC">(</span><span class="STRN">'keypress set'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2283</span> </span><span class="WHIT">      </span><span class="NAME">this._searchBlockOpen</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2284</span> 
+<span class='line'>2285</span> </span><span class="WHIT">      </span><span class="NAME">this._positiveMatch</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2286</span> </span><span class="WHIT">      
+<span class='line'>2287</span>       </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.closed"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2288</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2289</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2290</span> 
+<span class='line'>2291</span> </span><span class="COMM">/* this handler is called whenever the content of the search
+<span class='line'>2292</span>    field changes */</span><span class="WHIT">
+<span class='line'>2293</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.searchHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2294</span> </span><span class="WHIT">  </span><span class="NAME">this._searchLastValue</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">'value'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2295</span> </span><span class="WHIT">  </span><span class="NAME">this._positiveMatch</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2296</span> </span><span class="WHIT">  
+<span class='line'>2297</span>   </span><span class="COMM">// do nothing if the search field is empty, instead of highlighting everything.</span><span class="WHIT">
+<span class='line'>2298</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._searchLastValue</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2299</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.cleared"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2300</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">'background-color'</span><span class="PUNC">,</span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2301</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2302</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.search"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this._searchLastValue</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2303</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2304</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2305</span> 
+<span class='line'>2306</span> </span><span class="COMM">/*
+<span class='line'>2307</span>   handler for the IriSP.search.found message, which is sent by some views when they
+<span class='line'>2308</span>   highlight a match.
+<span class='line'>2309</span> */</span><span class="WHIT">
+<span class='line'>2310</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.searchMatch</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2311</span> </span><span class="WHIT">  </span><span class="NAME">this._positiveMatch</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2312</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">'background-color'</span><span class="PUNC">,</span><span class="STRN">'#e1ffe1'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2313</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2314</span> 
+<span class='line'>2315</span> </span><span class="COMM">/* the same, except that no value could be found */</span><span class="WHIT">
+<span class='line'>2316</span> </span><span class="NAME">IriSP.PlayerWidget.prototype.searchNoMatch</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2317</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._positiveMatch</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>2318</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".LdtSearchInput"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">'background-color'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"#d62e3a"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2319</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2320</span> 
+<span class='line'>2321</span> </span><span class="COMM">/* 
+<span class='line'>2322</span>  *   
+<span class='line'>2323</span>  *  Copyright 2010 Institut de recherche et d'innovation 
+<span class='line'>2324</span>  *  contributor(s) : Samuel Huron 
+<span class='line'>2325</span>  *   
+<span class='line'>2326</span>  *  contact@iri.centrepompidou.fr
+<span class='line'>2327</span>  *  http://www.iri.centrepompidou.fr 
+<span class='line'>2328</span>  *   
+<span class='line'>2329</span>  *  This software is a computer program whose purpose is to show and add annotations on a video .
+<span class='line'>2330</span>  *  This software is governed by the CeCILL-C license under French law and
+<span class='line'>2331</span>  *  abiding by the rules of distribution of free software. You can  use, 
+<span class='line'>2332</span>  *  modify and/ or redistribute the software under the terms of the CeCILL-C
+<span class='line'>2333</span>  *  license as circulated by CEA, CNRS and INRIA at the following URL
+<span class='line'>2334</span>  *  "http://www.cecill.info". 
+<span class='line'>2335</span>  *  
+<span class='line'>2336</span>  *  The fact that you are presently reading this means that you have had
+<span class='line'>2337</span>  *  knowledge of the CeCILL-C license and that you accept its terms.
+<span class='line'>2338</span> */</span><span class="WHIT">
+<span class='line'>2339</span> </span><span class="COMM">// CHART TIMELINE / VERSION PROTOTYPE  ::</span><span class="WHIT">
+<span class='line'>2340</span> 
+<span class='line'>2341</span> </span><span class="NAME">IriSP.PolemicWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2342</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Widget.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2343</span> </span><span class="WHIT"> 
+<span class='line'>2344</span>   </span><span class="NAME">this.userPol</span><span class="WHIT">    </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2345</span> </span><span class="WHIT">  </span><span class="NAME">this.userNoPol</span><span class="WHIT">  </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2346</span> </span><span class="WHIT">  </span><span class="NAME">this.userst</span><span class="WHIT">      </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2347</span> </span><span class="WHIT">  </span><span class="NAME">this.numberOfTweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2348</span> </span><span class="WHIT">  </span><span class="NAME">this.Users</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2349</span> </span><span class="WHIT">  </span><span class="NAME">this.TweetPolemic</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2350</span> </span><span class="WHIT">  </span><span class="NAME">this.yMax</span><span class="WHIT">        </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.height</span><span class="PUNC">;</span><span class="WHIT"> 
+<span class='line'>2351</span>   </span><span class="NAME">this.PaperSlider</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2352</span> </span><span class="WHIT">  </span><span class="NAME">this.heightOfChart</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2353</span> </span><span class="WHIT">  </span><span class="NAME">this.tweets</span><span class="WHIT">  </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2354</span> </span><span class="WHIT">  </span><span class="NAME">this.svgElements</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2355</span> </span><span class="WHIT">  
+<span class='line'>2356</span>   </span><span class="COMM">// Make and define the Raphael area</span><span class="WHIT">
+<span class='line'>2357</span> </span><span class="WHIT">  </span><span class="NAME">this.paper</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Raphael</span><span class="PUNC">(</span><span class="NAME">document.getElementById</span><span class="PUNC">(</span><span class="NAME">this._id</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config.width</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config.height</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2358</span> </span><span class="WHIT">  
+<span class='line'>2359</span>   </span><span class="NAME">this.oldSearchMatches</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2360</span> 
+<span class='line'>2361</span> </span><span class="WHIT">  </span><span class="COMM">// event handlers</span><span class="WHIT">
+<span class='line'>2362</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.search"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">this.searchHandler</span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2363</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.closed"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.searchFieldClosedHandler</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2364</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.cleared"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.searchFieldClearedHandler</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2365</span> 
+<span class='line'>2366</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2367</span> 
+<span class='line'>2368</span> </span><span class="NAME">IriSP.PolemicWidget.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Widget</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2369</span> </span><span class="WHIT">  
+<span class='line'>2370</span> </span><span class="NAME">IriSP.PolemicWidget.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2371</span> </span><span class="WHIT">  
+<span class='line'>2372</span>     </span><span class="COMM">// variable </span><span class="WHIT">
+<span class='line'>2373</span> </span><span class="WHIT">    </span><span class="COMM">// yMax</span><span class="WHIT">
+<span class='line'>2374</span> </span><span class="WHIT">    
+<span class='line'>2375</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">self</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2376</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">yCoef</span><span class="WHIT">        </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">;</span><span class="WHIT">             </span><span class="COMM">// coef for height of 1 tweet </span><span class="WHIT">
+<span class='line'>2377</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">frameSize</span><span class="WHIT">     </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">5</span><span class="PUNC">;</span><span class="WHIT">             </span><span class="COMM">// frame size </span><span class="WHIT">
+<span class='line'>2378</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">margin</span><span class="WHIT">         </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">            </span><span class="COMM">// marge between frame</span><span class="WHIT">
+<span class='line'>2379</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">lineSize</span><span class="WHIT">      </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.width</span><span class="PUNC">;</span><span class="WHIT">        </span><span class="COMM">// timeline pixel width </span><span class="WHIT">
+<span class='line'>2380</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">nbrframes</span><span class="WHIT">     </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">lineSize</span><span class="PUNC">/</span><span class="NAME">frameSize</span><span class="PUNC">;</span><span class="WHIT">     </span><span class="COMM">// frame numbers</span><span class="WHIT">
+<span class='line'>2381</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">numberOfTweet</span><span class="WHIT">   </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">            </span><span class="COMM">// number of tweet overide later </span><span class="WHIT">
+<span class='line'>2382</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT">      </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">      </span><span class="COMM">// timescale width </span><span class="WHIT">
+<span class='line'>2383</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">frameLength</span><span class="WHIT">   </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">lineSize</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">frameSize</span><span class="PUNC">;</span><span class="WHIT">    </span><span class="COMM">// frame timescale  </span><span class="WHIT">
+<span class='line'>2384</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">timeline</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2385</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">colors</span><span class="WHIT">  </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">,</span><span class="STRN">"#1D973D"</span><span class="PUNC">,</span><span class="STRN">"#C5A62D"</span><span class="PUNC">,</span><span class="STRN">"#CE0A15"</span><span class="PUNC">,</span><span class="STRN">"#036AAE"</span><span class="PUNC">,</span><span class="STRN">"#585858"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2386</span> </span><span class="WHIT">    
+<span class='line'>2387</span>     </span><span class="COMM">// array </span><span class="WHIT">
+<span class='line'>2388</span> </span><span class="WHIT">    </span><span class="COMM">//var tweets  = new Array();</span><span class="WHIT">
+<span class='line'>2389</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">element</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2390</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">cluster</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2391</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">frames</span><span class="WHIT">  </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="NAME">frameLength</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2392</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">slices</span><span class="WHIT">  </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2393</span> </span><span class="WHIT">    
+<span class='line'>2394</span>     
+<span class='line'>2395</span>     </span><span class="COMM">// Classes =======================================================================</span><span class="WHIT">
+<span class='line'>2396</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">Frames</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2397</span> </span><span class="WHIT">      
+<span class='line'>2398</span>       </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">Myclusters</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2399</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2400</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">y</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2401</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">width</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2402</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">height</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2403</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2404</span> </span><span class="WHIT">    </span><span class="NAME">Frames</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">json</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2405</span> </span><span class="WHIT">      </span><span class="COMM">// make my clusters</span><span class="WHIT">
+<span class='line'>2406</span> </span><span class="WHIT">      </span><span class="COMM">// ou Frame vide </span><span class="WHIT">
+<span class='line'>2407</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2408</span> </span><span class="WHIT">    </span><span class="NAME">Frames.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2409</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2410</span> </span><span class="WHIT">    </span><span class="NAME">Frames.prototype.zoom</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2411</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2412</span> </span><span class="WHIT">    </span><span class="NAME">Frames.prototype.inside</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2413</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2414</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">Clusters</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2415</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">Object</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2416</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">yDist</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2417</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2418</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">y</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2419</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">width</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2420</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">height</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2421</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2422</span> </span><span class="WHIT">    </span><span class="NAME">Clusters</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">json</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2423</span> </span><span class="WHIT">      </span><span class="COMM">// make my object</span><span class="WHIT">
+<span class='line'>2424</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2425</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">Tweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2426</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2427</span> </span><span class="WHIT">    </span><span class="COMM">// Classes =======================================================================</span><span class="WHIT">
+<span class='line'>2428</span> 
+<span class='line'>2429</span> </span><span class="WHIT">    </span><span class="COMM">// Refactoring (parametere) ************************************************************</span><span class="WHIT">
+<span class='line'>2430</span> </span><span class="WHIT">    </span><span class="COMM">// color translastion</span><span class="WHIT">
+<span class='line'>2431</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">qTweet_0</span><span class="WHIT">  </span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2432</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">qTweet_Q</span><span class="WHIT">  </span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2433</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">qTweet_REF</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2434</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">qTweet_OK</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2435</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">qTweet_KO</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2436</span> </span><span class="WHIT">    </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">colorTranslation</span><span class="PUNC">(</span><span class="NAME">value</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2437</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"Q"</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2438</span> </span><span class="WHIT">        </span><span class="NAME">qTweet_Q</span><span class="PUNC">+</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2439</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2440</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="STRN">"REF"</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2441</span> </span><span class="WHIT">        </span><span class="NAME">qTweet_REF</span><span class="PUNC">+</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2442</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">4</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2443</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="STRN">"OK"</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2444</span> </span><span class="WHIT">        </span><span class="NAME">qTweet_OK</span><span class="PUNC">+</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2445</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2446</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="STRN">"KO"</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2447</span> </span><span class="WHIT">        </span><span class="NAME">qTweet_KO</span><span class="PUNC">+</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2448</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">3</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2449</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2450</span> </span><span class="WHIT">        </span><span class="NAME">qTweet_0</span><span class="PUNC">+</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2451</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NUMB">5</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2452</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2453</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2454</span> </span><span class="WHIT">    
+<span class='line'>2455</span> 
+<span class='line'>2456</span>       </span><span class="NAME">this._serializer.sync</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">loaded_callback.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">data</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2457</span> </span><span class="WHIT">      
+<span class='line'>2458</span>       </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">loaded_callback</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">json</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2459</span> 
+<span class='line'>2460</span> </span><span class="WHIT">        </span><span class="COMM">// get current view (the first ???)</span><span class="WHIT">
+<span class='line'>2461</span> </span><span class="WHIT">        </span><span class="NAME">view</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">json.views</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2462</span> </span><span class="WHIT">        
+<span class='line'>2463</span>         </span><span class="COMM">// the tweets are by definition of the second annotation type FIXME ?</span><span class="WHIT">
+<span class='line'>2464</span> </span><span class="WHIT">        </span><span class="NAME">tweet_annot_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2465</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">view.annotation_types</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">view.annotation_types.length</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2466</span> </span><span class="WHIT">          </span><span class="NAME">tweet_annot_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">view.annotation_types</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2467</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2468</span> </span><span class="WHIT">      
+<span class='line'>2469</span>       </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">json.annotations.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2470</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">item</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">json.annotations</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">        
+<span class='line'>2471</span>         </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">MyTime</span><span class="WHIT">  </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">item.begin</span><span class="PUNC">/</span><span class="NAME">duration</span><span class="PUNC">*</span><span class="NAME">lineSize</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2472</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">Myframe</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">MyTime</span><span class="PUNC">/</span><span class="NAME">lineSize</span><span class="PUNC">*</span><span class="NAME">frameLength</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2473</span> 
+<span class='line'>2474</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">item.meta</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> 
+<span class='line'>2475</span>           </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">item.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT">
+<span class='line'>2476</span> </span><span class="WHIT">          </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">item.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">tweet_annot_type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2477</span> </span><span class="WHIT">            
+<span class='line'>2478</span>           </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">MyTJson</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">JSON.parse</span><span class="PUNC">(</span><span class="NAME">item.meta</span><span class="PUNC">[</span><span class="STRN">'dc:source'</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="STRN">'content'</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2479</span> </span><span class="WHIT">          
+<span class='line'>2480</span>             </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">item.content</span><span class="PUNC">[</span><span class="STRN">'polemics'</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="WHIT"> 
+<span class='line'>2481</span>             </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">item.content</span><span class="PUNC">[</span><span class="STRN">'polemics'</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2482</span> </span><span class="WHIT">            
+<span class='line'>2483</span>               </span><span class="COMM">// a tweet can have many polemics at the same time.</span><span class="WHIT">
+<span class='line'>2484</span> </span><span class="WHIT">              </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">&lt;</span><span class="NAME">item.content</span><span class="PUNC">[</span><span class="STRN">'polemics'</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2485</span> </span><span class="WHIT">                  
+<span class='line'>2486</span>                   </span><span class="NAME">this.tweets</span><span class="PUNC">[</span><span class="NAME">numberOfTweet</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2487</span> </span><span class="WHIT">                        </span><span class="NAME">id</span><span class="PUNC">:</span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2488</span> </span><span class="WHIT">                        </span><span class="NAME">qualification</span><span class="PUNC">:</span><span class="NAME">colorTranslation</span><span class="PUNC">(</span><span class="NAME">item.content</span><span class="PUNC">[</span><span class="STRN">'polemics'</span><span class="PUNC">]</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2489</span> </span><span class="WHIT">                        </span><span class="NAME">yIndicator</span><span class="PUNC">:</span><span class="NAME">MyTime</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2490</span> </span><span class="WHIT">                        </span><span class="NAME">yframe</span><span class="PUNC">:</span><span class="NAME">Myframe</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2491</span> </span><span class="WHIT">                        </span><span class="NAME">title</span><span class="PUNC">:</span><span class="NAME">item.content</span><span class="PUNC">[</span><span class="STRN">'title'</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2492</span> </span><span class="WHIT">                        </span><span class="NAME">timeframe</span><span class="PUNC">:</span><span class="NAME">item.begin</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2493</span> </span><span class="WHIT">                        </span><span class="NAME">userId</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">MyTJson.id</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2494</span> </span><span class="WHIT">                        </span><span class="NAME">userScreenName</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">MyTJson.screen_name</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2495</span> </span><span class="WHIT">                        </span><span class="NAME">tsource</span><span class="PUNC">:</span><span class="NAME">MyTJson</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2496</span> </span><span class="WHIT">                        </span><span class="NAME">cinecast_id</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">item.id</span><span class="WHIT">
+<span class='line'>2497</span> </span><span class="WHIT">                        </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2498</span> </span><span class="WHIT">                  </span><span class="NAME">numberOfTweet</span><span class="PUNC">+</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2499</span> </span><span class="WHIT">                  
+<span class='line'>2500</span>               </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2501</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2502</span> </span><span class="WHIT">          </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2503</span> </span><span class="WHIT">            </span><span class="NAME">this.tweets</span><span class="PUNC">[</span><span class="NAME">numberOfTweet</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2504</span> </span><span class="WHIT">                  </span><span class="NAME">id</span><span class="PUNC">:</span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2505</span> </span><span class="WHIT">                  </span><span class="NAME">qualification</span><span class="PUNC">:</span><span class="NAME">colorTranslation</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2506</span> </span><span class="WHIT">                  </span><span class="NAME">yIndicator</span><span class="PUNC">:</span><span class="NAME">MyTime</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2507</span> </span><span class="WHIT">                  </span><span class="NAME">yframe</span><span class="PUNC">:</span><span class="NAME">Myframe</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2508</span> </span><span class="WHIT">                  </span><span class="NAME">title</span><span class="PUNC">:</span><span class="NAME">item.content</span><span class="PUNC">[</span><span class="STRN">'title'</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2509</span> </span><span class="WHIT">                  </span><span class="NAME">timeframe</span><span class="PUNC">:</span><span class="NAME">item.begin</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2510</span> </span><span class="WHIT">                  </span><span class="NAME">userId</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">MyTJson.id</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2511</span> </span><span class="WHIT">                  </span><span class="NAME">userScreenName</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">MyTJson.screen_name</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2512</span> </span><span class="WHIT">                  </span><span class="NAME">tsource</span><span class="PUNC">:</span><span class="NAME">MyTJson</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2513</span> </span><span class="WHIT">                  </span><span class="NAME">cinecast_id</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">item.id</span><span class="WHIT">
+<span class='line'>2514</span> </span><span class="WHIT">            </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2515</span> </span><span class="WHIT">            </span><span class="NAME">numberOfTweet</span><span class="PUNC">+</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2516</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2517</span> </span><span class="WHIT">          
+<span class='line'>2518</span>         </span><span class="PUNC">}</span><span class="WHIT"> 
+<span class='line'>2519</span>       </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>2520</span>       
+<span class='line'>2521</span>        </span><span class="NAME">DrawTweets.call</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// FIXME: ugly.</span><span class="WHIT">
+<span class='line'>2522</span> </span><span class="WHIT">       
+<span class='line'>2523</span>       </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">      
+<span class='line'>2524</span> 
+<span class='line'>2525</span>     </span><span class="COMM">// tweet Drawing (in raphael) </span><span class="WHIT">
+<span class='line'>2526</span> </span><span class="WHIT">    </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">DrawTweets</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2527</span> </span><span class="WHIT">    </span><span class="COMM">// GROUPES TWEET ============================================</span><span class="WHIT">
+<span class='line'>2528</span> </span><span class="WHIT">    </span><span class="COMM">// Count nbr of cluster and tweet in a frame an save int in "frames"</span><span class="WHIT">
+<span class='line'>2529</span> </span><span class="WHIT">      </span><span class="NAME">numberOfTweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.tweets.length</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2530</span> </span><span class="WHIT">      </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">&lt;</span><span class="NAME">nbrframes</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
+<span class='line'>2531</span>         </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">&lt;</span><span class="NAME">numberOfTweet</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
+<span class='line'>2532</span>         
+<span class='line'>2533</span>           </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="PUNC">==</span><span class="NAME">this.tweets</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">yframe</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2534</span> </span><span class="WHIT">            
+<span class='line'>2535</span>             </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.tweets</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">qualification</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2536</span> </span><span class="WHIT">            
+<span class='line'>2537</span>             </span><span class="COMM">// make array for frame cluster</span><span class="WHIT">
+<span class='line'>2538</span> </span><span class="WHIT">            </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">==</span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2539</span> </span><span class="WHIT">              </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="NAME">id</span><span class="PUNC">:</span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2540</span> </span><span class="WHIT">                     </span><span class="NAME">qualifVol</span><span class="PUNC">:</span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2541</span> </span><span class="WHIT">                     </span><span class="NAME">mytweetsID</span><span class="PUNC">:</span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>2542</span> </span><span class="WHIT">                    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2543</span> </span><span class="WHIT">            </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2544</span> </span><span class="WHIT">            </span><span class="COMM">// add my tweet to frame</span><span class="WHIT">
+<span class='line'>2545</span> </span><span class="WHIT">            </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">mytweetsID.push</span><span class="PUNC">(</span><span class="NAME">this.tweets</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2546</span> </span><span class="WHIT">            
+<span class='line'>2547</span>             </span><span class="COMM">// count opinion by frame</span><span class="WHIT">
+<span class='line'>2548</span> </span><span class="WHIT">            </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">qualifVol</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2549</span> </span><span class="WHIT">              </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">qualifVol</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2550</span> </span><span class="WHIT">            </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2551</span> </span><span class="WHIT">              </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">qualifVol</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2552</span> </span><span class="WHIT">            </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2553</span> </span><span class="WHIT">            
+<span class='line'>2554</span>           </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2555</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2556</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2557</span> </span><span class="WHIT">    
+<span class='line'>2558</span>     </span><span class="COMM">// GROUPES TWEET ============================================    </span><span class="WHIT">
+<span class='line'>2559</span> </span><span class="WHIT">    </span><span class="COMM">// max of tweet by Frame </span><span class="WHIT">
+<span class='line'>2560</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">max</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> 
+<span class='line'>2561</span>       </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">nbrframes</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2562</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">moy</span><span class="WHIT">  </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2563</span> </span><span class="WHIT">        </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">6</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">    
+<span class='line'>2564</span>           </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2565</span> </span><span class="WHIT">            </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">qualifVol</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2566</span> </span><span class="WHIT">              </span><span class="NAME">moy</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">qualifVol</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2567</span> </span><span class="WHIT">            </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2568</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2569</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2570</span> </span><span class="WHIT">        
+<span class='line'>2571</span>         </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">moy</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NAME">max</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2572</span> </span><span class="WHIT">          </span><span class="NAME">max</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">moy</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2573</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2574</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2575</span> </span><span class="WHIT">    
+<span class='line'>2576</span>       </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">tweetDrawed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Array</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2577</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">TweetHeight</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">5</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2578</span> </span><span class="WHIT">      
+<span class='line'>2579</span>       </span><span class="COMM">// DRAW  TWEETS ============================================</span><span class="WHIT">
+<span class='line'>2580</span> </span><span class="WHIT">      </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">nbrframes</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2581</span> </span><span class="WHIT">        </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">addEheight</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">5</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2582</span> </span><span class="WHIT">        </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">                
+<span class='line'>2583</span>           </span><span class="COMM">// by type </span><span class="WHIT">
+<span class='line'>2584</span> </span><span class="WHIT">          
+<span class='line'>2585</span>           </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">6</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">--</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2586</span> </span><span class="WHIT">            </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">qualifVol</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2587</span> </span><span class="WHIT">              </span><span class="COMM">// show tweet by type </span><span class="WHIT">
+<span class='line'>2588</span> </span><span class="WHIT">              </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">mytweetsID.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">k</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2589</span> </span><span class="WHIT">              
+<span class='line'>2590</span>                 </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">mytweetsID</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">qualification</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">j</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">                
+<span class='line'>2591</span>                   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">frameSize</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2592</span> </span><span class="WHIT">                  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">y</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.heightmax</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">addEheight</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2593</span> </span><span class="WHIT">                  
+<span class='line'>2594</span>                   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.yMax</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NAME">y</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2595</span> </span><span class="WHIT">                    </span><span class="NAME">this.yMax</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">y</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2596</span> </span><span class="WHIT">                  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2597</span> </span><span class="WHIT">                  
+<span class='line'>2598</span>                   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NAME">x</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">y</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">frameSize</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">margin</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">TweetHeight</span><span class="WHIT"> </span><span class="COMM">/* height */</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>2599</span> </span><span class="WHIT">                                    </span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">stroke</span><span class="PUNC">:</span><span class="STRN">"#00"</span><span class="PUNC">,</span><span class="STRN">"stroke-width"</span><span class="PUNC">:</span><span class="NUMB">0.1</span><span class="PUNC">,</span><span class="WHIT">  </span><span class="NAME">fill</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">colors</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>2600</span>                   
+<span class='line'>2601</span>                   </span><span class="NAME">addEheight</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">TweetHeight</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2602</span> </span><span class="WHIT">                  
+<span class='line'>2603</span>                   </span><span class="NAME">e.color</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">colors</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2604</span> </span><span class="WHIT">                  </span><span class="NAME">e.time</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">mytweetsID</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">timeframe</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2605</span> </span><span class="WHIT">                  </span><span class="NAME">e.title</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">mytweetsID</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">title</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2606</span> </span><span class="WHIT">                  </span><span class="NAME">e.id</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">mytweetsID</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">cinecast_id</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2607</span> 
+<span class='line'>2608</span> </span><span class="WHIT">                  </span><span class="NAME">this.svgElements</span><span class="PUNC">[</span><span class="NAME">e.id</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">e</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2609</span> 
+<span class='line'>2610</span> </span><span class="WHIT">                  </span><span class="COMM">/*
+<span class='line'>2611</span>                   e.mouseover(function(element) { return function (event) {
+<span class='line'>2612</span>                         // event.clientX and event.clientY are to raphael what event.pageX and pageY are to jquery.                        
+<span class='line'>2613</span>                         self.TooltipWidget.show.call(self.TooltipWidget, element.title, element.attr("fill"), event.clientX - 106, event.clientY - 160);
+<span class='line'>2614</span>                         element.displayed = true;
+<span class='line'>2615</span>                   }}(e)).mouseout(function(element) { return function () {                          
+<span class='line'>2616</span>                           self.TooltipWidget.hide.call(self.TooltipWidget);
+<span class='line'>2617</span>                   }}(e)).mousedown(function () {
+<span class='line'>2618</span>                     self._Popcorn.currentTime(this.time/1000);
+<span class='line'>2619</span>                     self._Popcorn.trigger("IriSP.PolemicTweet.click", this.id); 
+<span class='line'>2620</span>                   });
+<span class='line'>2621</span>                   */</span><span class="WHIT">
+<span class='line'>2622</span> </span><span class="WHIT">                  
+<span class='line'>2623</span>                   </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="NAME">e.node</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">mouseenter</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">element</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">                        
+<span class='line'>2624</span>                         </span><span class="COMM">// event.clientX and event.clientY are to raphael what event.pageX and pageY are to jquery.                        </span><span class="WHIT">
+<span class='line'>2625</span> </span><span class="WHIT">                        </span><span class="NAME">self.TooltipWidget.show.call</span><span class="PUNC">(</span><span class="NAME">self.TooltipWidget</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">element.title</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">element.attr</span><span class="PUNC">(</span><span class="STRN">"fill"</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">event.pageX</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">106</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">event.pageY</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">160</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2626</span> </span><span class="WHIT">                        </span><span class="NAME">element.displayed</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2627</span> </span><span class="WHIT">                  </span><span class="PUNC">}</span><span class="PUNC">}</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">mousedown</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">element</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">                    
+<span class='line'>2628</span>                     </span><span class="NAME">self._Popcorn.currentTime</span><span class="PUNC">(</span><span class="NAME">element.time</span><span class="PUNC">/</span><span class="NUMB">1000</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2629</span> </span><span class="WHIT">                    </span><span class="NAME">self._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.PolemicTweet.click"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">element.id</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> 
+<span class='line'>2630</span>                     </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2631</span> </span><span class="WHIT">                  </span><span class="PUNC">}</span><span class="PUNC">(</span><span class="NAME">e</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">                  
+<span class='line'>2632</span>                   
+<span class='line'>2633</span>                   </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="NAME">e.node</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">'id'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">'t'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">k</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2634</span> </span><span class="WHIT">                  </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="NAME">e.node</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">'title'</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">mytweetsID</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">title</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2635</span> </span><span class="WHIT">                  </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="NAME">e.node</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">'begin'</span><span class="PUNC">,</span><span class="WHIT">  </span><span class="NAME">frames</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">mytweetsID</span><span class="PUNC">[</span><span class="NAME">k</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">timeframe</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">                  
+<span class='line'>2636</span>                 </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2637</span> </span><span class="WHIT">              </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2638</span> </span><span class="WHIT">            </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2639</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2640</span> </span><span class="WHIT">        </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2641</span> 
+<span class='line'>2642</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">    
+<span class='line'>2643</span>       </span><span class="COMM">// DRAW UI :: resize border and bgd      </span><span class="WHIT">
+<span class='line'>2644</span> </span><span class="WHIT">      </span><span class="NAME">this.paperBackground</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.width</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.heightmax</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="STRN">"#F8F8F8"</span><span class="PUNC">,</span><span class="STRN">"stroke-width"</span><span class="PUNC">:</span><span class="NUMB">0.1</span><span class="PUNC">,</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>2645</span> 
+<span class='line'>2646</span>       </span><span class="COMM">// outer borders</span><span class="WHIT">
+<span class='line'>2647</span> </span><span class="WHIT">      </span><span class="NAME">this.outerBorders</span><span class="WHIT">   </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2648</span> </span><span class="WHIT">      </span><span class="NAME">this.outerBorders.push</span><span class="PUNC">(</span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.height</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.width</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="STRN">"#ababab"</span><span class="PUNC">,</span><span class="NAME">stroke</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"none"</span><span class="PUNC">,</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>2649</span>       </span><span class="NAME">this.outerBorders.push</span><span class="PUNC">(</span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.width</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="STRN">"#ababab"</span><span class="PUNC">,</span><span class="NAME">stroke</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"none"</span><span class="PUNC">,</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>2650</span> 
+<span class='line'>2651</span>       </span><span class="COMM">// inner borders</span><span class="WHIT">
+<span class='line'>2652</span> </span><span class="WHIT">      </span><span class="NAME">this.innerBorders</span><span class="WHIT">   </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2653</span> </span><span class="WHIT">      </span><span class="NAME">this.innerBorders.push</span><span class="PUNC">(</span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.height</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.width</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="STRN">"#efefef"</span><span class="PUNC">,</span><span class="NAME">stroke</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"none"</span><span class="PUNC">,</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>2654</span>       </span><span class="NAME">this.innerBorders.push</span><span class="PUNC">(</span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.width</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="STRN">"#efefef"</span><span class="PUNC">,</span><span class="NAME">stroke</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"none"</span><span class="PUNC">,</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>2655</span>       </span><span class="NAME">this.innerBorders.push</span><span class="PUNC">(</span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.height</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="STRN">"#d0d1d1"</span><span class="PUNC">,</span><span class="NAME">stroke</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"none"</span><span class="PUNC">,</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0.8</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>2656</span>       </span><span class="NAME">this.innerBorders.push</span><span class="PUNC">(</span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NAME">this.width</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.height</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="STRN">"#efefef"</span><span class="PUNC">,</span><span class="NAME">stroke</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"none"</span><span class="PUNC">,</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>2657</span> 
+<span class='line'>2658</span> 
+<span class='line'>2659</span> 
+<span class='line'>2660</span>       </span><span class="NAME">this.paperSlider</span><span class="WHIT">   </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.heightmax</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="STRN">"#D4D5D5"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">stroke</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"none"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2661</span> </span><span class="WHIT">      
+<span class='line'>2662</span>       </span><span class="COMM">// the small white line displayed over the slider.</span><span class="WHIT">
+<span class='line'>2663</span> </span><span class="WHIT">      </span><span class="NAME">this.sliderTip</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.paper.rect</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.heightmax</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="STRN">"#fc00ff"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">stroke</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"none"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2664</span> </span><span class="WHIT">      </span><span class="COMM">// decalage </span><span class="WHIT">
+<span class='line'>2665</span> </span><span class="WHIT">      </span><span class="COMM">// tweetSelection = this.paper.rect(-100,-100,5,5).attr({fill:"#fff",stroke: "none",opacity: 1});  </span><span class="WHIT">
+<span class='line'>2666</span> </span><span class="WHIT">      
+<span class='line'>2667</span>       
+<span class='line'>2668</span>       </span><span class="NAME">this.paperSlider.toBack</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2669</span> </span><span class="WHIT">      </span><span class="NAME">this.paperBackground.toBack</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2670</span> </span><span class="WHIT">      </span><span class="NAME">this.sliderTip.toFront</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2671</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2672</span> </span><span class="WHIT">    
+<span class='line'>2673</span>     </span><span class="NAME">this.selector.mouseleave</span><span class="PUNC">(</span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.TooltipWidget.hide.call</span><span class="PUNC">(</span><span class="NAME">self.TooltipWidget</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2674</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"timeupdate"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.sliderUpdater</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2675</span> </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2676</span> 
+<span class='line'>2677</span> </span><span class="NAME">IriSP.PolemicWidget.prototype.sliderUpdater</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2678</span> 
+<span class='line'>2679</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">time</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2680</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2681</span> </span><span class="WHIT">    
+<span class='line'>2682</span>     </span><span class="NAME">this.paperSlider.attr</span><span class="PUNC">(</span><span class="STRN">"width"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">time</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.width</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2683</span> </span><span class="WHIT">        
+<span class='line'>2684</span>     </span><span class="NAME">this.sliderTip.attr</span><span class="PUNC">(</span><span class="STRN">"x"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">time</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.width</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2685</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2686</span> </span><span class="WHIT">    
+<span class='line'>2687</span> </span><span class="NAME">IriSP.PolemicWidget.prototype.searchHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2688</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>2689</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2690</span> 
+<span class='line'>2691</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">matches</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.searchTweetsOccurences</span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2692</span> 
+<span class='line'>2693</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">IriSP.countProperties</span><span class="PUNC">(</span><span class="NAME">matches</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2694</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.matchFound"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2695</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2696</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.noMatchFound"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2697</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2698</span> 
+<span class='line'>2699</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">id</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">matches</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2700</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.svgElements.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">id</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2701</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.svgElements</span><span class="PUNC">[</span><span class="NAME">id</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2702</span> </span><span class="WHIT">      </span><span class="NAME">this.svgElements</span><span class="PUNC">[</span><span class="NAME">id</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"#fc00ff"</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2703</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2704</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2705</span> 
+<span class='line'>2706</span> </span><span class="WHIT">  </span><span class="COMM">// clean up the blocks that were in the previous search</span><span class="WHIT">
+<span class='line'>2707</span> </span><span class="WHIT">  </span><span class="COMM">// but who aren't in the current one.</span><span class="WHIT">
+<span class='line'>2708</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">id</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">this.oldSearchMatches</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2709</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">matches.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">id</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2710</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.svgElements</span><span class="PUNC">[</span><span class="NAME">id</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2711</span> </span><span class="WHIT">      </span><span class="NAME">e.attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">e.color</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2712</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2713</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2714</span> </span><span class="WHIT">  
+<span class='line'>2715</span>   </span><span class="NAME">this.oldSearchMatches</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">matches</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2716</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2717</span> 
+<span class='line'>2718</span> </span><span class="NAME">IriSP.PolemicWidget.prototype.searchFieldClearedHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2719</span> </span><span class="WHIT">  </span><span class="COMM">// clean up the blocks that were in the previous search</span><span class="WHIT">
+<span class='line'>2720</span> </span><span class="WHIT">  </span><span class="COMM">// but who aren't in the current one.</span><span class="WHIT">
+<span class='line'>2721</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">id</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">this.oldSearchMatches</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2722</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.svgElements</span><span class="PUNC">[</span><span class="NAME">id</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2723</span> </span><span class="WHIT">      </span><span class="NAME">e.attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">e.color</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2724</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2725</span> </span><span class="WHIT"> 
+<span class='line'>2726</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2727</span> 
+<span class='line'>2728</span> </span><span class="NAME">IriSP.PolemicWidget.prototype.searchFieldClosedHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2729</span> </span><span class="WHIT">  </span><span class="COMM">// clean up the blocks that were in the previous search</span><span class="WHIT">
+<span class='line'>2730</span> </span><span class="WHIT">  </span><span class="COMM">// but who aren't in the current one.</span><span class="WHIT">
+<span class='line'>2731</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">id</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">this.oldSearchMatches</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2732</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">e</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.svgElements</span><span class="PUNC">[</span><span class="NAME">id</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2733</span> </span><span class="WHIT">      </span><span class="NAME">e.attr</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">fill</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">e.color</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2734</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2735</span> </span><span class="WHIT"> 
+<span class='line'>2736</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2737</span> </span><span class="WHIT">   
+<span class='line'>2738</span> </span><span class="NAME">IriSP.SegmentsWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2739</span> 
+<span class='line'>2740</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">self</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2741</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Widget.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2742</span> </span><span class="WHIT">  </span><span class="NAME">this.oldSearchMatches</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2743</span> 
+<span class='line'>2744</span> </span><span class="WHIT">  </span><span class="COMM">// event handlers</span><span class="WHIT">
+<span class='line'>2745</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.search"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.searchHandler.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2746</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.closed"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.searchFieldClosedHandler.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2747</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.cleared"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.searchFieldClearedHandler.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2748</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2749</span> 
+<span class='line'>2750</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Widget</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2751</span> 
+<span class='line'>2752</span> </span><span class="COMM">/* Get the width of a segment, in pixels. */</span><span class="WHIT">
+<span class='line'>2753</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype.segmentToPixel</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
+<span class='line'>2754</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">begin</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.round</span><span class="PUNC">(</span><span class="PUNC">(</span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotation.begin</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2755</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">end</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.round</span><span class="PUNC">(</span><span class="PUNC">(</span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotation.end</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">    
+<span class='line'>2756</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2757</span> </span><span class="WHIT">  
+<span class='line'>2758</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">startPourcent</span><span class="WHIT"> 	</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.timeToPourcent</span><span class="PUNC">(</span><span class="NAME">begin</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2759</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">startPixel</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">this.selector.parent</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">startPourcent</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2760</span> </span><span class="WHIT">  
+<span class='line'>2761</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">endPourcent</span><span class="WHIT"> 	</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">IriSP.timeToPourcent</span><span class="PUNC">(</span><span class="NAME">end</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">startPourcent</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2762</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">endPixel</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">this.selector.parent</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">endPourcent</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2763</span> </span><span class="WHIT">  
+<span class='line'>2764</span>   </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">endPixel</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2765</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2766</span> 
+<span class='line'>2767</span> </span><span class="COMM">/* compute the total length of a group of segments */</span><span class="WHIT">
+<span class='line'>2768</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype.segmentsLength</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">segmentsList</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2769</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">self</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2770</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">total</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2771</span> </span><span class="WHIT">  
+<span class='line'>2772</span>   </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">segmentsList.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>2773</span> </span><span class="WHIT">    </span><span class="NAME">total</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">self.segmentToPixel</span><span class="PUNC">(</span><span class="NAME">segmentsList</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2774</span> </span><span class="WHIT">  
+<span class='line'>2775</span>   </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">total</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>2776</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2777</span> 
+<span class='line'>2778</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2779</span> 
+<span class='line'>2780</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">self</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2781</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer._data.annotations</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2782</span> 
+<span class='line'>2783</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.addClass</span><span class="PUNC">(</span><span class="STRN">"Ldt-SegmentsWidget"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2784</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">IriSP.overlay_marker_template</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2785</span> </span><span class="WHIT">          
+<span class='line'>2786</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">view_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.getNonTweetIds</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">    
+<span class='line'>2787</span>   
+<span class='line'>2788</span>   </span><span class="NAME">this.positionMarker</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.selector.children</span><span class="PUNC">(</span><span class="STRN">":first"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2789</span> </span><span class="WHIT">  
+<span class='line'>2790</span>   </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"timeupdate"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.positionUpdater</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2791</span> </span><span class="WHIT">  
+<span class='line'>2792</span>   
+<span class='line'>2793</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2794</span> </span><span class="WHIT">  
+<span class='line'>2795</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">segments_annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2796</span> </span><span class="WHIT">  
+<span class='line'>2797</span>   </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">annotations.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2798</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">annotations</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2799</span> 
+<span class='line'>2800</span> </span><span class="WHIT">    </span><span class="COMM">/* filter the annotations whose type is not the one we want */</span><span class="WHIT">
+<span class='line'>2801</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">view_type</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT">
+<span class='line'>2802</span> </span><span class="WHIT">          </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">view_type</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2803</span> </span><span class="WHIT">        </span><span class="KEYW">continue</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2804</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2805</span> 
+<span class='line'>2806</span> </span><span class="WHIT">    </span><span class="NAME">segments_annotations.push</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2807</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2808</span> </span><span class="WHIT">    
+<span class='line'>2809</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">totalWidth</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.selector.width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">segments_annotations.length</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2810</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">lastSegment</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.underscore.max</span><span class="PUNC">(</span><span class="NAME">segments_annotations</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">annotation.end</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2811</span> </span><span class="WHIT">  
+<span class='line'>2812</span>   </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">segments_annotations.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2813</span> </span><span class="WHIT">  
+<span class='line'>2814</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">segments_annotations</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2815</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">begin</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotation.begin</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2816</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">end</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotation.end</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2817</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2818</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">id</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">annotation.id</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2819</span> </span><span class="WHIT">        
+<span class='line'>2820</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">startPixel</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">this.selector.parent</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">begin</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2821</span> 
+<span class='line'>2822</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">endPixel</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">this.selector.parent</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">end</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2823</span> </span><span class="WHIT">    
+<span class='line'>2824</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">annotation.id</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">lastSegment.id</span><span class="PUNC">)</span><span class="WHIT"> 
+<span class='line'>2825</span>       </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">pxWidth</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">endPixel</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">startPixel</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2826</span> </span><span class="WHIT">    </span><span class="KEYW">else</span><span class="WHIT">
+<span class='line'>2827</span> </span><span class="WHIT">      </span><span class="COMM">/* the last segment has no segment following it */</span><span class="WHIT">
+<span class='line'>2828</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">pxWidth</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">endPixel</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">startPixel</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2829</span> </span><span class="WHIT"> 
+<span class='line'>2830</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">divTitle</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">annotation.content.title</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">" - "</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotation.content.description</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">substr</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NUMB">55</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2831</span> 
+<span class='line'>2832</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.content.color</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>2833</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">color</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">annotation.content.color</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2834</span> </span><span class="WHIT">    </span><span class="KEYW">else</span><span class="WHIT">
+<span class='line'>2835</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">color</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">annotation.color</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2836</span> </span><span class="WHIT">    
+<span class='line'>2837</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">hexa_color</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.DEC_HEXA_COLOR</span><span class="PUNC">(</span><span class="NAME">color</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2838</span> 
+<span class='line'>2839</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">hexa_color</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"FFCC00"</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>2840</span> </span><span class="WHIT">      </span><span class="NAME">hexa_color</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">"333"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2841</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">hexa_color.length</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NUMB">4</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>2842</span> </span><span class="WHIT">      </span><span class="NAME">hexa_color</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">hexa_color</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'00'</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2843</span> </span><span class="WHIT">    
+<span class='line'>2844</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotationTemplate</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">IriSP.annotation_template</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2845</span> </span><span class="WHIT">        </span><span class="PUNC">{</span><span class="STRN">"divTitle"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">divTitle</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"id"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">id</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"startPixel"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">startPixel</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2846</span> </span><span class="WHIT">        </span><span class="STRN">"pxWidth"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">pxWidth</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"hexa_color"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">hexa_color</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2847</span> </span><span class="WHIT">        </span><span class="STRN">"seekPlace"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">Math.round</span><span class="PUNC">(</span><span class="NAME">begin</span><span class="PUNC">/</span><span class="NUMB">1000</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2848</span> 
+<span class='line'>2849</span> </span><span class="WHIT">        
+<span class='line'>2850</span>     </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">annotationTemplate</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2851</span> </span><span class="WHIT">    
+<span class='line'>2852</span>     </span><span class="COMM">/* add a special class to the last segment and change its border */</span><span class="WHIT">
+<span class='line'>2853</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">annotation.id</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">lastSegment.id</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2854</span> </span><span class="WHIT">        </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">id</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">addClass</span><span class="PUNC">(</span><span class="STRN">"Ldt-lastSegment"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">        
+<span class='line'>2855</span>         </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-lastSegment"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"border-color"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">hexa_color</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">        
+<span class='line'>2856</span>     </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2857</span> 
+<span class='line'>2858</span> </span><span class="WHIT">    </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">id</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">fadeTo</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0.3</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2859</span> 
+<span class='line'>2860</span> </span><span class="WHIT">    </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">id</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">mouseover</span><span class="PUNC">(</span><span class="WHIT">
+<span class='line'>2861</span> </span><span class="WHIT">    </span><span class="COMM">/* we wrap the handler in another function because js's scoping
+<span class='line'>2862</span>        rules are function-based - otherwise, the internal vars like
+<span class='line'>2863</span>        divTitle are preserved but they are looked-up from the draw
+<span class='line'>2864</span>        method scope, so after that the loop is run, so they're not
+<span class='line'>2865</span>        preserved */</span><span class="WHIT">
+<span class='line'>2866</span> </span><span class="WHIT">    </span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">divTitle</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> 
+<span class='line'>2867</span>      </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2868</span> </span><span class="WHIT">          </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0.6</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">5</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2869</span> </span><span class="WHIT">          </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">offset</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">offset</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2870</span> </span><span class="WHIT">          </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">correction</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">outerWidth</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2871</span> 
+<span class='line'>2872</span> </span><span class="WHIT">          </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">offset_x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">offset.left</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">correction</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">106</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2873</span> </span><span class="WHIT">          </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">offset_x</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>2874</span> </span><span class="WHIT">            </span><span class="NAME">offset_x</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2875</span> </span><span class="WHIT">                    
+<span class='line'>2876</span>           </span><span class="NAME">self.TooltipWidget.show</span><span class="PUNC">(</span><span class="NAME">divTitle</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">color</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">offset_x</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">event.pageY</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">160</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2877</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">(</span><span class="NAME">divTitle</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">mouseout</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2878</span> </span><span class="WHIT">      </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0.3</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">5</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2879</span> </span><span class="WHIT">      </span><span class="NAME">self.TooltipWidget.hide</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2880</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2881</span> 
+<span class='line'>2882</span> </span><span class="WHIT">    </span><span class="NAME">IriSP.jQuery</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">id</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">click</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">_this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2883</span> </span><span class="WHIT">                                    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">_this.clickHandler</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2884</span> </span><span class="WHIT">                                 </span><span class="PUNC">}</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2885</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2886</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2887</span> 
+<span class='line'>2888</span> </span><span class="COMM">/* restores the view after a search */</span><span class="WHIT">
+<span class='line'>2889</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype.clear</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2890</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.children</span><span class="PUNC">(</span><span class="STRN">".Ldt-iri-chapter"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="NUMB">0.3</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2891</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2892</span> 
+<span class='line'>2893</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype.clickHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2894</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.SegmentsWidget.click"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">annotation.id</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2895</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">begin</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">annotation.begin</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2896</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="NAME">Math.round</span><span class="PUNC">(</span><span class="NAME">begin</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2897</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2898</span> 
+<span class='line'>2899</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype.searchHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2900</span> 
+<span class='line'>2901</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>2902</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2903</span> 
+<span class='line'>2904</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">matches</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.searchOccurences</span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2905</span> 
+<span class='line'>2906</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">IriSP.countProperties</span><span class="PUNC">(</span><span class="NAME">matches</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2907</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.matchFound"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2908</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2909</span> </span><span class="WHIT">    </span><span class="NAME">this._Popcorn.trigger</span><span class="PUNC">(</span><span class="STRN">"IriSP.search.noMatchFound"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2910</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2911</span> 
+<span class='line'>2912</span> </span><span class="WHIT">  </span><span class="COMM">// un-highlight all the blocks</span><span class="WHIT">
+<span class='line'>2913</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.children</span><span class="PUNC">(</span><span class="STRN">".Ldt-iri-chapter"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"opacity"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">0.1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2914</span> </span><span class="WHIT"> 
+<span class='line'>2915</span>   </span><span class="COMM">// then highlight the ones with matches.</span><span class="WHIT">
+<span class='line'>2916</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">id</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">matches</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2917</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">factor</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0.5</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">matches</span><span class="PUNC">[</span><span class="NAME">id</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NUMB">0.2</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2918</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="PUNC">+</span><span class="NAME">id</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">dequeue</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2919</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">"#"</span><span class="PUNC">+</span><span class="NAME">id</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">opacity</span><span class="PUNC">:</span><span class="NAME">factor</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">200</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2920</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>2921</span> 
+<span class='line'>2922</span> </span><span class="WHIT"> 
+<span class='line'>2923</span>   </span><span class="NAME">this.oldSearchMatches</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">matches</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2924</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2925</span> 
+<span class='line'>2926</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype.searchFieldClearedHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2927</span> </span><span class="WHIT">  </span><span class="NAME">this.clear</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2928</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2929</span> 
+<span class='line'>2930</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype.searchFieldClosedHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2931</span> </span><span class="WHIT">  </span><span class="NAME">this.clear</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2932</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2933</span> 
+<span class='line'>2934</span> </span><span class="NAME">IriSP.SegmentsWidget.prototype.positionUpdater</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
+<span class='line'>2935</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2936</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">time</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2937</span> </span><span class="WHIT">  </span><span class="COMM">//var position 	= ((time / duration) * 100).toFixed(2);</span><span class="WHIT">
+<span class='line'>2938</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">position</span><span class="WHIT"> 	</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">time</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">toFixed</span><span class="PUNC">(</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2939</span> 
+<span class='line'>2940</span> </span><span class="WHIT">  </span><span class="NAME">this.positionMarker.css</span><span class="PUNC">(</span><span class="STRN">"left"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">position</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"%"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>2941</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2942</span> </span><span class="NAME">IriSP.SliderWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2943</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Widget.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2944</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2945</span> 
+<span class='line'>2946</span> </span><span class="NAME">IriSP.SliderWidget.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Widget</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2947</span> 
+<span class='line'>2948</span> </span><span class="NAME">IriSP.SliderWidget.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2949</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">self</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2950</span> 
+<span class='line'>2951</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">IriSP.sliderWidget_template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2952</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.addClass</span><span class="PUNC">(</span><span class="STRN">"Ldt-SliderMinimized"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2953</span> 
+<span class='line'>2954</span> </span><span class="WHIT">  </span><span class="NAME">this.sliderBackground</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-sliderBackground"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2955</span> </span><span class="WHIT">  </span><span class="NAME">this.sliderForeground</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-sliderForeground"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2956</span> </span><span class="WHIT">  </span><span class="NAME">this.positionMarker</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-sliderPositionMarker"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2957</span> 
+<span class='line'>2958</span> 
+<span class='line'>2959</span> </span><span class="WHIT">  </span><span class="COMM">// a special variable to stop methods from tinkering</span><span class="WHIT">
+<span class='line'>2960</span> </span><span class="WHIT">  </span><span class="COMM">// with the positionMarker when the user is dragging it</span><span class="WHIT">
+<span class='line'>2961</span> </span><span class="WHIT">  </span><span class="NAME">this.draggingOngoing</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2962</span> 
+<span class='line'>2963</span> </span><span class="WHIT">  </span><span class="COMM">// another special variable used by the timeout handler to</span><span class="WHIT">
+<span class='line'>2964</span> </span><span class="WHIT">  </span><span class="COMM">// open or close the slider.</span><span class="WHIT">
+<span class='line'>2965</span> </span><span class="WHIT">  </span><span class="NAME">this.sliderMaximized</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2966</span> </span><span class="WHIT">  </span><span class="NAME">this.timeOutId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2967</span> 
+<span class='line'>2968</span> </span><span class="WHIT">  
+<span class='line'>2969</span>   </span><span class="NAME">this.positionMarker.draggable</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="NAME">axis</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"x"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2970</span> </span><span class="WHIT">  </span><span class="NAME">start</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.positionMarkerDraggingStartedHandler</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2971</span> </span><span class="WHIT">  </span><span class="NAME">stop</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.positionMarkerDraggedHandler</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>2972</span> </span><span class="WHIT">  </span><span class="NAME">containment</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"parent"</span><span class="WHIT">
+<span class='line'>2973</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2974</span> </span><span class="WHIT">  </span><span class="NAME">this.positionMarker.css</span><span class="PUNC">(</span><span class="STRN">"position"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"absolute"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2975</span> </span><span class="WHIT">  
+<span class='line'>2976</span>   </span><span class="NAME">this.sliderBackground.click</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.backgroundClickHandler.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">event</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2977</span> </span><span class="WHIT">  </span><span class="NAME">this.sliderForeground.click</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">self.foregroundClickHandler.call</span><span class="PUNC">(</span><span class="NAME">self</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">event</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2978</span> 
+<span class='line'>2979</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.hover</span><span class="PUNC">(</span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.mouseOverHandler</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.mouseOutHandler</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2980</span> 
+<span class='line'>2981</span> </span><span class="WHIT">  </span><span class="COMM">// update the positions</span><span class="WHIT">
+<span class='line'>2982</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"timeupdate"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.sliderUpdater</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2983</span> 
+<span class='line'>2984</span> </span><span class="WHIT">  </span><span class="COMM">// special messages :</span><span class="WHIT">
+<span class='line'>2985</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.PlayerWidget.MouseOver"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.mouseOverHandler</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2986</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.PlayerWidget.MouseOut"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.mouseOutHandler</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2987</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2988</span> 
+<span class='line'>2989</span> </span><span class="COMM">/* update the slider and the position marker as time passes */</span><span class="WHIT">
+<span class='line'>2990</span> </span><span class="NAME">IriSP.SliderWidget.prototype.sliderUpdater</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>2991</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">this.draggingOngoing</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">this._disableUpdate</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>2992</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2993</span> </span><span class="WHIT">  
+<span class='line'>2994</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">time</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2995</span> 
+<span class='line'>2996</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2997</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">percent</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">time</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">toFixed</span><span class="PUNC">(</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>2998</span> </span><span class="WHIT">  
+<span class='line'>2999</span>   </span><span class="COMM">/* we do these complicated calculations to center exactly
+<span class='line'>3000</span>      the position Marker */</span><span class="WHIT">
+<span class='line'>3001</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">pixels_to_percents</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">this.selector.width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">/* how much is a pixel in percents */</span><span class="WHIT">
+<span class='line'>3002</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">positionMarker_width</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.positionMarker.width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3003</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">correction</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">pixels_to_percents</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">positionMarker_width</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3004</span> 
+<span class='line'>3005</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">newPos</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">percent</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">correction</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3006</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">newPos</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>3007</span> </span><span class="WHIT">    </span><span class="NAME">newPos</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3008</span> </span><span class="WHIT">  
+<span class='line'>3009</span> 	</span><span class="NAME">this.sliderForeground.css</span><span class="PUNC">(</span><span class="STRN">"width"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">percent</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"%"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3010</span> </span><span class="WHIT">	</span><span class="NAME">this.positionMarker.css</span><span class="PUNC">(</span><span class="STRN">"left"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">newPos</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"%"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3011</span> 
+<span class='line'>3012</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3013</span> 
+<span class='line'>3014</span> </span><span class="NAME">IriSP.SliderWidget.prototype.backgroundClickHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3015</span> </span><span class="WHIT">  </span><span class="COMM">/* this piece of code is a little bit convoluted - here's how it works :
+<span class='line'>3016</span>      we want to handle clicks on the progress bar and convert those to seeks in the media.
+<span class='line'>3017</span>      However, jquery only gives us a global position, and we want a number of pixels relative
+<span class='line'>3018</span>      to our container div, so we get the parent position, and compute an offset to this position,
+<span class='line'>3019</span>      and finally compute the progress ratio in the media.
+<span class='line'>3020</span>      Finally we multiply this ratio with the duration to get the correct time
+<span class='line'>3021</span>   */</span><span class="WHIT">
+<span class='line'>3022</span> 
+<span class='line'>3023</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">parentOffset</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.sliderBackground.parent</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">offset</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3024</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">width</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.sliderBackground.width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3025</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">relX</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">event.pageX</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">parentOffset.left</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3026</span> 
+<span class='line'>3027</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3028</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">newTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">relX</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">width</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">toFixed</span><span class="PUNC">(</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3029</span> 
+<span class='line'>3030</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="NAME">newTime</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3031</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3032</span> 
+<span class='line'>3033</span> </span><span class="COMM">/* same function as the previous one, except that it handles clicks
+<span class='line'>3034</span>    on the foreground element */</span><span class="WHIT">
+<span class='line'>3035</span> </span><span class="NAME">IriSP.SliderWidget.prototype.foregroundClickHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3036</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">parentOffset</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.sliderForeground.parent</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">offset</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3037</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">width</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.sliderBackground.width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3038</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">relX</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">event.pageX</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">parentOffset.left</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3039</span> 
+<span class='line'>3040</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3041</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">newTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">relX</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">width</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">toFixed</span><span class="PUNC">(</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3042</span> 
+<span class='line'>3043</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="NAME">newTime</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3044</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3045</span> 
+<span class='line'>3046</span> </span><span class="COMM">/* handles mouse over the slider */</span><span class="WHIT">
+<span class='line'>3047</span> </span><span class="NAME">IriSP.SliderWidget.prototype.mouseOverHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3048</span> </span><span class="WHIT">  
+<span class='line'>3049</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.timeOutId</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3050</span> </span><span class="WHIT">    </span><span class="NAME">window.clearTimeout</span><span class="PUNC">(</span><span class="NAME">this.timeOutId</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3051</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3052</span> </span><span class="WHIT"> 
+<span class='line'>3053</span>   </span><span class="NAME">this.sliderMaximized</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3054</span> 
+<span class='line'>3055</span> </span><span class="WHIT">  </span><span class="NAME">this.sliderBackground.animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">"height"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"9px"</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3056</span> </span><span class="WHIT">  </span><span class="NAME">this.sliderForeground.animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">"height"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"9px"</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3057</span> </span><span class="WHIT">  </span><span class="NAME">this.positionMarker.animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">"height"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"9px"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"width"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"9px"</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3058</span> </span><span class="WHIT">  </span><span class="COMM">//this.positionMarker.css("margin-top", "-4px");</span><span class="WHIT">
+<span class='line'>3059</span> </span><span class="WHIT">  
+<span class='line'>3060</span> </span><span class="COMM">//  this.selector.removeClass("Ldt-SliderMinimized");</span><span class="WHIT">
+<span class='line'>3061</span> </span><span class="COMM">//  this.selector.addClass("Ldt-SliderMaximized");</span><span class="WHIT">
+<span class='line'>3062</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3063</span> 
+<span class='line'>3064</span> </span><span class="COMM">/* handles when the mouse leaves the slider */</span><span class="WHIT">
+<span class='line'>3065</span> </span><span class="NAME">IriSP.SliderWidget.prototype.mouseOutHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3066</span> 
+<span class='line'>3067</span> </span><span class="WHIT">  </span><span class="NAME">this.timeOutId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">window.setTimeout</span><span class="PUNC">(</span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.minimizeOnTimeout</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>3068</span> </span><span class="WHIT">                                     </span><span class="NAME">IriSP.widgetsDefaults.SliderWidget.minimize_period</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3069</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3070</span> 
+<span class='line'>3071</span> </span><span class="NAME">IriSP.SliderWidget.prototype.minimizeOnTimeout</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3072</span> </span><span class="WHIT">  </span><span class="NAME">this.sliderBackground.animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">"height"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"5px"</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3073</span> </span><span class="WHIT">  </span><span class="NAME">this.sliderForeground.animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">"height"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"5px"</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3074</span> </span><span class="WHIT">  </span><span class="NAME">this.positionMarker.animate</span><span class="PUNC">(</span><span class="PUNC">{</span><span class="STRN">"height"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"5px"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"width"</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">"5px"</span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">100</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3075</span> </span><span class="WHIT">  </span><span class="NAME">this.positionMarker.css</span><span class="PUNC">(</span><span class="STRN">"margin-top"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"0px"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3076</span> </span><span class="WHIT">  </span><span class="NAME">this.sliderMinimized</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3077</span> </span><span class="WHIT">  
+<span class='line'>3078</span> </span><span class="COMM">//  this.selector.removeClass("Ldt-SliderMaximized");</span><span class="WHIT">
+<span class='line'>3079</span> </span><span class="COMM">//  this.selector.addClass("Ldt-SliderMinimized");</span><span class="WHIT">
+<span class='line'>3080</span> 
+<span class='line'>3081</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3082</span> 
+<span class='line'>3083</span> </span><span class="COMM">// called when the user starts dragging the position indicator</span><span class="WHIT">
+<span class='line'>3084</span> </span><span class="NAME">IriSP.SliderWidget.prototype.positionMarkerDraggingStartedHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">ui</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
+<span class='line'>3085</span>   </span><span class="NAME">this.draggingOngoing</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3086</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3087</span> 
+<span class='line'>3088</span> </span><span class="NAME">IriSP.SliderWidget.prototype.positionMarkerDraggedHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">event</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">ui</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">   
+<span class='line'>3089</span>   </span><span class="NAME">this._disableUpdate</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// disable slider position updates while dragging is ongoing.</span><span class="WHIT">
+<span class='line'>3090</span> </span><span class="WHIT">  </span><span class="NAME">window.setTimeout</span><span class="PUNC">(</span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="NAME">this._disableUpdate</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">500</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3091</span> 
+<span class='line'>3092</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">parentOffset</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.sliderForeground.parent</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">offset</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3093</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">width</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.sliderBackground.width</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3094</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">relX</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">event.pageX</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">parentOffset.left</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3095</span> 
+<span class='line'>3096</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer.currentMedia</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">meta</span><span class="PUNC">[</span><span class="STRN">"dc:duration"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3097</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">newTime</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">relX</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">width</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">duration</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">toFixed</span><span class="PUNC">(</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3098</span> 
+<span class='line'>3099</span> </span><span class="WHIT">  </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="NAME">newTime</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3100</span> </span><span class="WHIT">  
+<span class='line'>3101</span>   </span><span class="NAME">this.draggingOngoing</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3102</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3103</span> 
+<span class='line'>3104</span> </span><span class="COMM">/* this widget displays a small tooltip */</span><span class="WHIT">
+<span class='line'>3105</span> </span><span class="NAME">IriSP.TooltipWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3106</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Widget.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3107</span> </span><span class="WHIT">  </span><span class="NAME">this._shown</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3108</span> </span><span class="WHIT">  </span><span class="NAME">this._displayedText</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3109</span> </span><span class="WHIT">  </span><span class="NAME">this._hideTimeout</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3110</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3111</span> 
+<span class='line'>3112</span> 
+<span class='line'>3113</span> </span><span class="NAME">IriSP.TooltipWidget.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Widget</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3114</span> 
+<span class='line'>3115</span> </span><span class="NAME">IriSP.TooltipWidget.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3116</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">templ</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="NAME">IriSP.tooltipWidget_template</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3117</span> 
+<span class='line'>3118</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">templ</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3119</span> </span><span class="WHIT">  </span><span class="NAME">this.hide</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3120</span> 
+<span class='line'>3121</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3122</span> 
+<span class='line'>3123</span> </span><span class="NAME">IriSP.TooltipWidget.prototype.clear</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3124</span> </span><span class="WHIT">	</span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".tiptext"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">text</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3125</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3126</span> 
+<span class='line'>3127</span> </span><span class="NAME">IriSP.TooltipWidget.prototype.show</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">text</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">color</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">y</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3128</span> 
+<span class='line'>3129</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._displayedText</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="NAME">text</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>3130</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3131</span> </span><span class="WHIT">  
+<span class='line'>3132</span>   </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".tipcolor"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"background-color"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">color</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3133</span> </span><span class="WHIT">  </span><span class="NAME">this._displayedText</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">text</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3134</span> </span><span class="WHIT">	</span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".tiptext"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">text</span><span class="PUNC">(</span><span class="NAME">text</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3135</span> </span><span class="WHIT">  </span><span class="COMM">//this.selector.find(".tip").css("left", x).css("top", y);  </span><span class="WHIT">
+<span class='line'>3136</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".tip"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"left"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">x</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">css</span><span class="PUNC">(</span><span class="STRN">"top"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">y</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3137</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".tip"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">show</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3138</span> </span><span class="WHIT">  </span><span class="NAME">this._shown</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3139</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3140</span> 
+<span class='line'>3141</span> </span><span class="NAME">IriSP.TooltipWidget.prototype.hide</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">                                                   
+<span class='line'>3142</span>   </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".tip"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">hide</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3143</span> </span><span class="WHIT">  </span><span class="NAME">this._shown</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>3144</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="COMM">/* a widget that displays tweet - used in conjunction with the polemicWidget */</span><span class="WHIT">
+<span class='line'>3145</span> 
+<span class='line'>3146</span> </span><span class="NAME">IriSP.TweetsWidget</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3147</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Widget.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Popcorn</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">config</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">Serializer</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3148</span> 
+<span class='line'>3149</span> </span><span class="WHIT">  </span><span class="NAME">this._displayingTweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3150</span> </span><span class="WHIT">  </span><span class="NAME">this._timeoutId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>3151</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3152</span> 
+<span class='line'>3153</span> 
+<span class='line'>3154</span> </span><span class="NAME">IriSP.TweetsWidget.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Widget</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3155</span> 
+<span class='line'>3156</span> 
+<span class='line'>3157</span> </span><span class="NAME">IriSP.TweetsWidget.prototype.drawTweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3158</span> </span><span class="WHIT">    
+<span class='line'>3159</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">title</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.formatTweet</span><span class="PUNC">(</span><span class="NAME">annotation.content.title</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3160</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">img</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">annotation.content.img.src</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3161</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">img</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">img</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">""</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">img</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"None"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3162</span> </span><span class="WHIT">      </span><span class="NAME">img</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.widgetsDefaults.TweetsWidget.default_profile_picture</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3163</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3164</span> 
+<span class='line'>3165</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">imageMarkup</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.templToHTML</span><span class="PUNC">(</span><span class="STRN">"&lt;img src='{{src}}' alt='user image'>&lt;/img>"</span><span class="PUNC">,</span><span class="WHIT"> 
+<span class='line'>3166</span>                                        </span><span class="PUNC">{</span><span class="NAME">src</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">img</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3167</span> </span><span class="WHIT">    
+<span class='line'>3168</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"dc:source"</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">content</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3169</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">tweetContents</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">JSON.parse</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"dc:source"</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">content</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3170</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">creator</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">tweetContents.user.screen_name</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3171</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">real_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">tweetContents.user.name</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3172</span> 
+<span class='line'>3173</span> </span><span class="WHIT">      </span><span class="NAME">imageMarkup</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.templToHTML</span><span class="PUNC">(</span><span class="STRN">"&lt;a href='http://twitter.com/{{creator}}'>&lt;img src='{{src}}' alt='user image'>&lt;/img>&lt;/a>"</span><span class="PUNC">,</span><span class="WHIT"> 
+<span class='line'>3174</span>                                        </span><span class="PUNC">{</span><span class="NAME">src</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">img</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">creator</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">creator</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3175</span> </span><span class="WHIT">            
+<span class='line'>3176</span>       </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">formatted_date</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">Date</span><span class="PUNC">(</span><span class="NAME">tweetContents.created_at</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">toLocaleDateString</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3177</span> </span><span class="WHIT">      </span><span class="NAME">title</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.templToHTML</span><span class="PUNC">(</span><span class="STRN">"&lt;a class='Ldt-tweet_userHandle' href='http://twitter.com/{{creator}}'>@{{creator}}&lt;/a> - "</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> 
+<span class='line'>3178</span>                                 </span><span class="STRN">"&lt;div class='Ldt-tweet_realName'>{{real_name}}&lt;/div>"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
+<span class='line'>3179</span> </span><span class="WHIT">                                </span><span class="STRN">"&lt;div class='Ldt-tweet_tweetContents'>{{{ contents }}}&lt;/div>"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
+<span class='line'>3180</span> </span><span class="WHIT">                                </span><span class="STRN">"&lt;div class='Ldt-tweet_date'>{{ date }}&lt;/div>"</span><span class="PUNC">,</span><span class="WHIT"> 
+<span class='line'>3181</span>                                 </span><span class="PUNC">{</span><span class="NAME">creator</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">creator</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">real_name</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">real_name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">contents</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">title</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">date</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">formatted_date</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3182</span> 
+<span class='line'>3183</span> </span><span class="WHIT">      </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-TweetReply"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"href"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"http://twitter.com/home?status=@"</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">creator</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">":%20"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3184</span> 
+<span class='line'>3185</span> 
+<span class='line'>3186</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">rtText</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Mustache.to_html</span><span class="PUNC">(</span><span class="STRN">"http://twitter.com/home?status=RT @{{creator}}: {{text}}"</span><span class="PUNC">,</span><span class="WHIT">
+<span class='line'>3187</span> </span><span class="WHIT">                                    </span><span class="PUNC">{</span><span class="NAME">creator</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">creator</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">text</span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.encodeURI</span><span class="PUNC">(</span><span class="NAME">annotation.content.title</span><span class="PUNC">)</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3188</span> </span><span class="WHIT">      </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-Retweet"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">attr</span><span class="PUNC">(</span><span class="STRN">"href"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">rtText</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3189</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3190</span> 
+<span class='line'>3191</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-tweetContents"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">html</span><span class="PUNC">(</span><span class="NAME">title</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3192</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-tweetAvatar"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">html</span><span class="PUNC">(</span><span class="NAME">imageMarkup</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3193</span> </span><span class="WHIT">    </span><span class="NAME">this.selector.show</span><span class="PUNC">(</span><span class="STRN">"blind"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">250</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> 
+<span class='line'>3194</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3195</span> 
+<span class='line'>3196</span> </span><span class="NAME">IriSP.TweetsWidget.prototype.displayTweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3197</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._displayingTweet</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3198</span> </span><span class="WHIT">    </span><span class="NAME">this._displayingTweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3199</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3200</span> </span><span class="WHIT">    </span><span class="NAME">window.clearTimeout</span><span class="PUNC">(</span><span class="NAME">this._timeoutId</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3201</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3202</span> 
+<span class='line'>3203</span> </span><span class="WHIT">  </span><span class="NAME">this.drawTweet</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3204</span> 
+<span class='line'>3205</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">time</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._Popcorn.currentTime</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>3206</span>   </span><span class="NAME">this._timeoutId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">window.setTimeout</span><span class="PUNC">(</span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.clearPanel</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.widgetsDefaults.TweetsWidget.tweet_display_period</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3207</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3208</span> 
+<span class='line'>3209</span> 
+<span class='line'>3210</span> </span><span class="NAME">IriSP.TweetsWidget.prototype.clearPanel</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
+<span class='line'>3211</span>     </span><span class="NAME">this._displayingTweet</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3212</span> </span><span class="WHIT">    </span><span class="NAME">this._timeoutId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3213</span> </span><span class="WHIT">    </span><span class="NAME">this.closePanel</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3214</span> </span><span class="WHIT">    
+<span class='line'>3215</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3216</span> 
+<span class='line'>3217</span> </span><span class="NAME">IriSP.TweetsWidget.prototype.closePanel</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3218</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._timeoutId</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3219</span> </span><span class="WHIT">      </span><span class="COMM">/* we're called from the "close window" link */</span><span class="WHIT">
+<span class='line'>3220</span> </span><span class="WHIT">      </span><span class="COMM">/* cancel the timeout */</span><span class="WHIT">
+<span class='line'>3221</span> </span><span class="WHIT">      </span><span class="NAME">window.clearTimeout</span><span class="PUNC">(</span><span class="NAME">this._timeoutId</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3222</span> </span><span class="WHIT">      </span><span class="NAME">this._timeoutId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3223</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3224</span> </span><span class="WHIT">    
+<span class='line'>3225</span>     </span><span class="NAME">this.selector.hide</span><span class="PUNC">(</span><span class="STRN">"blind"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">400</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3226</span> </span><span class="WHIT">    
+<span class='line'>3227</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3228</span> 
+<span class='line'>3229</span> </span><span class="COMM">/* cancel the timeout if the user clicks on the keep panel open button */</span><span class="WHIT">
+<span class='line'>3230</span> </span><span class="NAME">IriSP.TweetsWidget.prototype.keepPanel</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3231</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this._timeoutId</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">undefined</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3232</span> </span><span class="WHIT">      </span><span class="COMM">/* we're called from the "close window" link */</span><span class="WHIT">
+<span class='line'>3233</span> </span><span class="WHIT">      </span><span class="COMM">/* cancel the timeout */</span><span class="WHIT">
+<span class='line'>3234</span> </span><span class="WHIT">      </span><span class="NAME">window.clearTimeout</span><span class="PUNC">(</span><span class="NAME">this._timeoutId</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3235</span> </span><span class="WHIT">      </span><span class="NAME">this._timeoutId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3236</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3237</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3238</span> 
+<span class='line'>3239</span> </span><span class="NAME">IriSP.TweetsWidget.prototype.draw</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3240</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_this</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3241</span> </span><span class="WHIT">  
+<span class='line'>3242</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">tweetMarkup</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.templToHTML</span><span class="PUNC">(</span><span class="NAME">IriSP.tweetWidget_template</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="STRN">"share_template"</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">IriSP.share_template</span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3243</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.append</span><span class="PUNC">(</span><span class="NAME">tweetMarkup</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3244</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.hide</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3245</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-tweetWidgetMinimize"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">click</span><span class="PUNC">(</span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.closePanel</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3246</span> </span><span class="WHIT">  </span><span class="NAME">this.selector.find</span><span class="PUNC">(</span><span class="STRN">".Ldt-tweetWidgetKeepOpen"</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">click</span><span class="PUNC">(</span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.keepPanel</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3247</span> </span><span class="WHIT">  
+<span class='line'>3248</span>   </span><span class="NAME">this._Popcorn.listen</span><span class="PUNC">(</span><span class="STRN">"IriSP.PolemicTweet.click"</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">IriSP.wrap</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.PolemicTweetClickHandler</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3249</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3250</span> 
+<span class='line'>3251</span> </span><span class="NAME">IriSP.TweetsWidget.prototype.PolemicTweetClickHandler</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">tweet_id</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
+<span class='line'>3252</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">index</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">annotation</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3253</span> </span><span class="WHIT">  </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">index</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">this._serializer._data.annotations</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3254</span> </span><span class="WHIT">    </span><span class="NAME">annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._serializer._data.annotations</span><span class="PUNC">[</span><span class="NAME">index</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3255</span> </span><span class="WHIT">    
+<span class='line'>3256</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">annotation.id</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">tweet_id</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>3257</span> </span><span class="WHIT">      </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3258</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3259</span> </span><span class="WHIT">    
+<span class='line'>3260</span>   </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">annotation.id</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">tweet_id</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>3261</span> </span><span class="WHIT">      </span><span class="COMM">/* we haven't found it */</span><span class="WHIT">
+<span class='line'>3262</span> </span><span class="WHIT">      </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3263</span> </span><span class="WHIT">  
+<span class='line'>3264</span>   </span><span class="NAME">this.displayTweet</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3265</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3266</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3267</span> 
+<span class='line'>3268</span> </span><span class="NAME">IriSP.JSONSerializer</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">DataLoader</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">url</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3269</span> </span><span class="WHIT">  </span><span class="NAME">IriSP.Serializer.call</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">DataLoader</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">url</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3270</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3271</span> 
+<span class='line'>3272</span> </span><span class="NAME">IriSP.JSONSerializer.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">IriSP.Serializer</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3273</span> 
+<span class='line'>3274</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.serialize</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3275</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">JSON.stringify</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3276</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3277</span> 
+<span class='line'>3278</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.deserialize</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3279</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">JSON.parse</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3280</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3281</span> 
+<span class='line'>3282</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.sync</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">callback</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3283</span> </span><span class="WHIT">  </span><span class="COMM">/* we don't have to do much because jQuery handles json for us */</span><span class="WHIT">
+<span class='line'>3284</span> 
+<span class='line'>3285</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">self</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3286</span> 
+<span class='line'>3287</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">fn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">      
+<span class='line'>3288</span>       </span><span class="NAME">self._data</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">data</span><span class="PUNC">;</span><span class="WHIT">      
+<span class='line'>3289</span>       </span><span class="COMM">// sort the data too     </span><span class="WHIT">
+<span class='line'>3290</span> </span><span class="WHIT">      </span><span class="NAME">self._data</span><span class="PUNC">[</span><span class="STRN">"annotations"</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">sort</span><span class="PUNC">(</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">)</span><span class="WHIT"> 
+<span class='line'>3291</span>           </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">a_begin</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">a.begin</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3292</span> </span><span class="WHIT">            </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">b_begin</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="NAME">b.begin</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3293</span> </span><span class="WHIT">            </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a_begin</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">b_begin</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3294</span> </span><span class="WHIT">          </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3295</span> </span><span class="WHIT">     
+<span class='line'>3296</span>       </span><span class="NAME">callback</span><span class="PUNC">(</span><span class="NAME">data</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">      
+<span class='line'>3297</span>   </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3298</span> </span><span class="WHIT">  
+<span class='line'>3299</span>   </span><span class="NAME">this._DataLoader.get</span><span class="PUNC">(</span><span class="NAME">this._url</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">fn</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3300</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3301</span> 
+<span class='line'>3302</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.currentMedia</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">  
+<span class='line'>3303</span>   </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this._data.medias</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">/* FIXME: don't hardcode it */</span><span class="WHIT">
+<span class='line'>3304</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3305</span> 
+<span class='line'>3306</span> </span><span class="COMM">/* this function searches for an annotation which matches title, description and keyword 
+<span class='line'>3307</span>    "" matches any field. 
+<span class='line'>3308</span>    Note: it ignores tweets.
+<span class='line'>3309</span> */</span><span class="WHIT">    
+<span class='line'>3310</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.searchAnnotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">title</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">description</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">keyword</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3311</span> </span><span class="WHIT">    </span><span class="COMM">/* we can have many types of annotations. We want search to only look for regular segments */</span><span class="WHIT">
+<span class='line'>3312</span> </span><span class="WHIT">    </span><span class="COMM">/* the next two lines are a bit verbose because for some test data, _serializer.data.view is either
+<span class='line'>3313</span>        null or undefined.
+<span class='line'>3314</span>     */</span><span class="WHIT">
+<span class='line'>3315</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">view</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3316</span> 
+<span class='line'>3317</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">this._data.views</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">this._data.views</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>3318</span> </span><span class="WHIT">       </span><span class="NAME">view</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._data.views</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3319</span> 
+<span class='line'>3320</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">searchViewType</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3321</span> 
+<span class='line'>3322</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">view</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">view.annotation_types</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">view.annotation_types.length</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3323</span> </span><span class="WHIT">            </span><span class="NAME">searchViewType</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">view.annotation_types</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3324</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3325</span> 
+<span class='line'>3326</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">filterfn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3327</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">searchViewType</span><span class="WHIT">  </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> 
+<span class='line'>3328</span>           </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> 
+<span class='line'>3329</span>           </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT">
+<span class='line'>3330</span> </span><span class="WHIT">          </span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">searchViewType</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3331</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// don't pass</span><span class="WHIT">
+<span class='line'>3332</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3333</span> </span><span class="WHIT">          </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3334</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3335</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3336</span> 
+<span class='line'>3337</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.searchAnnotationsFilter</span><span class="PUNC">(</span><span class="NAME">title</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">description</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">keyword</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">filterfn</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3338</span> 
+<span class='line'>3339</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3340</span> 
+<span class='line'>3341</span> </span><span class="COMM">/* only look for tweets */</span><span class="WHIT">
+<span class='line'>3342</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.searchTweets</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">title</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">description</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">keyword</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3343</span> </span><span class="WHIT">    </span><span class="COMM">/* we can have many types of annotations. We want search to only look for regular segments */</span><span class="WHIT">
+<span class='line'>3344</span> </span><span class="WHIT">    </span><span class="COMM">/* the next two lines are a bit verbose because for some test data, _serializer.data.view is either
+<span class='line'>3345</span>        null or undefined.
+<span class='line'>3346</span>     */</span><span class="WHIT">
+<span class='line'>3347</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">view</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3348</span> 
+<span class='line'>3349</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">this._data.views</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">this._data.views</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>3350</span> </span><span class="WHIT">       </span><span class="NAME">view</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._data.views</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3351</span> 
+<span class='line'>3352</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">searchViewType</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3353</span> 
+<span class='line'>3354</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">view</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">view.annotation_types</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">view.annotation_types.length</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3355</span> </span><span class="WHIT">            </span><span class="NAME">searchViewType</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">view.annotation_types</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3356</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3357</span> 
+<span class='line'>3358</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">filterfn</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3359</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="NAME">searchViewType</span><span class="WHIT">  </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> 
+<span class='line'>3360</span>           </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> 
+<span class='line'>3361</span>           </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT">
+<span class='line'>3362</span> </span><span class="WHIT">          </span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">searchViewType</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3363</span> </span><span class="WHIT">        </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">false</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// pass</span><span class="WHIT">
+<span class='line'>3364</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3365</span> </span><span class="WHIT">          </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">true</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3366</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3367</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3368</span> 
+<span class='line'>3369</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.searchAnnotationsFilter</span><span class="PUNC">(</span><span class="NAME">title</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">description</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">keyword</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">filterfn</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3370</span> 
+<span class='line'>3371</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3372</span> 
+<span class='line'>3373</span> </span><span class="COMM">/*
+<span class='line'>3374</span>   the previous function call this one, which is more general:
+<span class='line'>3375</span>  */</span><span class="WHIT">    
+<span class='line'>3376</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.searchAnnotationsFilter</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">title</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">description</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">keyword</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">filter</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3377</span> 
+<span class='line'>3378</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">rTitle</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3379</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">rDescription</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3380</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">rKeyword</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3381</span> </span><span class="WHIT">    </span><span class="COMM">/* match anything if given the empty string */</span><span class="WHIT">
+<span class='line'>3382</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">title</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>3383</span> </span><span class="WHIT">      </span><span class="NAME">title</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">".*"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3384</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">description</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>3385</span> </span><span class="WHIT">      </span><span class="NAME">description</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">".*"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3386</span> </span><span class="WHIT">    </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">keyword</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>3387</span> </span><span class="WHIT">      </span><span class="NAME">keyword</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">".*"</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3388</span> </span><span class="WHIT">    
+<span class='line'>3389</span>     </span><span class="NAME">rTitle</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="NAME">title</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"i"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>3390</span>     </span><span class="NAME">rDescription</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="NAME">description</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"i"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>3391</span>     </span><span class="NAME">rKeyword</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">RegExp</span><span class="PUNC">(</span><span class="NAME">keyword</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"i"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">  
+<span class='line'>3392</span>     
+<span class='line'>3393</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ret_array</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3394</span> </span><span class="WHIT">    
+<span class='line'>3395</span>     </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3396</span> </span><span class="WHIT">    </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">this._data.annotations</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3397</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._data.annotations</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3398</span> </span><span class="WHIT">      
+<span class='line'>3399</span>       </span><span class="COMM">/* filter the annotations whose type is not the one we want */</span><span class="WHIT">
+<span class='line'>3400</span> </span><span class="WHIT">      </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">filter</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3401</span> </span><span class="WHIT">          </span><span class="KEYW">continue</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3402</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3403</span> </span><span class="WHIT">      
+<span class='line'>3404</span>       </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">rTitle.test</span><span class="PUNC">(</span><span class="NAME">annotation.content.title</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> 
+<span class='line'>3405</span>           </span><span class="NAME">rDescription.test</span><span class="PUNC">(</span><span class="NAME">annotation.content.description</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3406</span> </span><span class="WHIT">          </span><span class="COMM">/* FIXME : implement keyword support */</span><span class="WHIT">
+<span class='line'>3407</span> </span><span class="WHIT">          </span><span class="NAME">ret_array.push</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3408</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3409</span> </span><span class="WHIT">    </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3410</span> </span><span class="WHIT">    
+<span class='line'>3411</span>     </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">ret_array</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3412</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3413</span> 
+<span class='line'>3414</span> </span><span class="COMM">/* breaks a string in words and searches each of these words. Returns an array
+<span class='line'>3415</span>    of objects with the id of the annotation and its number of occurences.
+<span class='line'>3416</span>    
+<span class='line'>3417</span>    FIXME: optimize ? seems to be n^2 in the worst case.
+<span class='line'>3418</span> */</span><span class="WHIT">
+<span class='line'>3419</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.searchOccurences</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3420</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3421</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">keywords</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">searchString.split</span><span class="PUNC">(</span><span class="REGX">/\s+/</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3422</span> </span><span class="WHIT">  
+<span class='line'>3423</span>   </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">keywords</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3424</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">keyword</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">keywords</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3425</span> </span><span class="WHIT">    
+<span class='line'>3426</span>     </span><span class="COMM">// search this keyword in descriptions and title</span><span class="WHIT">
+<span class='line'>3427</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">found_annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="WHIT">
+<span class='line'>3428</span> </span><span class="WHIT">    </span><span class="NAME">found_annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">found_annotations.concat</span><span class="PUNC">(</span><span class="NAME">this.searchAnnotations</span><span class="PUNC">(</span><span class="NAME">keyword</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3429</span> </span><span class="WHIT">    </span><span class="NAME">found_annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">found_annotations.concat</span><span class="PUNC">(</span><span class="NAME">this.searchAnnotations</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">keyword</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3430</span> </span><span class="WHIT">    
+<span class='line'>3431</span>     </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">found_annotations</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3432</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">current_annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">found_annotations</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3433</span> </span><span class="WHIT">      
+<span class='line'>3434</span>       </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">ret.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">current_annotation.id</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3435</span> </span><span class="WHIT">        </span><span class="NAME">ret</span><span class="PUNC">[</span><span class="NAME">current_annotation.id</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3436</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3437</span> </span><span class="WHIT">        </span><span class="NAME">ret</span><span class="PUNC">[</span><span class="NAME">current_annotation.id</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3438</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3439</span> </span><span class="WHIT">      
+<span class='line'>3440</span>     </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3441</span> 
+<span class='line'>3442</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3443</span> </span><span class="WHIT">  
+<span class='line'>3444</span>   </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3445</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3446</span> 
+<span class='line'>3447</span> </span><span class="COMM">/* breaks a string in words and searches each of these words. Returns an array
+<span class='line'>3448</span>    of objects with the id of the annotation and its number of occurences.
+<span class='line'>3449</span>    
+<span class='line'>3450</span>    FIXME: optimize ? seems to be n^2 in the worst case.
+<span class='line'>3451</span> */</span><span class="WHIT">
+<span class='line'>3452</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.searchTweetsOccurences</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">searchString</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3453</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3454</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">keywords</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">searchString.split</span><span class="PUNC">(</span><span class="REGX">/\s+/</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3455</span> </span><span class="WHIT">  
+<span class='line'>3456</span>   </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">keywords</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3457</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">keyword</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">keywords</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3458</span> </span><span class="WHIT">    
+<span class='line'>3459</span>     </span><span class="COMM">// search this keyword in descriptions and title</span><span class="WHIT">
+<span class='line'>3460</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">found_annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="WHIT">
+<span class='line'>3461</span> </span><span class="WHIT">    </span><span class="NAME">found_annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">found_annotations.concat</span><span class="PUNC">(</span><span class="NAME">this.searchTweets</span><span class="PUNC">(</span><span class="NAME">keyword</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3462</span> </span><span class="WHIT">    </span><span class="NAME">found_annotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">found_annotations.concat</span><span class="PUNC">(</span><span class="NAME">this.searchTweets</span><span class="PUNC">(</span><span class="STRN">""</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">keyword</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3463</span> </span><span class="WHIT">    
+<span class='line'>3464</span>     </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">j</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">found_annotations</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3465</span> </span><span class="WHIT">      </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">current_annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">found_annotations</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3466</span> </span><span class="WHIT">      
+<span class='line'>3467</span>       </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">ret.hasOwnProperty</span><span class="PUNC">(</span><span class="NAME">current_annotation.id</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3468</span> </span><span class="WHIT">        </span><span class="NAME">ret</span><span class="PUNC">[</span><span class="NAME">current_annotation.id</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3469</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3470</span> </span><span class="WHIT">        </span><span class="NAME">ret</span><span class="PUNC">[</span><span class="NAME">current_annotation.id</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3471</span> </span><span class="WHIT">      </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3472</span> </span><span class="WHIT">      
+<span class='line'>3473</span>     </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3474</span> 
+<span class='line'>3475</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3476</span> </span><span class="WHIT">  
+<span class='line'>3477</span>   </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">ret</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3478</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3479</span> 
+<span class='line'>3480</span> </span><span class="COMM">/* takes the currentTime and returns all the annotations that are displayable at the moment 
+<span class='line'>3481</span>    NB: only takes account the first type of annotations - ignores tweets 
+<span class='line'>3482</span>    currentTime is in seconds.
+<span class='line'>3483</span>  */</span><span class="WHIT">
+<span class='line'>3484</span> 
+<span class='line'>3485</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.currentAnnotations</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">currentTime</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3486</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">view</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3487</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">currentTimeMs</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1000</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">currentTime</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3488</span> 
+<span class='line'>3489</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">this._data.views</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">this._data.views</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>3490</span> </span><span class="WHIT">     </span><span class="NAME">view</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._data.views</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3491</span> 
+<span class='line'>3492</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">view_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">""</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3493</span> 
+<span class='line'>3494</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">view</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">view.annotation_types</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">view.annotation_types.length</span><span class="WHIT"> </span><span class="PUNC">>=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3495</span> </span><span class="WHIT">          </span><span class="NAME">view_type</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">view.annotation_types</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3496</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3497</span> 
+<span class='line'>3498</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ret_array</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3499</span> </span><span class="WHIT">  
+<span class='line'>3500</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3501</span> </span><span class="WHIT"> 
+<span class='line'>3502</span>   </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="KEYW">in</span><span class="WHIT"> </span><span class="NAME">this._data.annotations</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3503</span> </span><span class="WHIT">    </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">annotation</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this._data.annotations</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3504</span> </span><span class="WHIT">    
+<span class='line'>3505</span>     </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">annotation.meta</span><span class="PUNC">[</span><span class="STRN">"id-ref"</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">view_type</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">annotation.begin</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NAME">currentTimeMs</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">annotation.end</span><span class="WHIT"> </span><span class="PUNC">>=</span><span class="WHIT"> </span><span class="NAME">currentTimeMs</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>3506</span> </span><span class="WHIT">      </span><span class="NAME">ret_array.push</span><span class="PUNC">(</span><span class="NAME">annotation</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3507</span> </span><span class="WHIT">  </span><span class="PUNC">}</span><span class="WHIT">
+<span class='line'>3508</span> 
+<span class='line'>3509</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">ret_array</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3510</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3511</span> 
+<span class='line'>3512</span> 
+<span class='line'>3513</span> </span><span class="COMM">/* this function returns a list of ids of tweet lines */</span><span class="WHIT">
+<span class='line'>3514</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.getTweetIds</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3515</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">this._data.lists</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">this._data.lists</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>3516</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3517</span> 
+<span class='line'>3518</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">tweetsId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3519</span> </span><span class="WHIT">  
+<span class='line'>3520</span>   </span><span class="COMM">/* first get the list containing the tweets */</span><span class="WHIT">
+<span class='line'>3521</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">tweets</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.underscore.filter</span><span class="PUNC">(</span><span class="NAME">this._data.lists</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">entry</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">entry.id.indexOf</span><span class="PUNC">(</span><span class="STRN">"tweet"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3522</span> </span><span class="WHIT">  
+<span class='line'>3523</span>   </span><span class="COMM">// FIXME: collect tweets from multiple sources ?</span><span class="WHIT">
+<span class='line'>3524</span> </span><span class="WHIT">  </span><span class="NAME">tweetsId</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.underscore.pluck</span><span class="PUNC">(</span><span class="NAME">tweets</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">items</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"id-ref"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3525</span> 
+<span class='line'>3526</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">tweetsId</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3527</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3528</span> 
+<span class='line'>3529</span> </span><span class="COMM">/* this function returns a list of lines which are not tweet lines */</span><span class="WHIT">
+<span class='line'>3530</span> </span><span class="NAME">IriSP.JSONSerializer.prototype.getNonTweetIds</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
+<span class='line'>3531</span> </span><span class="WHIT">  </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">this._data.lists</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"undefined"</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">this._data.lists</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT">
+<span class='line'>3532</span> </span><span class="WHIT">    </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3533</span> </span><span class="WHIT">  
+<span class='line'>3534</span>   </span><span class="COMM">/* get all the ids */</span><span class="WHIT">
+<span class='line'>3535</span> </span><span class="WHIT">  </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">ids</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">IriSP.underscore.map</span><span class="PUNC">(</span><span class="NAME">this._data.lists</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">entry</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">                                                         
+<span class='line'>3536</span>                                                          </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">IriSP.underscore.pluck</span><span class="PUNC">(</span><span class="NAME">entry.items</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">"id-ref"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3537</span> </span><span class="WHIT">                                                         
+<span class='line'>3538</span>   </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">illegal_values</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.getTweetIds</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3539</span> </span><span class="WHIT">  </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">IriSP.underscore.difference</span><span class="PUNC">(</span><span class="NAME">ids</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">illegal_values</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3540</span> </span><span class="WHIT">  
+<span class='line'>3541</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
+<span class='line'>3542</span> </span></pre></body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/templates/jsdoc/allclasses.tmpl	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,17 @@
+<div align="center">{+new Link().toFile("index.html").withText("Class Index")+}
+| {+new Link().toFile("files.html").withText("File Index")+}</div>
+<hr />
+<h2>Classes</h2>
+<ul class="classList">
+	<for each="thisClass" in="data">
+	<li>{!
+		if (thisClass.alias == "_global_") {
+			output += "<i>"+new Link().toClass(thisClass.alias)+"</i>";
+		}
+		else {
+			output += new Link().toClass(thisClass.alias);
+		}
+	!}</li>
+	</for>
+</ul>
+<hr />
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/templates/jsdoc/allfiles.tmpl	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,56 @@
+<!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" xml:lang="en" lang="en">
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset={+IO.encoding+}" />
+		{! Link.base = ""; /* all generated links will be relative to this */ !}
+		<title>JsDoc Reference - File Index</title>
+		<meta name="generator" content="JsDoc Toolkit" />
+		
+		<style type="text/css">
+		{+include("static/default.css")+}
+		</style>
+	</head>
+	
+	<body>
+		{+include("static/header.html")+}
+		
+		<div id="index">
+			{+publish.classesIndex+}
+		</div>
+		
+		<div id="content">
+			<h1 class="classTitle">File Index</h1>
+			
+			<for each="item" in="data">
+			<div>
+				<h2>{+new Link().toSrc(item.alias).withText(item.name)+}</h2>
+				<if test="item.desc">{+resolveLinks(item.desc)+}</if>
+				<dl>
+					<if test="item.author">
+						<dt class="heading">Author:</dt>
+						<dd>{+item.author+}</dd>
+					</if>
+					<if test="item.version">
+						<dt class="heading">Version:</dt>
+							<dd>{+item.version+}</dd>
+					</if>
+					{! var locations = item.comment.getTag('location').map(function($){return $.toString().replace(/(^\$ ?| ?\$$)/g, '').replace(/^HeadURL: https:/g, 'http:');}) !}
+					<if test="locations.length">
+						<dt class="heading">Location:</dt>
+							<for each="location" in="locations">
+							<dd><a href="{+location+}">{+location+}</a></dd>
+							</for>
+					</if>
+				</dl>
+			</div>
+			<hr />
+			</for>
+			
+		</div>
+		<div class="fineprint" style="clear:both">
+			<if test="JSDOC.opt.D.copyright">&copy;{+JSDOC.opt.D.copyright+}<br /></if>
+			Documentation generated by <a href="http://code.google.com/p/jsdoc-toolkit/" target="_blankt">JsDoc Toolkit</a> {+JSDOC.VERSION+} on {+new Date()+}
+		</div>
+	</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/templates/jsdoc/class.tmpl	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,649 @@
+<!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" xml:lang="en" lang="en">
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset={+IO.encoding+}" />
+		<meta name="generator" content="JsDoc Toolkit" />
+		{! Link.base = "../"; /* all generated links will be relative to this */ !}
+		<title>JsDoc Reference - {+data.alias+}</title>
+
+		<style type="text/css">
+			{+include("static/default.css")+}
+		</style>
+	</head>
+
+	<body>
+<!-- ============================== header ================================= -->	
+		<!-- begin static/header.html -->
+		{+include("static/header.html")+}
+		<!-- end static/header.html -->
+
+<!-- ============================== classes index ============================ -->
+		<div id="index">
+			<!-- begin publish.classesIndex -->
+			{+publish.classesIndex+}
+			<!-- end publish.classesIndex -->
+		</div>
+		
+		<div id="content">
+<!-- ============================== class title ============================ -->
+			<h1 class="classTitle">
+				{!
+					var classType = "";
+					
+					if (data.isBuiltin()) {
+						classType += "Built-In ";
+					}
+					
+					if (data.isNamespace) {
+						if (data.is('FUNCTION')) {
+							classType += "Function ";
+						}
+						classType += "Namespace ";
+					}
+					else {
+						classType += "Class ";
+					}
+				!}
+				{+classType+}{+data.alias+}
+			</h1>
+
+<!-- ============================== class summary ========================== -->			
+			<p class="description">
+				<if test="data.version"><br />Version
+					{+ data.version +}.<br />
+				</if>
+				<if test="data.augments.length"><br />Extends
+					{+
+						data.augments
+						.sort()
+						.map(
+							function($) { return new Link().toSymbol($); }
+						)
+						.join(", ")
+					+}.<br />
+				</if>
+			
+				{+resolveLinks(data.classDesc)+}
+				
+				<if test="!data.isBuiltin()">{# isn't defined in any file #}
+					<br /><i>Defined in: </i> {+new Link().toSrc(data.srcFile)+}.
+				</if>
+			</p>
+
+<!-- ============================== constructor summary ==================== -->			
+			<if test="!data.isBuiltin() && (data.isNamespace || data.is('CONSTRUCTOR'))">
+			<table class="summaryTable" cellspacing="0" summary="A summary of the constructor documented in the class {+data.alias+}.">
+				<caption>{+classType+}Summary</caption>
+				<thead>
+					<tr>
+						<th scope="col">Constructor Attributes</th>
+						<th scope="col">Constructor Name and Description</th>
+					</tr>
+				</thead>
+				<tbody>
+					<tr>
+						<td class="attributes">{!
+							if (data.isPrivate) output += "&lt;private&gt; ";
+							if (data.isInner) output += "&lt;inner&gt; ";
+						!}&nbsp;</td>
+						<td class="nameDescription" {!if (data.comment.getTag("hilited").length){output += 'style="color: red"'}!}>
+							<div class="fixedFont">
+								<b>{+ new Link().toSymbol(data.alias).inner('constructor')+}</b><if test="classType != 'Namespace '">{+ makeSignature(data.params) +}</if>
+							</div>
+							<div class="description">{+resolveLinks(summarize(data.desc))+}</div>
+						</td>
+					</tr>
+				</tbody>
+			</table>
+			</if>
+
+<!-- ============================== properties summary ===================== -->
+			<if test="data.properties.length">
+				{! var ownProperties = data.properties.filter(function($){return $.memberOf == data.alias && !$.isNamespace}).sort(makeSortby("name")); !}
+				<if test="ownProperties.length">
+				<table class="summaryTable" cellspacing="0" summary="A summary of the fields documented in the class {+data.alias+}.">
+					<caption>Field Summary</caption>
+					<thead>
+						<tr>
+							<th scope="col">Field Attributes</th>
+							<th scope="col">Field Name and Description</th>
+						</tr>
+					</thead>
+					<tbody>
+					<for each="member" in="ownProperties">
+						<tr>
+							<td class="attributes">{!
+								if (member.isPrivate) output += "&lt;private&gt; ";
+								if (member.isInner) output += "&lt;inner&gt; ";
+								if (member.isStatic) output += "&lt;static&gt; ";
+								if (member.isConstant) output += "&lt;constant&gt; ";
+							!}&nbsp;</td>
+							<td class="nameDescription">
+								<div class="fixedFont">
+								<if test="member.isStatic && member.memberOf != '_global_'">{+member.memberOf+}.</if><b>{+new Link().toSymbol(member.alias).withText(member.name)+}</b>
+								</div>
+								<div class="description">{+resolveLinks(summarize(member.desc))+}</div>
+							</td>
+						</tr>
+					</for>
+					</tbody>
+				</table>
+				</if>
+				
+				<if test="data.inheritsFrom.length">
+				<dl class="inheritsList">
+				{!
+					var borrowedMembers = data.properties.filter(function($) {return $.memberOf != data.alias});
+					
+					var contributers = [];
+					borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)});
+					for (var i = 0, l = contributers.length; i < l; i++) {
+						output +=
+							"<dt>Fields borrowed from class "+new Link().toSymbol(contributers[i])+": </dt>"
+							+
+							"<dd>" +
+							borrowedMembers
+							.filter(
+								function($) { return $.memberOf == contributers[i] }
+							)
+							.sort(makeSortby("name"))
+							.map(
+								function($) { return new Link().toSymbol($.alias).withText($.name) }
+							)
+							.join(", ")
+							+
+							"</dd>";
+					}
+				!}
+				</dl>
+				</if>
+			</if>
+
+<!-- ============================== methods summary ======================== -->
+			<if test="data.methods.length">
+				{! var ownMethods = data.methods.filter(function($){return $.memberOf == data.alias  && !$.isNamespace}).sort(makeSortby("name")); !}
+				<if test="ownMethods.length">
+				<table class="summaryTable" cellspacing="0" summary="A summary of the methods documented in the class {+data.alias+}.">
+					<caption>Method Summary</caption>
+					<thead>
+						<tr>
+							<th scope="col">Method Attributes</th>
+							<th scope="col">Method Name and Description</th>
+						</tr>
+					</thead>
+					<tbody>
+					<for each="member" in="ownMethods">
+						<tr>
+							<td class="attributes">{!
+								if (member.isPrivate) output += "&lt;private&gt; ";
+								if (member.isInner) output += "&lt;inner&gt; ";
+								if (member.isStatic) output += "&lt;static&gt; ";
+							!}&nbsp;</td>
+							<td class="nameDescription">
+								<div class="fixedFont"><if test="member.isStatic && member.memberOf != '_global_'">{+member.memberOf+}.</if><b>{+new Link().toSymbol(member.alias).withText(member.name.replace(/\^\d+$/, ''))+}</b>{+makeSignature(member.params)+}
+								</div>
+								<div class="description">{+resolveLinks(summarize(member.desc))+}</div>
+							</td>
+						</tr>
+					</for>
+					</tbody>
+				</table>
+				</if>
+				
+				<if test="data.inheritsFrom.length">
+				<dl class="inheritsList">
+				{!
+					var borrowedMembers = data.methods.filter(function($) {return $.memberOf != data.alias});
+					var contributers = [];
+					borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)});
+					for (var i = 0, l = contributers.length; i < l; i++) {
+						output +=
+							"<dt>Methods borrowed from class "+new Link().toSymbol(contributers[i])+": </dt>"
+							+
+							"<dd>" +
+							borrowedMembers
+							.filter(
+								function($) { return $.memberOf == contributers[i] }
+							)
+							.sort(makeSortby("name"))
+							.map(
+								function($) { return new Link().toSymbol($.alias).withText($.name) }
+							)
+							.join(", ")
+							+
+							"</dd>";
+					}
+				
+				!}
+				</dl>
+				</if>
+			</if>
+<!-- ============================== events summary ======================== -->
+			<if test="data.events.length">
+				{! var ownEvents = data.events.filter(function($){return $.memberOf == data.alias  && !$.isNamespace}).sort(makeSortby("name")); !}
+				<if test="ownEvents.length">
+				<table class="summaryTable" cellspacing="0" summary="A summary of the events documented in the class {+data.alias+}.">
+					<caption>Event Summary</caption>
+					<thead>
+						<tr>
+							<th scope="col">Event Attributes</th>
+							<th scope="col">Event Name and Description</th>
+						</tr>
+					</thead>
+					<tbody>
+					<for each="member" in="ownEvents">
+						<tr>
+							<td class="attributes">{!
+								if (member.isPrivate) output += "&lt;private&gt; ";
+								if (member.isInner) output += "&lt;inner&gt; ";
+								if (member.isStatic) output += "&lt;static&gt; ";
+							!}&nbsp;</td>
+							<td class="nameDescription">
+								<div class="fixedFont"><if test="member.isStatic && member.memberOf != '_global_'">{+member.memberOf+}.</if><b>{+new Link().toSymbol(member.alias).withText(member.name)+}</b>{+makeSignature(member.params)+}
+								</div>
+								<div class="description">{+resolveLinks(summarize(member.desc))+}</div>
+							</td>
+						</tr>
+					</for>
+					</tbody>
+				</table>
+				</if>
+				
+				<if test="data.inheritsFrom.length">
+				<dl class="inheritsList">
+				{!
+					var borrowedMembers = data.events.filter(function($) {return $.memberOf != data.alias});
+					var contributers = [];
+					borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)});
+					for (var i = 0, l = contributers.length; i < l; i++) {
+						output +=
+							"<dt>Events borrowed from class "+new Link().toSymbol(contributers[i])+": </dt>"
+							+
+							"<dd>" +
+							borrowedMembers
+							.filter(
+								function($) { return $.memberOf == contributers[i] }
+							)
+							.sort(makeSortby("name"))
+							.map(
+								function($) { return new Link().toSymbol($.alias).withText($.name) }
+							)
+							.join(", ")
+							+
+							"</dd>";
+					}
+				
+				!}
+				</dl>
+				</if>
+			</if>
+
+<!-- ============================== constructor details ==================== -->		
+			<if test="!data.isBuiltin() && (data.isNamespace || data.is('CONSTRUCTOR'))">
+			<div class="details"><a name="constructor"> </a>
+				<div class="sectionTitle">
+					{+classType+}Detail
+				</div>
+				
+				<div class="fixedFont">{!
+					if (data.isPrivate) output += "&lt;private&gt; ";
+					if (data.isInner) output += "&lt;inner&gt; ";
+				!}
+						<b>{+ data.alias +}</b><if test="classType != 'Namespace '">{+ makeSignature(data.params) +}</if>
+				</div>
+				
+				<div class="description">
+					{+resolveLinks(data.desc)+}
+					<if test="data.author"><br /><i>Author: </i>{+data.author+}.</if>
+				</div>
+				
+				<if test="data.example.length">
+				<for each="example" in="data.example">
+				<pre class="code">{+example+}</pre>
+				</for>
+				</if>
+				
+				
+					<if test="data.params.length">
+						<dl class="detailList">
+						<dt class="heading">Parameters:</dt>
+						<for each="item" in="data.params">
+							<dt>
+								{+((item.type)?""+("<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type)+"}</span> ")) : "")+} <b>{+item.name+}</b>
+								<if test="item.isOptional"><i>Optional<if test="item.defaultValue">, Default: {+item.defaultValue+}</if></i></if>
+							</dt>
+								<dd>{+resolveLinks(item.desc)+}</dd>
+						</for>
+						</dl>
+					</if>
+					<if test="data.deprecated">
+						<dl class="detailList">
+						<dt class="heading">Deprecated:</dt>
+						<dt>
+							{+resolveLinks(data.deprecated)+}
+						</dt>
+						</dl>
+					</if>
+					<if test="data.since">
+						<dl class="detailList">
+						<dt class="heading">Since:</dt>
+							<dd>{+ data.since +}</dd>
+						</dl>
+					</if>
+					<if test="data.exceptions.length">
+						<dl class="detailList">
+						<dt class="heading">Throws:</dt>
+						<for each="item" in="data.exceptions">
+							<dt>
+								{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+} <b>{+item.name+}</b>
+							</dt>
+								<dd>{+resolveLinks(item.desc)+}</dd>
+						</for>
+						</dl>
+					</if>
+					<if test="data.returns.length">
+						<dl class="detailList">
+						<dt class="heading">Returns:</dt>
+						<for each="item" in="data.returns">
+								<dd>{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+}{+resolveLinks(item.desc)+}</dd>
+						</for>
+						</dl>
+					</if>
+					<if test="data.requires.length">
+						<dl class="detailList">
+						<dt class="heading">Requires:</dt>
+						<for each="item" in="data.requires">
+							<dd>{+ new Link().toSymbol(item) +}</dd>
+						</for>
+						</dl>
+					</if>
+					<if test="data.see.length">
+						<dl class="detailList">
+						<dt class="heading">See:</dt>
+						<for each="item" in="data.see">
+							<dd>{+ new Link().toSymbol(item) +}</dd>
+						</for>
+						</dl>
+					</if>
+
+			</div>
+			</if>
+
+<!-- ============================== field details ========================== -->		
+			<if test="defined(ownProperties) && ownProperties.length">
+				<div class="sectionTitle">
+					Field Detail
+				</div>
+				<for each="member" in="ownProperties">
+					<a name="{+Link.symbolNameToLinkName(member)+}"> </a>
+					<div class="fixedFont">{!
+						if (member.isPrivate) output += "&lt;private&gt; ";
+						if (member.isInner) output += "&lt;inner&gt; ";
+						if (member.isStatic) output += "&lt;static&gt; ";
+						if (member.isConstant) output += "&lt;constant&gt; ";
+					!}
+					
+					<if test="member.type"><span class="light">{{+new Link().toSymbol(member.type)+}}</span></if>
+					<if test="member.isStatic && member.memberOf != '_global_'"><span class="light">{+member.memberOf+}.</span></if><b>{+member.name+}</b>
+					
+					</div>
+					<div class="description">
+						{+resolveLinks(member.desc)+}
+						<if test="member.srcFile != data.srcFile">
+							<br />
+							<i>Defined in: </i> {+new Link().toSrc(member.srcFile)+}.
+						</if>
+						<if test="member.author"><br /><i>Author: </i>{+member.author+}.</if>
+					</div>
+					
+					<if test="member.example.length">
+					<for each="example" in="member.example">
+					<pre class="code">{+example+}</pre>
+					</for>
+					</if>
+
+						<if test="member.deprecated">
+							<dl class="detailList">
+							<dt class="heading">Deprecated:</dt>
+							<dt>
+								{+ resolveLinks(member.deprecated) +}
+							</dt>
+							</dl>
+						</if>
+						<if test="member.since">
+							<dl class="detailList">
+							<dt class="heading">Since:</dt>
+								<dd>{+ member.since +}</dd>
+							</dl>
+						</if>
+						<if test="member.see.length">
+							<dl class="detailList">
+							<dt class="heading">See:</dt>
+							<for each="item" in="member.see">
+							<dd>{+ new Link().toSymbol(item) +}</dd>
+							</for>
+							</dl>
+						</if>
+						<if test="member.defaultValue">
+							<dl class="detailList">
+							<dt class="heading">Default Value:</dt>
+							<dd>
+								{+resolveLinks(member.defaultValue)+}
+							</dd>
+							</dl>
+						</if>
+
+					<if test="!$member_last"><hr /></if>
+				</for>
+			</if>
+
+<!-- ============================== method details ========================= -->		
+			<if test="defined(ownMethods) && ownMethods.length">
+				<div class="sectionTitle">
+					Method Detail
+				</div>
+				<for each="member" in="ownMethods">
+					<a name="{+Link.symbolNameToLinkName(member)+}"> </a>
+					<div class="fixedFont">{!
+						if (member.isPrivate) output += "&lt;private&gt; ";
+						if (member.isInner) output += "&lt;inner&gt; ";
+						if (member.isStatic) output += "&lt;static&gt; ";
+					!}
+					
+					<if test="member.type"><span class="light">{{+new Link().toSymbol(member.type)+}}</span></if>
+					<if test="member.isStatic && member.memberOf != '_global_'"><span class="light">{+member.memberOf+}.</span></if><b>{+member.name.replace(/\^\d+$/, '')+}</b>{+makeSignature(member.params)+}
+					
+					</div>
+					<div class="description">
+						{+resolveLinks(member.desc)+}
+						<if test="member.srcFile != data.srcFile">
+							<br />
+							<i>Defined in: </i> {+new Link().toSrc(member.srcFile)+}.
+						</if>
+						<if test="member.author"><br /><i>Author: </i>{+member.author+}.</if>
+					</div>
+					
+					<if test="member.example.length">
+					<for each="example" in="member.example">
+					<pre class="code">{+example+}</pre>
+					</for>
+					</if>
+					
+						<if test="member.params.length">
+							<dl class="detailList">
+							<dt class="heading">Parameters:</dt>
+							<for each="item" in="member.params">
+								<dt>
+									{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+}<b>{+item.name+}</b>
+									<if test="item.isOptional"><i>Optional<if test="item.defaultValue">, Default: {+item.defaultValue+}</if></i></if>
+								</dt>
+								<dd>{+resolveLinks(item.desc)+}</dd>
+							</for>
+							</dl>
+						</if>
+						<if test="member.deprecated">
+							<dl class="detailList">
+							<dt class="heading">Deprecated:</dt>
+							<dt>
+								{+ resolveLinks(member.deprecated) +}
+							</dt>
+							</dl>
+						</if>
+						<if test="member.since">
+							<dl class="detailList">
+							<dt class="heading">Since:</dt>
+								<dd>{+ member.since +}</dd>
+							</dl>
+							</dl>
+						</if>
+						<if test="member.exceptions.length">
+							<dl class="detailList">
+							<dt class="heading">Throws:</dt>
+							<for each="item" in="member.exceptions">
+								<dt>
+									{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+} <b>{+item.name+}</b>
+								</dt>
+								<dd>{+resolveLinks(item.desc)+}</dd>
+							</for>
+							</dl>
+						</if>
+						<if test="member.returns.length">
+							<dl class="detailList">
+							<dt class="heading">Returns:</dt>
+							<for each="item" in="member.returns">
+								<dd>{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+}{+resolveLinks(item.desc)+}</dd>
+							</for>
+							</dl>
+						</if>
+						<if test="member.requires.length">
+							<dl class="detailList">
+							<dt class="heading">Requires:</dt>
+							<for each="item" in="member.requires">
+								<dd>{+ resolveLinks(item) +}</dd>
+							</for>
+							</dl>
+						</if>
+						<if test="member.see.length">
+							<dl class="detailList">
+							<dt class="heading">See:</dt>
+							<for each="item" in="member.see">
+								<dd>{+ new Link().toSymbol(item) +}</dd>
+							</for>
+							</dl>
+						</if>
+
+					<if test="!$member_last"><hr /></if>
+				</for>
+			</if>
+			
+<!-- ============================== event details ========================= -->		
+			<if test="defined(ownEvents) && ownEvents.length">
+				<div class="sectionTitle">
+					Event Detail
+				</div>
+				<for each="member" in="ownEvents">
+					<a name="{+Link.symbolNameToLinkName(member)+}"> </a>
+					<div class="fixedFont">{!
+						if (member.isPrivate) output += "&lt;private&gt; ";
+						if (member.isInner) output += "&lt;inner&gt; ";
+						if (member.isStatic) output += "&lt;static&gt; ";
+					!}
+					
+					<if test="member.type"><span class="light">{{+new Link().toSymbol(member.type)+}}</span></if>
+					<if test="member.isStatic && member.memberOf != '_global_'"><span class="light">{+member.memberOf+}.</span></if><b>{+member.name+}</b>{+makeSignature(member.params)+}
+					
+					</div>
+					<div class="description">
+						{+resolveLinks(member.desc)+}
+						<if test="member.srcFile != data.srcFile">
+							<br />
+							<i>Defined in: </i> {+new Link().toSrc(member.srcFile)+}.
+						</if>
+						<if test="member.author"><br /><i>Author: </i>{+member.author+}.</if>
+					</div>
+					
+					<if test="member.example.length">
+					<for each="example" in="member.example">
+					<pre class="code">{+example+}</pre>
+					</for>
+					</if>
+					
+						<if test="member.params.length">
+							<dl class="detailList">
+							<dt class="heading">Parameters:</dt>
+							<for each="item" in="member.params">
+								<dt>
+									{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+}<b>{+item.name+}</b>
+									<if test="item.isOptional"><i>Optional<if test="item.defaultValue">, Default: {+item.defaultValue+}</if></i></if>
+								</dt>
+								<dd>{+ resolveLinks(item.desc) +}</dd>
+							</for>
+							</dl>
+						</if>
+						<if test="member.deprecated">
+							<dl class="detailList">
+							<dt class="heading">Deprecated:</dt>
+							<dt>
+								{+ resolveLinks(member.deprecated) +}
+							</dt>
+							</dl>
+						</if>
+						<if test="member.since">
+							<dl class="detailList">
+							<dt class="heading">Since:</dt>
+								<dd>{+ member.since +}</dd>
+							</dl>
+							</dl>
+						</if>
+						<if test="member.exceptions.length">
+							<dl class="detailList">
+							<dt class="heading">Throws:</dt>
+							<for each="item" in="member.exceptions">
+								<dt>
+									{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+} <b>{+item.name+}</b>
+								</dt>
+								<dd>{+ resolveLinks(item.desc) +}</dd>
+							</for>
+							</dl>
+						</if>
+						<if test="member.returns.length">
+							<dl class="detailList">
+							<dt class="heading">Returns:</dt>
+							<for each="item" in="member.returns">
+								<dd>{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+}{+resolveLinks(item.desc)+}</dd>
+							</for>
+							</dl>
+						</if>
+						<if test="member.requires.length">
+							<dl class="detailList">
+							<dt class="heading">Requires:</dt>
+							<for each="item" in="member.requires">
+								<dd>{+ resolveLinks(item) +}</dd>
+							</for>
+							</dl>
+						</if>
+						<if test="member.see.length">
+							<dl class="detailList">
+							<dt class="heading">See:</dt>
+							<for each="item" in="member.see">
+								<dd>{+ new Link().toSymbol(item) +}</dd>
+							</for>
+							</dl>
+						</if>
+
+					<if test="!$member_last"><hr /></if>
+				</for>
+			</if>
+			
+			<hr />
+		</div>
+
+		
+<!-- ============================== footer ================================= -->
+		<div class="fineprint" style="clear:both">
+			<if test="JSDOC.opt.D.copyright">&copy;{+JSDOC.opt.D.copyright+}<br /></if>
+			Documentation generated by <a href="http://code.google.com/p/jsdoc-toolkit/" target="_blank">JsDoc Toolkit</a> {+JSDOC.VERSION+} on {+new Date()+}
+		</div>
+	</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/templates/jsdoc/index.tmpl	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,39 @@
+<!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" xml:lang="en" lang="en">
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset={+IO.encoding+}" />
+		
+		<title>JsDoc Reference - Index</title>
+		<meta name="generator" content="JsDoc Toolkit" />
+		
+		<style type="text/css">
+		{+include("static/default.css")+}
+		</style>
+	</head>
+	
+	<body>
+		{+include("static/header.html")+}
+		
+		<div id="index">
+			{+publish.classesIndex+}
+		</div>
+		
+		<div id="content">
+			<h1 class="classTitle">Class Index</h1>
+			
+			<for each="thisClass" in="data">
+			<div>
+				<h2>{+(new Link().toSymbol(thisClass.alias))+}</h2>
+				{+resolveLinks(summarize(thisClass.classDesc))+}
+			</div>
+			<hr />
+			</for>
+			
+		</div>
+		<div class="fineprint" style="clear:both">
+			<if test="JSDOC.opt.D.copyright">&copy;{+JSDOC.opt.D.copyright+}<br /></if>
+			Documentation generated by <a href="http://code.google.com/p/jsdoc-toolkit/" target="_blankt">JsDoc Toolkit</a> {+JSDOC.VERSION+} on {+new Date()+}
+		</div>
+	</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/templates/jsdoc/publish.js	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,201 @@
+/** Called automatically by JsDoc Toolkit. */
+function publish(symbolSet) {
+	publish.conf = {  // trailing slash expected for dirs
+		ext:         ".html",
+		outDir:      JSDOC.opt.d || SYS.pwd+"../out/jsdoc/",
+		templatesDir: JSDOC.opt.t || SYS.pwd+"../templates/jsdoc/",
+		symbolsDir:  "symbols/",
+		srcDir:      "symbols/src/"
+	};
+	
+	// is source output is suppressed, just display the links to the source file
+	if (JSDOC.opt.s && defined(Link) && Link.prototype._makeSrcLink) {
+		Link.prototype._makeSrcLink = function(srcFilePath) {
+			return "&lt;"+srcFilePath+"&gt;";
+		}
+	}
+	
+	// create the folders and subfolders to hold the output
+	IO.mkPath((publish.conf.outDir+"symbols/src").split("/"));
+		
+	// used to allow Link to check the details of things being linked to
+	Link.symbolSet = symbolSet;
+
+	// create the required templates
+	try {
+		var classTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"class.tmpl");
+		var classesTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"allclasses.tmpl");
+	}
+	catch(e) {
+		print("Couldn't create the required templates: "+e);
+		quit();
+	}
+	
+	// some ustility filters
+	function hasNoParent($) {return ($.memberOf == "")}
+	function isaFile($) {return ($.is("FILE"))}
+	function isaClass($) {return ($.is("CONSTRUCTOR") || $.isNamespace)}
+	
+	// get an array version of the symbolset, useful for filtering
+	var symbols = symbolSet.toArray();
+	
+	// create the hilited source code files
+	var files = JSDOC.opt.srcFiles;
+ 	for (var i = 0, l = files.length; i < l; i++) {
+ 		var file = files[i];
+ 		var srcDir = publish.conf.outDir + "symbols/src/";
+		makeSrcFile(file, srcDir);
+ 	}
+ 	
+ 	// get a list of all the classes in the symbolset
+ 	var classes = symbols.filter(isaClass).sort(makeSortby("alias"));
+	
+	// create a filemap in which outfiles must be to be named uniquely, ignoring case
+	if (JSDOC.opt.u) {
+		var filemapCounts = {};
+		Link.filemap = {};
+		for (var i = 0, l = classes.length; i < l; i++) {
+			var lcAlias = classes[i].alias.toLowerCase();
+			
+			if (!filemapCounts[lcAlias]) filemapCounts[lcAlias] = 1;
+			else filemapCounts[lcAlias]++;
+			
+			Link.filemap[classes[i].alias] = 
+				(filemapCounts[lcAlias] > 1)?
+				lcAlias+"_"+filemapCounts[lcAlias] : lcAlias;
+		}
+	}
+	
+	// create a class index, displayed in the left-hand column of every class page
+	Link.base = "../";
+ 	publish.classesIndex = classesTemplate.process(classes); // kept in memory
+	
+	// create each of the class pages
+	for (var i = 0, l = classes.length; i < l; i++) {
+		var symbol = classes[i];
+		
+		symbol.events = symbol.getEvents();   // 1 order matters
+		symbol.methods = symbol.getMethods(); // 2
+		
+		Link.currentSymbol= symbol;
+		var output = "";
+		output = classTemplate.process(symbol);
+		
+		IO.saveFile(publish.conf.outDir+"symbols/", ((JSDOC.opt.u)? Link.filemap[symbol.alias] : symbol.alias) + publish.conf.ext, output);
+	}
+	
+	// regenerate the index with different relative links, used in the index pages
+	Link.base = "";
+	publish.classesIndex = classesTemplate.process(classes);
+	
+	// create the class index page
+	try {
+		var classesindexTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"index.tmpl");
+	}
+	catch(e) { print(e.message); quit(); }
+	
+	var classesIndex = classesindexTemplate.process(classes);
+	IO.saveFile(publish.conf.outDir, "index"+publish.conf.ext, classesIndex);
+	classesindexTemplate = classesIndex = classes = null;
+	
+	// create the file index page
+	try {
+		var fileindexTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"allfiles.tmpl");
+	}
+	catch(e) { print(e.message); quit(); }
+	
+	var documentedFiles = symbols.filter(isaFile); // files that have file-level docs
+	var allFiles = []; // not all files have file-level docs, but we need to list every one
+	
+	for (var i = 0; i < files.length; i++) {
+		allFiles.push(new JSDOC.Symbol(files[i], [], "FILE", new JSDOC.DocComment("/** */")));
+	}
+	
+	for (var i = 0; i < documentedFiles.length; i++) {
+		var offset = files.indexOf(documentedFiles[i].alias);
+		allFiles[offset] = documentedFiles[i];
+	}
+		
+	allFiles = allFiles.sort(makeSortby("name"));
+
+	// output the file index page
+	var filesIndex = fileindexTemplate.process(allFiles);
+	IO.saveFile(publish.conf.outDir, "files"+publish.conf.ext, filesIndex);
+	fileindexTemplate = filesIndex = files = null;
+}
+
+
+/** Just the first sentence (up to a full stop). Should not break on dotted variable names. */
+function summarize(desc) {
+	if (typeof desc != "undefined")
+		return desc.match(/([\w\W]+?\.)[^a-z0-9_$]/i)? RegExp.$1 : desc;
+}
+
+/** Make a symbol sorter by some attribute. */
+function makeSortby(attribute) {
+	return function(a, b) {
+		if (a[attribute] != undefined && b[attribute] != undefined) {
+			a = a[attribute].toLowerCase();
+			b = b[attribute].toLowerCase();
+			if (a < b) return -1;
+			if (a > b) return 1;
+			return 0;
+		}
+	}
+}
+
+/** Pull in the contents of an external file at the given path. */
+function include(path) {
+	var path = publish.conf.templatesDir+path;
+	return IO.readFile(path);
+}
+
+/** Turn a raw source file into a code-hilited page in the docs. */
+function makeSrcFile(path, srcDir, name) {
+	if (JSDOC.opt.s) return;
+	
+	if (!name) {
+		name = path.replace(/\.\.?[\\\/]/g, "").replace(/[\\\/]/g, "_");
+		name = name.replace(/\:/g, "_");
+	}
+	
+	var src = {path: path, name:name, charset: IO.encoding, hilited: ""};
+	
+	if (defined(JSDOC.PluginManager)) {
+		JSDOC.PluginManager.run("onPublishSrc", src);
+	}
+
+	if (src.hilited) {
+		IO.saveFile(srcDir, name+publish.conf.ext, src.hilited);
+	}
+}
+
+/** Build output for displaying function parameters. */
+function makeSignature(params) {
+	if (!params) return "()";
+	var signature = "("
+	+
+	params.filter(
+		function($) {
+			return $.name.indexOf(".") == -1; // don't show config params in signature
+		}
+	).map(
+		function($) {
+			return $.name;
+		}
+	).join(", ")
+	+
+	")";
+	return signature;
+}
+
+/** Find symbol {@link ...} strings in text and turn into html links */
+function resolveLinks(str, from) {
+	str = str.replace(/\{@link ([^} ]+) ?\}/gi,
+		function(match, symbolName) {
+			return new Link().toSymbol(symbolName);
+		}
+	);
+	
+	return str;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/templates/jsdoc/static/default.css	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,162 @@
+/* default.css */
+body
+{
+	font: 12px "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;
+	width: 800px;
+}
+
+.header
+{
+	clear: both;
+	background-color: #ccc;
+	padding: 8px;
+}
+
+h1
+{
+	font-size: 150%;
+	font-weight: bold;
+	padding: 0;
+	margin: 1em 0 0 .3em;
+}
+
+hr
+{
+	border: none 0;
+	border-top: 1px solid #7F8FB1;
+	height: 1px;
+}
+
+pre.code
+{
+	display: block;
+	padding: 8px;
+	border: 1px dashed #ccc;
+}
+
+#index
+{
+	margin-top: 24px;
+	float: left;
+	width: 160px;
+	position: absolute;
+	left: 8px;
+	background-color: #F3F3F3;
+	padding: 8px;
+}
+
+#content
+{
+	margin-left: 190px;
+	width: 600px;
+}
+
+.classList
+{
+	list-style-type: none;
+	padding: 0;
+	margin: 0 0 0 8px;
+	font-family: arial, sans-serif;
+	font-size: 1em;
+	overflow: auto;
+}
+
+.classList li
+{
+	padding: 0;
+	margin: 0 0 8px 0;
+}
+
+.summaryTable { width: 100%; }
+
+h1.classTitle
+{
+	font-size:170%;
+	line-height:130%;
+}
+
+h2 { font-size: 110%; }
+caption, div.sectionTitle
+{
+	background-color: #7F8FB1;
+	color: #fff;
+	font-size:130%;
+	text-align: left;
+	padding: 2px 6px 2px 6px;
+	border: 1px #7F8FB1 solid;
+}
+
+div.sectionTitle { margin-bottom: 8px; }
+.summaryTable thead { display: none; }
+
+.summaryTable td
+{
+	vertical-align: top;
+	padding: 4px;
+	border-bottom: 1px #7F8FB1 solid;
+	border-right: 1px #7F8FB1 solid;
+}
+
+/*col#summaryAttributes {}*/
+.summaryTable td.attributes
+{
+	border-left: 1px #7F8FB1 solid;
+	width: 140px;
+	text-align: right;
+}
+
+td.attributes, .fixedFont
+{
+	line-height: 15px;
+	color: #002EBE;
+	font-family: "Courier New",Courier,monospace;
+	font-size: 13px;
+}
+
+.summaryTable td.nameDescription
+{
+	text-align: left;
+	font-size: 13px;
+	line-height: 15px;
+}
+
+.summaryTable td.nameDescription, .description
+{
+	line-height: 15px;
+	padding: 4px;
+	padding-left: 4px;
+}
+
+.summaryTable { margin-bottom: 8px; }
+
+ul.inheritsList
+{
+	list-style: square;
+	margin-left: 20px;
+	padding-left: 0;
+}
+
+.detailList {
+	margin-left: 20px; 
+	line-height: 15px;
+}
+.detailList dt { margin-left: 20px; }
+
+.detailList .heading
+{
+	font-weight: bold;
+	padding-bottom: 6px;
+	margin-left: 0;
+}
+
+.light, td.attributes, .light a:link, .light a:visited
+{
+	color: #777;
+	font-style: italic;
+}
+
+.fineprint
+{
+	text-align: right;
+	font-size: 10px;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/templates/jsdoc/static/header.html	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,2 @@
+<div id="header">
+</div>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/templates/jsdoc/static/index.html	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,19 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+	<title>Generated Javascript Documentation</title>
+</head>
+<frameset cols="20%,80%">
+	<frame src="allclasses-frame.html" name="packageFrame" />
+	<frame src="splash.html" name="classFrame" />
+	<noframes>
+		<body>
+		<p>
+		This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
+		</p>
+		</body>
+	</noframes>
+</frameset>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbin/res/jsdoc/templates/jsdoc/symbol.tmpl	Fri Dec 23 11:38:47 2011 +0100
@@ -0,0 +1,35 @@
+<symbol alias="{+data.alias+}">
+	<name>{+data.name+}</name>
+	<memberOf>{+data.memberOf+}</memberOf>
+	<isStatic>{+data.isStatic+}</isStatic>
+	<isa>{+data.isa+}</isa>
+	<desc>{+data.desc+}</desc>
+	<classDesc>{+data.classDesc+}</classDesc>
+	
+	<methods><for each="method" in="data.methods">
+		<method>
+			<name>{+method.name+}</name>
+			<memberOf>{+method.memberOf+}</memberOf>
+			<isStatic>{+method.isStatic+}</isStatic>
+			<desc>{+method.desc+}</desc>
+			<params><for each="param" in="method.params">
+				<param>
+					<type>{+param.type+}</type>
+					<name>{+param.name+}</name>
+					<desc>{+param.desc+}</desc>
+					<defaultValue>{+param.defaultValue+}</defaultValue>
+				</param></for>
+			</params>
+		</method></for>
+	</methods>
+	
+	<properties><for each="property" in="data.properties">
+		<property>
+			<name>{+property.name+}</name>
+			<memberOf>{+property.memberOf+}</memberOf>
+			<isStatic>{+property.isStatic+}</isStatic>
+			<desc>{+property.desc+}</desc>
+			<type>{+property.type+}</type>
+		</property></for>
+	</properties>
+</symbol>
Binary file sbin/res/jsrun.jar has changed
--- a/sbin/res/templates/jsdoc/allclasses.tmpl	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-<div align="center">{+new Link().toFile("index.html").withText("Class Index")+}
-| {+new Link().toFile("files.html").withText("File Index")+}</div>
-<hr />
-<h2>Classes</h2>
-<ul class="classList">
-	<for each="thisClass" in="data">
-	<li>{!
-		if (thisClass.alias == "_global_") {
-			output += "<i>"+new Link().toClass(thisClass.alias)+"</i>";
-		}
-		else {
-			output += new Link().toClass(thisClass.alias);
-		}
-	!}</li>
-	</for>
-</ul>
-<hr />
\ No newline at end of file
--- a/sbin/res/templates/jsdoc/allfiles.tmpl	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +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" xml:lang="en" lang="en">
-	<head>
-		<meta http-equiv="content-type" content="text/html; charset={+IO.encoding+}" />
-		{! Link.base = ""; /* all generated links will be relative to this */ !}
-		<title>JsDoc Reference - File Index</title>
-		<meta name="generator" content="JsDoc Toolkit" />
-		
-		<style type="text/css">
-		{+include("static/default.css")+}
-		</style>
-	</head>
-	
-	<body>
-		{+include("static/header.html")+}
-		
-		<div id="index">
-			{+publish.classesIndex+}
-		</div>
-		
-		<div id="content">
-			<h1 class="classTitle">File Index</h1>
-			
-			<for each="item" in="data">
-			<div>
-				<h2>{+new Link().toSrc(item.alias).withText(item.name)+}</h2>
-				<if test="item.desc">{+resolveLinks(item.desc)+}</if>
-				<dl>
-					<if test="item.author">
-						<dt class="heading">Author:</dt>
-						<dd>{+item.author+}</dd>
-					</if>
-					<if test="item.version">
-						<dt class="heading">Version:</dt>
-							<dd>{+item.version+}</dd>
-					</if>
-					{! var locations = item.comment.getTag('location').map(function($){return $.toString().replace(/(^\$ ?| ?\$$)/g, '').replace(/^HeadURL: https:/g, 'http:');}) !}
-					<if test="locations.length">
-						<dt class="heading">Location:</dt>
-							<for each="location" in="locations">
-							<dd><a href="{+location+}">{+location+}</a></dd>
-							</for>
-					</if>
-				</dl>
-			</div>
-			<hr />
-			</for>
-			
-		</div>
-		<div class="fineprint" style="clear:both">
-			<if test="JSDOC.opt.D.copyright">&copy;{+JSDOC.opt.D.copyright+}<br /></if>
-			Documentation generated by <a href="http://code.google.com/p/jsdoc-toolkit/" target="_blankt">JsDoc Toolkit</a> {+JSDOC.VERSION+} on {+new Date()+}
-		</div>
-	</body>
-</html>
\ No newline at end of file
--- a/sbin/res/templates/jsdoc/class.tmpl	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,649 +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" xml:lang="en" lang="en">
-	<head>
-		<meta http-equiv="content-type" content="text/html; charset={+IO.encoding+}" />
-		<meta name="generator" content="JsDoc Toolkit" />
-		{! Link.base = "../"; /* all generated links will be relative to this */ !}
-		<title>JsDoc Reference - {+data.alias+}</title>
-
-		<style type="text/css">
-			{+include("static/default.css")+}
-		</style>
-	</head>
-
-	<body>
-<!-- ============================== header ================================= -->	
-		<!-- begin static/header.html -->
-		{+include("static/header.html")+}
-		<!-- end static/header.html -->
-
-<!-- ============================== classes index ============================ -->
-		<div id="index">
-			<!-- begin publish.classesIndex -->
-			{+publish.classesIndex+}
-			<!-- end publish.classesIndex -->
-		</div>
-		
-		<div id="content">
-<!-- ============================== class title ============================ -->
-			<h1 class="classTitle">
-				{!
-					var classType = "";
-					
-					if (data.isBuiltin()) {
-						classType += "Built-In ";
-					}
-					
-					if (data.isNamespace) {
-						if (data.is('FUNCTION')) {
-							classType += "Function ";
-						}
-						classType += "Namespace ";
-					}
-					else {
-						classType += "Class ";
-					}
-				!}
-				{+classType+}{+data.alias+}
-			</h1>
-
-<!-- ============================== class summary ========================== -->			
-			<p class="description">
-				<if test="data.version"><br />Version
-					{+ data.version +}.<br />
-				</if>
-				<if test="data.augments.length"><br />Extends
-					{+
-						data.augments
-						.sort()
-						.map(
-							function($) { return new Link().toSymbol($); }
-						)
-						.join(", ")
-					+}.<br />
-				</if>
-			
-				{+resolveLinks(data.classDesc)+}
-				
-				<if test="!data.isBuiltin()">{# isn't defined in any file #}
-					<br /><i>Defined in: </i> {+new Link().toSrc(data.srcFile)+}.
-				</if>
-			</p>
-
-<!-- ============================== constructor summary ==================== -->			
-			<if test="!data.isBuiltin() && (data.isNamespace || data.is('CONSTRUCTOR'))">
-			<table class="summaryTable" cellspacing="0" summary="A summary of the constructor documented in the class {+data.alias+}.">
-				<caption>{+classType+}Summary</caption>
-				<thead>
-					<tr>
-						<th scope="col">Constructor Attributes</th>
-						<th scope="col">Constructor Name and Description</th>
-					</tr>
-				</thead>
-				<tbody>
-					<tr>
-						<td class="attributes">{!
-							if (data.isPrivate) output += "&lt;private&gt; ";
-							if (data.isInner) output += "&lt;inner&gt; ";
-						!}&nbsp;</td>
-						<td class="nameDescription" {!if (data.comment.getTag("hilited").length){output += 'style="color: red"'}!}>
-							<div class="fixedFont">
-								<b>{+ new Link().toSymbol(data.alias).inner('constructor')+}</b><if test="classType != 'Namespace '">{+ makeSignature(data.params) +}</if>
-							</div>
-							<div class="description">{+resolveLinks(summarize(data.desc))+}</div>
-						</td>
-					</tr>
-				</tbody>
-			</table>
-			</if>
-
-<!-- ============================== properties summary ===================== -->
-			<if test="data.properties.length">
-				{! var ownProperties = data.properties.filter(function($){return $.memberOf == data.alias && !$.isNamespace}).sort(makeSortby("name")); !}
-				<if test="ownProperties.length">
-				<table class="summaryTable" cellspacing="0" summary="A summary of the fields documented in the class {+data.alias+}.">
-					<caption>Field Summary</caption>
-					<thead>
-						<tr>
-							<th scope="col">Field Attributes</th>
-							<th scope="col">Field Name and Description</th>
-						</tr>
-					</thead>
-					<tbody>
-					<for each="member" in="ownProperties">
-						<tr>
-							<td class="attributes">{!
-								if (member.isPrivate) output += "&lt;private&gt; ";
-								if (member.isInner) output += "&lt;inner&gt; ";
-								if (member.isStatic) output += "&lt;static&gt; ";
-								if (member.isConstant) output += "&lt;constant&gt; ";
-							!}&nbsp;</td>
-							<td class="nameDescription">
-								<div class="fixedFont">
-								<if test="member.isStatic && member.memberOf != '_global_'">{+member.memberOf+}.</if><b>{+new Link().toSymbol(member.alias).withText(member.name)+}</b>
-								</div>
-								<div class="description">{+resolveLinks(summarize(member.desc))+}</div>
-							</td>
-						</tr>
-					</for>
-					</tbody>
-				</table>
-				</if>
-				
-				<if test="data.inheritsFrom.length">
-				<dl class="inheritsList">
-				{!
-					var borrowedMembers = data.properties.filter(function($) {return $.memberOf != data.alias});
-					
-					var contributers = [];
-					borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)});
-					for (var i = 0, l = contributers.length; i < l; i++) {
-						output +=
-							"<dt>Fields borrowed from class "+new Link().toSymbol(contributers[i])+": </dt>"
-							+
-							"<dd>" +
-							borrowedMembers
-							.filter(
-								function($) { return $.memberOf == contributers[i] }
-							)
-							.sort(makeSortby("name"))
-							.map(
-								function($) { return new Link().toSymbol($.alias).withText($.name) }
-							)
-							.join(", ")
-							+
-							"</dd>";
-					}
-				!}
-				</dl>
-				</if>
-			</if>
-
-<!-- ============================== methods summary ======================== -->
-			<if test="data.methods.length">
-				{! var ownMethods = data.methods.filter(function($){return $.memberOf == data.alias  && !$.isNamespace}).sort(makeSortby("name")); !}
-				<if test="ownMethods.length">
-				<table class="summaryTable" cellspacing="0" summary="A summary of the methods documented in the class {+data.alias+}.">
-					<caption>Method Summary</caption>
-					<thead>
-						<tr>
-							<th scope="col">Method Attributes</th>
-							<th scope="col">Method Name and Description</th>
-						</tr>
-					</thead>
-					<tbody>
-					<for each="member" in="ownMethods">
-						<tr>
-							<td class="attributes">{!
-								if (member.isPrivate) output += "&lt;private&gt; ";
-								if (member.isInner) output += "&lt;inner&gt; ";
-								if (member.isStatic) output += "&lt;static&gt; ";
-							!}&nbsp;</td>
-							<td class="nameDescription">
-								<div class="fixedFont"><if test="member.isStatic && member.memberOf != '_global_'">{+member.memberOf+}.</if><b>{+new Link().toSymbol(member.alias).withText(member.name.replace(/\^\d+$/, ''))+}</b>{+makeSignature(member.params)+}
-								</div>
-								<div class="description">{+resolveLinks(summarize(member.desc))+}</div>
-							</td>
-						</tr>
-					</for>
-					</tbody>
-				</table>
-				</if>
-				
-				<if test="data.inheritsFrom.length">
-				<dl class="inheritsList">
-				{!
-					var borrowedMembers = data.methods.filter(function($) {return $.memberOf != data.alias});
-					var contributers = [];
-					borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)});
-					for (var i = 0, l = contributers.length; i < l; i++) {
-						output +=
-							"<dt>Methods borrowed from class "+new Link().toSymbol(contributers[i])+": </dt>"
-							+
-							"<dd>" +
-							borrowedMembers
-							.filter(
-								function($) { return $.memberOf == contributers[i] }
-							)
-							.sort(makeSortby("name"))
-							.map(
-								function($) { return new Link().toSymbol($.alias).withText($.name) }
-							)
-							.join(", ")
-							+
-							"</dd>";
-					}
-				
-				!}
-				</dl>
-				</if>
-			</if>
-<!-- ============================== events summary ======================== -->
-			<if test="data.events.length">
-				{! var ownEvents = data.events.filter(function($){return $.memberOf == data.alias  && !$.isNamespace}).sort(makeSortby("name")); !}
-				<if test="ownEvents.length">
-				<table class="summaryTable" cellspacing="0" summary="A summary of the events documented in the class {+data.alias+}.">
-					<caption>Event Summary</caption>
-					<thead>
-						<tr>
-							<th scope="col">Event Attributes</th>
-							<th scope="col">Event Name and Description</th>
-						</tr>
-					</thead>
-					<tbody>
-					<for each="member" in="ownEvents">
-						<tr>
-							<td class="attributes">{!
-								if (member.isPrivate) output += "&lt;private&gt; ";
-								if (member.isInner) output += "&lt;inner&gt; ";
-								if (member.isStatic) output += "&lt;static&gt; ";
-							!}&nbsp;</td>
-							<td class="nameDescription">
-								<div class="fixedFont"><if test="member.isStatic && member.memberOf != '_global_'">{+member.memberOf+}.</if><b>{+new Link().toSymbol(member.alias).withText(member.name)+}</b>{+makeSignature(member.params)+}
-								</div>
-								<div class="description">{+resolveLinks(summarize(member.desc))+}</div>
-							</td>
-						</tr>
-					</for>
-					</tbody>
-				</table>
-				</if>
-				
-				<if test="data.inheritsFrom.length">
-				<dl class="inheritsList">
-				{!
-					var borrowedMembers = data.events.filter(function($) {return $.memberOf != data.alias});
-					var contributers = [];
-					borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)});
-					for (var i = 0, l = contributers.length; i < l; i++) {
-						output +=
-							"<dt>Events borrowed from class "+new Link().toSymbol(contributers[i])+": </dt>"
-							+
-							"<dd>" +
-							borrowedMembers
-							.filter(
-								function($) { return $.memberOf == contributers[i] }
-							)
-							.sort(makeSortby("name"))
-							.map(
-								function($) { return new Link().toSymbol($.alias).withText($.name) }
-							)
-							.join(", ")
-							+
-							"</dd>";
-					}
-				
-				!}
-				</dl>
-				</if>
-			</if>
-
-<!-- ============================== constructor details ==================== -->		
-			<if test="!data.isBuiltin() && (data.isNamespace || data.is('CONSTRUCTOR'))">
-			<div class="details"><a name="constructor"> </a>
-				<div class="sectionTitle">
-					{+classType+}Detail
-				</div>
-				
-				<div class="fixedFont">{!
-					if (data.isPrivate) output += "&lt;private&gt; ";
-					if (data.isInner) output += "&lt;inner&gt; ";
-				!}
-						<b>{+ data.alias +}</b><if test="classType != 'Namespace '">{+ makeSignature(data.params) +}</if>
-				</div>
-				
-				<div class="description">
-					{+resolveLinks(data.desc)+}
-					<if test="data.author"><br /><i>Author: </i>{+data.author+}.</if>
-				</div>
-				
-				<if test="data.example.length">
-				<for each="example" in="data.example">
-				<pre class="code">{+example+}</pre>
-				</for>
-				</if>
-				
-				
-					<if test="data.params.length">
-						<dl class="detailList">
-						<dt class="heading">Parameters:</dt>
-						<for each="item" in="data.params">
-							<dt>
-								{+((item.type)?""+("<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type)+"}</span> ")) : "")+} <b>{+item.name+}</b>
-								<if test="item.isOptional"><i>Optional<if test="item.defaultValue">, Default: {+item.defaultValue+}</if></i></if>
-							</dt>
-								<dd>{+resolveLinks(item.desc)+}</dd>
-						</for>
-						</dl>
-					</if>
-					<if test="data.deprecated">
-						<dl class="detailList">
-						<dt class="heading">Deprecated:</dt>
-						<dt>
-							{+resolveLinks(data.deprecated)+}
-						</dt>
-						</dl>
-					</if>
-					<if test="data.since">
-						<dl class="detailList">
-						<dt class="heading">Since:</dt>
-							<dd>{+ data.since +}</dd>
-						</dl>
-					</if>
-					<if test="data.exceptions.length">
-						<dl class="detailList">
-						<dt class="heading">Throws:</dt>
-						<for each="item" in="data.exceptions">
-							<dt>
-								{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+} <b>{+item.name+}</b>
-							</dt>
-								<dd>{+resolveLinks(item.desc)+}</dd>
-						</for>
-						</dl>
-					</if>
-					<if test="data.returns.length">
-						<dl class="detailList">
-						<dt class="heading">Returns:</dt>
-						<for each="item" in="data.returns">
-								<dd>{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+}{+resolveLinks(item.desc)+}</dd>
-						</for>
-						</dl>
-					</if>
-					<if test="data.requires.length">
-						<dl class="detailList">
-						<dt class="heading">Requires:</dt>
-						<for each="item" in="data.requires">
-							<dd>{+ new Link().toSymbol(item) +}</dd>
-						</for>
-						</dl>
-					</if>
-					<if test="data.see.length">
-						<dl class="detailList">
-						<dt class="heading">See:</dt>
-						<for each="item" in="data.see">
-							<dd>{+ new Link().toSymbol(item) +}</dd>
-						</for>
-						</dl>
-					</if>
-
-			</div>
-			</if>
-
-<!-- ============================== field details ========================== -->		
-			<if test="defined(ownProperties) && ownProperties.length">
-				<div class="sectionTitle">
-					Field Detail
-				</div>
-				<for each="member" in="ownProperties">
-					<a name="{+Link.symbolNameToLinkName(member)+}"> </a>
-					<div class="fixedFont">{!
-						if (member.isPrivate) output += "&lt;private&gt; ";
-						if (member.isInner) output += "&lt;inner&gt; ";
-						if (member.isStatic) output += "&lt;static&gt; ";
-						if (member.isConstant) output += "&lt;constant&gt; ";
-					!}
-					
-					<if test="member.type"><span class="light">{{+new Link().toSymbol(member.type)+}}</span></if>
-					<if test="member.isStatic && member.memberOf != '_global_'"><span class="light">{+member.memberOf+}.</span></if><b>{+member.name+}</b>
-					
-					</div>
-					<div class="description">
-						{+resolveLinks(member.desc)+}
-						<if test="member.srcFile != data.srcFile">
-							<br />
-							<i>Defined in: </i> {+new Link().toSrc(member.srcFile)+}.
-						</if>
-						<if test="member.author"><br /><i>Author: </i>{+member.author+}.</if>
-					</div>
-					
-					<if test="member.example.length">
-					<for each="example" in="member.example">
-					<pre class="code">{+example+}</pre>
-					</for>
-					</if>
-
-						<if test="member.deprecated">
-							<dl class="detailList">
-							<dt class="heading">Deprecated:</dt>
-							<dt>
-								{+ resolveLinks(member.deprecated) +}
-							</dt>
-							</dl>
-						</if>
-						<if test="member.since">
-							<dl class="detailList">
-							<dt class="heading">Since:</dt>
-								<dd>{+ member.since +}</dd>
-							</dl>
-						</if>
-						<if test="member.see.length">
-							<dl class="detailList">
-							<dt class="heading">See:</dt>
-							<for each="item" in="member.see">
-							<dd>{+ new Link().toSymbol(item) +}</dd>
-							</for>
-							</dl>
-						</if>
-						<if test="member.defaultValue">
-							<dl class="detailList">
-							<dt class="heading">Default Value:</dt>
-							<dd>
-								{+resolveLinks(member.defaultValue)+}
-							</dd>
-							</dl>
-						</if>
-
-					<if test="!$member_last"><hr /></if>
-				</for>
-			</if>
-
-<!-- ============================== method details ========================= -->		
-			<if test="defined(ownMethods) && ownMethods.length">
-				<div class="sectionTitle">
-					Method Detail
-				</div>
-				<for each="member" in="ownMethods">
-					<a name="{+Link.symbolNameToLinkName(member)+}"> </a>
-					<div class="fixedFont">{!
-						if (member.isPrivate) output += "&lt;private&gt; ";
-						if (member.isInner) output += "&lt;inner&gt; ";
-						if (member.isStatic) output += "&lt;static&gt; ";
-					!}
-					
-					<if test="member.type"><span class="light">{{+new Link().toSymbol(member.type)+}}</span></if>
-					<if test="member.isStatic && member.memberOf != '_global_'"><span class="light">{+member.memberOf+}.</span></if><b>{+member.name.replace(/\^\d+$/, '')+}</b>{+makeSignature(member.params)+}
-					
-					</div>
-					<div class="description">
-						{+resolveLinks(member.desc)+}
-						<if test="member.srcFile != data.srcFile">
-							<br />
-							<i>Defined in: </i> {+new Link().toSrc(member.srcFile)+}.
-						</if>
-						<if test="member.author"><br /><i>Author: </i>{+member.author+}.</if>
-					</div>
-					
-					<if test="member.example.length">
-					<for each="example" in="member.example">
-					<pre class="code">{+example+}</pre>
-					</for>
-					</if>
-					
-						<if test="member.params.length">
-							<dl class="detailList">
-							<dt class="heading">Parameters:</dt>
-							<for each="item" in="member.params">
-								<dt>
-									{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+}<b>{+item.name+}</b>
-									<if test="item.isOptional"><i>Optional<if test="item.defaultValue">, Default: {+item.defaultValue+}</if></i></if>
-								</dt>
-								<dd>{+resolveLinks(item.desc)+}</dd>
-							</for>
-							</dl>
-						</if>
-						<if test="member.deprecated">
-							<dl class="detailList">
-							<dt class="heading">Deprecated:</dt>
-							<dt>
-								{+ resolveLinks(member.deprecated) +}
-							</dt>
-							</dl>
-						</if>
-						<if test="member.since">
-							<dl class="detailList">
-							<dt class="heading">Since:</dt>
-								<dd>{+ member.since +}</dd>
-							</dl>
-							</dl>
-						</if>
-						<if test="member.exceptions.length">
-							<dl class="detailList">
-							<dt class="heading">Throws:</dt>
-							<for each="item" in="member.exceptions">
-								<dt>
-									{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+} <b>{+item.name+}</b>
-								</dt>
-								<dd>{+resolveLinks(item.desc)+}</dd>
-							</for>
-							</dl>
-						</if>
-						<if test="member.returns.length">
-							<dl class="detailList">
-							<dt class="heading">Returns:</dt>
-							<for each="item" in="member.returns">
-								<dd>{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+}{+resolveLinks(item.desc)+}</dd>
-							</for>
-							</dl>
-						</if>
-						<if test="member.requires.length">
-							<dl class="detailList">
-							<dt class="heading">Requires:</dt>
-							<for each="item" in="member.requires">
-								<dd>{+ resolveLinks(item) +}</dd>
-							</for>
-							</dl>
-						</if>
-						<if test="member.see.length">
-							<dl class="detailList">
-							<dt class="heading">See:</dt>
-							<for each="item" in="member.see">
-								<dd>{+ new Link().toSymbol(item) +}</dd>
-							</for>
-							</dl>
-						</if>
-
-					<if test="!$member_last"><hr /></if>
-				</for>
-			</if>
-			
-<!-- ============================== event details ========================= -->		
-			<if test="defined(ownEvents) && ownEvents.length">
-				<div class="sectionTitle">
-					Event Detail
-				</div>
-				<for each="member" in="ownEvents">
-					<a name="{+Link.symbolNameToLinkName(member)+}"> </a>
-					<div class="fixedFont">{!
-						if (member.isPrivate) output += "&lt;private&gt; ";
-						if (member.isInner) output += "&lt;inner&gt; ";
-						if (member.isStatic) output += "&lt;static&gt; ";
-					!}
-					
-					<if test="member.type"><span class="light">{{+new Link().toSymbol(member.type)+}}</span></if>
-					<if test="member.isStatic && member.memberOf != '_global_'"><span class="light">{+member.memberOf+}.</span></if><b>{+member.name+}</b>{+makeSignature(member.params)+}
-					
-					</div>
-					<div class="description">
-						{+resolveLinks(member.desc)+}
-						<if test="member.srcFile != data.srcFile">
-							<br />
-							<i>Defined in: </i> {+new Link().toSrc(member.srcFile)+}.
-						</if>
-						<if test="member.author"><br /><i>Author: </i>{+member.author+}.</if>
-					</div>
-					
-					<if test="member.example.length">
-					<for each="example" in="member.example">
-					<pre class="code">{+example+}</pre>
-					</for>
-					</if>
-					
-						<if test="member.params.length">
-							<dl class="detailList">
-							<dt class="heading">Parameters:</dt>
-							<for each="item" in="member.params">
-								<dt>
-									{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+}<b>{+item.name+}</b>
-									<if test="item.isOptional"><i>Optional<if test="item.defaultValue">, Default: {+item.defaultValue+}</if></i></if>
-								</dt>
-								<dd>{+ resolveLinks(item.desc) +}</dd>
-							</for>
-							</dl>
-						</if>
-						<if test="member.deprecated">
-							<dl class="detailList">
-							<dt class="heading">Deprecated:</dt>
-							<dt>
-								{+ resolveLinks(member.deprecated) +}
-							</dt>
-							</dl>
-						</if>
-						<if test="member.since">
-							<dl class="detailList">
-							<dt class="heading">Since:</dt>
-								<dd>{+ member.since +}</dd>
-							</dl>
-							</dl>
-						</if>
-						<if test="member.exceptions.length">
-							<dl class="detailList">
-							<dt class="heading">Throws:</dt>
-							<for each="item" in="member.exceptions">
-								<dt>
-									{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+} <b>{+item.name+}</b>
-								</dt>
-								<dd>{+ resolveLinks(item.desc) +}</dd>
-							</for>
-							</dl>
-						</if>
-						<if test="member.returns.length">
-							<dl class="detailList">
-							<dt class="heading">Returns:</dt>
-							<for each="item" in="member.returns">
-								<dd>{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+}{+resolveLinks(item.desc)+}</dd>
-							</for>
-							</dl>
-						</if>
-						<if test="member.requires.length">
-							<dl class="detailList">
-							<dt class="heading">Requires:</dt>
-							<for each="item" in="member.requires">
-								<dd>{+ resolveLinks(item) +}</dd>
-							</for>
-							</dl>
-						</if>
-						<if test="member.see.length">
-							<dl class="detailList">
-							<dt class="heading">See:</dt>
-							<for each="item" in="member.see">
-								<dd>{+ new Link().toSymbol(item) +}</dd>
-							</for>
-							</dl>
-						</if>
-
-					<if test="!$member_last"><hr /></if>
-				</for>
-			</if>
-			
-			<hr />
-		</div>
-
-		
-<!-- ============================== footer ================================= -->
-		<div class="fineprint" style="clear:both">
-			<if test="JSDOC.opt.D.copyright">&copy;{+JSDOC.opt.D.copyright+}<br /></if>
-			Documentation generated by <a href="http://code.google.com/p/jsdoc-toolkit/" target="_blank">JsDoc Toolkit</a> {+JSDOC.VERSION+} on {+new Date()+}
-		</div>
-	</body>
-</html>
--- a/sbin/res/templates/jsdoc/index.tmpl	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +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" xml:lang="en" lang="en">
-	<head>
-		<meta http-equiv="content-type" content="text/html; charset={+IO.encoding+}" />
-		
-		<title>JsDoc Reference - Index</title>
-		<meta name="generator" content="JsDoc Toolkit" />
-		
-		<style type="text/css">
-		{+include("static/default.css")+}
-		</style>
-	</head>
-	
-	<body>
-		{+include("static/header.html")+}
-		
-		<div id="index">
-			{+publish.classesIndex+}
-		</div>
-		
-		<div id="content">
-			<h1 class="classTitle">Class Index</h1>
-			
-			<for each="thisClass" in="data">
-			<div>
-				<h2>{+(new Link().toSymbol(thisClass.alias))+}</h2>
-				{+resolveLinks(summarize(thisClass.classDesc))+}
-			</div>
-			<hr />
-			</for>
-			
-		</div>
-		<div class="fineprint" style="clear:both">
-			<if test="JSDOC.opt.D.copyright">&copy;{+JSDOC.opt.D.copyright+}<br /></if>
-			Documentation generated by <a href="http://code.google.com/p/jsdoc-toolkit/" target="_blankt">JsDoc Toolkit</a> {+JSDOC.VERSION+} on {+new Date()+}
-		</div>
-	</body>
-</html>
\ No newline at end of file
--- a/sbin/res/templates/jsdoc/publish.js	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,201 +0,0 @@
-/** Called automatically by JsDoc Toolkit. */
-function publish(symbolSet) {
-	publish.conf = {  // trailing slash expected for dirs
-		ext:         ".html",
-		outDir:      JSDOC.opt.d || SYS.pwd+"../out/jsdoc/",
-		templatesDir: JSDOC.opt.t || SYS.pwd+"../templates/jsdoc/",
-		symbolsDir:  "symbols/",
-		srcDir:      "symbols/src/"
-	};
-	
-	// is source output is suppressed, just display the links to the source file
-	if (JSDOC.opt.s && defined(Link) && Link.prototype._makeSrcLink) {
-		Link.prototype._makeSrcLink = function(srcFilePath) {
-			return "&lt;"+srcFilePath+"&gt;";
-		}
-	}
-	
-	// create the folders and subfolders to hold the output
-	IO.mkPath((publish.conf.outDir+"symbols/src").split("/"));
-		
-	// used to allow Link to check the details of things being linked to
-	Link.symbolSet = symbolSet;
-
-	// create the required templates
-	try {
-		var classTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"class.tmpl");
-		var classesTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"allclasses.tmpl");
-	}
-	catch(e) {
-		print("Couldn't create the required templates: "+e);
-		quit();
-	}
-	
-	// some ustility filters
-	function hasNoParent($) {return ($.memberOf == "")}
-	function isaFile($) {return ($.is("FILE"))}
-	function isaClass($) {return ($.is("CONSTRUCTOR") || $.isNamespace)}
-	
-	// get an array version of the symbolset, useful for filtering
-	var symbols = symbolSet.toArray();
-	
-	// create the hilited source code files
-	var files = JSDOC.opt.srcFiles;
- 	for (var i = 0, l = files.length; i < l; i++) {
- 		var file = files[i];
- 		var srcDir = publish.conf.outDir + "symbols/src/";
-		makeSrcFile(file, srcDir);
- 	}
- 	
- 	// get a list of all the classes in the symbolset
- 	var classes = symbols.filter(isaClass).sort(makeSortby("alias"));
-	
-	// create a filemap in which outfiles must be to be named uniquely, ignoring case
-	if (JSDOC.opt.u) {
-		var filemapCounts = {};
-		Link.filemap = {};
-		for (var i = 0, l = classes.length; i < l; i++) {
-			var lcAlias = classes[i].alias.toLowerCase();
-			
-			if (!filemapCounts[lcAlias]) filemapCounts[lcAlias] = 1;
-			else filemapCounts[lcAlias]++;
-			
-			Link.filemap[classes[i].alias] = 
-				(filemapCounts[lcAlias] > 1)?
-				lcAlias+"_"+filemapCounts[lcAlias] : lcAlias;
-		}
-	}
-	
-	// create a class index, displayed in the left-hand column of every class page
-	Link.base = "../";
- 	publish.classesIndex = classesTemplate.process(classes); // kept in memory
-	
-	// create each of the class pages
-	for (var i = 0, l = classes.length; i < l; i++) {
-		var symbol = classes[i];
-		
-		symbol.events = symbol.getEvents();   // 1 order matters
-		symbol.methods = symbol.getMethods(); // 2
-		
-		Link.currentSymbol= symbol;
-		var output = "";
-		output = classTemplate.process(symbol);
-		
-		IO.saveFile(publish.conf.outDir+"symbols/", ((JSDOC.opt.u)? Link.filemap[symbol.alias] : symbol.alias) + publish.conf.ext, output);
-	}
-	
-	// regenerate the index with different relative links, used in the index pages
-	Link.base = "";
-	publish.classesIndex = classesTemplate.process(classes);
-	
-	// create the class index page
-	try {
-		var classesindexTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"index.tmpl");
-	}
-	catch(e) { print(e.message); quit(); }
-	
-	var classesIndex = classesindexTemplate.process(classes);
-	IO.saveFile(publish.conf.outDir, "index"+publish.conf.ext, classesIndex);
-	classesindexTemplate = classesIndex = classes = null;
-	
-	// create the file index page
-	try {
-		var fileindexTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"allfiles.tmpl");
-	}
-	catch(e) { print(e.message); quit(); }
-	
-	var documentedFiles = symbols.filter(isaFile); // files that have file-level docs
-	var allFiles = []; // not all files have file-level docs, but we need to list every one
-	
-	for (var i = 0; i < files.length; i++) {
-		allFiles.push(new JSDOC.Symbol(files[i], [], "FILE", new JSDOC.DocComment("/** */")));
-	}
-	
-	for (var i = 0; i < documentedFiles.length; i++) {
-		var offset = files.indexOf(documentedFiles[i].alias);
-		allFiles[offset] = documentedFiles[i];
-	}
-		
-	allFiles = allFiles.sort(makeSortby("name"));
-
-	// output the file index page
-	var filesIndex = fileindexTemplate.process(allFiles);
-	IO.saveFile(publish.conf.outDir, "files"+publish.conf.ext, filesIndex);
-	fileindexTemplate = filesIndex = files = null;
-}
-
-
-/** Just the first sentence (up to a full stop). Should not break on dotted variable names. */
-function summarize(desc) {
-	if (typeof desc != "undefined")
-		return desc.match(/([\w\W]+?\.)[^a-z0-9_$]/i)? RegExp.$1 : desc;
-}
-
-/** Make a symbol sorter by some attribute. */
-function makeSortby(attribute) {
-	return function(a, b) {
-		if (a[attribute] != undefined && b[attribute] != undefined) {
-			a = a[attribute].toLowerCase();
-			b = b[attribute].toLowerCase();
-			if (a < b) return -1;
-			if (a > b) return 1;
-			return 0;
-		}
-	}
-}
-
-/** Pull in the contents of an external file at the given path. */
-function include(path) {
-	var path = publish.conf.templatesDir+path;
-	return IO.readFile(path);
-}
-
-/** Turn a raw source file into a code-hilited page in the docs. */
-function makeSrcFile(path, srcDir, name) {
-	if (JSDOC.opt.s) return;
-	
-	if (!name) {
-		name = path.replace(/\.\.?[\\\/]/g, "").replace(/[\\\/]/g, "_");
-		name = name.replace(/\:/g, "_");
-	}
-	
-	var src = {path: path, name:name, charset: IO.encoding, hilited: ""};
-	
-	if (defined(JSDOC.PluginManager)) {
-		JSDOC.PluginManager.run("onPublishSrc", src);
-	}
-
-	if (src.hilited) {
-		IO.saveFile(srcDir, name+publish.conf.ext, src.hilited);
-	}
-}
-
-/** Build output for displaying function parameters. */
-function makeSignature(params) {
-	if (!params) return "()";
-	var signature = "("
-	+
-	params.filter(
-		function($) {
-			return $.name.indexOf(".") == -1; // don't show config params in signature
-		}
-	).map(
-		function($) {
-			return $.name;
-		}
-	).join(", ")
-	+
-	")";
-	return signature;
-}
-
-/** Find symbol {@link ...} strings in text and turn into html links */
-function resolveLinks(str, from) {
-	str = str.replace(/\{@link ([^} ]+) ?\}/gi,
-		function(match, symbolName) {
-			return new Link().toSymbol(symbolName);
-		}
-	);
-	
-	return str;
-}
--- a/sbin/res/templates/jsdoc/static/default.css	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,162 +0,0 @@
-/* default.css */
-body
-{
-	font: 12px "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;
-	width: 800px;
-}
-
-.header
-{
-	clear: both;
-	background-color: #ccc;
-	padding: 8px;
-}
-
-h1
-{
-	font-size: 150%;
-	font-weight: bold;
-	padding: 0;
-	margin: 1em 0 0 .3em;
-}
-
-hr
-{
-	border: none 0;
-	border-top: 1px solid #7F8FB1;
-	height: 1px;
-}
-
-pre.code
-{
-	display: block;
-	padding: 8px;
-	border: 1px dashed #ccc;
-}
-
-#index
-{
-	margin-top: 24px;
-	float: left;
-	width: 160px;
-	position: absolute;
-	left: 8px;
-	background-color: #F3F3F3;
-	padding: 8px;
-}
-
-#content
-{
-	margin-left: 190px;
-	width: 600px;
-}
-
-.classList
-{
-	list-style-type: none;
-	padding: 0;
-	margin: 0 0 0 8px;
-	font-family: arial, sans-serif;
-	font-size: 1em;
-	overflow: auto;
-}
-
-.classList li
-{
-	padding: 0;
-	margin: 0 0 8px 0;
-}
-
-.summaryTable { width: 100%; }
-
-h1.classTitle
-{
-	font-size:170%;
-	line-height:130%;
-}
-
-h2 { font-size: 110%; }
-caption, div.sectionTitle
-{
-	background-color: #7F8FB1;
-	color: #fff;
-	font-size:130%;
-	text-align: left;
-	padding: 2px 6px 2px 6px;
-	border: 1px #7F8FB1 solid;
-}
-
-div.sectionTitle { margin-bottom: 8px; }
-.summaryTable thead { display: none; }
-
-.summaryTable td
-{
-	vertical-align: top;
-	padding: 4px;
-	border-bottom: 1px #7F8FB1 solid;
-	border-right: 1px #7F8FB1 solid;
-}
-
-/*col#summaryAttributes {}*/
-.summaryTable td.attributes
-{
-	border-left: 1px #7F8FB1 solid;
-	width: 140px;
-	text-align: right;
-}
-
-td.attributes, .fixedFont
-{
-	line-height: 15px;
-	color: #002EBE;
-	font-family: "Courier New",Courier,monospace;
-	font-size: 13px;
-}
-
-.summaryTable td.nameDescription
-{
-	text-align: left;
-	font-size: 13px;
-	line-height: 15px;
-}
-
-.summaryTable td.nameDescription, .description
-{
-	line-height: 15px;
-	padding: 4px;
-	padding-left: 4px;
-}
-
-.summaryTable { margin-bottom: 8px; }
-
-ul.inheritsList
-{
-	list-style: square;
-	margin-left: 20px;
-	padding-left: 0;
-}
-
-.detailList {
-	margin-left: 20px; 
-	line-height: 15px;
-}
-.detailList dt { margin-left: 20px; }
-
-.detailList .heading
-{
-	font-weight: bold;
-	padding-bottom: 6px;
-	margin-left: 0;
-}
-
-.light, td.attributes, .light a:link, .light a:visited
-{
-	color: #777;
-	font-style: italic;
-}
-
-.fineprint
-{
-	text-align: right;
-	font-size: 10px;
-}
\ No newline at end of file
--- a/sbin/res/templates/jsdoc/static/header.html	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<div id="header">
-</div>
\ No newline at end of file
--- a/sbin/res/templates/jsdoc/static/index.html	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
-	<title>Generated Javascript Documentation</title>
-</head>
-<frameset cols="20%,80%">
-	<frame src="allclasses-frame.html" name="packageFrame" />
-	<frame src="splash.html" name="classFrame" />
-	<noframes>
-		<body>
-		<p>
-		This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
-		</p>
-		</body>
-	</noframes>
-</frameset>
-</html>
\ No newline at end of file
--- a/sbin/res/templates/jsdoc/symbol.tmpl	Fri Dec 23 10:59:23 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-<symbol alias="{+data.alias+}">
-	<name>{+data.name+}</name>
-	<memberOf>{+data.memberOf+}</memberOf>
-	<isStatic>{+data.isStatic+}</isStatic>
-	<isa>{+data.isa+}</isa>
-	<desc>{+data.desc+}</desc>
-	<classDesc>{+data.classDesc+}</classDesc>
-	
-	<methods><for each="method" in="data.methods">
-		<method>
-			<name>{+method.name+}</name>
-			<memberOf>{+method.memberOf+}</memberOf>
-			<isStatic>{+method.isStatic+}</isStatic>
-			<desc>{+method.desc+}</desc>
-			<params><for each="param" in="method.params">
-				<param>
-					<type>{+param.type+}</type>
-					<name>{+param.name+}</name>
-					<desc>{+param.desc+}</desc>
-					<defaultValue>{+param.defaultValue+}</defaultValue>
-				</param></for>
-			</params>
-		</method></for>
-	</methods>
-	
-	<properties><for each="property" in="data.properties">
-		<property>
-			<name>{+property.name+}</name>
-			<memberOf>{+property.memberOf+}</memberOf>
-			<isStatic>{+property.isStatic+}</isStatic>
-			<desc>{+property.desc+}</desc>
-			<type>{+property.type+}</type>
-		</property></for>
-	</properties>
-</symbol>
--- a/src/js/main.js	Fri Dec 23 10:59:23 2011 +0100
+++ b/src/js/main.js	Fri Dec 23 11:38:47 2011 +0100
@@ -1,6 +1,11 @@
 /* main file */
 
+
 if ( window.IriSP === undefined && window.__IriSP === undefined ) { 
+  /**
+    We define here IriSP, the object under which everything goes.
+    We also alias it to __IriSP for backward compatibility
+  */
 	var IriSP = {}; 
 	var __IriSP = IriSP; /* for backward compatibility */
 }
--- a/src/js/widgets.js	Fri Dec 23 10:59:23 2011 +0100
+++ b/src/js/widgets.js	Fri Dec 23 11:38:47 2011 +0100
@@ -1,5 +1,16 @@
 /* the widget classes and definitions */
 
+/**
+  * @class Widget is an "abstract" class. It's mostly used to define some properties common to every widget.
+  *
+  *  Note that widget constructors are never called directly by the user. Instead, the widgets are instantiated by functions
+  *  defined in init.js
+  *  
+  * @constructor
+  * @param Popcorn a reference to the popcorn Object
+  * @param config configuration options for the widget
+  * @param Serializer a serializer instance from which the widget reads data fromCharCode  
+*/
 IriSP.Widget = function(Popcorn, config, Serializer) {
 
   if (config === undefined || config === null) {
@@ -40,10 +51,16 @@
   
 };
 
+/**
+  * This method responsible of drawing a widget on screen.
+  */
 IriSP.Widget.prototype.draw = function() {
   /* implemented by "sub-classes" */  
 };
 
+/**
+  * Optional method if you want your widget to support redraws.
+  */
 IriSP.Widget.prototype.redraw = function() {
   /* implemented by "sub-classes" */  
 };