added jsdoc support, and a script to generate the docs.
Also added sample documentation for the IriSP.widget base class.
--- 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, "<")+"</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>@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>@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 "&";
+ case "\\": return "\\\\";
+ case '"': return '"';
+ case "'": return ''';
+ case "<": return "<";
+ case ">": return ">";
+ 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,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};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'> </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'> </span></a> <a onclick='__IriSP.MyApiPlayer.share(\'facebook\');' title='partager avec facebook'> <span class='share shareFacebook'> </span></a><a onclick='__IriSP.MyApiPlayer.share(\'twitter\');' title='partager avec twitter'> <span class='share shareTwitter'> </span></a><a onclick='__IriSP.MyApiPlayer.share(\'myspace\');' title='partager avec Myspace'> <span class='share shareMySpace'> </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, "<")+"</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>@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>@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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"><</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"><</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 <= 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"><</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"><</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"><</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"><</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"><</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"><</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 < 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"><</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+;)|["'<>\\]/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">"&"</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">'"'</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">'''</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">"<"</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'>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">">"</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"><</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"><</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"><</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"><</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"><</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"><</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"><</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"><</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"><=</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"><</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"><=</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"><</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"><</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">"&"</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="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="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="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">/<%([\s\S]+?)%>/g</span><span class="PUNC">,</span><span class="NAME">interpolate</span><span class="PUNC">:</span><span class="REGX">/<%=([\s\S]+?)%>/g</span><span class="PUNC">,</span><span class="NAME">escape</span><span class="PUNC">:</span><span class="REGX">/<%-([\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">"<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">"<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 }}<div title='{{divTitle}}' id='{{id}}' class='Ldt-iri-chapter' style='left: {{startPixel}}px; width: {{pxWidth}}px; background-color:#{{hexa_color}};' ></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 }}<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>"</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 }}<div id='Ldt-load-container'><div id='Ldt-loader'> </div> Chargement... </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">"<div class='Ldt-arrowWidget'></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 }}<div class='Ldt-SegmentPositionMarker' style='background-color: #F7268E;'></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 }}<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>"</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 }}<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>"</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 }}<a onclick='__IriSP.MyApiPlayer.share(\'delicious\');' title='partager avec delicious'><span class='share shareDelicious'> </span></a> <a onclick='__IriSP.MyApiPlayer.share(\'facebook\');' title='partager avec facebook'> <span class='share shareFacebook'> </span></a><a onclick='__IriSP.MyApiPlayer.share(\'twitter\');' title='partager avec twitter'> <span class='share shareTwitter'> </span></a><a onclick='__IriSP.MyApiPlayer.share(\'myspace\');' title='partager avec Myspace'> <span class='share shareMySpace'> </span></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 }}<div class='Ldt-sliderBackground'></div><div class='Ldt-sliderForeground'></div><div class='Ldt-sliderPositionMarker'></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 }}<div class='Ldt-tooltip'> <div class='title'>{{title}}</div> <div class='time'>{{begin}} : {{end}} </div> <div class='description'>{{description}}</div></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 }}<div class='tip'> <div class='tipcolor' style='height:10px;width:10px'></div> <div class='tiptext'></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 }}<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>"</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"><</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"><</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"><</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"><=</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"><=</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"><</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"><</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"><</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"><</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( "<div>"+IriSP.traceNum+" - "+msg+" : "+value+"</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"><</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">"<a href='$1'>$1</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">"<a href='http://twitter.com/$1'>@$1</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">"<a href='http://twitter.com/search?q=%23$1'>#$1</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">"<span class='Ldt-PolemicPlusPlus'>$1</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">"<span class='Ldt-PolemicMinusMinus'>$1</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">"<span class='Ldt-PolemicEqualEqual'>$1</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">"<span class='Ldt-PolemicQuestion'>$1</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"><</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"><</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">"<div id='{{id}}' style='width: {{width}}px; position: relative;'></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">"<div id='{{spacer_id}}' style='width: {{width}}px; position: relative; height: {{spacer_div_height}};'></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">"<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">"'></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"><</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"><</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"><</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"><</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"><=</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"><</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"><</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"><</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"><</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"><</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"><</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"><</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"><</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"><</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"><</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"><</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"><</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"><=</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">"<img src='{{src}}' alt='user image'></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">"<a href='http://twitter.com/{{creator}}'><img src='{{src}}' alt='user image'></img></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">"<a class='Ldt-tweet_userHandle' href='http://twitter.com/{{creator}}'>@{{creator}}</a> - "</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
+<span class='line'>3178</span> </span><span class="STRN">"<div class='Ldt-tweet_realName'>{{real_name}}</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">"<div class='Ldt-tweet_tweetContents'>{{{ contents }}}</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">"<div class='Ldt-tweet_date'>{{ date }}</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"><=</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">©{+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 += "<private> ";
+ if (data.isInner) output += "<inner> ";
+ !} </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 += "<private> ";
+ if (member.isInner) output += "<inner> ";
+ if (member.isStatic) output += "<static> ";
+ if (member.isConstant) output += "<constant> ";
+ !} </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 += "<private> ";
+ if (member.isInner) output += "<inner> ";
+ if (member.isStatic) output += "<static> ";
+ !} </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 += "<private> ";
+ if (member.isInner) output += "<inner> ";
+ if (member.isStatic) output += "<static> ";
+ !} </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 += "<private> ";
+ if (data.isInner) output += "<inner> ";
+ !}
+ <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 += "<private> ";
+ if (member.isInner) output += "<inner> ";
+ if (member.isStatic) output += "<static> ";
+ if (member.isConstant) output += "<constant> ";
+ !}
+
+ <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 += "<private> ";
+ if (member.isInner) output += "<inner> ";
+ if (member.isStatic) output += "<static> ";
+ !}
+
+ <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 += "<private> ";
+ if (member.isInner) output += "<inner> ";
+ if (member.isStatic) output += "<static> ";
+ !}
+
+ <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">©{+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">©{+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 "<"+srcFilePath+">";
+ }
+ }
+
+ // 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">©{+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 += "<private> ";
- if (data.isInner) output += "<inner> ";
- !} </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 += "<private> ";
- if (member.isInner) output += "<inner> ";
- if (member.isStatic) output += "<static> ";
- if (member.isConstant) output += "<constant> ";
- !} </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 += "<private> ";
- if (member.isInner) output += "<inner> ";
- if (member.isStatic) output += "<static> ";
- !} </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 += "<private> ";
- if (member.isInner) output += "<inner> ";
- if (member.isStatic) output += "<static> ";
- !} </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 += "<private> ";
- if (data.isInner) output += "<inner> ";
- !}
- <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 += "<private> ";
- if (member.isInner) output += "<inner> ";
- if (member.isStatic) output += "<static> ";
- if (member.isConstant) output += "<constant> ";
- !}
-
- <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 += "<private> ";
- if (member.isInner) output += "<inner> ";
- if (member.isStatic) output += "<static> ";
- !}
-
- <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 += "<private> ";
- if (member.isInner) output += "<inner> ";
- if (member.isStatic) output += "<static> ";
- !}
-
- <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">©{+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">©{+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 "<"+srcFilePath+">";
- }
- }
-
- // 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" */
};