From d9fd21d5bba2812f6ac606c48fc57fe9fc9905ab Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 9 Dec 2013 09:20:16 +0000 Subject: [PATCH 001/444] docs(help) coderaiser/cloudcmd-archive -> cloudcmd/archive --- HELP.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/HELP.md b/HELP.md index cf76a84b..de3384f9 100644 --- a/HELP.md +++ b/HELP.md @@ -367,22 +367,22 @@ so to get it you should type a couple more commands: Version history --------------- -- *2013.12.09*, **[v0.7.0](//github.com/coderaiser/cloudcmd-archive/raw/master/cloudcmd-v0.7.0.zip)** -- *2013.11.08*, **[v0.6.0](//github.com/coderaiser/cloudcmd-archive/raw/master/cloudcmd-v0.6.0.zip)** -- *2013.10.17*, **[v0.5.0](//github.com/coderaiser/cloudcmd-archive/raw/master/cloudcmd-v0.5.0.zip)** -- *2013.09.27*, **[v0.4.0](//github.com/coderaiser/cloudcmd-archive/raw/master/cloudcmd-v0.4.0.zip)** -- *2013.08.01*, **[v0.3.0](//github.com/coderaiser/cloudcmd-archive/raw/master/cloudcmd-v0.3.0.zip)** -- *2013.04.22*, **[v0.2.0](//github.com/coderaiser/cloudcmd-archive/raw/master/cloudcmd-v0.2.0.zip)** -- *2013.03.01*, **[v0.1.9](//github.com/coderaiser/cloudcmd-archive/raw/master/cloudcmd-v0.1.9.zip)** -- *2012.12.12*, **[v0.1.8](//github.com/coderaiser/cloudcmd-archive/raw/master/cloudcmd-v0.1.8.zip)** -- *2012.10.01*, **[v0.1.7](//github.com/coderaiser/cloudcmd-archive/raw/master/cloudcmd-v0.1.7.zip)** -- *2012.08.24*, **[v0.1.6](//github.com/coderaiser/cloudcmd-archive/raw/master/cloudcmd-v0.1.6.zip)** -- *2012.08.06*, **[v0.1.5](//github.com/coderaiser/cloudcmd-archive/raw/master/cloudcmd-v0.1.5.zip)** -- *2012.07.27*, **[v0.1.4](//github.com/coderaiser/cloudcmd-archive/raw/master/cloudcmd-v0.1.4.zip)** -- *2012.07.19*, **[v0.1.3](//github.com/coderaiser/cloudcmd-archive/raw/master/cloudcmd-v0.1.3.zip)** -- *2012.07.14*, **[v0.1.2](//github.com/coderaiser/cloudcmd-archive/raw/master/cloudcmd-v0.1.2.zip)** -- *2012.07.11*, **[v0.1.1](//github.com/coderaiser/cloudcmd-archive/raw/master/cloudcmd-v0.1.1.zip)** -- *2012.07.09*, **[v0.1.0](//github.com/coderaiser/cloudcmd-archive/raw/master/cloudcmd-v0.1.0.zip)** +- *2013.12.09*, **[v0.7.0](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.7.0.zip)** +- *2013.11.08*, **[v0.6.0](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.6.0.zip)** +- *2013.10.17*, **[v0.5.0](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.5.0.zip)** +- *2013.09.27*, **[v0.4.0](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.4.0.zip)** +- *2013.08.01*, **[v0.3.0](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.3.0.zip)** +- *2013.04.22*, **[v0.2.0](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.2.0.zip)** +- *2013.03.01*, **[v0.1.9](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.1.9.zip)** +- *2012.12.12*, **[v0.1.8](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.1.8.zip)** +- *2012.10.01*, **[v0.1.7](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.1.7.zip)** +- *2012.08.24*, **[v0.1.6](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.1.6.zip)** +- *2012.08.06*, **[v0.1.5](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.1.5.zip)** +- *2012.07.27*, **[v0.1.4](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.1.4.zip)** +- *2012.07.19*, **[v0.1.3](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.1.3.zip)** +- *2012.07.14*, **[v0.1.2](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.1.2.zip)** +- *2012.07.11*, **[v0.1.1](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.1.1.zip)** +- *2012.00.00*, **[v0.1.0](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.1.0.zip)** License --------------- From 1fc2d23943fa8c7b7cfc1faa5b44fba79b19ac54 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 9 Dec 2013 11:03:55 +0000 Subject: [PATCH 002/444] chore(server) rm " " --- lib/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/server.js b/lib/server.js index bb47fc67..29a4b8ab 100644 --- a/lib/server.js +++ b/lib/server.js @@ -164,7 +164,7 @@ response : pRes }; - if (lConfig.rest ) + if (lConfig.rest) lRet = Util.exec(Rest, lData); if (!lRet && Route) From 660f7d7a6fe14d0806064a1f3055c014e6e40b8a Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 9 Dec 2013 12:12:34 +0000 Subject: [PATCH 003/444] refactor(cloudfunc) combine -> join --- html/index.html | 8 ++++---- lib/client/console.js | 2 +- lib/client/edit.js | 4 ++-- lib/cloudfunc.js | 14 +++++++------- lib/server.js | 12 ++++++------ 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/html/index.html b/html/index.html index 3b140811..bab2b82c 100644 --- a/html/index.html +++ b/html/index.html @@ -10,7 +10,7 @@ {{ title }} - + @@ -41,7 +41,7 @@ 'lib/cloudfunc.js', 'lib/util.js' ], - url = getCombineURL(files); + url = getJoinURL(files); window.addEventListener('load', createScript); setPanelHeight(); @@ -55,9 +55,9 @@ window.removeEventListener('load', createScript); } - function getCombineURL(files) { + function getJoinURL(files) { var regExp = new RegExp(',', 'g'), - url = '/combine/' + files; + url = '/join/' + files; url = url.replace(regExp, ':'); diff --git a/lib/client/console.js b/lib/client/console.js index a47f7150..ab0dae3f 100644 --- a/lib/client/console.js +++ b/lib/client/console.js @@ -141,7 +141,7 @@ var CloudCmd, Util, DOM, CloudFunc, $; lDir + 'jqconsole.css', lDir + 'ansi.css' ], - lAllCSS = CloudFunc.getCombineURL(lCSS), + lAllCSS = CloudFunc.getJoinURL(lCSS), lFiles = [ lDir + 'jqconsole.js', lAllCSS diff --git a/lib/client/edit.js b/lib/client/edit.js index cef834c7..1950f948 100644 --- a/lib/client/edit.js +++ b/lib/client/edit.js @@ -190,7 +190,7 @@ var CloudCmd, Util, DOM, CloudFunc, ace, DiffProto, diff_match_patch; LIBDIR + 'diff.js', LIBDIR + 'diff/diff-match-patch.js' ], - url = CloudFunc.getCombineURL(libs); + url = CloudFunc.getJoinURL(libs); DOM.jsload(url, function() { var patch, @@ -225,7 +225,7 @@ var CloudCmd, Util, DOM, CloudFunc, ace, DiffProto, diff_match_patch; DIR + 'ext-modelist.js', ], lAce = DIR + 'ace.js', - lURL = CloudFunc.getCombineURL(lFiles); + lURL = CloudFunc.getJoinURL(lFiles); DOM.anyLoadOnLoad([lURL, lAce], function() { diff --git a/lib/cloudfunc.js b/lib/cloudfunc.js index 4d3daefc..1370c778 100644 --- a/lib/cloudfunc.js +++ b/lib/cloudfunc.js @@ -29,7 +29,7 @@ var Util; function CloudFuncProto(Util) { var CloudFunc = this, FS, - COMBINE = '/combine/'; + JOIN = '/join/'; /* Путь с которым мы сейчас работаем */ this.Path = ''; @@ -49,25 +49,25 @@ var Util; this.LEFTPANEL = 'left'; this.RIGHTPANEL = 'right'; - this.getCombineURL = function(names) { + this.getJoinURL = function(names) { var url, nameStr = names + ''; nameStr = Util.replaceStr(nameStr, ',', ':'); - url = COMBINE + nameStr; + url = JOIN + nameStr; return url; }; - this.getCombineArray = function(url) { - var str = Util.removeStrOneTime(url, COMBINE), + this.getJoinArray = function(url) { + var str = Util.removeStrOneTime(url, JOIN), names = str.split(':'); return names; }; - this.isCombineURL = function(url) { - var ret = Util.isContainStrAtBegin(url, COMBINE); + this.isJoinURL = function(url) { + var ret = Util.isContainStrAtBegin(url, JOIN); return ret; }; diff --git a/lib/server.js b/lib/server.js index 29a4b8ab..7b8991a5 100644 --- a/lib/server.js +++ b/lib/server.js @@ -171,7 +171,7 @@ lRet = Util.exec(Route, lData); if (!lRet) - lRet = combine(lData); + lRet = join(lData); if (!lRet) { lName = lData.name; @@ -213,7 +213,7 @@ }; } - function combine(params) { + function join(params) { var names, i, n, name, minName, stream, check, funcs = [], config = main.config, @@ -222,7 +222,7 @@ p = params, isGzip = main.isGZIP(p.request), path = params.name, - isCombine = CloudFunc.isCombineURL(path), + isJoin = CloudFunc.isJoinURL(path), readPipe = function() { main.mainSetHeader({ name : names[0], @@ -264,8 +264,8 @@ gzip.pipe(p.response); }; - if (isCombine) { - names = CloudFunc.getCombineArray(path); + if (isJoin) { + names = CloudFunc.getJoinArray(path); n = names.length; if (!config.minify) @@ -290,7 +290,7 @@ } } - return isCombine; + return isJoin; } function checkExtension(name) { From 8e8daab7b3ce763899b849cbbdde9d48fb63eb43 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 9 Dec 2013 13:06:09 +0000 Subject: [PATCH 004/444] feature(cloudfunc) getJoinURL: rm first "/" --- lib/cloudfunc.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/cloudfunc.js b/lib/cloudfunc.js index 1370c778..4bc25afe 100644 --- a/lib/cloudfunc.js +++ b/lib/cloudfunc.js @@ -50,11 +50,16 @@ var Util; this.RIGHTPANEL = 'right'; this.getJoinURL = function(names) { - var url, - nameStr = names + ''; + var url, isContain, + nameStr = names + ''; - nameStr = Util.replaceStr(nameStr, ',', ':'); - url = JOIN + nameStr; + nameStr = Util.replaceStr(nameStr, ',', ':'); + isContain = Util.isContainStrAtBegin(nameStr, '/'); + + if (isContain) + nameStr = Util.removeStrOneTime(nameStr, '/'); + + url = JOIN + nameStr; return url; }; From bfd1a56104cd88ef01c6dec2dcad01aec0da6bc1 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 9 Dec 2013 13:10:12 +0000 Subject: [PATCH 005/444] fix(client) baseInit pCallBack: mv to end --- lib/client.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/client.js b/lib/client.js index 3da247f0..f55583d8 100644 --- a/lib/client.js +++ b/lib/client.js @@ -252,14 +252,13 @@ var Util, DOM, CloudFunc, CloudCmd; Storage.set(lDirPath, getJSONfromFileTable()); }); - Util.exec(pCallBack); - /* выделяем строку с первым файлом */ var lFiles = DOM.getFiles(); if (lFiles) DOM.setCurrentFile(lFiles[0]); Util.exec(CloudCmd.Key); + Util.exec(pCallBack); } function getSystemFile(pGlobal, pURL) { From 9f7e919fea8ddc9c057c1192244ea06c20eeabec Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 9 Dec 2013 13:26:11 +0000 Subject: [PATCH 006/444] docs(help) change date of v0.1.0 --- HELP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HELP.md b/HELP.md index de3384f9..ddff3b75 100644 --- a/HELP.md +++ b/HELP.md @@ -382,7 +382,7 @@ Version history - *2012.07.19*, **[v0.1.3](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.1.3.zip)** - *2012.07.14*, **[v0.1.2](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.1.2.zip)** - *2012.07.11*, **[v0.1.1](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.1.1.zip)** -- *2012.00.00*, **[v0.1.0](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.1.0.zip)** +- *2012.07.09*, **[v0.1.0](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.1.0.zip)** License --------------- From 3e0abe049745091f14231766fa83590deedaaad4 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 9 Dec 2013 16:22:39 +0200 Subject: [PATCH 007/444] docs(help) jq-console: fix url --- HELP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HELP.md b/HELP.md index ddff3b75..7bfaf194 100644 --- a/HELP.md +++ b/HELP.md @@ -343,7 +343,7 @@ For extend main functionality Cloud Commander use next modules: [AceURL]: //ace.ajax.org/ "Ace" [FancyBoxURL]: //github.com/fancyapps/fancyBox "FancyBox" [jQuery-contextMenuURL]: //github.com/medialize/jQuery-contextMenu "jQuery-contextMenu" -[jq-consoleURL]: //github.com/replit/jq-console‎ "jq-console" +[jq-consoleURL]: //github.com/replit/jq-console "jq-console" [githubURL]: //github.com/michael/github "github" [dropbox-jsURL]: //github.com/dropbox/dropbox-js "dropbox-js" [jqueryURL]: //jquery.com From 8da60a7b1e0481334f40a06caf7445d5daf98b19 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 9 Dec 2013 18:07:04 +0200 Subject: [PATCH 008/444] docs(help) Version history: rm "\n" --- HELP.md | 1 - 1 file changed, 1 deletion(-) diff --git a/HELP.md b/HELP.md index 7bfaf194..2cb8f1c9 100644 --- a/HELP.md +++ b/HELP.md @@ -366,7 +366,6 @@ so to get it you should type a couple more commands: Version history --------------- - - *2013.12.09*, **[v0.7.0](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.7.0.zip)** - *2013.11.08*, **[v0.6.0](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.6.0.zip)** - *2013.10.17*, **[v0.5.0](//github.com/cloudcmd/archive/raw/master/cloudcmd-v0.5.0.zip)** From bab6451339c1dddee23dd5daa244e77ec86e3bd6 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 10 Dec 2013 11:40:16 +0000 Subject: [PATCH 009/444] feature(contact) add --- html/index.html | 1 + json/modules.json | 1 + lib/client/contact.js | 75 ++++++++++++++++++++++++++++++++ lib/client/contact/olark.js | 87 +++++++++++++++++++++++++++++++++++++ lib/client/listeners.js | 36 +++++++++------ 5 files changed, 186 insertions(+), 14 deletions(-) create mode 100644 lib/client/contact.js create mode 100644 lib/client/contact/olark.js diff --git a/html/index.html b/html/index.html index bab2b82c..4af7579a 100644 --- a/html/index.html +++ b/html/index.html @@ -27,6 +27,7 @@ + From 0512f6f233a3501b9fb8c2add9537bdda9b75c1b Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 24 Dec 2013 11:09:17 +0000 Subject: [PATCH 041/444] fix(dom) first 2 files not select --- lib/client/dom.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/client/dom.js b/lib/client/dom.js index fd79409b..c5864a65 100644 --- a/lib/client/dom.js +++ b/lib/client/dom.js @@ -1608,12 +1608,18 @@ var CloudCmd, Util, DOM, CloudFunc, Dialog; var i, n, isStr = Util.isString(pCurrent), lCurrent = !isStr && pCurrent || Cmd.getCurrentFile(), - lParent = lCurrent.parentElement, - lNodes = lParent.childNodes; + panel = DOM.getPanel(), + files = DOM.getFiles(panel), + name = DOM.getCurrentName(files[0]); - /* not path and fm_header */ - for (i = 2, n = lNodes.length; i < n; i++) - DOM.toggleSelectedFile( lNodes[i] ); + if (name === '..') + i = 1; + else + i = 0; + + n = files.length; + for (;i < n; i++) + DOM.toggleSelectedFile(files[i]); return Cmd; }; From 6437e5d5470dc26974581bfef1059e2dcb27c5af Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 24 Dec 2013 12:07:27 +0000 Subject: [PATCH 042/444] chore(font) rm DroidSansMono.txt --- font/DroidSansMono.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 font/DroidSansMono.txt diff --git a/font/DroidSansMono.txt b/font/DroidSansMono.txt deleted file mode 100644 index e69de29b..00000000 From 7ecce39fb8626e3c5478a965e022ff7f7bad307f Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 24 Dec 2013 12:08:53 +0000 Subject: [PATCH 043/444] feature(css) style height: .fm 85%, .keyspanel 15% --- css/style.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/css/style.css b/css/style.css index 1f7b0b0f..c19d22e0 100644 --- a/css/style.css +++ b/css/style.css @@ -156,7 +156,7 @@ body { background-image:url('/img/txt.png'); } .fm { - height: 90%; + height: 85%; margin: 26px 26px 0 26px; } .fm-header { @@ -198,7 +198,7 @@ body { .keyspanel { text-align: center; - height: 10%; + height: 15%; } .name { From c68699ff5c6ffbf8885c0076caae6644785aba2a Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 24 Dec 2013 12:44:24 +0000 Subject: [PATCH 044/444] fix(key) insert --- lib/client/key.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/client/key.js b/lib/client/key.js index 2f468c84..a009cdd7 100644 --- a/lib/client/key.js +++ b/lib/client/key.js @@ -189,7 +189,7 @@ var CloudCmd, Util, DOM; case Key.INSERT: DOM .toggleSelectedFile(lCurrent) - .setCurrentFile(Info.next); + .setCurrentFile(next); break; case Key.DELETE: From cf601a09e04de3e498f5a644674912c043847af7 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 24 Dec 2013 12:48:37 +0000 Subject: [PATCH 045/444] feature(font) add config icon --- css/style.css | 11 ++- font/LICENSE | 201 --------------------------------------------- font/fontello.eot | Bin 5068 -> 5284 bytes font/fontello.json | 34 ++++++++ font/fontello.svg | 49 +++-------- font/fontello.ttf | Bin 4892 -> 5116 bytes font/fontello.woff | Bin 3136 -> 3212 bytes html/index.html | 2 +- 8 files changed, 55 insertions(+), 242 deletions(-) delete mode 100644 font/LICENSE create mode 100644 font/fontello.json diff --git a/css/style.css b/css/style.css index c19d22e0..1e89a5d3 100644 --- a/css/style.css +++ b/css/style.css @@ -71,7 +71,7 @@ body { font-size : 14px; color : rgb(222, 41, 41); cursor : default; - content : '\2757'; + content : '\e800'; } .loading { @@ -105,6 +105,11 @@ body { transition: ease 0.1s; } +.config-button:before { + font-family: 'Fontello'; + content: '\e804 '; +} + .cmd-button:hover { border: 1.5px solid; transition: ease 0.5s; @@ -274,12 +279,12 @@ a:hover, a:active { top: 10px } .directory::before { - content: '\1f4c1'; + content: '\e802'; } .text-file::before { color: rgb(26, 224, 124); color: rgba(26, 224, 124, 0.56); - content: '\1f4c4'; + content: '\e801'; } .text-file { background-image:none; diff --git a/font/LICENSE b/font/LICENSE deleted file mode 100644 index 753842b6..00000000 --- a/font/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/font/fontello.eot b/font/fontello.eot index 9ae403f0715efd1f87c417b85ce50405185e9abf..df78c735a9224aad7d8a393129aa449d5ea99e8d 100644 GIT binary patch literal 5284 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 R=WV|G4XJ&*q~q@&_HQZDZyx{v literal 5068 zcmds4TWlQV6+ZvW?9F$_SF(2Uug7+5@9bv1z9w1dX4h*690xlI$!@sqdcD3Rw%4+q zHW5;VRH)FZrBc=MfKVk6;-RXle-n^WwFsz?08yaoODkTG+CCsu(LMyh1Bv^c*yMTRP;4{gd#`+S%x=5w z(Lh;Rr954v1)w!NiE3zuazHDvu0fY{2Kpv#!IGzS=ppcIaoaYnct|J>h}Af%}Kq?`})y*3Nk%PXqH8 zHA>$xf(>1`*l1fHa2q`*IxeXvqXDXho4gE-?*th0H$|(|M;_ADfCToogDB} z(0&W+k4jQ}K!XB9duv?z4GjgXT(gUb1&SUxyR)O8L~YLL(jGFdbLoOlRGSDjA_MpF zQZL{_w~+-|W!nvV;0&%V0Esw}%jqyc z(;FT2{-H)+QI#xqH$`kkV_tXESLbz$i(ytGf~nut!T_Ss}~ zAKD#;?npU>rqLYuRY%D%#2g7xEn?m%I)f&iv{Z#jh;Gc3Nrp(Iq75z02d%!I&b`fD zExx{PSA)N4cyw%ZDBRlC+S2TFInA!#1HGcl+0xY9dPIcBnudE#-G-xgieW#u)L(iq zxAn+tV}~F&ANl>*A(400RMoha8Z|s0uW?;)RW)94SBr;0I(+G&>~>j-pL(1(UvRqX z#5t$u#-Cj^)$a3qs$G~p^*itCpK2dd9qpqBr&TS|m82Vn{s5+)MuwJj2&73f5X2di zNO+_BLD84LnSpc#b?$9zZfx*4sZP{7>--|z>eB0k>FYY6_l^$rwE4#F5=eBvXdUu} zTlKd(o3sI~t@HEuha3Z1Q>T8u>hmjghHQR*xNG13F>$)NTU>AP-i&zL!s2yr%X;5q zO`To)y4x`x4&?ES_BK|ljuC7lFYTuj(P_*LC&r)Gl<<%^TaBmN;c=hEz-V(-7)=bM z!=cZSu2<`^jt+;>vA<*gzE1DnJKA|zYO9PU$DYQ98jO~&#fKDH8k?O+p?9Qlcy!3& zYxL>95np4AZ{%;H{pN?_v4O)!`ft|sMUM1~>o;q}^>rAz;mLF2ABP8SO!Oa#^l88A zKeBLRLVT9Ic`3=$&tB4~@3D_wdGF!+$R|{-f5_(B_B3Rue~JvTA?~hvyravVXXu>a zV!rgYXu=@(EdHD2eV##AEyRUpZ$AYxWy6^a62i?y9_Rk+Nl>u7tzC> zr)&%MZ2I-C{}HtD8~mP|UMyp5tn_vn>(nhe%Ge;cI90|DY7pNqV<+s-V$6hrbBS;k zm9fCN^IREgI51x>W1WuCpUT*PpQB~$ASoUwV<+rCp*W7x4Z4hDb%mB_nYKwH+c@<@ zhVA1u3^Wgh1hd3i!Qq=hUJ}oXcw^aa*@7O$y=WiK+c>IM@yp|Q&f4Z zZkgzhTqru`W0G60RFO8|1B}apEWlkcL=Ad@iZnasL&RE1r(2)?5dAC?%gOH8D?Rc+3^6j0UH^jvcKRLSV|!QN!sYpf#G z#_vlOYir{OA5$KGiqqD5V&#mBRlvn+Jd|iPCAy3(z%Y7Z1=JR?-2*-o?^ZBI&wd|1 z?6wp#nL_`k((2LqTNT4Mag#ZrL|oBbSA-BKZa~$dJC4NZB&k|6Ce!fxQeB(VlgDyF$~_?t_bG6L09dvYB-&jYI4Ql?*-0|C`zNjZfXQki^aX55s8`;uQaVw?l2 zcekXXRrL%g(Gs#Nc;Jf}-`><`$q{>9^;@L$(hSE^sl;PQtuNY}#>8Fbc(G5kpjQKy zjGzYN-gLjLBU#c{(rs!PqswQ>my{h%< zdsDF(=ClXf1mYp0Ihj^Q91|65iTtI#N{go#Or^&&3z+#@JmUpUr?3z}%OEiJL~}AT z?ls|Ol84U|w|&7y$rU1CPk@4&_>}|8!olz2J?w(V9^r zku^&dFYRe&xvJ<>Kn;~6#w%q_^TB{DDwQ9$Oc~_#C$URKQo&-kXvX9o*)^m1x6Grv zW}97k^)}9!rGoxS%WY1_Ep^aez>xFU7BKn05*Wn}s&2$TWLJdeOQnE37qGZw5Hq*b z$HQ2N*v@t*Rwc!6pE*}eLyrfDL*(-O9dc~a%~c*o}9!!Ua3aR;(4WxqIhxZ z3ejPJ2>`($VOP1M?`9hb=X@%TBXmvokhg_PmXlnzdATm%6};P0iVesf#vZ>XM~~cB#v( z*whspG4;HSn0mqTD|b%m-Lsc?`wkFIU!ylqCW}Hmnfi?z|4L*fHpvMb&gRAyqtBB# wIdQeB+G+TUPBDS0^#s0QqE94?PJN=-%Njl#Sj7hdu4`iFab^6t=%9&z11<_Sg#Z8m diff --git a/font/fontello.json b/font/fontello.json new file mode 100644 index 00000000..38dfddec --- /dev/null +++ b/font/fontello.json @@ -0,0 +1,34 @@ +{ + "name": "", + "css_prefix_text": "icon-", + "css_use_suffix": false, + "hinting": true, + "units_per_em": 1000, + "ascent": 850, + "glyphs": [ + { + "uid": "b035c28eba2b35c6ffe92aee8b0df507", + "css": "attention-circled", + "code": 59392, + "src": "fontawesome" + }, + { + "uid": "1189604bf305b6b03a74685ce60e6632", + "css": "doc-text", + "code": 59393, + "src": "entypo" + }, + { + "uid": "0ccb084ddeeae372673793ed0b45bb4a", + "css": "folder", + "code": 59394, + "src": "entypo" + }, + { + "uid": "7336247ba3db350dec8d6c0a47cef966", + "css": "cog-1", + "code": 59396, + "src": "mfglabs" + } + ] +} \ No newline at end of file diff --git a/font/fontello.svg b/font/fontello.svg index 0eb33d8e..6a1f4a89 100644 --- a/font/fontello.svg +++ b/font/fontello.svg @@ -1,40 +1,15 @@ - + - -Created by FontForge 20100429 at Thu Jan 24 11:50:44 2013 - By root -Copyright (C) 2012 by original authors @ fontello.com - +Copyright (C) 2013 by original authors @ fontello.com - - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/font/fontello.ttf b/font/fontello.ttf index 2868965d8d6901025ff86f916b807dcfe7299f4f..1eb103fadec3e2a7414c132f434bedc4d1a33af8 100644 GIT binary patch literal 5116 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 D0nc2) literal 4892 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 diff --git a/font/fontello.woff b/font/fontello.woff index 5cf2f300c8b4f779e07c96206cef6a50308a1a33..e6fd9077660a36bb54f29c54da23e9f226bfb0f1 100644 GIT binary patch literal 3212 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 diff --git a/html/index.html b/html/index.html index 81068777..73c9953e 100644 --- a/html/index.html +++ b/html/index.html @@ -25,7 +25,7 @@ - + From 52c0fbf2f8997a868d15b3981e571e5c8b3cc9bb Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 24 Dec 2013 13:00:19 +0000 Subject: [PATCH 046/444] feature(style) cmd-button: add directory icon --- css/style.css | 5 +++++ html/index.html | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/css/style.css b/css/style.css index 1e89a5d3..4bd7c674 100644 --- a/css/style.css +++ b/css/style.css @@ -110,6 +110,11 @@ body { content: '\e804 '; } +.directory-button:before { + font-family: 'Fontello'; + content: '\e802 '; +} + .cmd-button:hover { border: 1.5px solid; transition: ease 0.5s; diff --git a/html/index.html b/html/index.html index 73c9953e..d522eca8 100644 --- a/html/index.html +++ b/html/index.html @@ -22,7 +22,7 @@ - + From 79f84917544c25553b640f11ca5334dc4e8f0045 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Tue, 24 Dec 2013 14:49:02 +0000 Subject: [PATCH 047/444] feature(css) keyspanel: add icons for: help, view, edit, delete, menu, console and contact --- css/style.css | 35 ++++++++++++++++ font/fontello.eot | Bin 5284 -> 7328 bytes font/fontello.json | 98 +++++++++++++++++++++++++++++++++++++++++++++ font/fontello.svg | 9 ++++- font/fontello.ttf | Bin 5116 -> 7160 bytes font/fontello.woff | Bin 3212 -> 4544 bytes html/index.html | 14 +++---- 7 files changed, 148 insertions(+), 8 deletions(-) diff --git a/css/style.css b/css/style.css index 4bd7c674..0e80c137 100644 --- a/css/style.css +++ b/css/style.css @@ -105,6 +105,26 @@ body { transition: ease 0.1s; } +.help-button:before { + font-family: 'Fontello'; + content: '\e803 '; +} + +.view-button:before { + font-family: 'Fontello'; + content: '\e80a '; +} + +.edit-button:before { + font-family: 'Fontello'; + content: '\e806 '; +} + +.contact-button:before { + font-family: 'Fontello'; + content: '\e809 '; +} + .config-button:before { font-family: 'Fontello'; content: '\e804 '; @@ -115,6 +135,21 @@ body { content: '\e802 '; } +.delete-button:before { + font-family: 'Fontello'; + content: '\e802 '; +} + +.menu-button:before { + font-family: 'Fontello'; + content: '\e805 '; +} + +.console-button:before { + font-family: 'Fontello'; + content: '\e807 '; +} + .cmd-button:hover { border: 1.5px solid; transition: ease 0.5s; diff --git a/font/fontello.eot b/font/fontello.eot index df78c735a9224aad7d8a393129aa449d5ea99e8d..374e453daeb39e5d008080e9add8f8606afc147e 100644 GIT binary patch delta 2749 zcmai0Z){sv6+h?R`|f*wcAV$<*-mTMNo~h&n>J12e_hih&Yv~yI<=)~*1B1@&xRz}N*bxjbU4p1V>2M|aZlh~LFd?28G7^oj6At(|RLQ@!(Iz$H@Y8}qA z6FOB4-qStzo1_1U^dvf$MGmY}hiU4qZK>EOm;>pRc=w~|s>Kp*JD<^YjiX=Bkzf8S$a^m?D zt+Dqd0DA?%zNwJUjlnNH>j7%sBz>wt0`*mXgm}weq%b*?JGAzN-&KGAF zuC4(1=ZSwBkiR_l4eUCu^Fu4A;23X&uag|9RUb~B)dH)sKH@BG00huiK~j&v0G9O? z@=85eeLX((f$}@u4Cf9qrIW8bSb2?Sxg8wjp#=&VeFG}OgPgIReT(%6k7oR!0OJZ9 zvOdJ|2nYcKl0K=6xi9j!o=^Z*zR9jrpd8%b13xstQ08b2suYVVvt)>91I#*!YKl$E zI#2WHY*FLx;PmDH+#FzUHQ6BHD~0 zxdBaY2ezl&i53ipRM~*ucze1N+r1uBs!sHIs`^B#3p=^bbYiH5kvfQYSJytR=@oLh z^O?4b{kEDXg|sQbrX5?n{_rlWsOswideC(IcKTP#Z%@h3UBCO*3x|?x^K>k=9d7xo zQ%?&u>JQd=);o+$)FiKUA-f^h2R0pgZfRy_>3xgLy{kMZ5hzwZ;>Xw$Wv&6XLn;&B zghJ5>3&?tC@q#PD+C)a1J7l4uk^~sA(A6JJ(i@ka<|b=(8$;1pGLcGeZ1-~FW2?Mx zm0#0W_^fH%zf)_L(Cg%`S}#`F|H_T^*P5iLP&D>9$+)&cu__}FywQ|UB3gZVp?qn9osKWWjjhI@@zd_X?uHc3uDK}x>{Qi3&oDYm!Yu=u z;EASHC%aX0q2cBE@}+rfNstfYu(6f)mTD92?E?E0m=J+jCSs$qf;|>8IUP$fKp>oQ zD?6O^CwBzuguB^>GPE6|w6vH-Qtdu#QLE{oC6`ihLMQGn-&dS6Amz=QQU(-5ppa}( z*B&fe2a?rmI&LEqB_N&h<{zr2#2e-NVavcGlzX6}SXZe*)=BDsUN{No_bpbyP+P+^ zht4Ewa!4U83dTT1C=G!McGZ3aY&PcrIGwtUYEdgV!KOKF*-w~7lk9f&0F^HLfHk{6 zn^|{aEH^xqJ$&fEQ+xZnGwy^tX+3eHz8PJnq|#K`eJV{}-^cjUqXLU}yEeMaAW~*J z5#zCFEG$)pa#rzV;V9+`hoY3dR0mRNOUK*24M+rox)!nWLFDqo;mf*Om8$xlvP07t z-e8(mzVt7@P)e^!fq&Jt)G7dy*7P65Y+JoQ@@~~)KcvLJQU19l#BPgz!ni!fTo3Lz zOkFowzFR?52I!Ly?zHsvv@mxil;fTN2F>HTRVN57E8~2b{Q^o+2xl7obj@LpvxY&} zqZKX^3Nxb_sZNJOF{#o^H7=Tp5|*fdvo37GSfZ1~setq4m)^S=+cGuhkLXUib{Kbv z8dEh5wf5*39=vdU?BaVb;c)KSh{#1Xfesy6iLhU*IK5gR;NH?cdwB1KksTw~Dt9%Z zeVKg$To8gdq%#RSBV5uAu4rQ3{WK#{XXwzPraAwGDc(8#Y3B) zNJ}+{jVVk-)sXbi{-&r_m*VXy#Z;wejL-o|r?#T-dHKTNxzOy5+0ePceYa5DD*wc= z?;bO}MqjJlz~9;Tm+zH-U%t2BZr_g@Mp4^u$DJ3tclH)$XA8YMyDv;%yoh_rbnFR- zlhx_1ea1U(_xY<=&%2}MxvT8kFPK)Et=8DK_+s(d+Fc)lom;c{k# zF+O)sHkAI!Z&xN*inYgK*>n0&VArYtOLfe@x7u5}d1@|d*0|!ErhXp&guC$;8)i#< zQGj??i6~zsxfPBB3f3W}he0E3gDDzK*scJ)eoFm2TStF_NS7d8A9O>YN-MXaj&^j+ z74*;!M{Mh)6Hj|&89G}WfC^OT!GX-_@^d#wK Xc>ekP+$(xm8Rv~FAx#stX$BK&q@Y*@ zr3f0wMbQWfS?ETDxDuBEE2#JnNyYyNw(C(?| zBU)f~Zn+XG-#qf`#5VvfMk1Xzt!DqqSAdQ)#?v#Uh+cFq1I7=IhbOIUe%@C;1o$?x zR>_)0i*?s`>%G~j>y!QQ!Yx270Pvu zLchaL?^Gde(xQ0HoEspJH_I03#vkT2=8s zS2Nb57f&3Z$IVZGr~$@1}Smw<|u~TnCXU@h3pdh3YDQFtvI=A(WLQ0B*$WQh) z`OY5J`u3lXr8bZUIy`!kQ-};uvWs7@GQ3Hy6>&ca;TsK*QZmjR{L-G$?%Hkbqy1NJ z?{Md3EYHmbE_5IM3BPQ*bADO6v~Hs>omHo5-|HG2Ta~TpKNTfAqx!g$pQ z;0C_aNm^X1P&ml@xJO_Bdoayjp+408TliTfL6S65_P*eduF{3<-l%;)xJ^}M#HrTb H23y8IR}6&E diff --git a/font/fontello.json b/font/fontello.json index 38dfddec..a3ff495f 100644 --- a/font/fontello.json +++ b/font/fontello.json @@ -6,12 +6,110 @@ "units_per_em": 1000, "ascent": 850, "glyphs": [ + { + "uid": "60617c8adc1e7eb3c444a5491dd13f57", + "css": "attention-circled-1", + "code": 59395, + "src": "custom_icons", + "selected": false, + "svg": { + "path": "M429 71Q545 71 644 129T800 285T857 500T800 715T644 871T429 929T213 871T58 715T0 500T58 285T213 129T429 71ZM500 767V661Q500 653 495 648T483 643H376Q368 643 363 648T357 661V767Q357 775 363 780T376 786H483Q490 786 495 780T500 767ZM499 575L509 229Q509 222 503 219Q498 214 490 214H367Q359 214 354 219Q348 222 348 229L358 575Q358 581 363 585T377 589H480Q488 589 493 585T499 575Z", + "width": 857.1 + }, + "search": [ + "attention-circled" + ] + }, + { + "uid": "9347a40928618e76958fa67e5333f1c5", + "css": "doc-text-1", + "code": 59397, + "src": "custom_icons", + "selected": false, + "svg": { + "path": "M212 542L212 452L492 452L492 542L212 542ZM600 50Q642 50 671 79T700 150L700 850Q700 890 671 920T600 950L100 950Q60 950 30 920T0 850L0 150Q0 108 30 79T100 50L600 50ZM600 850L600 150L100 150L100 850L600 850ZM490 258L490 346L210 346L210 258L490 258ZM490 650L490 738L210 738L210 650L490 650Z", + "width": 700 + }, + "search": [ + "doc-text" + ] + }, + { + "uid": "6405321f27abab4a505476c917d8c748", + "css": "folder-1", + "code": 59398, + "src": "custom_icons", + "selected": false, + "svg": { + "path": "M954 350Q986 350 994 362T1000 398L958 850Q956 874 946 887T904 900L98 900Q46 900 42 850L0 398Q-2 374 6 362T46 350L954 350ZM920 240L930 280L84 280L98 148Q102 128 118 114T154 100L318 100Q370 100 404 134L434 164Q466 200 520 200L860 200Q880 200 898 212T920 240Z", + "width": 1001 + }, + "search": [ + "folder" + ] + }, + { + "uid": "2ba2063e74ee7b74f6c46a949d37a130", + "css": "cog-2", + "code": 59399, + "src": "custom_icons", + "selected": false, + "svg": { + "path": "M0 498Q0 460 7 415Q57 419 102 396T172 328Q197 283 195 233T165 142Q229 86 315 56Q338 97 379 122T469 146T558 122T622 56Q707 86 772 142Q751 181 751 227T774 313Q798 354 839 377T926 400Q937 449 937 498Q937 530 930 572Q885 573 846 597T783 660Q758 704 760 752T786 841Q720 901 641 934Q618 892 577 867T487 842Q434 842 391 870T327 944Q245 918 174 862Q202 821 204 771T181 676Q154 630 107 606T9 589Q0 548 0 498ZM293 498Q293 571 344 622T469 673T593 622T644 498T593 374T469 322T344 374T293 498Z", + "width": 937.5 + }, + "search": [ + "cog-1" + ] + }, + { + "uid": "17ebadd1e3f274ff0205601eef7b9cc4", + "css": "help-circled", + "code": 59395, + "src": "fontawesome" + }, + { + "uid": "c5fd349cbd3d23e4ade333789c29c729", + "css": "eye", + "code": 59402, + "src": "fontawesome" + }, + { + "uid": "41087bc74d4b20b55059c60a33bf4008", + "css": "edit", + "code": 59398, + "src": "fontawesome" + }, + { + "uid": "85528017f1e6053b2253785c31047f44", + "css": "comment", + "code": 59401, + "src": "fontawesome" + }, { "uid": "b035c28eba2b35c6ffe92aee8b0df507", "css": "attention-circled", "code": 59392, "src": "fontawesome" }, + { + "uid": "f48ae54adfb27d8ada53d0fd9e34ee10", + "css": "trash", + "code": 59400, + "src": "fontawesome" + }, + { + "uid": "559647a6f430b3aeadbecd67194451dd", + "css": "menu", + "code": 59397, + "src": "fontawesome" + }, + { + "uid": "fa10777b2d88cc64cd6e4f26ef0e5264", + "css": "terminal", + "code": 59399, + "src": "fontawesome" + }, { "uid": "1189604bf305b6b03a74685ce60e6632", "css": "doc-text", diff --git a/font/fontello.svg b/font/fontello.svg index 6a1f4a89..c94b5dce 100644 --- a/font/fontello.svg +++ b/font/fontello.svg @@ -6,10 +6,17 @@ + + + + + + + - + \ No newline at end of file diff --git a/font/fontello.ttf b/font/fontello.ttf index 1eb103fadec3e2a7414c132f434bedc4d1a33af8..202813b138ce9261f5427284d7764afb2b4a8888 100644 GIT binary patch delta 2685 zcmahLZERE5^_+X}yYIt}^Bh0h0UIaSjtwM)B>rNA2Ipf0nu;(?3L$M8D=|1-5~7f9 zwAyOWq86&Dlw?{Z+D%02er)QbbV%z~u@7x*>W^;X$E0ax)6g_kS%*ZY(Tz^v>^vt~ zE3|I5?z#7T-h0nE_ndbxem7GB1OOMD0S+VmxgBjCTlalPlv^|&9i7ZiUk_|}699W? zJUse^*?M_uMF6-zAb#-p^ohwAjMMD^HBJEi;)(pJX`-9NU#3|*G4b^AmiYS;fV~9Z z*itOy$KV&ma)a;#CzBNM!I7s}jPtO#l=NB)n00b@* z{wN@S5nloYH1-U;N|di&EVnugerV-MIL7PY<%M0isj-KAVS6PA0%$9cG$Sy8Wn+a* z(G2!ni-1>Nz&dO$W{pj#2rqKRy84!C4<5}1XcNX2He}o4cm#xioFuD;Sa_Gc?BRSyfPE1`y++kAn@Zmh6sYl23|a{hMa zm&{~J@8@GX4 z;)1K92*g1c(FjNdKIY=e)za&*$7xk}N|Nq8IYu2-^pnfb( z4~tTk-WL}`pEwg^N> zInY^`#`$#<K~3;v!yp;|S=wD+ex@p;Ikt zq1K~oE`9J*v`ER}Q2VKLIdZmk?_hSr@v;2y(BR=i{g3SL?aX?To|OGdn6-`Qwj`CN zO7y8T`TU>2OAiuk+~eNtwn9jr=|D`xWATVo74lidlAT9!cO)Dm@1@(3N?Rt;=Bq;j z7&5e|?GFMMK3=|PsH;@f*jILH8pG>M)5_=n6%b144Jq)ihL&DSfRwHNdR%Yveb3jV z#lK6Af3y4(n~0q@{FHThjJfaMc3OsEu|lVUsN`tN`?s5Wx|*4%a+JrtK@3@s8+M(b zY*`uS%k1Y+ia{h>AE2IvU9KtydmgNC(Qt&BjYxGm5{^ri{#4^)=@{h_6>zo(n=zj3 zU-zV~M|Bxval7$Q@RJ#-hOj=3$(S0JUW#v;YIP~mmR2lPiux!$kW9J> zh2O^)2hN1&ug{0i4D{VZakKnG)3JBV^qD;^4ikUpI8eS@ez$!0fWvVBHH@Klz=6Bw zI(Ky!=jV&vyE^A)&Yi>kBs%t4r;F7XEj{Kt9?#iJm(F@()|pG}o6lOdo9$8Gy7ZOl zC#rXU2o7$49Ko;uIQNg$`H}BaQy*VADCzgwB`9Ay?gp%;eT0O^KY-s zHt#YGHw}ATu}!L9fi?Un9DG948d*M@&Bk^{^eLXf>f<1i11u z`FFN~zU7dbAhi$b5UA44bu`d{&V`@q;hoN6VPbmw==jX&L}5%BJ$Yh#tC%cIJtYcb sul@6?_<81`OV||%`EI&>=*+9XvB3e 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 D>t4jJ delta 1364 zcmXYxdoJchp6m0JY09f8Wv_Rk|m1}gjsSBTL3`t z)jb)>VKhnz07`G+S8JFfpnJ+93>E=UmQUbe^tTov&V@zCU4%8cN3LTr*#JZ_sB#|( z?oo1}UIk$^WKwHQh?4c6k|P1pb^3=UY{($HiwSg^2t9ySqS&WYT+ zGnuh8co=0Z@8#s&DU@9-rjkQq=((pLLpqs)-YDtW*>k^xuYjd*>4ShIa=WkGK_=6a z$Qno&v4D!B^M=R)gg0o2o<*oz%X}P1CY-; zB3w`|1In_wBy)h-hM2A&g^-Gz_#F2rO(OQ`R8hf%U#-^2r{|x}M1?NIt1?;*#zX!x z)ODtxEJJ!_RGbVLLp!TwD#V^u@kVbGrd$2E*H)L?4OKIpoAE@Rs^J-j6<_ak&+LrB zC|;Ar%huu6b?fD}b%)YdHB$FDQawLK*_m0G&#JP}JfK_DsMG)W_)Ibf$&HxZiAzCf zK?A0xSQTJ#ZTwxgJIf8hUMtDj_i}_n= zE9(hsE1f+CgSUfPn>aRC)P$4Tns>vqJf#eq8LwAHC5g3~$f`S#Tf6SuBP7;@c?acf z8e@y$}LX&c=JW?y77F$+)7 z_LW{gf2DJU}ugrQv~T_2goWBW*73@kl}-V(ZQ$uug5{?>DYo{2eb z=f&HV8lLU(jIH+DuRF@^@H{QfA)5rgee27)xjRfGioe*ECCpcT$im}>ai<#83f zhg_jv00DIX6u~hVc_;vFU<_j5ic!y2NrIfHRS=qkJ{E7*%}_^>Fp=@HR?B%aZODLhWi`R58D!gM)=7P_=$}U%%x!h{sCF;F%$p* diff --git a/html/index.html b/html/index.html index d522eca8..d1ceb1f5 100644 --- a/html/index.html +++ b/html/index.html @@ -16,18 +16,18 @@
{{ fm }}
- + - - + + - - + + - - + +
+ + + + diff --git a/lib/client/console/demos/index.html b/lib/client/console/demos/index.html new file mode 100644 index 00000000..6f57b493 --- /dev/null +++ b/lib/client/console/demos/index.html @@ -0,0 +1,120 @@ + + + + + + + +
+ + + + + diff --git a/lib/client/console/jqconsole.jquery.json b/lib/client/console/jqconsole.jquery.json index a42d1945..ad1331df 100644 --- a/lib/client/console/jqconsole.jquery.json +++ b/lib/client/console/jqconsole.jquery.json @@ -1,6 +1,6 @@ { "name": "jqconsole", - "version": "2.7.7", + "version": "2.8.0", "title": "Feature complete web terminal.", "author": { "name": "Amjad Masad", diff --git a/lib/client/console/karma.conf.js b/lib/client/console/karma.conf.js new file mode 100644 index 00000000..df3028a8 --- /dev/null +++ b/lib/client/console/karma.conf.js @@ -0,0 +1,23 @@ +module.exports = function(config) { + config.set({ + frameworks: ["mocha"], + files: [ + 'test/vendor/*.js', + 'lib/*.js', + 'test/setup.coffee', + 'test/ansi-test.coffee', + 'test/jqconsole-test.coffee', + 'test/prompt-test.coffee', + 'test/shortcuts-test.coffee', + 'test/history-test.coffee', + ], + browsers: ['Chrome'], + reporters: ['dots'], + coffeePreprocessor: { + // options passed to the coffee compiler + options: { + bare: false, + } + }, + }); +}; diff --git a/lib/client/console/jqconsole.js b/lib/client/console/lib/jqconsole.js similarity index 89% rename from lib/client/console/jqconsole.js rename to lib/client/console/lib/jqconsole.js index 0561b911..80836fd9 100644 --- a/lib/client/console/jqconsole.js +++ b/lib/client/console/lib/jqconsole.js @@ -1,72 +1,9 @@ -// Generated by CoffeeScript 1.3.3 - +// Generated by CoffeeScript 1.6.3 /* Copyrights 2011, the repl.it project. Licensed under the MIT license */ -// Limit scope pollution from any deprecated API -(function() { - var matched, browser; - -// Use of jQuery.browser is frowned upon. -// More details: http://api.jquery.com/jQuery.browser -// jQuery.uaMatch maintained for back-compat - jQuery.uaMatch = function( ua ) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) || - /(webkit)[ \/]([\w.]+)/.exec( ua ) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) || - /(msie) ([\w.]+)/.exec( ua ) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - - matched = jQuery.uaMatch( navigator.userAgent ); - browser = {}; - - if ( matched.browser ) { - browser[ matched.browser ] = true; - browser.version = matched.version; - } - -// Chrome is Webkit, but Webkit is also Safari. - if ( browser.chrome ) { - browser.webkit = true; - } else if ( browser.webkit ) { - browser.safari = true; - } - - jQuery.browser = browser; - - jQuery.sub = function() { - function jQuerySub( selector, context ) { - return new jQuerySub.fn.init( selector, context ); - } - jQuery.extend( true, jQuerySub, this ); - jQuerySub.superclass = this; - jQuerySub.fn = jQuerySub.prototype = this(); - jQuerySub.fn.constructor = jQuerySub; - jQuerySub.sub = this.sub; - jQuerySub.fn.init = function init( selector, context ) { - if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { - context = jQuerySub( context ); - } - - return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); - }; - jQuerySub.fn.init.prototype = jQuerySub.fn; - var rootjQuerySub = jQuerySub(document); - return jQuerySub; - }; - -})(); (function() { var $, Ansi, CLASS_ANSI, CLASS_BLURRED, CLASS_CURSOR, CLASS_HEADER, CLASS_INPUT, CLASS_OLD_PROMPT, CLASS_PREFIX, CLASS_PROMPT, DEFAULT_INDENT_WIDTH, DEFAULT_PROMPT_CONINUE_LABEL, DEFAULT_PROMPT_LABEL, EMPTY_DIV, EMPTY_SELECTOR, EMPTY_SPAN, ESCAPE_CHAR, ESCAPE_SYNTAX, E_KEYPRESS, JQConsole, KEY_BACKSPACE, KEY_DELETE, KEY_DOWN, KEY_END, KEY_ENTER, KEY_HOME, KEY_LEFT, KEY_PAGE_DOWN, KEY_PAGE_UP, KEY_RIGHT, KEY_TAB, KEY_UP, NEWLINE, STATE_INPUT, STATE_OUTPUT, STATE_PROMPT, spanHtml, @@ -142,24 +79,16 @@ Licensed under the MIT license ESCAPE_SYNTAX = /\[(\d*)(?:;(\d*))*m/; Ansi = (function() { - Ansi.prototype.COLORS = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white']; function Ansi() { this.stylize = __bind(this.stylize, this); - this._closeSpan = __bind(this._closeSpan, this); - this._openSpan = __bind(this._openSpan, this); - this.getClasses = __bind(this.getClasses, this); - this._style = __bind(this._style, this); - this._color = __bind(this._color, this); - this._remove = __bind(this._remove, this); - this._append = __bind(this._append, this); this.klasses = []; } @@ -344,27 +273,16 @@ Licensed under the MIT license }; JQConsole = (function() { - - function JQConsole(container, header, prompt_label, prompt_continue_label) { - this.container = container; + function JQConsole(outer_container, header, prompt_label, prompt_continue_label) { this._HideComposition = __bind(this._HideComposition, this); - this._ShowComposition = __bind(this._ShowComposition, this); - this._UpdateComposition = __bind(this._UpdateComposition, this); - this._EndComposition = __bind(this._EndComposition, this); - this._StartComposition = __bind(this._StartComposition, this); - this._CheckComposition = __bind(this._CheckComposition, this); - this._ProcessMatch = __bind(this._ProcessMatch, this); - this._HandleKey = __bind(this._HandleKey, this); - this._HandleChar = __bind(this._HandleChar, this); - this.isMobile = !!navigator.userAgent.match(/iPhone|iPad|iPod|Android/i); this.isIos = !!navigator.userAgent.match(/iPhone|iPad|iPod/i); this.isAndroid = !!navigator.userAgent.match(/Android/i); @@ -382,26 +300,41 @@ Licensed under the MIT license this.history_new = ''; this.history_active = false; this.shortcuts = {}; - this.$console = $('
').appendTo(this.container);
+      this.$container = $('
').appendTo(outer_container); + this.$container.css({ + 'top': 0, + 'left': 0, + 'right': 0, + 'bottom': 0, + 'position': 'absolute', + 'overflow': 'auto' + }); + this.$console = $('
').appendTo(this.$container);
       this.$console.css({
-        position: 'absolute',
-        top: 0,
-        bottom: 0,
-        right: 0,
-        left: 0,
-        margin: 0,
-        overflow: 'auto'
+        'margin': 0,
+        'position': 'relative',
+        'min-height': '100%',
+        'box-sizing': 'border-box',
+        '-moz-box-sizing': 'border-box',
+        '-webkit-box-sizing': 'border-box'
       });
       this.$console_focused = true;
-      this.$input_container = $(EMPTY_DIV).appendTo(this.container);
+      this.$input_container = $(EMPTY_DIV).appendTo(this.$container);
       this.$input_container.css({
-        position: 'relative',
+        position: 'absolute',
         width: 1,
         height: 0,
         overflow: 'hidden'
       });
-      this.$input_source = $('";
+  support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+})();
+var strundefined = typeof undefined;
+
+
+
+support.focusinBubbles = "onfocusin" in window;
+
+
+var
+  rkeyEvent = /^key/,
+  rmouseEvent = /^(?:mouse|contextmenu)|click/,
+  rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+  rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+  return true;
+}
+
+function returnFalse() {
+  return false;
+}
+
+function safeActiveElement() {
+  try {
+    return document.activeElement;
+  } catch ( err ) { }
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+  global: {},
+
+  add: function( elem, types, handler, data, selector ) {
+
+    var handleObjIn, eventHandle, tmp,
+      events, t, handleObj,
+      special, handlers, type, namespaces, origType,
+      elemData = data_priv.get( elem );
+
+    // Don't attach events to noData or text/comment nodes (but allow plain objects)
+    if ( !elemData ) {
+      return;
+    }
+
+    // Caller can pass in an object of custom data in lieu of the handler
+    if ( handler.handler ) {
+      handleObjIn = handler;
+      handler = handleObjIn.handler;
+      selector = handleObjIn.selector;
+    }
+
+    // Make sure that the handler has a unique ID, used to find/remove it later
+    if ( !handler.guid ) {
+      handler.guid = jQuery.guid++;
+    }
+
+    // Init the element's event structure and main handler, if this is the first
+    if ( !(events = elemData.events) ) {
+      events = elemData.events = {};
+    }
+    if ( !(eventHandle = elemData.handle) ) {
+      eventHandle = elemData.handle = function( e ) {
+        // Discard the second event of a jQuery.event.trigger() and
+        // when an event is called after a page has unloaded
+        return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
+          jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+      };
+    }
+
+    // Handle multiple events separated by a space
+    types = ( types || "" ).match( rnotwhite ) || [ "" ];
+    t = types.length;
+    while ( t-- ) {
+      tmp = rtypenamespace.exec( types[t] ) || [];
+      type = origType = tmp[1];
+      namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+      // There *must* be a type, no attaching namespace-only handlers
+      if ( !type ) {
+        continue;
+      }
+
+      // If event changes its type, use the special event handlers for the changed type
+      special = jQuery.event.special[ type ] || {};
+
+      // If selector defined, determine special event api type, otherwise given type
+      type = ( selector ? special.delegateType : special.bindType ) || type;
+
+      // Update special based on newly reset type
+      special = jQuery.event.special[ type ] || {};
+
+      // handleObj is passed to all event handlers
+      handleObj = jQuery.extend({
+        type: type,
+        origType: origType,
+        data: data,
+        handler: handler,
+        guid: handler.guid,
+        selector: selector,
+        needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+        namespace: namespaces.join(".")
+      }, handleObjIn );
+
+      // Init the event handler queue if we're the first
+      if ( !(handlers = events[ type ]) ) {
+        handlers = events[ type ] = [];
+        handlers.delegateCount = 0;
+
+        // Only use addEventListener if the special events handler returns false
+        if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+          if ( elem.addEventListener ) {
+            elem.addEventListener( type, eventHandle, false );
+          }
+        }
+      }
+
+      if ( special.add ) {
+        special.add.call( elem, handleObj );
+
+        if ( !handleObj.handler.guid ) {
+          handleObj.handler.guid = handler.guid;
+        }
+      }
+
+      // Add to the element's handler list, delegates in front
+      if ( selector ) {
+        handlers.splice( handlers.delegateCount++, 0, handleObj );
+      } else {
+        handlers.push( handleObj );
+      }
+
+      // Keep track of which events have ever been used, for event optimization
+      jQuery.event.global[ type ] = true;
+    }
+
+  },
+
+  // Detach an event or set of events from an element
+  remove: function( elem, types, handler, selector, mappedTypes ) {
+
+    var j, origCount, tmp,
+      events, t, handleObj,
+      special, handlers, type, namespaces, origType,
+      elemData = data_priv.hasData( elem ) && data_priv.get( elem );
+
+    if ( !elemData || !(events = elemData.events) ) {
+      return;
+    }
+
+    // Once for each type.namespace in types; type may be omitted
+    types = ( types || "" ).match( rnotwhite ) || [ "" ];
+    t = types.length;
+    while ( t-- ) {
+      tmp = rtypenamespace.exec( types[t] ) || [];
+      type = origType = tmp[1];
+      namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+      // Unbind all events (on this namespace, if provided) for the element
+      if ( !type ) {
+        for ( type in events ) {
+          jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+        }
+        continue;
+      }
+
+      special = jQuery.event.special[ type ] || {};
+      type = ( selector ? special.delegateType : special.bindType ) || type;
+      handlers = events[ type ] || [];
+      tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+      // Remove matching events
+      origCount = j = handlers.length;
+      while ( j-- ) {
+        handleObj = handlers[ j ];
+
+        if ( ( mappedTypes || origType === handleObj.origType ) &&
+          ( !handler || handler.guid === handleObj.guid ) &&
+          ( !tmp || tmp.test( handleObj.namespace ) ) &&
+          ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+          handlers.splice( j, 1 );
+
+          if ( handleObj.selector ) {
+            handlers.delegateCount--;
+          }
+          if ( special.remove ) {
+            special.remove.call( elem, handleObj );
+          }
+        }
+      }
+
+      // Remove generic event handler if we removed something and no more handlers exist
+      // (avoids potential for endless recursion during removal of special event handlers)
+      if ( origCount && !handlers.length ) {
+        if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+          jQuery.removeEvent( elem, type, elemData.handle );
+        }
+
+        delete events[ type ];
+      }
+    }
+
+    // Remove the expando if it's no longer used
+    if ( jQuery.isEmptyObject( events ) ) {
+      delete elemData.handle;
+      data_priv.remove( elem, "events" );
+    }
+  },
+
+  trigger: function( event, data, elem, onlyHandlers ) {
+
+    var i, cur, tmp, bubbleType, ontype, handle, special,
+      eventPath = [ elem || document ],
+      type = hasOwn.call( event, "type" ) ? event.type : event,
+      namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+    cur = tmp = elem = elem || document;
+
+    // Don't do events on text and comment nodes
+    if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+      return;
+    }
+
+    // focus/blur morphs to focusin/out; ensure we're not firing them right now
+    if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+      return;
+    }
+
+    if ( type.indexOf(".") >= 0 ) {
+      // Namespaced trigger; create a regexp to match event type in handle()
+      namespaces = type.split(".");
+      type = namespaces.shift();
+      namespaces.sort();
+    }
+    ontype = type.indexOf(":") < 0 && "on" + type;
+
+    // Caller can pass in a jQuery.Event object, Object, or just an event type string
+    event = event[ jQuery.expando ] ?
+      event :
+      new jQuery.Event( type, typeof event === "object" && event );
+
+    // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+    event.isTrigger = onlyHandlers ? 2 : 3;
+    event.namespace = namespaces.join(".");
+    event.namespace_re = event.namespace ?
+      new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+      null;
+
+    // Clean up the event in case it is being reused
+    event.result = undefined;
+    if ( !event.target ) {
+      event.target = elem;
+    }
+
+    // Clone any incoming data and prepend the event, creating the handler arg list
+    data = data == null ?
+      [ event ] :
+      jQuery.makeArray( data, [ event ] );
+
+    // Allow special events to draw outside the lines
+    special = jQuery.event.special[ type ] || {};
+    if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+      return;
+    }
+
+    // Determine event propagation path in advance, per W3C events spec (#9951)
+    // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+    if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+      bubbleType = special.delegateType || type;
+      if ( !rfocusMorph.test( bubbleType + type ) ) {
+        cur = cur.parentNode;
+      }
+      for ( ; cur; cur = cur.parentNode ) {
+        eventPath.push( cur );
+        tmp = cur;
+      }
+
+      // Only add window if we got to document (e.g., not plain obj or detached DOM)
+      if ( tmp === (elem.ownerDocument || document) ) {
+        eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+      }
+    }
+
+    // Fire handlers on the event path
+    i = 0;
+    while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+      event.type = i > 1 ?
+        bubbleType :
+        special.bindType || type;
+
+      // jQuery handler
+      handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
+      if ( handle ) {
+        handle.apply( cur, data );
+      }
+
+      // Native handler
+      handle = ontype && cur[ ontype ];
+      if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
+        event.result = handle.apply( cur, data );
+        if ( event.result === false ) {
+          event.preventDefault();
+        }
+      }
+    }
+    event.type = type;
+
+    // If nobody prevented the default action, do it now
+    if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+      if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
+        jQuery.acceptData( elem ) ) {
+
+        // Call a native DOM method on the target with the same name name as the event.
+        // Don't do default actions on window, that's where global variables be (#6170)
+        if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
+
+          // Don't re-trigger an onFOO event when we call its FOO() method
+          tmp = elem[ ontype ];
+
+          if ( tmp ) {
+            elem[ ontype ] = null;
+          }
+
+          // Prevent re-triggering of the same event, since we already bubbled it above
+          jQuery.event.triggered = type;
+          elem[ type ]();
+          jQuery.event.triggered = undefined;
+
+          if ( tmp ) {
+            elem[ ontype ] = tmp;
+          }
+        }
+      }
+    }
+
+    return event.result;
+  },
+
+  dispatch: function( event ) {
+
+    // Make a writable jQuery.Event from the native event object
+    event = jQuery.event.fix( event );
+
+    var i, j, ret, matched, handleObj,
+      handlerQueue = [],
+      args = slice.call( arguments ),
+      handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
+      special = jQuery.event.special[ event.type ] || {};
+
+    // Use the fix-ed jQuery.Event rather than the (read-only) native event
+    args[0] = event;
+    event.delegateTarget = this;
+
+    // Call the preDispatch hook for the mapped type, and let it bail if desired
+    if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+      return;
+    }
+
+    // Determine handlers
+    handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+    // Run delegates first; they may want to stop propagation beneath us
+    i = 0;
+    while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+      event.currentTarget = matched.elem;
+
+      j = 0;
+      while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+        // Triggered event must either 1) have no namespace, or
+        // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+        if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+          event.handleObj = handleObj;
+          event.data = handleObj.data;
+
+          ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+              .apply( matched.elem, args );
+
+          if ( ret !== undefined ) {
+            if ( (event.result = ret) === false ) {
+              event.preventDefault();
+              event.stopPropagation();
+            }
+          }
+        }
+      }
+    }
+
+    // Call the postDispatch hook for the mapped type
+    if ( special.postDispatch ) {
+      special.postDispatch.call( this, event );
+    }
+
+    return event.result;
+  },
+
+  handlers: function( event, handlers ) {
+    var i, matches, sel, handleObj,
+      handlerQueue = [],
+      delegateCount = handlers.delegateCount,
+      cur = event.target;
+
+    // Find delegate handlers
+    // Black-hole SVG  instance trees (#13180)
+    // Avoid non-left-click bubbling in Firefox (#3861)
+    if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+      for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+        // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+        if ( cur.disabled !== true || event.type !== "click" ) {
+          matches = [];
+          for ( i = 0; i < delegateCount; i++ ) {
+            handleObj = handlers[ i ];
+
+            // Don't conflict with Object.prototype properties (#13203)
+            sel = handleObj.selector + " ";
+
+            if ( matches[ sel ] === undefined ) {
+              matches[ sel ] = handleObj.needsContext ?
+                jQuery( sel, this ).index( cur ) >= 0 :
+                jQuery.find( sel, this, null, [ cur ] ).length;
+            }
+            if ( matches[ sel ] ) {
+              matches.push( handleObj );
+            }
+          }
+          if ( matches.length ) {
+            handlerQueue.push({ elem: cur, handlers: matches });
+          }
+        }
+      }
+    }
+
+    // Add the remaining (directly-bound) handlers
+    if ( delegateCount < handlers.length ) {
+      handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+    }
+
+    return handlerQueue;
+  },
+
+  // Includes some event props shared by KeyEvent and MouseEvent
+  props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+  fixHooks: {},
+
+  keyHooks: {
+    props: "char charCode key keyCode".split(" "),
+    filter: function( event, original ) {
+
+      // Add which for key events
+      if ( event.which == null ) {
+        event.which = original.charCode != null ? original.charCode : original.keyCode;
+      }
+
+      return event;
+    }
+  },
+
+  mouseHooks: {
+    props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+    filter: function( event, original ) {
+      var eventDoc, doc, body,
+        button = original.button;
+
+      // Calculate pageX/Y if missing and clientX/Y available
+      if ( event.pageX == null && original.clientX != null ) {
+        eventDoc = event.target.ownerDocument || document;
+        doc = eventDoc.documentElement;
+        body = eventDoc.body;
+
+        event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+        event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+      }
+
+      // Add which for click: 1 === left; 2 === middle; 3 === right
+      // Note: button is not normalized, so don't use it
+      if ( !event.which && button !== undefined ) {
+        event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+      }
+
+      return event;
+    }
+  },
+
+  fix: function( event ) {
+    if ( event[ jQuery.expando ] ) {
+      return event;
+    }
+
+    // Create a writable copy of the event object and normalize some properties
+    var i, prop, copy,
+      type = event.type,
+      originalEvent = event,
+      fixHook = this.fixHooks[ type ];
+
+    if ( !fixHook ) {
+      this.fixHooks[ type ] = fixHook =
+        rmouseEvent.test( type ) ? this.mouseHooks :
+        rkeyEvent.test( type ) ? this.keyHooks :
+        {};
+    }
+    copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+    event = new jQuery.Event( originalEvent );
+
+    i = copy.length;
+    while ( i-- ) {
+      prop = copy[ i ];
+      event[ prop ] = originalEvent[ prop ];
+    }
+
+    // Support: Cordova 2.5 (WebKit) (#13255)
+    // All events should have a target; Cordova deviceready doesn't
+    if ( !event.target ) {
+      event.target = document;
+    }
+
+    // Support: Safari 6.0+, Chrome < 28
+    // Target should not be a text node (#504, #13143)
+    if ( event.target.nodeType === 3 ) {
+      event.target = event.target.parentNode;
+    }
+
+    return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+  },
+
+  special: {
+    load: {
+      // Prevent triggered image.load events from bubbling to window.load
+      noBubble: true
+    },
+    focus: {
+      // Fire native event if possible so blur/focus sequence is correct
+      trigger: function() {
+        if ( this !== safeActiveElement() && this.focus ) {
+          this.focus();
+          return false;
+        }
+      },
+      delegateType: "focusin"
+    },
+    blur: {
+      trigger: function() {
+        if ( this === safeActiveElement() && this.blur ) {
+          this.blur();
+          return false;
+        }
+      },
+      delegateType: "focusout"
+    },
+    click: {
+      // For checkbox, fire native event so checked state will be right
+      trigger: function() {
+        if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
+          this.click();
+          return false;
+        }
+      },
+
+      // For cross-browser consistency, don't fire native .click() on links
+      _default: function( event ) {
+        return jQuery.nodeName( event.target, "a" );
+      }
+    },
+
+    beforeunload: {
+      postDispatch: function( event ) {
+
+        // Support: Firefox 20+
+        // Firefox doesn't alert if the returnValue field is not set.
+        if ( event.result !== undefined ) {
+          event.originalEvent.returnValue = event.result;
+        }
+      }
+    }
+  },
+
+  simulate: function( type, elem, event, bubble ) {
+    // Piggyback on a donor event to simulate a different one.
+    // Fake originalEvent to avoid donor's stopPropagation, but if the
+    // simulated event prevents default then we do the same on the donor.
+    var e = jQuery.extend(
+      new jQuery.Event(),
+      event,
+      {
+        type: type,
+        isSimulated: true,
+        originalEvent: {}
+      }
+    );
+    if ( bubble ) {
+      jQuery.event.trigger( e, null, elem );
+    } else {
+      jQuery.event.dispatch.call( elem, e );
+    }
+    if ( e.isDefaultPrevented() ) {
+      event.preventDefault();
+    }
+  }
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+  if ( elem.removeEventListener ) {
+    elem.removeEventListener( type, handle, false );
+  }
+};
+
+jQuery.Event = function( src, props ) {
+  // Allow instantiation without the 'new' keyword
+  if ( !(this instanceof jQuery.Event) ) {
+    return new jQuery.Event( src, props );
+  }
+
+  // Event object
+  if ( src && src.type ) {
+    this.originalEvent = src;
+    this.type = src.type;
+
+    // Events bubbling up the document may have been marked as prevented
+    // by a handler lower down the tree; reflect the correct value.
+    this.isDefaultPrevented = src.defaultPrevented ||
+        // Support: Android < 4.0
+        src.defaultPrevented === undefined &&
+        src.getPreventDefault && src.getPreventDefault() ?
+      returnTrue :
+      returnFalse;
+
+  // Event type
+  } else {
+    this.type = src;
+  }
+
+  // Put explicitly provided properties onto the event object
+  if ( props ) {
+    jQuery.extend( this, props );
+  }
+
+  // Create a timestamp if incoming event doesn't have one
+  this.timeStamp = src && src.timeStamp || jQuery.now();
+
+  // Mark it as fixed
+  this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+  isDefaultPrevented: returnFalse,
+  isPropagationStopped: returnFalse,
+  isImmediatePropagationStopped: returnFalse,
+
+  preventDefault: function() {
+    var e = this.originalEvent;
+
+    this.isDefaultPrevented = returnTrue;
+
+    if ( e && e.preventDefault ) {
+      e.preventDefault();
+    }
+  },
+  stopPropagation: function() {
+    var e = this.originalEvent;
+
+    this.isPropagationStopped = returnTrue;
+
+    if ( e && e.stopPropagation ) {
+      e.stopPropagation();
+    }
+  },
+  stopImmediatePropagation: function() {
+    this.isImmediatePropagationStopped = returnTrue;
+    this.stopPropagation();
+  }
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// Support: Chrome 15+
+jQuery.each({
+  mouseenter: "mouseover",
+  mouseleave: "mouseout"
+}, function( orig, fix ) {
+  jQuery.event.special[ orig ] = {
+    delegateType: fix,
+    bindType: fix,
+
+    handle: function( event ) {
+      var ret,
+        target = this,
+        related = event.relatedTarget,
+        handleObj = event.handleObj;
+
+      // For mousenter/leave call the handler if related is outside the target.
+      // NB: No relatedTarget if the mouse left/entered the browser window
+      if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+        event.type = handleObj.origType;
+        ret = handleObj.handler.apply( this, arguments );
+        event.type = fix;
+      }
+      return ret;
+    }
+  };
+});
+
+// Create "bubbling" focus and blur events
+// Support: Firefox, Chrome, Safari
+if ( !support.focusinBubbles ) {
+  jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+    // Attach a single capturing handler on the document while someone wants focusin/focusout
+    var handler = function( event ) {
+        jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+      };
+
+    jQuery.event.special[ fix ] = {
+      setup: function() {
+        var doc = this.ownerDocument || this,
+          attaches = data_priv.access( doc, fix );
+
+        if ( !attaches ) {
+          doc.addEventListener( orig, handler, true );
+        }
+        data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
+      },
+      teardown: function() {
+        var doc = this.ownerDocument || this,
+          attaches = data_priv.access( doc, fix ) - 1;
+
+        if ( !attaches ) {
+          doc.removeEventListener( orig, handler, true );
+          data_priv.remove( doc, fix );
+
+        } else {
+          data_priv.access( doc, fix, attaches );
+        }
+      }
+    };
+  });
+}
+
+jQuery.fn.extend({
+
+  on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+    var origFn, type;
+
+    // Types can be a map of types/handlers
+    if ( typeof types === "object" ) {
+      // ( types-Object, selector, data )
+      if ( typeof selector !== "string" ) {
+        // ( types-Object, data )
+        data = data || selector;
+        selector = undefined;
+      }
+      for ( type in types ) {
+        this.on( type, selector, data, types[ type ], one );
+      }
+      return this;
+    }
+
+    if ( data == null && fn == null ) {
+      // ( types, fn )
+      fn = selector;
+      data = selector = undefined;
+    } else if ( fn == null ) {
+      if ( typeof selector === "string" ) {
+        // ( types, selector, fn )
+        fn = data;
+        data = undefined;
+      } else {
+        // ( types, data, fn )
+        fn = data;
+        data = selector;
+        selector = undefined;
+      }
+    }
+    if ( fn === false ) {
+      fn = returnFalse;
+    } else if ( !fn ) {
+      return this;
+    }
+
+    if ( one === 1 ) {
+      origFn = fn;
+      fn = function( event ) {
+        // Can use an empty set, since event contains the info
+        jQuery().off( event );
+        return origFn.apply( this, arguments );
+      };
+      // Use same guid so caller can remove using origFn
+      fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+    }
+    return this.each( function() {
+      jQuery.event.add( this, types, fn, data, selector );
+    });
+  },
+  one: function( types, selector, data, fn ) {
+    return this.on( types, selector, data, fn, 1 );
+  },
+  off: function( types, selector, fn ) {
+    var handleObj, type;
+    if ( types && types.preventDefault && types.handleObj ) {
+      // ( event )  dispatched jQuery.Event
+      handleObj = types.handleObj;
+      jQuery( types.delegateTarget ).off(
+        handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+        handleObj.selector,
+        handleObj.handler
+      );
+      return this;
+    }
+    if ( typeof types === "object" ) {
+      // ( types-object [, selector] )
+      for ( type in types ) {
+        this.off( type, selector, types[ type ] );
+      }
+      return this;
+    }
+    if ( selector === false || typeof selector === "function" ) {
+      // ( types [, fn] )
+      fn = selector;
+      selector = undefined;
+    }
+    if ( fn === false ) {
+      fn = returnFalse;
+    }
+    return this.each(function() {
+      jQuery.event.remove( this, types, fn, selector );
+    });
+  },
+
+  trigger: function( type, data ) {
+    return this.each(function() {
+      jQuery.event.trigger( type, data, this );
+    });
+  },
+  triggerHandler: function( type, data ) {
+    var elem = this[0];
+    if ( elem ) {
+      return jQuery.event.trigger( type, data, elem, true );
+    }
+  }
+});
+
+
+var
+  rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+  rtagName = /<([\w:]+)/,
+  rhtml = /<|&#?\w+;/,
+  rnoInnerhtml = /<(?:script|style|link)/i,
+  // checked="checked" or checked
+  rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+  rscriptType = /^$|\/(?:java|ecma)script/i,
+  rscriptTypeMasked = /^true\/(.*)/,
+  rcleanScript = /^\s*\s*$/g,
+
+  // We have to close these tags to support XHTML (#13200)
+  wrapMap = {
+
+    // Support: IE 9
+    option: [ 1, "" ],
+
+    thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] + }; + +// Support: IE 9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: 1.x compatibility +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild( elem.ownerDocument.createElement("tbody") ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute("type"); + } + + return elem; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + data_priv.set( + elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) + ); + } +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( data_priv.hasData( src ) ) { + pdataOld = data_priv.access( src ); + pdataCur = data_priv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( data_user.hasData( src ) ) { + udataOld = data_user.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + data_user.set( dest, udataCur ); + } +} + +function getAll( context, tag ) { + var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : + context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : + []; + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], ret ) : + ret; +} + +// Support: IE >= 9 +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Support: IE >= 9 + // Fix Cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + // Support: QtWebKit + // jQuery.merge because push.apply(_, arraylike) throws + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: QtWebKit + // jQuery.merge because push.apply(_, arraylike) throws + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Fixes #12346 + // Support: Webkit, IE + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; + }, + + cleanData: function( elems ) { + var data, elem, events, type, key, j, + special = jQuery.event.special, + i = 0; + + for ( ; (elem = elems[ i ]) !== undefined; i++ ) { + if ( jQuery.acceptData( elem ) ) { + key = elem[ data_priv.expando ]; + + if ( key && (data = data_priv.cache[ key ]) ) { + events = Object.keys( data.events || {} ); + if ( events.length ) { + for ( j = 0; (type = events[j]) !== undefined; j++ ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + if ( data_priv.cache[ key ] ) { + // Discard any remaining `private` data + delete data_priv.cache[ key ]; + } + } + } + // Discard any remaining `user` data + delete data_user.cache[ elem[ data_user.expando ] ]; + } + } +}); + +jQuery.fn.extend({ + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each(function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + }); + }, null, value, arguments.length ); + }, + + append: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + remove: function( selector, keepData /* Internal Use Only */ ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map(function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1>" ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var arg = arguments[ 0 ]; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + arg = this.parentNode; + + jQuery.cleanData( getAll( this ) ); + + if ( arg ) { + arg.replaceChild( elem, this ); + } + }); + + // Force removal if there was no new content (e.g., from empty arguments) + return arg && (arg.length || arg.nodeType) ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + self.domManip( args, callback ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + // Support: QtWebKit + // jQuery.merge because push.apply(_, arraylike) throws + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); + } + } + } + } + } + } + + return this; + } +}); + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: QtWebKit + // .get() because push.apply(_, arraylike) throws + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +}); + + +var iframe, + elemdisplay = {}; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + // getDefaultComputedStyle might be reliably used only on attached element + display = window.getDefaultComputedStyle ? + + // Use of this method is a temporary fix (more like optmization) until something better comes along, + // since it was removed from specification and supported only in FF + window.getDefaultComputedStyle( elem[ 0 ] ).display : jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = (iframe || jQuery( "