From 0abfaf1180f94c05585d068cf1970337ef2ea3bf Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 7 Sep 2011 17:27:20 +0530 Subject: [PATCH] version 2 --- attribution.md | 26 ++ conf/Framework.sql | 245 ++++++++++ conf/__init__.py | 0 conf/_conf.py | 12 + conf/apache.conf | 35 ++ conf/app.js | 20 + conf/conf.py | 11 + conf/index.cgi | 21 + css/base.css | 389 ++++++++++++++++ css/layout.css | 58 +++ css/skeleton.css | 236 ++++++++++ css/ui/overlay.css | 82 ++++ css/ui/status_bar.css | 19 + images/icons/folder.gif | Bin 0 -> 996 bytes images/icons/icons.png | Bin 0 -> 53108 bytes images/icons/wntoolbar-icons.png | Bin 0 -> 2762 bytes js/build.json | 19 + js/core.js | 33 ++ js/core.min.js | 55 +++ js/legacy/build.json | 68 +++ js/lib/history/history.adapter.jquery.js | 1 + js/lib/history/history.html4.js | 1 + js/lib/history/history.js | 1 + js/lib/history/history.min.js | 19 + js/lib/jquery.min.js | 18 + js/lib/json2.js | 480 ++++++++++++++++++++ js/lib/superfish/css/superfish-vertical.css | 23 + js/lib/superfish/css/superfish.css | 136 ++++++ js/lib/superfish/hoverIntent.js | 84 ++++ js/lib/superfish/images/arrows-ffffff.png | Bin 0 -> 244 bytes js/lib/superfish/images/shadow.png | Bin 0 -> 1698 bytes js/lib/superfish/make_superfish.js | 34 ++ js/lib/superfish/superfish.js | 121 +++++ js/lib/superfish/superfish.min.js | 171 +++++++ js/wn/assets.js | 94 ++++ js/wn/dom.js | 49 ++ js/wn/history.js | 15 + js/wn/page.js | 28 ++ js/wn/provide.js | 17 + js/wn/require.js | 15 + js/wn/ui/overlay.js | 24 + js/wn/ui/status_bar.js | 22 + js/wn/xmlhttp.js | 36 ++ py/__init__.py | 0 py/build/__init__.py | 21 + py/build/__main__.py | 5 + py/build/bundle.py | 142 ++++++ py/build/markdown2_extn.py | 34 ++ py/build/minify.py | 215 +++++++++ py/build/nav.py | 67 +++ py/build/project.py | 83 ++++ py/build/timestamps.py | 147 ++++++ py/common.py | 13 + py/core/.no_timestamps | 0 py/tests.py | 12 + py/watch.py | 11 + py/webnotes/.no_timestamps | 0 57 files changed, 3468 insertions(+) create mode 100644 attribution.md create mode 100644 conf/Framework.sql create mode 100644 conf/__init__.py create mode 100644 conf/_conf.py create mode 100644 conf/apache.conf create mode 100644 conf/app.js create mode 100644 conf/conf.py create mode 100755 conf/index.cgi create mode 100755 css/base.css create mode 100755 css/layout.css create mode 100755 css/skeleton.css create mode 100644 css/ui/overlay.css create mode 100644 css/ui/status_bar.css create mode 100644 images/icons/folder.gif create mode 100644 images/icons/icons.png create mode 100644 images/icons/wntoolbar-icons.png create mode 100644 js/build.json create mode 100644 js/core.js create mode 100644 js/core.min.js create mode 100644 js/legacy/build.json create mode 100644 js/lib/history/history.adapter.jquery.js create mode 100644 js/lib/history/history.html4.js create mode 100644 js/lib/history/history.js create mode 100644 js/lib/history/history.min.js create mode 100644 js/lib/jquery.min.js create mode 100644 js/lib/json2.js create mode 100644 js/lib/superfish/css/superfish-vertical.css create mode 100644 js/lib/superfish/css/superfish.css create mode 100644 js/lib/superfish/hoverIntent.js create mode 100644 js/lib/superfish/images/arrows-ffffff.png create mode 100644 js/lib/superfish/images/shadow.png create mode 100644 js/lib/superfish/make_superfish.js create mode 100644 js/lib/superfish/superfish.js create mode 100644 js/lib/superfish/superfish.min.js create mode 100644 js/wn/assets.js create mode 100644 js/wn/dom.js create mode 100644 js/wn/history.js create mode 100644 js/wn/page.js create mode 100644 js/wn/provide.js create mode 100644 js/wn/require.js create mode 100644 js/wn/ui/overlay.js create mode 100644 js/wn/ui/status_bar.js create mode 100644 js/wn/xmlhttp.js create mode 100644 py/__init__.py create mode 100644 py/build/__init__.py create mode 100644 py/build/__main__.py create mode 100644 py/build/bundle.py create mode 100644 py/build/markdown2_extn.py create mode 100644 py/build/minify.py create mode 100644 py/build/nav.py create mode 100644 py/build/project.py create mode 100644 py/build/timestamps.py create mode 100644 py/common.py create mode 100644 py/core/.no_timestamps create mode 100644 py/tests.py create mode 100644 py/watch.py create mode 100644 py/webnotes/.no_timestamps diff --git a/attribution.md b/attribution.md new file mode 100644 index 0000000000..0be7c628f4 --- /dev/null +++ b/attribution.md @@ -0,0 +1,26 @@ +# Attribution + +Following libraries have been used in wnframework + +## Python + +- Jinja2 +- Markdown2 +- Jinja2 Markdown2 extenion +- Redis (?) + +## Javascript + +- JSON2 +- JQuery +- JQPlot +- History +- Suckerfish (menu) + +## CSS + +- Skeleton CSS: +- CSS3 Overlay: + [https://github.com/LearnBoost/CSS3-Overlay/](https://github.com/LearnBoost/CSS3-Overlay/) + [http://blog.learnboost.com/blog/a-css3-overlay-system/](http://blog.learnboost.com/blog/a-css3-overlay-system/) + diff --git a/conf/Framework.sql b/conf/Framework.sql new file mode 100644 index 0000000000..27faa19913 --- /dev/null +++ b/conf/Framework.sql @@ -0,0 +1,245 @@ +-- Core Elements to install WNFramework +-- To be called from install.py + + +-- +-- Table structure for table `__DocTypeCache` +-- + +DROP TABLE IF EXISTS `__DocTypeCache`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `__DocTypeCache` ( + `name` varchar(120) DEFAULT NULL, + `modified` datetime DEFAULT NULL, + `content` text +) ENGINE=MyISAM DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `__SessionCache` +-- + +DROP TABLE IF EXISTS `__SessionCache`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `__SessionCache` ( + `user` varchar(120) DEFAULT NULL, + `country` varchar(120) DEFAULT NULL, + `cache` longtext +) ENGINE=MyISAM DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + + + +-- +-- Table structure for table `tabDocField` +-- + +DROP TABLE IF EXISTS `tabDocField`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `tabDocField` ( + `name` varchar(120) NOT NULL, + `creation` datetime DEFAULT NULL, + `modified` datetime DEFAULT NULL, + `modified_by` varchar(40) DEFAULT NULL, + `owner` varchar(40) DEFAULT NULL, + `docstatus` int(1) DEFAULT '0', + `parent` varchar(120) DEFAULT NULL, + `parentfield` varchar(120) DEFAULT NULL, + `parenttype` varchar(120) DEFAULT NULL, + `idx` int(8) DEFAULT NULL, + `fieldname` varchar(180) DEFAULT NULL, + `label` varchar(180) DEFAULT NULL, + `oldfieldname` varchar(180) DEFAULT NULL, + `fieldtype` varchar(180) DEFAULT NULL, + `oldfieldtype` varchar(180) DEFAULT NULL, + `options` text, + `search_index` int(3) DEFAULT NULL, + `hidden` int(3) DEFAULT NULL, + `print_hide` int(3) DEFAULT NULL, + `report_hide` int(3) DEFAULT NULL, + `reqd` int(3) DEFAULT NULL, + `no_copy` int(3) DEFAULT NULL, + `allow_on_submit` int(3) DEFAULT NULL, + `trigger` varchar(180) DEFAULT NULL, + `depends_on` varchar(180) DEFAULT NULL, + `permlevel` int(3) DEFAULT NULL, + `width` varchar(180) DEFAULT NULL, + `default` text, + `description` text, + `colour` varchar(180) DEFAULT NULL, + `icon` varchar(180) DEFAULT NULL, + `in_filter` int(3) DEFAULT NULL, + PRIMARY KEY (`name`), + KEY `parent` (`parent`), + KEY `label` (`label`), + KEY `fieldtype` (`fieldtype`), + KEY `fieldname` (`fieldname`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `tabDocFormat` +-- + +DROP TABLE IF EXISTS `tabDocFormat`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `tabDocFormat` ( + `name` varchar(120) NOT NULL, + `creation` datetime DEFAULT NULL, + `modified` datetime DEFAULT NULL, + `modified_by` varchar(40) DEFAULT NULL, + `owner` varchar(40) DEFAULT NULL, + `docstatus` int(1) DEFAULT '0', + `parent` varchar(120) DEFAULT NULL, + `parentfield` varchar(120) DEFAULT NULL, + `parenttype` varchar(120) DEFAULT NULL, + `idx` int(8) DEFAULT NULL, + `format` varchar(180) DEFAULT NULL, + PRIMARY KEY (`name`), + KEY `parent` (`parent`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `tabDocPerm` +-- + +DROP TABLE IF EXISTS `tabDocPerm`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `tabDocPerm` ( + `name` varchar(120) NOT NULL, + `creation` datetime DEFAULT NULL, + `modified` datetime DEFAULT NULL, + `modified_by` varchar(40) DEFAULT NULL, + `owner` varchar(40) DEFAULT NULL, + `docstatus` int(1) DEFAULT '0', + `parent` varchar(120) DEFAULT NULL, + `parentfield` varchar(120) DEFAULT NULL, + `parenttype` varchar(120) DEFAULT NULL, + `idx` int(8) DEFAULT NULL, + `permlevel` int(11) DEFAULT NULL, + `role` varchar(180) DEFAULT NULL, + `match` varchar(180) DEFAULT NULL, + `read` int(3) DEFAULT NULL, + `write` int(3) DEFAULT NULL, + `create` int(3) DEFAULT NULL, + `submit` int(3) DEFAULT NULL, + `cancel` int(3) DEFAULT NULL, + `amend` int(3) DEFAULT NULL, + `execute` int(3) DEFAULT NULL, + PRIMARY KEY (`name`), + KEY `parent` (`parent`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `tabDocType` +-- + +DROP TABLE IF EXISTS `tabDocType`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `tabDocType` ( + `name` varchar(180) NOT NULL DEFAULT '', + `creation` datetime DEFAULT NULL, + `modified` datetime DEFAULT NULL, + `modified_by` varchar(40) DEFAULT NULL, + `owner` varchar(180) DEFAULT NULL, + `docstatus` int(1) DEFAULT '0', + `parent` varchar(120) DEFAULT NULL, + `parentfield` varchar(120) DEFAULT NULL, + `parenttype` varchar(120) DEFAULT NULL, + `idx` int(8) DEFAULT NULL, + `search_fields` varchar(180) DEFAULT NULL, + `issingle` int(1) DEFAULT NULL, + `istable` int(1) DEFAULT NULL, + `version` int(11) DEFAULT NULL, + `module` varchar(180) DEFAULT NULL, + `autoname` varchar(180) DEFAULT NULL, + `name_case` varchar(180) DEFAULT NULL, + `description` text, + `colour` varchar(180) DEFAULT NULL, + `read_only` int(1) DEFAULT NULL, + `in_create` int(1) DEFAULT NULL, + `show_in_menu` int(3) DEFAULT NULL, + `menu_index` int(11) DEFAULT NULL, + `parent_node` varchar(180) DEFAULT NULL, + `smallicon` varchar(180) DEFAULT NULL, + `allow_print` int(1) DEFAULT NULL, + `allow_email` int(1) DEFAULT NULL, + `allow_copy` int(1) DEFAULT NULL, + `allow_rename` int(1) DEFAULT NULL, + `hide_toolbar` int(1) DEFAULT NULL, + `hide_heading` int(1) DEFAULT NULL, + `allow_attach` int(1) DEFAULT NULL, + `use_template` int(1) DEFAULT NULL, + `max_attachments` int(11) DEFAULT NULL, + `section_style` varchar(180) DEFAULT NULL, + `client_script` text, + `client_script_core` text, + `server_code` text, + `server_code_core` text, + `server_code_compiled` text, + `client_string` text, + `server_code_error` varchar(180) DEFAULT NULL, + `print_outline` varchar(180) DEFAULT NULL, + `dt_template` text, + `is_transaction_doc` int(1) DEFAULT NULL, + `change_log` text, + `read_only_onload` int(1) DEFAULT NULL, + PRIMARY KEY (`name`), + KEY `parent` (`parent`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `tabSeries` +-- + +DROP TABLE IF EXISTS `tabSeries`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `tabSeries` ( + `name` varchar(40) DEFAULT NULL, + `current` int(10) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + + +-- +-- Table structure for table `tabSessions` +-- + +DROP TABLE IF EXISTS `tabSessions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `tabSessions` ( + `user` varchar(40) DEFAULT NULL, + `sid` varchar(120) DEFAULT NULL, + `sessiondata` longtext, + `ipaddress` varchar(16) DEFAULT NULL, + `lastupdate` datetime DEFAULT NULL, + `status` varchar(20) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + + +-- +-- Table structure for table `tabSingles` +-- + +DROP TABLE IF EXISTS `tabSingles`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `tabSingles` ( + `doctype` varchar(40) DEFAULT NULL, + `field` varchar(40) DEFAULT NULL, + `value` text, + KEY `doctype` (`doctype`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + diff --git a/conf/__init__.py b/conf/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/conf/_conf.py b/conf/_conf.py new file mode 100644 index 0000000000..5343a27d96 --- /dev/null +++ b/conf/_conf.py @@ -0,0 +1,12 @@ +# Main Configuration File + +# Copy this into conf.py +# ---------------------- + +# Index URL +# --------- + +# URL path to index.html +# if you are installing within a folder, add the folderpath +index_path = '/' + diff --git a/conf/apache.conf b/conf/apache.conf new file mode 100644 index 0000000000..a5bcd4bd05 --- /dev/null +++ b/conf/apache.conf @@ -0,0 +1,35 @@ +# Sample httpd.conf extension ot start wnframework + +# Port on which you want to run wnframework +Listen 8080 + + + + # Set your root folder here + DocumentRoot /var/www/html/ + + + AllowOverride All + Order allow,deny + Allow from all + + # enable direct execution of .py files + Options +ExecCGI + #AddHandler cgi-script .cgi + AddHandler cgi-script .py + + DirectoryIndex index.html + + RewriteEngine On + + # all model calls will be redirected to model.py + # to call a model - mysite/models/type/name eg. mysite.com/models/Organization/WebNotes + RewriteRule /models/(.*)$ /lib/model.py/$1 [L,QSA] + + # all page calls will be redircted to page.py + # page/home + RewriteRule /pages/(.*)$ /lib/page.py/$1 [L,QSA] + + + + \ No newline at end of file diff --git a/conf/app.js b/conf/app.js new file mode 100644 index 0000000000..a2ca08dcd8 --- /dev/null +++ b/conf/app.js @@ -0,0 +1,20 @@ +wn.require('lib/js/lib/jquery.min.js'); +wn.require('lib/js/wn/ui/status_bar.js'); + +wn.sb = new wn.ui.StatusBar(); +wn.sb.set_value(15); +// for datepicker +wn.require('lib/js/legacy/jquery/jquery-ui.min.js') +wn.sb.set_value(25); + +wn.require('lib/js/legacy/wnf.compressed.js'); +wn.sb.set_value(60); + +wn.require('lib/js/legacy/form.compressed.js'); +wn.require('lib/js/legacy/report.compressed.js'); +wn.require('lib/css/legacy/default.css'); +wn.sb.set_value(80); + +$(document).bind('ready', function() { + startup(); +}); \ No newline at end of file diff --git a/conf/conf.py b/conf/conf.py new file mode 100644 index 0000000000..777006a3aa --- /dev/null +++ b/conf/conf.py @@ -0,0 +1,11 @@ +# Main Configuration File + +# Copy this into conf.py +# ---------------------- + +# Index URL +# --------- + +# URL path to index.html +# if you are installing within a folder, add the folderpath +index_path = '/' \ No newline at end of file diff --git a/conf/index.cgi b/conf/index.cgi new file mode 100755 index 0000000000..d203f3061d --- /dev/null +++ b/conf/index.cgi @@ -0,0 +1,21 @@ +#!/usr/bin/python +# main handler file + +import cgi, cgitb, os, sys +cgitb.enable() + +# import libs +sys.path.append('lib/py') +sys.path.append('erpnext') + +import webnotes +import webnotes.defs + +webnotes.form = cgi.FieldStorage() + +# make the form_dict +for key in webnotes.form.keys(): + webnotes.form_dict[key] = webnotes.form.getvalue(key) + +# pass on to legacy handler +import webnotes.handler diff --git a/css/base.css b/css/base.css new file mode 100755 index 0000000000..ac345506db --- /dev/null +++ b/css/base.css @@ -0,0 +1,389 @@ +/* +* Skeleton V1.1 +* Copyright 2011, Dave Gamache +* www.getskeleton.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 8/17/2011 +*/ + + +/* Table of Content +================================================== + #Reset & Basics + #Basic Styles + #Site Styles + #Typography + #Links + #Lists + #Images + #Buttons + #Tabs + #Forms + #Misc */ + + +/* #Reset & Basics (Inspired by E. Meyers) +================================================== */ + html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; } + article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { + display: block; } + body { + line-height: 1; } + ol, ul { + list-style: none; } + blockquote, q { + quotes: none; } + blockquote:before, blockquote:after, + q:before, q:after { + content: ''; + content: none; } + table { + border-collapse: collapse; + border-spacing: 0; } + + +/* #Basic Styles +================================================== */ + body { + background: #fff; + font: 14px/21px "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #444; + -webkit-font-smoothing: antialiased; /* Fix for webkit rendering */ + -webkit-text-size-adjust: 100%; + } + + +/* #Typography +================================================== */ + h1, h2, h3, h4, h5, h6 { + color: #181818; + font-family: "Georgia", "Times New Roman", Helvetica, Arial, sans-serif; + font-weight: normal; } + h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { font-weight: inherit; } + h1 { font-size: 46px; line-height: 55px; margin-bottom: 14px;} + h2 { font-size: 35px; line-height: 40px; margin-bottom: 10px; } + h3 { font-size: 28px; line-height: 34px; margin-bottom: 8px; } + h4 { font-size: 21px; line-height: 30px; margin-bottom: 4px; } + h5 { font-size: 17px; line-height: 24px; } + h6 { font-size: 14px; line-height: 21px; } + .subheader { color: #777; } + + p { margin: 0 0 20px 0; } + p img { margin: 0; } + p.lead { font-size: 21px; line-height: 27px; color: #777; } + + em { font-style: italic; } + strong { font-weight: bold; color: #333; } + small { font-size: 80%; } + +/* Blockquotes */ + blockquote, blockquote p { font-size: 17px; line-height: 24px; color: #777; font-style: italic; } + blockquote { margin: 0 0 20px; padding: 9px 20px 0 19px; border-left: 1px solid #ddd; } + blockquote cite { display: block; font-size: 12px; color: #555; } + blockquote cite:before { content: "\2014 \0020"; } + blockquote cite a, blockquote cite a:visited, blockquote cite a:visited { color: #555; } + + hr { border: solid #ddd; border-width: 1px 0 0; clear: both; margin: 10px 0 30px; height: 0; } + + +/* #Links +================================================== */ + a, a:visited { color: #333; text-decoration: underline; outline: 0; } + a:hover, a:focus { color: #000; } + p a, p a:visited { line-height: inherit; } + + +/* #Lists +================================================== */ + ul, ol { margin-bottom: 20px; } + ul { list-style: none outside; } + ol { list-style: decimal; } + ol, ul.square, ul.circle, ul.disc { margin-left: 30px; } + ul.square { list-style: square outside; } + ul.circle { list-style: circle outside; } + ul.disc { list-style: disc outside; } + ul ul, ul ol, + ol ol, ol ul { margin: 4px 0 5px 30px; font-size: 90%; } + ul ul li, ul ol li, + ol ol li, ol ul li { margin-bottom: 6px; } + li { line-height: 18px; margin-bottom: 12px; } + ul.large li { line-height: 21px; } + li p { line-height: 21px; } + +/* #Images +================================================== */ + + img.scale-with-grid { + max-width: 100%; + height: auto; } + + +/* #Buttons +================================================== */ + + a.button, + button, + input[type="submit"], + input[type="reset"], + input[type="button"] { + background: #eee; /* Old browsers */ + background: -moz-linear-gradient(top, rgba(255,255,255,.2) 0%, rgba(0,0,0,.2) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.2)), color-stop(100%,rgba(0,0,0,.2))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* W3C */ + border: 1px solid #aaa; + border-top: 1px solid #ccc; + border-left: 1px solid #ccc; + padding: 4px 12px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + color: #444; + display: inline-block; + font-size: 11px; + font-weight: bold; + text-decoration: none; + text-shadow: 0 1px rgba(255, 255, 255, .75); + cursor: pointer; + margin-bottom: 20px; + line-height: 21px; + font-family: "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; } + + a.button:hover, + button:hover, + input[type="submit"]:hover, + input[type="reset"]:hover, + input[type="button"]:hover { + color: #222; + background: #ddd; /* Old browsers */ + background: -moz-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.3)), color-stop(100%,rgba(0,0,0,.3))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* W3C */ + border: 1px solid #888; + border-top: 1px solid #aaa; + border-left: 1px solid #aaa; } + + a.button:active, + button:active, + input[type="submit"]:active, + input[type="reset"]:active, + input[type="button"]:active { + border: 1px solid #666; + background: #ccc; /* Old browsers */ + background: -moz-linear-gradient(top, rgba(255,255,255,.35) 0%, rgba(10,10,10,.4) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.35)), color-stop(100%,rgba(10,10,10,.4))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* W3C */ } + + .button.full-width, + button.full-width, + input[type="submit"].full-width, + input[type="reset"].full-width, + input[type="button"].full-width { + width: 100%; + padding-left: 0 !important; + padding-right: 0 !important; + text-align: center; } + + +/* #Tabs (activate in tabs.js) +================================================== */ + ul.tabs { + display: block; + margin: 0 0 20px 0; + padding: 0; + border-bottom: solid 1px #ddd; } + ul.tabs li { + display: block; + width: auto; + height: 30px; + padding: 0; + float: left; + margin-bottom: 0; } + ul.tabs li a { + display: block; + text-decoration: none; + width: auto; + height: 29px; + padding: 0px 20px; + line-height: 30px; + border: solid 1px #ddd; + border-width: 1px 1px 0 0; + margin: 0; + background: #f5f5f5; + font-size: 13px; } + ul.tabs li a.active { + background: #fff; + height: 30px; + position: relative; + top: -4px; + padding-top: 4px; + border-left-width: 1px; + margin: 0 0 0 -1px; + color: #111; + -moz-border-radius-topleft: 2px; + -webkit-border-top-left-radius: 2px; + border-top-left-radius: 2px; + -moz-border-radius-topright: 2px; + -webkit-border-top-right-radius: 2px; + border-top-right-radius: 2px; } + ul.tabs li:first-child a.active { + margin-left: 0; } + ul.tabs li:first-child a { + border-width: 1px 1px 0 1px; + -moz-border-radius-topleft: 2px; + -webkit-border-top-left-radius: 2px; + border-top-left-radius: 2px; } + ul.tabs li:last-child a { + -moz-border-radius-topright: 2px; + -webkit-border-top-right-radius: 2px; + border-top-right-radius: 2px; } + + ul.tabs-content { margin: 0; display: block; } + ul.tabs-content > li { display:none; } + ul.tabs-content > li.active { display: block; } + + /* Clearfixing tabs for beautiful stacking */ + ul.tabs:before, + ul.tabs:after { + content: '\0020'; + display: block; + overflow: hidden; + visibility: hidden; + width: 0; + height: 0; } + ul.tabs:after { + clear: both; } + ul.tabs { + zoom: 1; } + + +/* #Forms +================================================== */ + + form { + margin-bottom: 20px; } + fieldset { + margin-bottom: 20px; } + input[type="text"], + input[type="password"], + input[type="email"], + textarea, + select { + border: 1px solid #ccc; + padding: 6px 4px; + outline: none; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + font: 13px "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #777; + margin: 0; + width: 210px; + max-width: 100%; + display: block; + margin-bottom: 20px; + background: #fff; } + select { + padding: 0; } + input[type="text"]:focus, + input[type="password"]:focus, + input[type="email"]:focus, + textarea:focus { + border: 1px solid #aaa; + color: #444; + -moz-box-shadow: 0 0 3px rgba(0,0,0,.2); + -webkit-box-shadow: 0 0 3px rgba(0,0,0,.2); + box-shadow: 0 0 3px rgba(0,0,0,.2); } + textarea { + min-height: 60px; } + label, + legend { + display: block; + font-weight: bold; + font-size: 13px; } + select { + width: 220px; } + input[type="checkbox"] { + display: inline; } + label span, + legend span { + font-weight: normal; + font-size: 13px; + color: #444; } + +/* #Misc +================================================== */ + .remove-bottom { margin-bottom: 0 !important; } + .half-bottom { margin-bottom: 10px !important; } + .add-bottom { margin-bottom: 20px !important; } + + +/* + +chaiproject.org + +Some standard styles to help you get started + +Fibonacchi 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 + +*/ + +/* Code blocks */ + +pre, code { + font: 12px 'Bitstream Vera Sans Mono','Courier',monospace; +} + +/* Light Gradient */ +.gradient-light { + background: #eaeaea; /* Old browsers */ + background: -moz-linear-gradient(top, #eaeaea 0%, #b2b2b2 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#eaeaea), color-stop(100%,#b2b2b2)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #eaeaea 0%,#b2b2b2 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #eaeaea 0%,#b2b2b2 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, #eaeaea 0%,#b2b2b2 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eaeaea', endColorstr='#b2b2b2',GradientType=0 ); /* IE6-9 */ + background: linear-gradient(top, #eaeaea 0%,#b2b2b2 100%); /* W3C */ +} + +/* Dark Gradient */ +.gradient-dark { + background: #45484d; /* Old browsers */ + background: -moz-linear-gradient(top, #45484d 0%, #000000 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#45484d), color-stop(100%,#000000)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #45484d 0%,#000000 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #45484d 0%,#000000 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, #45484d 0%,#000000 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#45484d', endColorstr='#000000',GradientType=0 ); /* IE6-9 */ + background: linear-gradient(top, #45484d 0%,#000000 100%); /* W3C */ + color: #FFF; +} + +/* Small shadow */ +.shadow { + -moz-box-shadow: 0px 2px 2px #888; + -webkit-box-shadow: 0px 2px 2px #888; + box-shadow: 0px 2px 2px #888; +} + +/* Rounded corners */ +.round { + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} \ No newline at end of file diff --git a/css/layout.css b/css/layout.css new file mode 100755 index 0000000000..aff5b477e0 --- /dev/null +++ b/css/layout.css @@ -0,0 +1,58 @@ +/* +* Skeleton V1.1 +* Copyright 2011, Dave Gamache +* www.getskeleton.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 8/17/2011 +*/ + +/* Table of Content +================================================== + #Site Styles + #Page Styles + #Media Queries + #Font-Face */ + +/* #Site Styles +================================================== */ + +/* #Page Styles +================================================== */ + +/* #Media Queries +================================================== */ + + /* Smaller than standard 960 (devices and browsers) */ + @media only screen and (max-width: 959px) {} + + /* Tablet Portrait size to standard 960 (devices and browsers) */ + @media only screen and (min-width: 768px) and (max-width: 959px) {} + + /* All Mobile Sizes (devices and browser) */ + @media only screen and (max-width: 767px) {} + + /* Mobile Landscape Size to Tablet Portrait (devices and browsers) */ + @media only screen and (min-width: 480px) and (max-width: 767px) {} + + /* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */ + @media only screen and (max-width: 479px) {} + + +/* #Font-Face +================================================== */ +/* This is the proper syntax for an @font-face file + Just create a "fonts" folder at the root, + copy your FontName into code below and remove + comment brackets */ + +/* @font-face { + font-family: 'FontName'; + src: url('../fonts/FontName.eot'); + src: url('../fonts/FontName.eot?iefix') format('eot'), + url('../fonts/FontName.woff') format('woff'), + url('../fonts/FontName.ttf') format('truetype'), + url('../fonts/FontName.svg#webfontZam02nTh') format('svg'); + font-weight: normal; + font-style: normal; } +*/ \ No newline at end of file diff --git a/css/skeleton.css b/css/skeleton.css new file mode 100755 index 0000000000..d0264a40b3 --- /dev/null +++ b/css/skeleton.css @@ -0,0 +1,236 @@ +/* +* Skeleton V1.1 +* Copyright 2011, Dave Gamache +* www.getskeleton.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 8/17/2011 +*/ + + +/* Table of Contents +================================================== + #Base 960 Grid + #Tablet (Portrait) + #Mobile (Portrait) + #Mobile (Landscape) + #Clearing */ + + + +/* #Base 960 Grid +================================================== */ + + .container { position: relative; width: 960px; margin: 0 auto; padding: 0; } + .column, .columns { float: left; display: inline; margin-left: 10px; margin-right: 10px; } + .row { margin-bottom: 20px; } + + /* Nested Column Classes */ + .column.alpha, .columns.alpha { margin-left: 0; } + .column.omega, .columns.omega { margin-right: 0; } + + /* Base Grid */ + .container .one.column { width: 40px; } + .container .two.columns { width: 100px; } + .container .three.columns { width: 160px; } + .container .four.columns { width: 220px; } + .container .five.columns { width: 280px; } + .container .six.columns { width: 340px; } + .container .seven.columns { width: 400px; } + .container .eight.columns { width: 460px; } + .container .nine.columns { width: 520px; } + .container .ten.columns { width: 580px; } + .container .eleven.columns { width: 640px; } + .container .twelve.columns { width: 700px; } + .container .thirteen.columns { width: 760px; } + .container .fourteen.columns { width: 820px; } + .container .fifteen.columns { width: 880px; } + .container .sixteen.columns { width: 940px; } + + .container .one-third.column { width: 300px; } + .container .two-thirds.column { width: 620px; } + + /* Offsets */ + .container .offset-by-one { padding-left: 60px; } + .container .offset-by-two { padding-left: 120px; } + .container .offset-by-three { padding-left: 180px; } + .container .offset-by-four { padding-left: 240px; } + .container .offset-by-five { padding-left: 300px; } + .container .offset-by-six { padding-left: 360px; } + .container .offset-by-seven { padding-left: 420px; } + .container .offset-by-eight { padding-left: 480px; } + .container .offset-by-nine { padding-left: 540px; } + .container .offset-by-ten { padding-left: 600px; } + .container .offset-by-eleven { padding-left: 660px; } + .container .offset-by-twelve { padding-left: 720px; } + .container .offset-by-thirteen { padding-left: 780px; } + .container .offset-by-fourteen { padding-left: 840px; } + .container .offset-by-fifteen { padding-left: 900px; } + + + +/* #Tablet (Portrait) +================================================== */ + + /* Note: Design for a width of 768px */ + + @media only screen and (min-width: 768px) and (max-width: 959px) { + .container { width: 768px; } + .container .column, + .container .columns { margin-left: 10px; margin-right: 10px; } + .column.alpha, .columns.alpha { margin-left: 0; margin-right: 10px; } + .column.omega, .columns.omega { margin-right: 0; margin-left: 10px; } + + .container .one.column { width: 28px; } + .container .two.columns { width: 76px; } + .container .three.columns { width: 124px; } + .container .four.columns { width: 172px; } + .container .five.columns { width: 220px; } + .container .six.columns { width: 268px; } + .container .seven.columns { width: 316px; } + .container .eight.columns { width: 364px; } + .container .nine.columns { width: 412px; } + .container .ten.columns { width: 460px; } + .container .eleven.columns { width: 508px; } + .container .twelve.columns { width: 556px; } + .container .thirteen.columns { width: 604px; } + .container .fourteen.columns { width: 652px; } + .container .fifteen.columns { width: 700px; } + .container .sixteen.columns { width: 748px; } + + .container .one-third.column { width: 236px; } + .container .two-thirds.column { width: 492px; } + + /* Offsets */ + .container .offset-by-one { padding-left: 48px; } + .container .offset-by-two { padding-left: 96px; } + .container .offset-by-three { padding-left: 144px; } + .container .offset-by-four { padding-left: 192px; } + .container .offset-by-five { padding-left: 240px; } + .container .offset-by-six { padding-left: 288px; } + .container .offset-by-seven { padding-left: 336px; } + .container .offset-by-eight { padding-left: 348px; } + .container .offset-by-nine { padding-left: 432px; } + .container .offset-by-ten { padding-left: 480px; } + .container .offset-by-eleven { padding-left: 528px; } + .container .offset-by-twelve { padding-left: 576px; } + .container .offset-by-thirteen { padding-left: 624px; } + .container .offset-by-fourteen { padding-left: 672px; } + .container .offset-by-fifteen { padding-left: 720px; } + } + + +/* #Mobile (Portrait) +================================================== */ + + /* Note: Design for a width of 320px */ + + @media only screen and (max-width: 767px) { + .container { width: 300px; } + .columns, .column { margin: 0; } + + .container .one.column, + .container .two.columns, + .container .three.columns, + .container .four.columns, + .container .five.columns, + .container .six.columns, + .container .seven.columns, + .container .eight.columns, + .container .nine.columns, + .container .ten.columns, + .container .eleven.columns, + .container .twelve.columns, + .container .thirteen.columns, + .container .fourteen.columns, + .container .fifteen.columns, + .container .sixteen.columns, + .container .one-third.column, + .container .two-thirds.column { width: 300px; } + + /* Offsets */ + .container .offset-by-one, + .container .offset-by-two, + .container .offset-by-three, + .container .offset-by-four, + .container .offset-by-five, + .container .offset-by-six, + .container .offset-by-seven, + .container .offset-by-eight, + .container .offset-by-nine, + .container .offset-by-ten, + .container .offset-by-eleven, + .container .offset-by-twelve, + .container .offset-by-thirteen, + .container .offset-by-fourteen, + .container .offset-by-fifteen { padding-left: 0; } + + } + + +/* #Mobile (Landscape) +================================================== */ + + /* Note: Design for a width of 480px */ + + @media only screen and (min-width: 480px) and (max-width: 767px) { + .container { width: 420px; } + .columns, .column { margin: 0; } + + .container .one.column, + .container .two.columns, + .container .three.columns, + .container .four.columns, + .container .five.columns, + .container .six.columns, + .container .seven.columns, + .container .eight.columns, + .container .nine.columns, + .container .ten.columns, + .container .eleven.columns, + .container .twelve.columns, + .container .thirteen.columns, + .container .fourteen.columns, + .container .fifteen.columns, + .container .sixteen.columns, + .container .one-third.column, + .container .two-thirds.column { width: 420px; } + } + + +/* #Clearing +================================================== */ + + /* Self Clearing Goodness */ + .container:after { content: "\0020"; display: block; height: 0; clear: both; visibility: hidden; } + + /* Use clearfix class on parent to clear nested columns, + or wrap each row of columns in a
*/ + .clearfix:before, + .clearfix:after, + .row:before, + .row:after { + content: '\0020'; + display: block; + overflow: hidden; + visibility: hidden; + width: 0; + height: 0; } + .row:after, + .clearfix:after { + clear: both; } + .row, + .clearfix { + zoom: 1; } + + /* You can also use a
to clear columns */ + .clear { + clear: both; + display: block; + overflow: hidden; + visibility: hidden; + width: 0; + height: 0; + } + + diff --git a/css/ui/overlay.css b/css/ui/overlay.css new file mode 100644 index 0000000000..47daaca95f --- /dev/null +++ b/css/ui/overlay.css @@ -0,0 +1,82 @@ +/* https://github.com/LearnBoost/CSS3-Overlay/ */ + +body.overlaid { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +body.overlaid div.overlay { + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + transform: translateY(0); +} + + div.overlay { + /* using display none to hide the overlay nullifies -webkit-transition */ + -webkit-transform: translateY(-50000px); + -moz-transform: translateY(-50000px); + transform: translateY(-50000px); + + position: fixed; + width: 100%; + height: 100%; + top: 0; + left: 0; + background: rgba(0,0,0,0.6); + + -webkit-user-select: auto; + -moz-user-select: auto; + user-select: auto; + } + div.overlay > div.wrap-outer { + position: relative; + width: 100%; + height: 100%; + + display: -webkit-box; + display: -moz-box; + display: box; + + -webkit-box-orient: horizontal; + -moz-box-orient: horizontal; + box-orient: horizontal; + + -webkit-box-align: stretch; + -moz-box-align: stretch; + box-align: stretch; + + -webkit-box-pack: center; + -moz-box-pack: center; + box-pack: center; + } + div.overlay > div.wrap-outer > div.wrap { + display: -webkit-box; + display: -moz-box; + display: box; + + -webkit-box-orient: vertical; + -moz-box-orient: vertical; + box-orient: vertical; + + -webkit-box-align: stretch; + -moz-box-align: stretch; + box-align: stretch; + + -webkit-box-pack: center; + -moz-box-pack: center; + box-pack: center; + } + + div.overlay > div.wrap-outer > div.wrap > * { + -webkit-box-flex: 0; + -moz-box-flex: 0; + box-flex: 0; + + display: block; + } + +div.overlay > div.wrap-outer > div.wrap > div.dialog { + padding: 21px; + background-color: #fff; +} \ No newline at end of file diff --git a/css/ui/status_bar.css b/css/ui/status_bar.css new file mode 100644 index 0000000000..10e7cbdfca --- /dev/null +++ b/css/ui/status_bar.css @@ -0,0 +1,19 @@ +div.status_bar_outer { + background-color: rgba(0,0,0,0.2); + border: 1px solid rgba(0,0,0,0.4); + height: 21px; + width: 240px; +} + +div.status_bar_inner { + background: #a9e4f7; /* Old browsers */ + background: -moz-linear-gradient(left, #a9e4f7 0%, #0fb4e7 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, right top, color-stop(0%,#a9e4f7), color-stop(100%,#0fb4e7)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(left, #a9e4f7 0%,#0fb4e7 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(left, #a9e4f7 0%,#0fb4e7 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(left, #a9e4f7 0%,#0fb4e7 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#a9e4f7', endColorstr='#0fb4e7',GradientType=1 ); /* IE6-9 */ + background: linear-gradient(left, #a9e4f7 0%,#0fb4e7 100%); /* W3C */ + height: 21px; + width: 0%; +} \ No newline at end of file diff --git a/images/icons/folder.gif b/images/icons/folder.gif new file mode 100644 index 0000000000000000000000000000000000000000..45b191d8ae042575e18df1ae2b689135a32d954e GIT binary patch literal 996 zcmeH`TT4>`0DzA+ZHqE9BLyRu(MuOr_~1Ij<_a%Rh$vk^!CPRl%2tdL!)-Q+l$oSv zbXyj+2a~dbj0l|ubK17tYU-JDIyEP{dG2TDTKj88k9vi03fm2e@FnEO3;-5t#Q3=DUwiRfPtx zVbD`*-h@LnEMlV;+fi?m??X;-xDt8J#pn*JfH#F)GVxgJxk4BS1a kG}l)Y$K`fzJu35jlHP0DB-g8&6UtPEokmOXMiBu10r_2l`v3p{ literal 0 HcmV?d00001 diff --git a/images/icons/icons.png b/images/icons/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..fac6f173f03f8a29fa952fe8b22720ec7a488e44 GIT binary patch literal 53108 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 P;73M6QM^jjDCqwIF6Tl8 literal 0 HcmV?d00001 diff --git a/images/icons/wntoolbar-icons.png b/images/icons/wntoolbar-icons.png new file mode 100644 index 0000000000000000000000000000000000000000..1e17e115934fb4b70e886d07464ab65cf349899b GIT binary patch literal 2762 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 C{XbIx literal 0 HcmV?d00001 diff --git a/js/build.json b/js/build.json new file mode 100644 index 0000000000..ee822313cd --- /dev/null +++ b/js/build.json @@ -0,0 +1,19 @@ +{ + "core.min.js": [ + "wn/provide.js", + "wn/xmlhttp.js", + "wn/assets.js", + "wn/require.js", + "wn/dom.js", + "wn/page.js", + "lib/json2.js", + "core.js" + ], + "lib/superfish/superfish.min.js": [ + "lib/superfish/hoverIntent.js", + "lib/superfish/superfish.js", + "lib/superfish/make_superfish.js", + "lib/superfish/css/superfish.css", + "lib/superfish/css/superfish-vertical.css" + ] +} \ No newline at end of file diff --git a/js/core.js b/js/core.js new file mode 100644 index 0000000000..bb1d7c5204 --- /dev/null +++ b/js/core.js @@ -0,0 +1,33 @@ + +// load all critical libraries +wn.require("lib/js/lib/jquery.min.js"); +//wn.require("lib/js/lib/history/history.min.js"); +wn.require("lib/js/lib/history/history.adapter.jquery.js"); +wn.require("lib/js/lib/history/history.js"); +wn.require("lib/js/lib/history/history.html4.js"); +wn.require("lib/js/wn/history.js"); + +/* overload links for ajax pages */ +$(document).bind('ready', function() { + var base = window.location.href.split('#')[0]; + + // convert hard links to softlinks + $.each($('a[softlink!="false"]'), function(i, v) { + + // if linking on the same site + if(v.href.substr(0, base.length)==base) { + var path = (v.href.substr(base.length)); + + // if hardlink, softlink it + if(path.substr(0,1)!='#') { + v.href = base + '#' + path; + } + } + }); + + // go to hash page if exists + if(window.location.hash) { + wn.page.set(window.location.hash.substr(1)); + } + +}); diff --git a/js/core.min.js b/js/core.min.js new file mode 100644 index 0000000000..c246569965 --- /dev/null +++ b/js/core.min.js @@ -0,0 +1,55 @@ + +wn={} +wn.provide=function(namespace){var nsl=namespace.split('.');var l=nsl.length;var parent=window;for(var i=0;i")&&c[0]);return a>4?a:!1}();return a},l.isInternetExplorer=function(){var a=l.isInternetExplorer.cached=typeof l.isInternetExplorer.cached!="undefined"?l.isInternetExplorer.cached:Boolean(l.getInternetExplorerMajorVersion());return a},l.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||l.isInternetExplorer()&&l.getInternetExplorerMajorVersion()<8)},l.enabled=!l.emulated.pushState,l.bugs={setHash:Boolean(!l.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!l.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(l.isInternetExplorer()&&l.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(l.isInternetExplorer()&&l.getInternetExplorerMajorVersion()<7)},l.isEmptyObject=function(a){for(var b in a)return!1;return!0},l.cloneObject=function(a){var b,c;a?(b=k.stringify(a),c=k.parse(b)):c={};return c},l.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;a+="/";return a},l.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/");return c},l.getBaseUrl=function(){var a=l.getBaseHref()||l.getBasePageUrl()||l.getRootUrl();return a},l.getPageUrl=function(){var a=l.getState(!1,!1),b=(a||{}).url||d.location.href,c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"});return c},l.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},l.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=l.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=l.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=l.getPageUrl().replace(/[\?#].*/,"")+a:b?c=l.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=l.getBasePageUrl()+a.replace(/^(\.\/)+/,""));return c.replace(/\#$/,"")},l.getShortUrl=function(a){var b=a,c=l.getBaseUrl(),d=l.getRootUrl();l.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),l.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,"");return b},l.store=f?f.store("History.store")||{}:{},l.store.idToState=l.store.idToState||{},l.store.urlToId=l.store.urlToId||{},l.store.stateToId=l.store.stateToId||{},l.idToState=l.idToState||{},l.stateToId=l.stateToId||{},l.urlToId=l.urlToId||{},l.storedStates=l.storedStates||[],l.savedStates=l.savedStates||[],l.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=l.getLastSavedState();!c&&b&&(c=l.createStateObject()),a&&(c=l.cloneObject(c),c.url=c.cleanUrl||c.url);return c},l.getIdByState=function(a){var b=l.extractId(a.url);if(!b){var c=l.getStateString(a);if(typeof l.stateToId[c]!="undefined")b=l.stateToId[c];else if(typeof l.store.stateToId[c]!="undefined")b=l.store.stateToId[c];else{for(;;){b=String(Math.floor(Math.random()*1e3));if(typeof l.idToState[b]=="undefined"&&typeof l.store.idToState[b]=="undefined")break}l.stateToId[c]=b,l.idToState[b]=a}}return b},l.normalizeState=function(a){if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};var b={};b.normalized=!0,b.title=a.title||"",b.url=l.getFullUrl(l.unescapeString(a.url||d.location.href)),b.hash=l.getShortUrl(b.url),b.data=l.cloneObject(a.data),b.id=l.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl;var c=!l.isEmptyObject(b.data);if(b.title||c)b.hash=l.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;b.hashedUrl=l.getFullUrl(b.hash),(l.emulated.pushState||l.bugs.safariPoll)&&l.hasUrlDuplicate(b)&&(b.url=b.hashedUrl);return b},l.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};d=l.normalizeState(d);return d},l.getStateById=function(a){a=String(a);var c=l.idToState[a]||l.store.idToState[a]||b;return c},l.getStateString=function(a){var b=l.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c);return d},l.getStateId=function(a){var b=l.normalizeState(a),c=b.id;return c},l.getHashByState=function(a){var b,c=l.normalizeState(a);b=c.hash;return b},l.extractId=function(a){var b,c,d;c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"";return b||!1},l.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},l.extractState=function(a,b){var c=null;b=b||!1;var d=l.extractId(a);d&&(c=l.getStateById(d));if(!c){var e=l.getFullUrl(a);d=l.getIdByUrl(e)||!1,d&&(c=l.getStateById(d)),!c&&b&&!l.isTraditionalAnchor(a)&&(c=l.createStateObject(null,null,e))}return c},l.getIdByUrl=function(a){var c=l.urlToId[a]||l.store.urlToId[a]||b;return c},l.getLastSavedState=function(){return l.savedStates[l.savedStates.length-1]||b},l.getLastStoredState=function(){return l.storedStates[l.storedStates.length-1]||b},l.hasUrlDuplicate=function(a){var b=!1,c=l.extractState(a.url);b=c&&c.id!==a.id;return b},l.storeState=function(a){l.urlToId[a.url]=a.id,l.storedStates.push(l.cloneObject(a));return a},l.isLastSavedState=function(a){var b=!1;if(l.savedStates.length){var c=a.id,d=l.getLastSavedState(),e=d.id;b=c===e}return b},l.saveState=function(a){if(l.isLastSavedState(a))return!1;l.savedStates.push(l.cloneObject(a));return!0},l.getStateByIndex=function(a){var b=null;typeof a=="undefined"?b=l.savedStates[l.savedStates.length-1]:a<0?b=l.savedStates[l.savedStates.length+a]:b=l.savedStates[a];return b},l.getHash=function(){var a=l.unescapeHash(d.location.hash);return a},l.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},l.unescapeHash=function(a){var b=l.normalizeHash(a);b=l.unescapeString(b);return b},l.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},l.setHash=function(a,b){if(b!==!1&&l.busy()){l.pushQueue({scope:l,callback:l.setHash,args:arguments,queue:b});return!1}var c=l.escapeHash(a);l.busy(!0);var e=l.extractState(a,!0);if(e&&!l.emulated.pushState)l.pushState(e.data,e.title,e.url,!1);else if(d.location.hash!==c)if(l.bugs.setHash){var f=l.getPageUrl();l.pushState(null,null,f+"#"+c,!1)}else d.location.hash=c;return l},l.escapeHash=function(b){var c=l.normalizeHash(b);c=a.escape(c),l.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?"));return c},l.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");b=l.unescapeHash(b);return b},l.setTitle=function(a){var b=a.title;if(!b){var c=l.getStateByIndex(0);c&&c.url===a.url&&(b=c.title||l.options.initialTitle)}try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}d.title=b;return l},l.queues=[],l.busy=function(a){typeof a!="undefined"?l.busy.flag=a:typeof l.busy.flag=="undefined"&&(l.busy.flag=!1);if(!l.busy.flag){h(l.busy.timeout);var b=function(){if(!l.busy.flag)for(var a=l.queues.length-1;a>=0;--a){var c=l.queues[a];if(c.length===0)continue;var d=c.shift();l.fireQueueItem(d),l.busy.timeout=g(b,l.options.busyDelay)}};l.busy.timeout=g(b,l.options.busyDelay)}return l.busy.flag},l.fireQueueItem=function(a){return a.callback.apply(a.scope||l,a.args||[])},l.pushQueue=function(a){l.queues[a.queue||0]=l.queues[a.queue||0]||[],l.queues[a.queue||0].push(a);return l},l.queue=function(a,b){typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),l.busy()?l.pushQueue(a):l.fireQueueItem(a);return l},l.clearQueue=function(){l.busy.flag=!1,l.queues=[];return l},l.stateChanged=!1,l.doubleChecker=!1,l.doubleCheckComplete=function(){l.stateChanged=!0,l.doubleCheckClear();return l},l.doubleCheckClear=function(){l.doubleChecker&&(h(l.doubleChecker),l.doubleChecker=!1);return l},l.doubleCheck=function(a){l.stateChanged=!1,l.doubleCheckClear(),l.bugs.ieDoubleCheck&&(l.doubleChecker=g(function(){l.doubleCheckClear(),l.stateChanged||a();return!0},l.options.doubleCheckInterval));return l},l.safariStatePoll=function(){var b=l.extractState(d.location.href),c;if(!l.isLastSavedState(b))c=b;else return;c||(c=l.createStateObject()),l.Adapter.trigger(a,"popstate");return l},l.back=function(a){if(a!==!1&&l.busy()){l.pushQueue({scope:l,callback:l.back,args:arguments,queue:a});return!1}l.busy(!0),l.doubleCheck(function(){l.back(!1)}),m.go(-1);return!0},l.forward=function(a){if(a!==!1&&l.busy()){l.pushQueue({scope:l,callback:l.forward,args:arguments,queue:a});return!1}l.busy(!0),l.doubleCheck(function(){l.forward(!1)}),m.go(1);return!0},l.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)l.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)l.back(b)}return l},l.saveState(l.storeState(l.extractState(d.location.href,!0))),f&&(l.onUnload=function(){var a=f.store("History.store")||{},b;a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in l.idToState){if(!l.idToState.hasOwnProperty(b))continue;a.idToState[b]=l.idToState[b]}for(b in l.urlToId){if(!l.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=l.urlToId[b]}for(b in l.stateToId){if(!l.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=l.stateToId[b]}l.store=a,f.store("History.store",a)},l.intervalList.push(i(l.onUnload,l.options.storeInterval)),l.Adapter.bind(a,"beforeunload",l.onUnload),l.Adapter.bind(a,"unload",l.onUnload));if(l.emulated.pushState){var n=function(){};l.pushState=l.pushState||n,l.replaceState=l.replaceState||n}else{l.onPopState=function(b){l.doubleCheckComplete();var c=l.getHash();if(c){var e=l.extractState(c||d.location.href,!0);e?l.replaceState(e.data,e.title,e.url,!1):(l.Adapter.trigger(a,"anchorchange"),l.busy(!1)),l.expectedStateId=!1;return!1}var f=!1;b=b||{},typeof b.state=="undefined"&&(typeof b.originalEvent!="undefined"&&typeof b.originalEvent.state!="undefined"?b.state=b.originalEvent.state||!1:typeof b.event!="undefined"&&typeof b.event.state!="undefined"&&(b.state=b.event.state||!1)),b.state=b.state||!1,b.state?f=l.getStateById(b.state):l.expectedStateId?f=l.getStateById(l.expectedStateId):f=l.extractState(d.location.href),f||(f=l.createStateObject(null,null,d.location.href)),l.expectedStateId=!1;if(l.isLastSavedState(f)){l.busy(!1);return!1}l.storeState(f),l.saveState(f),l.setTitle(f),l.Adapter.trigger(a,"statechange"),l.busy(!1);return!0},l.Adapter.bind(a,"popstate",l.onPopState),l.pushState=function(b,c,d,e){if(l.getHashByUrl(d)&&l.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&l.busy()){l.pushQueue({scope:l,callback:l.pushState,args:arguments,queue:e});return!1}l.busy(!0);var f=l.createStateObject(b,c,d);l.isLastSavedState(f)?l.busy(!1):(l.storeState(f),l.expectedStateId=f.id,m.pushState(f.id,f.title,f.url),l.Adapter.trigger(a,"popstate"));return!0},l.replaceState=function(b,c,d,e){if(l.getHashByUrl(d)&&l.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&l.busy()){l.pushQueue({scope:l,callback:l.replaceState,args:arguments,queue:e});return!1}l.busy(!0);var f=l.createStateObject(b,c,d);l.isLastSavedState(f)?l.busy(!1):(l.storeState(f),l.expectedStateId=f.id,m.replaceState(f.id,f.title,f.url),l.Adapter.trigger(a,"popstate"));return!0},l.bugs.safariPoll&&l.intervalList.push(i(l.safariStatePoll,l.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")l.Adapter.bind(a,"hashchange",function(){l.Adapter.trigger(a,"popstate")}),l.getHash()&&l.Adapter.onDomLoad(function(){l.Adapter.trigger(a,"hashchange")})}},l.init()})(window) \ No newline at end of file diff --git a/js/lib/history/history.min.js b/js/lib/history/history.min.js new file mode 100644 index 0000000000..a4851329ed --- /dev/null +++ b/js/lib/history/history.min.js @@ -0,0 +1,19 @@ +(function(a,b){var c=a.History=a.History||{},d=a.jQuery;if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");c.Adapter={bind:function(a,b,c){d(a).bind(b,c)},trigger:function(a,b){d(a).trigger(b)},onDomLoad:function(a){d(a)}},typeof c.init!="undefined"&&c.init()})(window) +(function(a,b){"use strict";var c=a.console||b,d=a.document,e=a.navigator,f=a.amplify||!1,g=a.setTimeout,h=a.clearTimeout,i=a.setInterval,j=a.clearInterval,k=a.JSON,l=a.History=a.History||{},m=a.history;k.stringify=k.stringify||k.encode,k.parse=k.parse||k.decode;if(typeof l.init!="undefined")throw new Error("History.js Core has already been loaded...");l.init=function(){if(typeof l.Adapter=="undefined")return!1;typeof l.initCore!="undefined"&&l.initCore(),typeof l.initHtml4!="undefined"&&l.initHtml4();return!0},l.initCore=function(){if(typeof l.initCore.initialized!="undefined")return!1;l.initCore.initialized=!0,l.options=l.options||{},l.options.hashChangeInterval=l.options.hashChangeInterval||100,l.options.safariPollInterval=l.options.safariPollInterval||500,l.options.doubleCheckInterval=l.options.doubleCheckInterval||500,l.options.storeInterval=l.options.storeInterval||1e3,l.options.busyDelay=l.options.busyDelay||250,l.options.debug=l.options.debug||!1,l.options.initialTitle=l.options.initialTitle||d.title,l.intervalList=[],l.clearAllIntervals=function(){var a,b=l.intervalList;if(typeof b!="undefined"&&b!==null){for(a=0;a")&&c[0]);return a>4?a:!1}();return a},l.isInternetExplorer=function(){var a=l.isInternetExplorer.cached=typeof l.isInternetExplorer.cached!="undefined"?l.isInternetExplorer.cached:Boolean(l.getInternetExplorerMajorVersion());return a},l.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||l.isInternetExplorer()&&l.getInternetExplorerMajorVersion()<8)},l.enabled=!l.emulated.pushState,l.bugs={setHash:Boolean(!l.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!l.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(l.isInternetExplorer()&&l.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(l.isInternetExplorer()&&l.getInternetExplorerMajorVersion()<7)},l.isEmptyObject=function(a){for(var b in a)return!1;return!0},l.cloneObject=function(a){var b,c;a?(b=k.stringify(a),c=k.parse(b)):c={};return c},l.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;a+="/";return a},l.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/");return c},l.getBaseUrl=function(){var a=l.getBaseHref()||l.getBasePageUrl()||l.getRootUrl();return a},l.getPageUrl=function(){var a=l.getState(!1,!1),b=(a||{}).url||d.location.href,c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"});return c},l.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},l.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=l.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=l.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=l.getPageUrl().replace(/[\?#].*/,"")+a:b?c=l.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=l.getBasePageUrl()+a.replace(/^(\.\/)+/,""));return c.replace(/\#$/,"")},l.getShortUrl=function(a){var b=a,c=l.getBaseUrl(),d=l.getRootUrl();l.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),l.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,"");return b},l.store=f?f.store("History.store")||{}:{},l.store.idToState=l.store.idToState||{},l.store.urlToId=l.store.urlToId||{},l.store.stateToId=l.store.stateToId||{},l.idToState=l.idToState||{},l.stateToId=l.stateToId||{},l.urlToId=l.urlToId||{},l.storedStates=l.storedStates||[],l.savedStates=l.savedStates||[],l.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=l.getLastSavedState();!c&&b&&(c=l.createStateObject()),a&&(c=l.cloneObject(c),c.url=c.cleanUrl||c.url);return c},l.getIdByState=function(a){var b=l.extractId(a.url);if(!b){var c=l.getStateString(a);if(typeof l.stateToId[c]!="undefined")b=l.stateToId[c];else if(typeof l.store.stateToId[c]!="undefined")b=l.store.stateToId[c];else{for(;;){b=String(Math.floor(Math.random()*1e3));if(typeof l.idToState[b]=="undefined"&&typeof l.store.idToState[b]=="undefined")break}l.stateToId[c]=b,l.idToState[b]=a}}return b},l.normalizeState=function(a){if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};var b={};b.normalized=!0,b.title=a.title||"",b.url=l.getFullUrl(l.unescapeString(a.url||d.location.href)),b.hash=l.getShortUrl(b.url),b.data=l.cloneObject(a.data),b.id=l.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl;var c=!l.isEmptyObject(b.data);if(b.title||c)b.hash=l.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;b.hashedUrl=l.getFullUrl(b.hash),(l.emulated.pushState||l.bugs.safariPoll)&&l.hasUrlDuplicate(b)&&(b.url=b.hashedUrl);return b},l.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};d=l.normalizeState(d);return d},l.getStateById=function(a){a=String(a);var c=l.idToState[a]||l.store.idToState[a]||b;return c},l.getStateString=function(a){var b=l.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c);return d},l.getStateId=function(a){var b=l.normalizeState(a),c=b.id;return c},l.getHashByState=function(a){var b,c=l.normalizeState(a);b=c.hash;return b},l.extractId=function(a){var b,c,d;c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"";return b||!1},l.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},l.extractState=function(a,b){var c=null;b=b||!1;var d=l.extractId(a);d&&(c=l.getStateById(d));if(!c){var e=l.getFullUrl(a);d=l.getIdByUrl(e)||!1,d&&(c=l.getStateById(d)),!c&&b&&!l.isTraditionalAnchor(a)&&(c=l.createStateObject(null,null,e))}return c},l.getIdByUrl=function(a){var c=l.urlToId[a]||l.store.urlToId[a]||b;return c},l.getLastSavedState=function(){return l.savedStates[l.savedStates.length-1]||b},l.getLastStoredState=function(){return l.storedStates[l.storedStates.length-1]||b},l.hasUrlDuplicate=function(a){var b=!1,c=l.extractState(a.url);b=c&&c.id!==a.id;return b},l.storeState=function(a){l.urlToId[a.url]=a.id,l.storedStates.push(l.cloneObject(a));return a},l.isLastSavedState=function(a){var b=!1;if(l.savedStates.length){var c=a.id,d=l.getLastSavedState(),e=d.id;b=c===e}return b},l.saveState=function(a){if(l.isLastSavedState(a))return!1;l.savedStates.push(l.cloneObject(a));return!0},l.getStateByIndex=function(a){var b=null;typeof a=="undefined"?b=l.savedStates[l.savedStates.length-1]:a<0?b=l.savedStates[l.savedStates.length+a]:b=l.savedStates[a];return b},l.getHash=function(){var a=l.unescapeHash(d.location.hash);return a},l.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},l.unescapeHash=function(a){var b=l.normalizeHash(a);b=l.unescapeString(b);return b},l.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},l.setHash=function(a,b){if(b!==!1&&l.busy()){l.pushQueue({scope:l,callback:l.setHash,args:arguments,queue:b});return!1}var c=l.escapeHash(a);l.busy(!0);var e=l.extractState(a,!0);if(e&&!l.emulated.pushState)l.pushState(e.data,e.title,e.url,!1);else if(d.location.hash!==c)if(l.bugs.setHash){var f=l.getPageUrl();l.pushState(null,null,f+"#"+c,!1)}else d.location.hash=c;return l},l.escapeHash=function(b){var c=l.normalizeHash(b);c=a.escape(c),l.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?"));return c},l.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");b=l.unescapeHash(b);return b},l.setTitle=function(a){var b=a.title;if(!b){var c=l.getStateByIndex(0);c&&c.url===a.url&&(b=c.title||l.options.initialTitle)}try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}d.title=b;return l},l.queues=[],l.busy=function(a){typeof a!="undefined"?l.busy.flag=a:typeof l.busy.flag=="undefined"&&(l.busy.flag=!1);if(!l.busy.flag){h(l.busy.timeout);var b=function(){if(!l.busy.flag)for(var a=l.queues.length-1;a>=0;--a){var c=l.queues[a];if(c.length===0)continue;var d=c.shift();l.fireQueueItem(d),l.busy.timeout=g(b,l.options.busyDelay)}};l.busy.timeout=g(b,l.options.busyDelay)}return l.busy.flag},l.fireQueueItem=function(a){return a.callback.apply(a.scope||l,a.args||[])},l.pushQueue=function(a){l.queues[a.queue||0]=l.queues[a.queue||0]||[],l.queues[a.queue||0].push(a);return l},l.queue=function(a,b){typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),l.busy()?l.pushQueue(a):l.fireQueueItem(a);return l},l.clearQueue=function(){l.busy.flag=!1,l.queues=[];return l},l.stateChanged=!1,l.doubleChecker=!1,l.doubleCheckComplete=function(){l.stateChanged=!0,l.doubleCheckClear();return l},l.doubleCheckClear=function(){l.doubleChecker&&(h(l.doubleChecker),l.doubleChecker=!1);return l},l.doubleCheck=function(a){l.stateChanged=!1,l.doubleCheckClear(),l.bugs.ieDoubleCheck&&(l.doubleChecker=g(function(){l.doubleCheckClear(),l.stateChanged||a();return!0},l.options.doubleCheckInterval));return l},l.safariStatePoll=function(){var b=l.extractState(d.location.href),c;if(!l.isLastSavedState(b))c=b;else return;c||(c=l.createStateObject()),l.Adapter.trigger(a,"popstate");return l},l.back=function(a){if(a!==!1&&l.busy()){l.pushQueue({scope:l,callback:l.back,args:arguments,queue:a});return!1}l.busy(!0),l.doubleCheck(function(){l.back(!1)}),m.go(-1);return!0},l.forward=function(a){if(a!==!1&&l.busy()){l.pushQueue({scope:l,callback:l.forward,args:arguments,queue:a});return!1}l.busy(!0),l.doubleCheck(function(){l.forward(!1)}),m.go(1);return!0},l.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)l.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)l.back(b)}return l},l.saveState(l.storeState(l.extractState(d.location.href,!0))),f&&(l.onUnload=function(){var a=f.store("History.store")||{},b;a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in l.idToState){if(!l.idToState.hasOwnProperty(b))continue;a.idToState[b]=l.idToState[b]}for(b in l.urlToId){if(!l.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=l.urlToId[b]}for(b in l.stateToId){if(!l.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=l.stateToId[b]}l.store=a,f.store("History.store",a)},l.intervalList.push(i(l.onUnload,l.options.storeInterval)),l.Adapter.bind(a,"beforeunload",l.onUnload),l.Adapter.bind(a,"unload",l.onUnload));if(l.emulated.pushState){var n=function(){};l.pushState=l.pushState||n,l.replaceState=l.replaceState||n}else{l.onPopState=function(b){l.doubleCheckComplete();var c=l.getHash();if(c){var e=l.extractState(c||d.location.href,!0);e?l.replaceState(e.data,e.title,e.url,!1):(l.Adapter.trigger(a,"anchorchange"),l.busy(!1)),l.expectedStateId=!1;return!1}var f=!1;b=b||{},typeof b.state=="undefined"&&(typeof b.originalEvent!="undefined"&&typeof b.originalEvent.state!="undefined"?b.state=b.originalEvent.state||!1:typeof b.event!="undefined"&&typeof b.event.state!="undefined"&&(b.state=b.event.state||!1)),b.state=b.state||!1,b.state?f=l.getStateById(b.state):l.expectedStateId?f=l.getStateById(l.expectedStateId):f=l.extractState(d.location.href),f||(f=l.createStateObject(null,null,d.location.href)),l.expectedStateId=!1;if(l.isLastSavedState(f)){l.busy(!1);return!1}l.storeState(f),l.saveState(f),l.setTitle(f),l.Adapter.trigger(a,"statechange"),l.busy(!1);return!0},l.Adapter.bind(a,"popstate",l.onPopState),l.pushState=function(b,c,d,e){if(l.getHashByUrl(d)&&l.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&l.busy()){l.pushQueue({scope:l,callback:l.pushState,args:arguments,queue:e});return!1}l.busy(!0);var f=l.createStateObject(b,c,d);l.isLastSavedState(f)?l.busy(!1):(l.storeState(f),l.expectedStateId=f.id,m.pushState(f.id,f.title,f.url),l.Adapter.trigger(a,"popstate"));return!0},l.replaceState=function(b,c,d,e){if(l.getHashByUrl(d)&&l.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&l.busy()){l.pushQueue({scope:l,callback:l.replaceState,args:arguments,queue:e});return!1}l.busy(!0);var f=l.createStateObject(b,c,d);l.isLastSavedState(f)?l.busy(!1):(l.storeState(f),l.expectedStateId=f.id,m.replaceState(f.id,f.title,f.url),l.Adapter.trigger(a,"popstate"));return!0},l.bugs.safariPoll&&l.intervalList.push(i(l.safariStatePoll,l.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")l.Adapter.bind(a,"hashchange",function(){l.Adapter.trigger(a,"popstate")}),l.getHash()&&l.Adapter.onDomLoad(function(){l.Adapter.trigger(a,"hashchange")})}},l.init()})(window) +(function(a,b){"use strict";var c=a.document,d=a.setTimeout||d,e=a.clearTimeout||e,f=a.setInterval||f,g=a.History=a.History||{};if(typeof g.initHtml4!="undefined")throw new Error("History.js HTML4 Support has already been loaded...");g.initHtml4=function(){if(typeof g.initHtml4.initialized!="undefined")return!1;g.initHtml4.initialized=!0,g.enabled=!0,g.savedHashes=[],g.isLastHash=function(a){var b=g.getHashByIndex(),c=a===b;return c},g.saveHash=function(a){if(g.isLastHash(a))return!1;g.savedHashes.push(a);return!0},g.getHashByIndex=function(a){var b=null;typeof a=="undefined"?b=g.savedHashes[g.savedHashes.length-1]:a<0?b=g.savedHashes[g.savedHashes.length+a]:b=g.savedHashes[a];return b},g.discardedHashes={},g.discardedStates={},g.discardState=function(a,b,c){var d=g.getHashByState(a),e={discardedState:a,backState:c,forwardState:b};g.discardedStates[d]=e;return!0},g.discardHash=function(a,b,c){var d={discardedHash:a,backState:c,forwardState:b};g.discardedHashes[a]=d;return!0},g.discardedState=function(a){var b=g.getHashByState(a),c=g.discardedStates[b]||!1;return c},g.discardedHash=function(a){var b=g.discardedHashes[a]||!1;return b},g.recycleState=function(a){var b=g.getHashByState(a);g.discardedState(a)&&delete g.discardedStates[b];return!0},g.emulated.hashChange&&(g.hashChangeInit=function(){g.checkerFunction=null;var b="";if(g.isInternetExplorer()){var d="historyjs-iframe",e=c.createElement("iframe");e.setAttribute("id",d),e.style.display="none",c.body.appendChild(e),e.contentWindow.document.open(),e.contentWindow.document.close();var h="",i=!1;g.checkerFunction=function(){if(i)return!1;i=!0;var c=g.getHash()||"",d=g.unescapeHash(e.contentWindow.document.location.hash)||"";c!==b?(b=c,d!==c&&(h=d=c,e.contentWindow.document.open(),e.contentWindow.document.close(),e.contentWindow.document.location.hash=g.escapeHash(c)),g.Adapter.trigger(a,"hashchange")):d!==h&&(h=d,g.setHash(d,!1)),i=!1;return!0}}else g.checkerFunction=function(){var c=g.getHash();c!==b&&(b=c,g.Adapter.trigger(a,"hashchange"));return!0};g.intervalList.push(f(g.checkerFunction,g.options.hashChangeInterval));return!0},g.Adapter.onDomLoad(g.hashChangeInit)),g.emulated.pushState&&(g.onHashChange=function(b){var d=b&&b.newURL||c.location.href,e=g.getHashByUrl(d),f=null,h=null,i=null;if(g.isLastHash(e)){g.busy(!1);return!1}g.doubleCheckComplete(),g.saveHash(e);if(e&&g.isTraditionalAnchor(e)){g.Adapter.trigger(a,"anchorchange"),g.busy(!1);return!1}f=g.extractState(g.getFullUrl(e||c.location.href,!1),!0);if(g.isLastSavedState(f)){g.busy(!1);return!1}h=g.getHashByState(f);var j=g.discardedState(f);if(j){g.getHashByIndex(-2)===g.getHashByState(j.forwardState)?g.back(!1):g.forward(!1);return!1}g.pushState(f.data,f.title,f.url,!1);return!0},g.Adapter.bind(a,"hashchange",g.onHashChange),g.pushState=function(b,d,e,f){if(g.getHashByUrl(e))throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(f!==!1&&g.busy()){g.pushQueue({scope:g,callback:g.pushState,args:arguments,queue:f});return!1}g.busy(!0);var h=g.createStateObject(b,d,e),i=g.getHashByState(h),j=g.getState(!1),k=g.getHashByState(j),l=g.getHash();g.storeState(h),g.expectedStateId=h.id,g.recycleState(h),g.setTitle(h);if(i===k){g.busy(!1);return!1}if(i!==l&&i!==g.getShortUrl(c.location.href)){g.setHash(i,!1);return!1}g.saveState(h),g.Adapter.trigger(a,"statechange"),g.busy(!1);return!0},g.replaceState=function(a,b,c,d){if(g.getHashByUrl(c))throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(d!==!1&&g.busy()){g.pushQueue({scope:g,callback:g.replaceState,args:arguments,queue:d});return!1}g.busy(!0);var e=g.createStateObject(a,b,c),f=g.getState(!1),h=g.getStateByIndex(-2);g.discardState(f,e,h),g.pushState(e.data,e.title,e.url,!1);return!0},g.getHash()&&!g.emulated.hashChange&&g.Adapter.onDomLoad(function(){g.Adapter.trigger(a,"hashchange")}))},g.init()})(window) +// manage history +// load pages via ajax +// setup the history adapter +// if settings no_history is set, no history will be bound +// this can be used to make it work with legacy + +$(document).bind('ready', function() { + if(wn.settings.no_history) return; + History.Adapter.bind(window,'statechange',function() { + var state = History.getState(); + + // load the state on the browser + wn.page.set(state.hash, state.title); + }); +}) + diff --git a/js/lib/jquery.min.js b/js/lib/jquery.min.js new file mode 100644 index 0000000000..8cdc80eb85 --- /dev/null +++ b/js/lib/jquery.min.js @@ -0,0 +1,18 @@ +/*! + * jQuery JavaScript Library v1.6.2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Jun 30 14:16:56 2011 -0400 + */ +(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. +shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j +)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/js/lib/json2.js b/js/lib/json2.js new file mode 100644 index 0000000000..b4c02d3f08 --- /dev/null +++ b/js/lib/json2.js @@ -0,0 +1,480 @@ +/* + http://www.JSON.org/json2.js + 2011-02-23 + + Public Domain. + + NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + + See http://www.JSON.org/js.html + + + This code should be minified before deployment. + See http://javascript.crockford.com/jsmin.html + + USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO + NOT CONTROL. + + + This file creates a global JSON object containing two methods: stringify + and parse. + + JSON.stringify(value, replacer, space) + value any JavaScript value, usually an object or array. + + replacer an optional parameter that determines how object + values are stringified for objects. It can be a + function or an array of strings. + + space an optional parameter that specifies the indentation + of nested structures. If it is omitted, the text will + be packed without extra whitespace. If it is a number, + it will specify the number of spaces to indent at each + level. If it is a string (such as '\t' or ' '), + it contains the characters used to indent at each level. + + This method produces a JSON text from a JavaScript value. + + When an object value is found, if the object contains a toJSON + method, its toJSON method will be called and the result will be + stringified. A toJSON method does not serialize: it returns the + value represented by the name/value pair that should be serialized, + or undefined if nothing should be serialized. The toJSON method + will be passed the key associated with the value, and this will be + bound to the value + + For example, this would serialize Dates as ISO strings. + + Date.prototype.toJSON = function (key) { + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + return this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z'; + }; + + You can provide an optional replacer method. It will be passed the + key and value of each member, with this bound to the containing + object. The value that is returned from your method will be + serialized. If your method returns undefined, then the member will + be excluded from the serialization. + + If the replacer parameter is an array of strings, then it will be + used to select the members to be serialized. It filters the results + such that only members with keys listed in the replacer array are + stringified. + + Values that do not have JSON representations, such as undefined or + functions, will not be serialized. Such values in objects will be + dropped; in arrays they will be replaced with null. You can use + a replacer function to replace those with JSON values. + JSON.stringify(undefined) returns undefined. + + The optional space parameter produces a stringification of the + value that is filled with line breaks and indentation to make it + easier to read. + + If the space parameter is a non-empty string, then that string will + be used for indentation. If the space parameter is a number, then + the indentation will be that many spaces. + + Example: + + text = JSON.stringify(['e', {pluribus: 'unum'}]); + // text is '["e",{"pluribus":"unum"}]' + + + text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); + // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' + + text = JSON.stringify([new Date()], function (key, value) { + return this[key] instanceof Date ? + 'Date(' + this[key] + ')' : value; + }); + // text is '["Date(---current time---)"]' + + + JSON.parse(text, reviver) + This method parses a JSON text to produce an object or array. + It can throw a SyntaxError exception. + + The optional reviver parameter is a function that can filter and + transform the results. It receives each of the keys and values, + and its return value is used instead of the original value. + If it returns what it received, then the structure is not modified. + If it returns undefined then the member is deleted. + + Example: + + // Parse the text. Values that look like ISO date strings will + // be converted to Date objects. + + myData = JSON.parse(text, function (key, value) { + var a; + if (typeof value === 'string') { + a = +/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); + if (a) { + return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], + +a[5], +a[6])); + } + } + return value; + }); + + myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { + var d; + if (typeof value === 'string' && + value.slice(0, 5) === 'Date(' && + value.slice(-1) === ')') { + d = new Date(value.slice(5, -1)); + if (d) { + return d; + } + } + return value; + }); + + + This is a reference implementation. You are free to copy, modify, or + redistribute. +*/ + +/*jslint evil: true, strict: false, regexp: false */ + +/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, + call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, + getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, + lastIndex, length, parse, prototype, push, replace, slice, stringify, + test, toJSON, toString, valueOf +*/ + + +// Create a JSON object only if one does not already exist. We create the +// methods in a closure to avoid creating global variables. + +var JSON; +if (!JSON) { + JSON = {}; +} + +(function () { + "use strict"; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + if (typeof Date.prototype.toJSON !== 'function') { + + Date.prototype.toJSON = function (key) { + + return isFinite(this.valueOf()) ? + this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z' : null; + }; + + String.prototype.toJSON = + Number.prototype.toJSON = + Boolean.prototype.toJSON = function (key) { + return this.valueOf(); + }; + } + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value && typeof value === 'object' && + typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 ? '[]' : gap ? + '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + if (typeof rep[i] === 'string') { + k = rep[i]; + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 ? '{}' : gap ? + '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : + '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + if (typeof JSON.stringify !== 'function') { + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + } + + +// If the JSON object does not yet have a parse method, give it one. + + if (typeof JSON.parse !== 'function') { + JSON.parse = function (text, reviver) { + +// The parse method takes a text and an optional reviver function, and returns +// a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + +// The walk method is used to recursively walk the resulting structure so +// that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + +// Parsing happens in four stages. In the first stage, we replace certain +// Unicode characters with escape sequences. JavaScript handles many characters +// incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + +// In the second stage, we run the text against regular expressions that look +// for non-JSON patterns. We are especially concerned with '()' and 'new' +// because they can cause invocation, and '=' because it can cause mutation. +// But just to be safe, we want to reject all unexpected forms. + +// We split the second stage into 4 regexp operations in order to work around +// crippling inefficiencies in IE's and Safari's regexp engines. First we +// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we +// replace all simple value tokens with ']' characters. Third, we delete all +// open brackets that follow a colon or comma or that begin the text. Finally, +// we look to see that the remaining characters are only whitespace or ']' or +// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + +// In the third stage we use the eval function to compile the text into a +// JavaScript structure. The '{' operator is subject to a syntactic ambiguity +// in JavaScript: it can begin a block or an object literal. We wrap the text +// in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + +// In the optional fourth stage, we recursively walk the new structure, passing +// each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : j; + } + +// If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + } +}()); diff --git a/js/lib/superfish/css/superfish-vertical.css b/js/lib/superfish/css/superfish-vertical.css new file mode 100644 index 0000000000..8025b7859f --- /dev/null +++ b/js/lib/superfish/css/superfish-vertical.css @@ -0,0 +1,23 @@ +/*** adding sf-vertical in addition to sf-menu creates a vertical menu ***/ +.sf-vertical, .sf-vertical li { + width: 10em; +} +/* this lacks ul at the start of the selector, so the styles from the main CSS file override it where needed */ +.sf-vertical li:hover ul, +.sf-vertical li.sfHover ul { + left: 10em; /* match ul width */ + top: 0; +} + +/*** alter arrow directions ***/ +.sf-vertical .sf-sub-indicator { background-position: -10px 0; } /* IE6 gets solid image only */ +.sf-vertical a > .sf-sub-indicator { background-position: 0 0; } /* use translucent arrow for modern browsers*/ + +/* hover arrow direction for modern browsers*/ +.sf-vertical a:focus > .sf-sub-indicator, +.sf-vertical a:hover > .sf-sub-indicator, +.sf-vertical a:active > .sf-sub-indicator, +.sf-vertical li:hover > a > .sf-sub-indicator, +.sf-vertical li.sfHover > a > .sf-sub-indicator { + background-position: -10px 0; /* arrow hovers for modern browsers*/ +} \ No newline at end of file diff --git a/js/lib/superfish/css/superfish.css b/js/lib/superfish/css/superfish.css new file mode 100644 index 0000000000..aa384b8b33 --- /dev/null +++ b/js/lib/superfish/css/superfish.css @@ -0,0 +1,136 @@ + +/*** ESSENTIAL STYLES ***/ +.sf-menu, .sf-menu * { + margin: 0; + padding: 0; + list-style: none; +} +.sf-menu { + line-height: 1.0; +} +.sf-menu ul { + position: absolute; + top: -999em; + width: 10em; /* left offset of submenus need to match (see below) */ +} +.sf-menu ul li { + width: 100%; +} +.sf-menu li:hover { + visibility: inherit; /* fixes IE7 'sticky bug' */ +} +.sf-menu li { + float: left; + position: relative; +} +.sf-menu a { + display: block; + position: relative; +} +.sf-menu li:hover ul, +.sf-menu li.sfHover ul { + left: 0; + top: 2.5em; /* match top ul list item height */ + z-index: 99; +} +ul.sf-menu li:hover li ul, +ul.sf-menu li.sfHover li ul { + top: -999em; +} +ul.sf-menu li li:hover ul, +ul.sf-menu li li.sfHover ul { + left: 10em; /* match ul width */ + top: 0; +} +ul.sf-menu li li:hover li ul, +ul.sf-menu li li.sfHover li ul { + top: -999em; +} +ul.sf-menu li li li:hover ul, +ul.sf-menu li li li.sfHover ul { + left: 10em; /* match ul width */ + top: 0; +} + +/*** DEMO SKIN ***/ +.sf-menu { + float: left; + margin-bottom: 1em; +} +.sf-menu a { + border-left: 1px solid #fff; + border-top: 1px solid #CFDEFF; + padding: .75em 1em; + text-decoration:none; +} +.sf-menu a, .sf-menu a:visited { /* visited pseudo selector so IE6 applies text colour*/ + color: #13a; +} +.sf-menu li { + background: #BDD2FF; +} +.sf-menu li li { + background: #AABDE6; +} +.sf-menu li li li { + background: #9AAEDB; +} +.sf-menu li:hover, .sf-menu li.sfHover, +.sf-menu a:focus, .sf-menu a:hover, .sf-menu a:active { + background: #CFDEFF; + outline: 0; +} + +/*** arrows **/ +.sf-menu a.sf-with-ul { + padding-right: 2.25em; + min-width: 1px; /* trigger IE7 hasLayout so spans position accurately */ +} +.sf-sub-indicator { + position: absolute; + display: block; + right: .75em; + top: 1.05em; /* IE6 only */ + width: 10px; + height: 10px; + text-indent: -999em; + overflow: hidden; + background: url('assets/js/lib/superfish/images/arrows-ffffff.png') no-repeat -10px -100px; /* 8-bit indexed alpha png. IE6 gets solid image only */ +} +a > .sf-sub-indicator { /* give all except IE6 the correct values */ + top: .8em; + background-position: 0 -100px; /* use translucent arrow for modern browsers*/ +} +/* apply hovers to modern browsers */ +a:focus > .sf-sub-indicator, +a:hover > .sf-sub-indicator, +a:active > .sf-sub-indicator, +li:hover > a > .sf-sub-indicator, +li.sfHover > a > .sf-sub-indicator { + background-position: -10px -100px; /* arrow hovers for modern browsers*/ +} + +/* point right for anchors in subs */ +.sf-menu ul .sf-sub-indicator { background-position: -10px 0; } +.sf-menu ul a > .sf-sub-indicator { background-position: 0 0; } +/* apply hovers to modern browsers */ +.sf-menu ul a:focus > .sf-sub-indicator, +.sf-menu ul a:hover > .sf-sub-indicator, +.sf-menu ul a:active > .sf-sub-indicator, +.sf-menu ul li:hover > a > .sf-sub-indicator, +.sf-menu ul li.sfHover > a > .sf-sub-indicator { + background-position: -10px 0; /* arrow hovers for modern browsers*/ +} + +/*** shadows for all but IE6 ***/ +.sf-shadow ul { + background: url('assets/js/lib/superfish/images/shadow.png') no-repeat bottom right; + padding: 0 8px 9px 0; + -moz-border-radius-bottomleft: 17px; + -moz-border-radius-topright: 17px; + -webkit-border-top-right-radius: 17px; + -webkit-border-bottom-left-radius: 17px; +} +.sf-shadow ul.sf-shadow-off { + background: transparent; +} diff --git a/js/lib/superfish/hoverIntent.js b/js/lib/superfish/hoverIntent.js new file mode 100644 index 0000000000..91da57b244 --- /dev/null +++ b/js/lib/superfish/hoverIntent.js @@ -0,0 +1,84 @@ +(function($){ + /* hoverIntent by Brian Cherne */ + $.fn.hoverIntent = function(f,g) { + // default configuration options + var cfg = { + sensitivity: 7, + interval: 100, + timeout: 0 + }; + // override configuration options with user supplied object + cfg = $.extend(cfg, g ? { over: f, out: g } : f ); + + // instantiate variables + // cX, cY = current X and Y position of mouse, updated by mousemove event + // pX, pY = previous X and Y position of mouse, set by mouseover and polling interval + var cX, cY, pX, pY; + + // A private function for getting mouse position + var track = function(ev) { + cX = ev.pageX; + cY = ev.pageY; + }; + + // A private function for comparing current and previous mouse position + var compare = function(ev,ob) { + ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); + // compare mouse positions to see if they've crossed the threshold + if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) { + $(ob).unbind("mousemove",track); + // set hoverIntent state to true (so mouseOut can be called) + ob.hoverIntent_s = 1; + return cfg.over.apply(ob,[ev]); + } else { + // set previous coordinates for next time + pX = cX; pY = cY; + // use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs) + ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval ); + } + }; + + // A private function for delaying the mouseOut function + var delay = function(ev,ob) { + ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); + ob.hoverIntent_s = 0; + return cfg.out.apply(ob,[ev]); + }; + + // A private function for handling mouse 'hovering' + var handleHover = function(e) { + // next three lines copied from jQuery.hover, ignore children onMouseOver/onMouseOut + var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget; + while ( p && p != this ) { try { p = p.parentNode; } catch(e) { p = this; } } + if ( p == this ) { return false; } + + // copy objects to be passed into t (required for event object to be passed in IE) + var ev = jQuery.extend({},e); + var ob = this; + + // cancel hoverIntent timer if it exists + if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); } + + // else e.type == "onmouseover" + if (e.type == "mouseover") { + // set "previous" X and Y position based on initial entry point + pX = ev.pageX; pY = ev.pageY; + // update "current" X and Y position based on mousemove + $(ob).bind("mousemove",track); + // start polling interval (self-calling timeout) to compare mouse coordinates over time + if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );} + + // else e.type == "onmouseout" + } else { + // unbind expensive mousemove event + $(ob).unbind("mousemove",track); + // if hoverIntent state is true, then call the mouseOut function after the specified delay + if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );} + } + }; + + // bind the function to the two event listeners + return this.mouseover(handleHover).mouseout(handleHover); + }; + +})(jQuery); \ No newline at end of file diff --git a/js/lib/superfish/images/arrows-ffffff.png b/js/lib/superfish/images/arrows-ffffff.png new file mode 100644 index 0000000000000000000000000000000000000000..995df52065bc250180081f895070ee63de05bfe7 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^B0!wS#0(^(;%-|4Ddu7)&kzm{j@u9Y9{{*+s`nvx*DV21Ml+qsS;fz%XuL>4nJa0`JjX}uDbwD2HC(*ycgt4t?ty+@+wPUlR;uUiAH4mbx%Td3O?Q*$ zf&zQmF8}g8dC^~1Y@56N`Id%svugXbOJqMzNq%PY>BN*-n!)@W7LRXkPCY$Kvh?pylS=lQEeJmx&}%I_=-`FKFUe^aWI+!LPc+s5;Ys_!vxdGhVg=U0pN)oi@O zH(|f%$AZ)c_dD2+Fh64a*igX$#11wJasvDy3=tjxDF+*z&Y+=G2RoXV5q8l~>f;U; zSXkqU26{?8VjPWfP)eX#Y8W|De&GL-eKmQ98S63@?fZFZo^AD{N4pM&9@*aVN_Vbp z^|qYI$u>urZReRrZ&O^TJg>~`(x&v&vs8m8`Pvvv*_d*2mhSJFey=A#Uy1q3A9|9{K22WQ% Jmvv4FO#s~6iZ1{F literal 0 HcmV?d00001 diff --git a/js/lib/superfish/make_superfish.js b/js/lib/superfish/make_superfish.js new file mode 100644 index 0000000000..c3955b4c25 --- /dev/null +++ b/js/lib/superfish/make_superfish.js @@ -0,0 +1,34 @@ +// convert to superfish menu + +provide('wn.menus.superfish'); +wn.menus.superfish = function(parent, data) { + var _make_list = function(myparent, lst) { + var ul = wn.dom.add(myparent, 'ul'); + $.each(lst, function(i,v) { + var li = wn.dom.add(ul, 'li') + var a = wn.dom.add(li, 'a', '', '', v.label); + a.action = v.action + + // action + if(v.action) { + a.onclick = function() { window[action](); }; + } + + // link + if(v.href) { + a.href = v.href; + } + + // sub menu + if(v.subitems) { + _make_list(li, v.subitems); + } + }) + return ul; + } + ul = _make_list(parent, data); + ul.className = 'sf-menu'; + + // build it + $(ul).superfish(); +} \ No newline at end of file diff --git a/js/lib/superfish/superfish.js b/js/lib/superfish/superfish.js new file mode 100644 index 0000000000..c6a9c7de04 --- /dev/null +++ b/js/lib/superfish/superfish.js @@ -0,0 +1,121 @@ + +/* + * Superfish v1.4.8 - jQuery menu widget + * Copyright (c) 2008 Joel Birch + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt + */ + +;(function($){ + $.fn.superfish = function(op){ + + var sf = $.fn.superfish, + c = sf.c, + $arrow = $([' »'].join('')), + over = function(){ + var $$ = $(this), menu = getMenu($$); + clearTimeout(menu.sfTimer); + $$.showSuperfishUl().siblings().hideSuperfishUl(); + }, + out = function(){ + var $$ = $(this), menu = getMenu($$), o = sf.op; + clearTimeout(menu.sfTimer); + menu.sfTimer=setTimeout(function(){ + o.retainPath=($.inArray($$[0],o.$path)>-1); + $$.hideSuperfishUl(); + if (o.$path.length && $$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);} + },o.delay); + }, + getMenu = function($menu){ + var menu = $menu.parents(['ul.',c.menuClass,':first'].join(''))[0]; + sf.op = sf.o[menu.serial]; + return menu; + }, + addArrow = function($a){ $a.addClass(c.anchorClass).append($arrow.clone()); }; + + return this.each(function() { + var s = this.serial = sf.o.length; + var o = $.extend({},sf.defaults,op); + o.$path = $('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){ + $(this).addClass([o.hoverClass,c.bcClass].join(' ')) + .filter('li:has(ul)').removeClass(o.pathClass); + }); + sf.o[s] = sf.op = o; + + $('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](over,out).each(function() { + if (o.autoArrows) addArrow( $('>a:first-child',this) ); + }) + .not('.'+c.bcClass) + .hideSuperfishUl(); + + var $a = $('a',this); + $a.each(function(i){ + var $li = $a.eq(i).parents('li'); + $a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);}); + }); + o.onInit.call(this); + + }).each(function() { + var menuClasses = [c.menuClass]; + if (sf.op.dropShadows && !($.browser.msie && $.browser.version < 7)) menuClasses.push(c.shadowClass); + $(this).addClass(menuClasses.join(' ')); + }); + }; + + var sf = $.fn.superfish; + sf.o = []; + sf.op = {}; + sf.IE7fix = function(){ + var o = sf.op; + if ($.browser.msie && $.browser.version > 6 && o.dropShadows && o.animation.opacity!=undefined) + this.toggleClass(sf.c.shadowClass+'-off'); + }; + sf.c = { + bcClass : 'sf-breadcrumb', + menuClass : 'sf-js-enabled', + anchorClass : 'sf-with-ul', + arrowClass : 'sf-sub-indicator', + shadowClass : 'sf-shadow' + }; + sf.defaults = { + hoverClass : 'sfHover', + pathClass : 'overideThisToUse', + pathLevels : 1, + delay : 800, + animation : {opacity:'show'}, + speed : 'normal', + autoArrows : true, + dropShadows : true, + disableHI : false, // true disables hoverIntent detection + onInit : function(){}, // callback functions + onBeforeShow: function(){}, + onShow : function(){}, + onHide : function(){} + }; + $.fn.extend({ + hideSuperfishUl : function(){ + var o = sf.op, + not = (o.retainPath===true) ? o.$path : ''; + o.retainPath = false; + var $ul = $(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass) + .find('>ul').hide().css('visibility','hidden'); + o.onHide.call($ul); + return this; + }, + showSuperfishUl : function(){ + var o = sf.op, + sh = sf.c.shadowClass+'-off', + $ul = this.addClass(o.hoverClass) + .find('>ul:hidden').css('visibility','visible'); + sf.IE7fix.call($ul); + o.onBeforeShow.call($ul); + $ul.animate(o.animation,o.speed,function(){ sf.IE7fix.call($ul); o.onShow.call($ul); }); + return this; + } + }); + +})(jQuery); diff --git a/js/lib/superfish/superfish.min.js b/js/lib/superfish/superfish.min.js new file mode 100644 index 0000000000..9e2e6228f4 --- /dev/null +++ b/js/lib/superfish/superfish.min.js @@ -0,0 +1,171 @@ + +(function($){$.fn.hoverIntent=function(f,g){var cfg={sensitivity:7,interval:100,timeout:0};cfg=$.extend(cfg,g?{over:f,out:g}:f);var cX,cY,pX,pY;var track=function(ev){cX=ev.pageX;cY=ev.pageY;};var compare=function(ev,ob){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);if((Math.abs(pX-cX)+Math.abs(pY-cY)) »'].join('')),over=function(){var $$=$(this),menu=getMenu($$);clearTimeout(menu.sfTimer);$$.showSuperfishUl().siblings().hideSuperfishUl();},out=function(){var $$=$(this),menu=getMenu($$),o=sf.op;clearTimeout(menu.sfTimer);menu.sfTimer=setTimeout(function(){o.retainPath=($.inArray($$[0],o.$path)>-1);$$.hideSuperfishUl();if(o.$path.length&&$$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);}},o.delay);},getMenu=function($menu){var menu=$menu.parents(['ul.',c.menuClass,':first'].join(''))[0];sf.op=sf.o[menu.serial];return menu;},addArrow=function($a){$a.addClass(c.anchorClass).append($arrow.clone());};return this.each(function(){var s=this.serial=sf.o.length;var o=$.extend({},sf.defaults,op);o.$path=$('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){$(this).addClass([o.hoverClass,c.bcClass].join(' ')).filter('li:has(ul)').removeClass(o.pathClass);});sf.o[s]=sf.op=o;$('li:has(ul)',this)[($.fn.hoverIntent&&!o.disableHI)?'hoverIntent':'hover'](over,out).each(function(){if(o.autoArrows)addArrow($('>a:first-child',this));}).not('.'+c.bcClass).hideSuperfishUl();var $a=$('a',this);$a.each(function(i){var $li=$a.eq(i).parents('li');$a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);});});o.onInit.call(this);}).each(function(){var menuClasses=[c.menuClass];if(sf.op.dropShadows&&!($.browser.msie&&$.browser.version<7))menuClasses.push(c.shadowClass);$(this).addClass(menuClasses.join(' '));});};var sf=$.fn.superfish;sf.o=[];sf.op={};sf.IE7fix=function(){var o=sf.op;if($.browser.msie&&$.browser.version>6&&o.dropShadows&&o.animation.opacity!=undefined) +this.toggleClass(sf.c.shadowClass+'-off');};sf.c={bcClass:'sf-breadcrumb',menuClass:'sf-js-enabled',anchorClass:'sf-with-ul',arrowClass:'sf-sub-indicator',shadowClass:'sf-shadow'};sf.defaults={hoverClass:'sfHover',pathClass:'overideThisToUse',pathLevels:1,delay:800,animation:{opacity:'show'},speed:'normal',autoArrows:true,dropShadows:true,disableHI:false,onInit:function(){},onBeforeShow:function(){},onShow:function(){},onHide:function(){}};$.fn.extend({hideSuperfishUl:function(){var o=sf.op,not=(o.retainPath===true)?o.$path:'';o.retainPath=false;var $ul=$(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass).find('>ul').hide().css('visibility','hidden');o.onHide.call($ul);return this;},showSuperfishUl:function(){var o=sf.op,sh=sf.c.shadowClass+'-off',$ul=this.addClass(o.hoverClass).find('>ul:hidden').css('visibility','visible');sf.IE7fix.call($ul);o.onBeforeShow.call($ul);$ul.animate(o.animation,o.speed,function(){sf.IE7fix.call($ul);o.onShow.call($ul);});return this;}});})(jQuery);provide('wn.menus.superfish');wn.menus.superfish=function(parent,data){var _make_list=function(myparent,lst){var ul=wn.dom.add(myparent,'ul');$.each(lst,function(i,v){var li=wn.dom.add(ul,'li') +var a=wn.dom.add(li,'a','','',v.label);a.action=v.action +if(v.action){a.onclick=function(){window[action]();};} +if(v.href){a.href=v.href;} +if(v.subitems){_make_list(li,v.subitems);}}) +return ul;} +ul=_make_list(parent,data);ul.className='sf-menu';$(ul).superfish();} +wn.assets.handler.css('\ +/*** ESSENTIAL STYLES ***/\ +.sf-menu, .sf-menu * {\ + margin: 0;\ + padding: 0;\ + list-style: none;\ +}\ +.sf-menu {\ + line-height: 1.0;\ +}\ +.sf-menu ul {\ + position: absolute;\ + top: -999em;\ + width: 10em; /* left offset of submenus need to match (see below) */\ +}\ +.sf-menu ul li {\ + width: 100%;\ +}\ +.sf-menu li:hover {\ + visibility: inherit; /* fixes IE7 \'sticky bug\' */\ +}\ +.sf-menu li {\ + float: left;\ + position: relative;\ +}\ +.sf-menu a {\ + display: block;\ + position: relative;\ +}\ +.sf-menu li:hover ul,\ +.sf-menu li.sfHover ul {\ + left: 0;\ + top: 2.5em; /* match top ul list item height */\ + z-index: 99;\ +}\ +ul.sf-menu li:hover li ul,\ +ul.sf-menu li.sfHover li ul {\ + top: -999em;\ +}\ +ul.sf-menu li li:hover ul,\ +ul.sf-menu li li.sfHover ul {\ + left: 10em; /* match ul width */\ + top: 0;\ +}\ +ul.sf-menu li li:hover li ul,\ +ul.sf-menu li li.sfHover li ul {\ + top: -999em;\ +}\ +ul.sf-menu li li li:hover ul,\ +ul.sf-menu li li li.sfHover ul {\ + left: 10em; /* match ul width */\ + top: 0;\ +}\ +\ +/*** DEMO SKIN ***/\ +.sf-menu {\ + float: left;\ + margin-bottom: 1em;\ +}\ +.sf-menu a {\ + border-left: 1px solid #fff;\ + border-top: 1px solid #CFDEFF;\ + padding: .75em 1em;\ + text-decoration:none;\ +}\ +.sf-menu a, .sf-menu a:visited { /* visited pseudo selector so IE6 applies text colour*/\ + color: #13a;\ +}\ +.sf-menu li {\ + background: #BDD2FF;\ +}\ +.sf-menu li li {\ + background: #AABDE6;\ +}\ +.sf-menu li li li {\ + background: #9AAEDB;\ +}\ +.sf-menu li:hover, .sf-menu li.sfHover,\ +.sf-menu a:focus, .sf-menu a:hover, .sf-menu a:active {\ + background: #CFDEFF;\ + outline: 0;\ +}\ +\ +/*** arrows **/\ +.sf-menu a.sf-with-ul {\ + padding-right: 2.25em;\ + min-width: 1px; /* trigger IE7 hasLayout so spans position accurately */\ +}\ +.sf-sub-indicator {\ + position: absolute;\ + display: block;\ + right: .75em;\ + top: 1.05em; /* IE6 only */\ + width: 10px;\ + height: 10px;\ + text-indent: -999em;\ + overflow: hidden;\ + background: url(\'assets/js/lib/superfish/images/arrows-ffffff.png\') no-repeat -10px -100px; /* 8-bit indexed alpha png. IE6 gets solid image only */\ +}\ +a > .sf-sub-indicator { /* give all except IE6 the correct values */\ + top: .8em;\ + background-position: 0 -100px; /* use translucent arrow for modern browsers*/\ +}\ +/* apply hovers to modern browsers */\ +a:focus > .sf-sub-indicator,\ +a:hover > .sf-sub-indicator,\ +a:active > .sf-sub-indicator,\ +li:hover > a > .sf-sub-indicator,\ +li.sfHover > a > .sf-sub-indicator {\ + background-position: -10px -100px; /* arrow hovers for modern browsers*/\ +}\ +\ +/* point right for anchors in subs */\ +.sf-menu ul .sf-sub-indicator { background-position: -10px 0; }\ +.sf-menu ul a > .sf-sub-indicator { background-position: 0 0; }\ +/* apply hovers to modern browsers */\ +.sf-menu ul a:focus > .sf-sub-indicator,\ +.sf-menu ul a:hover > .sf-sub-indicator,\ +.sf-menu ul a:active > .sf-sub-indicator,\ +.sf-menu ul li:hover > a > .sf-sub-indicator,\ +.sf-menu ul li.sfHover > a > .sf-sub-indicator {\ + background-position: -10px 0; /* arrow hovers for modern browsers*/\ +}\ +\ +/*** shadows for all but IE6 ***/\ +.sf-shadow ul {\ + background: url(\'assets/js/lib/superfish/images/shadow.png\') no-repeat bottom right;\ + padding: 0 8px 9px 0;\ + -moz-border-radius-bottomleft: 17px;\ + -moz-border-radius-topright: 17px;\ + -webkit-border-top-right-radius: 17px;\ + -webkit-border-bottom-left-radius: 17px;\ +}\ +.sf-shadow ul.sf-shadow-off {\ + background: transparent;\ +}\ +');wn.assets.handler.css('/*** adding sf-vertical in addition to sf-menu creates a vertical menu ***/\ +.sf-vertical, .sf-vertical li {\ + width: 10em;\ +}\ +/* this lacks ul at the start of the selector, so the styles from the main CSS file override it where needed */\ +.sf-vertical li:hover ul,\ +.sf-vertical li.sfHover ul {\ + left: 10em; /* match ul width */\ + top: 0;\ +}\ +\ +/*** alter arrow directions ***/\ +.sf-vertical .sf-sub-indicator { background-position: -10px 0; } /* IE6 gets solid image only */\ +.sf-vertical a > .sf-sub-indicator { background-position: 0 0; } /* use translucent arrow for modern browsers*/\ +\ +/* hover arrow direction for modern browsers*/\ +.sf-vertical a:focus > .sf-sub-indicator,\ +.sf-vertical a:hover > .sf-sub-indicator,\ +.sf-vertical a:active > .sf-sub-indicator,\ +.sf-vertical li:hover > a > .sf-sub-indicator,\ +.sf-vertical li.sfHover > a > .sf-sub-indicator {\ + background-position: -10px 0; /* arrow hovers for modern browsers*/\ +}'); \ No newline at end of file diff --git a/js/wn/assets.js b/js/wn/assets.js new file mode 100644 index 0000000000..881deb9072 --- /dev/null +++ b/js/wn/assets.js @@ -0,0 +1,94 @@ +// library to mange assets (js, css, models, html) etc in the app. +// will try and get from localStorge if latest are available +// or will load them via xmlhttp +// depends on asset_timestamps_ loaded via boot + +wn.assets = { + // keep track of executed assets + executed_ : {}, + + // check if the asset exists in + // localstorage and if the timestamp + // matches with the loaded timestamp + exists: function(src) { + if('localStorage' in window + && localStorage.getItem(src) + && localStorage.getItem('[ts] '+src) == asset_timestamps_[src]) + return true + }, + + // add the asset to + // localstorage + add: function(src, txt) { + if('localStorage' in window) { + localStorage.setItem(src, txt); + localStorage.setItem('[ts] ' + src, asset_timestamps_[src]); + } + }, + + get: function(src) { + return localStorage.getItem(src); + }, + + extn: function(src) { + return src.split('.').slice(-1)[0]; + }, + + html_src: function(src) { + if(src.indexOf('/')!=-1) { + var t = src.split('/').slice(0,-1); + t.push('src'); + t = t.join('/') +'/' + a.split('/').slice(-1)[0]; + } else { + var t = 'src/' + src; + } + return t; + }, + + // load an asset via + // xmlhttp + load: function(src) { + var t = wn.assets.extn(src)=='html' ? wn.assets.html_src(src) : src; + + wn.xmlhttp.get(t, function(txt) { + // add it to localstorage + wn.assets.add(src, txt); + }, false) + }, + + // pass on to the handler to set + execute: function(src) { + if(!wn.assets.exists(src)) { + wn.assets.load(src); + } + var type = wn.assets.extn(src); + if(wn.assets.handler[type]) { + wn.assets.handler[type](wn.assets.get(src), src); + wn.assets.executed_[src] = 1; + } + }, + + // handle types of assets + // and launch them in the + // app + handler: { + js: function(txt, src) { + wn.dom.eval(txt); + }, + css: function(txt, src) { + var se = document.createElement('style'); + se.type = "text/css"; + if (se.styleSheet) { + se.styleSheet.cssText = txt; + } else { + se.appendChild(document.createTextNode(txt)); + } + document.getElementsByTagName('head')[0].appendChild(se); + }, + html: function(txt, src) { + // make the html content page + var page = wn.dom.add($('.outer .inner').get(0), 'div', 'content', null, txt); + page.setAttribute("_src", src); + } + } +} diff --git a/js/wn/dom.js b/js/wn/dom.js new file mode 100644 index 0000000000..426cc04968 --- /dev/null +++ b/js/wn/dom.js @@ -0,0 +1,49 @@ +// add a new dom element +wn.provide('wn.dom'); + +wn.dom.by_id = function(id) { + return document.getElementById(id); +} + +wn.dom.eval = function(txt) { + var el = document.createElement('script'); + el.appendChild(document.createTextNode(txt)); + // execute the script globally + document.getElementsByTagName('head')[0].appendChild(el); +} + +wn.dom.add = function(parent, newtag, className, cs, innerHTML, onclick) { + if(parent && parent.substr)parent = wn.dom.by_id(parent); + var c = document.createElement(newtag); + if(parent) + parent.appendChild(c); + + // if image, 3rd parameter is source + if(className) { + if(newtag.toLowerCase()=='img') + c.src = className + else + c.className = className; + } + if(cs) wn.dom.css(c,cs); + if(innerHTML) c.innerHTML = innerHTML; + if(onclick) c.onclick = onclick; + return c; +} + +// add css to element +wn.dom.css= function(ele, s) { + if(ele && s) { + for(var i in s) ele.style[i]=s[i]; + }; + return ele; +} + +wn.dom.hide = function(ele) { + ele.style.display = 'none'; +} + +wn.dom.show = function(ele, value) { + if(!value) value = 'block'; + ele.style.display = value; +} diff --git a/js/wn/history.js b/js/wn/history.js new file mode 100644 index 0000000000..15574e7f46 --- /dev/null +++ b/js/wn/history.js @@ -0,0 +1,15 @@ +// manage history +// load pages via ajax +// setup the history adapter +// if settings no_history is set, no history will be bound +// this can be used to make it work with legacy + +$(document).bind('ready', function() { + if(wn.settings.no_history) return; + History.Adapter.bind(window,'statechange',function() { + var state = History.getState(); + + // load the state on the browser + wn.page.set(state.hash, state.title); + }); +}) diff --git a/js/wn/page.js b/js/wn/page.js new file mode 100644 index 0000000000..e9f7d55058 --- /dev/null +++ b/js/wn/page.js @@ -0,0 +1,28 @@ +wn.page = { + set: function(src) { + var new_selection = $('.inner div.content[_src="'+ src +'"]'); + if(!new_selection.length) { + // get from server / localstorage + wn.assets.execute(src); + new_selection = $('.inner div.content[_src="'+ src +'"]'); + } + + // hide current + $('.inner .current_page').removeClass('current_page'); + + // show new + new_selection.addClass('current_page'); + + // get title (the first h1, h2, h3) + var title = $('nav ul li a[href*="' + src + '"]').attr('title') || 'No Title' + + // replace state (to url) + state = History.getState(); + if(state.hash!=src) { + History.replaceState(null, title, src); + } + else { + document.title = title; + } + } +} \ No newline at end of file diff --git a/js/wn/provide.js b/js/wn/provide.js new file mode 100644 index 0000000000..99f03c020d --- /dev/null +++ b/js/wn/provide.js @@ -0,0 +1,17 @@ +// provide a namespace +wn = {} +wn.provide = function(namespace) { + var nsl = namespace.split('.'); + var l = nsl.length; + var parent = window; + for(var i=0; i %s' % outfile + print 'Original: %.2f kB' % (org_size / 1024.0) + print 'Compressed: %.2f kB' % (new_size / 1024.0) + print 'Reduction: %.1f%%' % (float(org_size - new_size) / org_size * 100) + + def make(self, path): + """ + Build (stitch + compress) the file defined in build.json + """ + import os, sys, json + from build import no_minify + + # open the build.json file and read + # the dict + bfile = open(os.path.join(path, 'build.json'), 'r') + bdata = json.loads(bfile.read()) + bfile.close() + + for outfile in bdata: + prefix, fname = False, outfile + + # check if there is a prefix + if ':' in outfile: + prefix, fname = outfile.split(':') + + # build the file list relative to the main folder + fl = [os.path.relpath(os.path.join(path, f), os.curdir) for f in bdata[outfile]] + + self.timestamps.bundled += fl + + if self.changed(fl): + # js files are minified by default unless explicitly + # mentioned in the prefix. + # some files may not work if minified (known jsmin bug) + + if fname.split('.')[-1]=='js' and prefix!='concat' and not no_minify: + self.minify(fl, os.path.relpath(os.path.join(path, fname), os.curdir)) + else: + self.concat(fl, os.path.relpath(os.path.join(path, fname), os.curdir)) + + def bundle(self, timestamps): + """ + Build js files from "build.json" + """ + import os + self.timestamps = timestamps + + # walk the parent folder and build all files as defined in the build.json files + for wt in os.walk('.', followlinks=True): + if 'build.json' in wt[2]: + # found build file + self.make(os.path.abspath(wt[0])) + diff --git a/py/build/markdown2_extn.py b/py/build/markdown2_extn.py new file mode 100644 index 0000000000..79d906ef87 --- /dev/null +++ b/py/build/markdown2_extn.py @@ -0,0 +1,34 @@ +""" + Jinja2 markdown2 extension + by Silas Swell + http://www.silassewell.com/blog/2010/05/10/jinja2-markdown-extension/ +""" + +import jinja2 +import jinja2.ext +import markdown2 + +class Markdown2Extension(jinja2.ext.Extension): + tags = set(['markdown2']) + + def __init__(self, environment): + super(Markdown2Extension, self).__init__(environment) + environment.extend( + markdowner=markdown2.Markdown() + ) + + def parse(self, parser): + lineno = parser.stream.next().lineno + body = parser.parse_statements( + ['name:endmarkdown2'], + drop_needle=True + ) + return jinja2.nodes.CallBlock( + self.call_method('_markdown_support'), + [], + [], + body + ).set_lineno(lineno) + + def _markdown_support(self, caller): + return self.environment.markdowner.convert(caller()).strip() \ No newline at end of file diff --git a/py/build/minify.py b/py/build/minify.py new file mode 100644 index 0000000000..3926a6c57a --- /dev/null +++ b/py/build/minify.py @@ -0,0 +1,215 @@ + + +import os, os.path, shutil + +# This code is original from jsmin by Douglas Crockford, it was translated to +# Python by Baruch Even. The original code had the following copyright and +# license. +# +# /* jsmin.c +# 2007-05-22 +# +# Copyright (c) 2002 Douglas Crockford (www.crockford.com) +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# The Software shall be used for Good, not Evil. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# */ + +from StringIO import StringIO + +def jsmin(js): + ins = StringIO(js) + outs = StringIO() + JavascriptMinify().minify(ins, outs) + str = outs.getvalue() + if len(str) > 0 and str[0] == '\n': + str = str[1:] + return str + +def isAlphanum(c): + """return true if the character is a letter, digit, underscore, + dollar sign, or non-ASCII character. + """ + return ((c >= 'a' and c <= 'z') or (c >= '0' and c <= '9') or + (c >= 'A' and c <= 'Z') or c == '_' or c == '$' or c == '\\' or (c is not None and ord(c) > 126)); + +class UnterminatedComment(Exception): + pass + +class UnterminatedStringLiteral(Exception): + pass + +class UnterminatedRegularExpression(Exception): + pass + +class JavascriptMinify(object): + + def _outA(self): + self.outstream.write(self.theA) + def _outB(self): + self.outstream.write(self.theB) + + def _get(self): + """return the next character from stdin. Watch out for lookahead. If + the character is a control character, translate it to a space or + linefeed. + """ + c = self.theLookahead + self.theLookahead = None + if c == None: + c = self.instream.read(1) + if c >= ' ' or c == '\n': + return c + if c == '': # EOF + return '\000' + if c == '\r': + return '\n' + return ' ' + + def _peek(self): + self.theLookahead = self._get() + return self.theLookahead + + def _next(self): + """get the next character, excluding comments. peek() is used to see + if an unescaped '/' is followed by a '/' or '*'. + """ + c = self._get() + if c == '/' and self.theA != '\\': + p = self._peek() + if p == '/': + c = self._get() + while c > '\n': + c = self._get() + return c + if p == '*': + c = self._get() + while 1: + c = self._get() + if c == '*': + if self._peek() == '/': + self._get() + return ' ' + if c == '\000': + raise UnterminatedComment() + + return c + + def _action(self, action): + """do something! What you do is determined by the argument: + 1 Output A. Copy B to A. Get the next B. + 2 Copy B to A. Get the next B. (Delete A). + 3 Get the next B. (Delete B). + action treats a string as a single character. Wow! + action recognizes a regular expression if it is preceded by ( or , or =. + """ + if action <= 1: + self._outA() + + if action <= 2: + self.theA = self.theB + if self.theA == "'" or self.theA == '"': + while 1: + self._outA() + self.theA = self._get() + if self.theA == self.theB: + break + if self.theA <= '\n': + raise UnterminatedStringLiteral() + if self.theA == '\\': + self._outA() + self.theA = self._get() + + + if action <= 3: + self.theB = self._next() + if self.theB == '/' and (self.theA == '(' or self.theA == ',' or + self.theA == '=' or self.theA == ':' or + self.theA == '[' or self.theA == '?' or + self.theA == '!' or self.theA == '&' or + self.theA == '|' or self.theA == ';' or + self.theA == '{' or self.theA == '}' or + self.theA == '\n'): + self._outA() + self._outB() + while 1: + self.theA = self._get() + if self.theA == '/': + break + elif self.theA == '\\': + self._outA() + self.theA = self._get() + elif self.theA <= '\n': + raise UnterminatedRegularExpression() + self._outA() + self.theB = self._next() + + + def _jsmin(self): + """Copy the input to the output, deleting the characters which are + insignificant to JavaScript. Comments will be removed. Tabs will be + replaced with spaces. Carriage returns will be replaced with linefeeds. + Most spaces and linefeeds will be removed. + """ + self.theA = '\n' + self._action(3) + + while self.theA != '\000': + if self.theA == ' ': + if isAlphanum(self.theB): + self._action(1) + else: + self._action(2) + elif self.theA == '\n': + if self.theB in ['{', '[', '(', '+', '-']: + self._action(1) + elif self.theB == ' ': + self._action(3) + else: + if isAlphanum(self.theB): + self._action(1) + else: + self._action(2) + else: + if self.theB == ' ': + if isAlphanum(self.theA): + self._action(1) + else: + self._action(3) + elif self.theB == '\n': + if self.theA in ['}', ']', ')', '+', '-', '"', '\'']: + self._action(1) + else: + if isAlphanum(self.theA): + self._action(1) + else: + self._action(3) + else: + self._action(1) + + def minify(self, instream, outstream): + self.instream = instream + self.outstream = outstream + self.theA = '\n' + self.theB = None + self.theLookahead = None + + self._jsmin() + self.instream.close() \ No newline at end of file diff --git a/py/build/nav.py b/py/build/nav.py new file mode 100644 index 0000000000..9cfb76671c --- /dev/null +++ b/py/build/nav.py @@ -0,0 +1,67 @@ +class Nav: + """ + Build sitemap / navigation tree + """ + page_info_template = { + 'description': None, + 'keywords': None, + 'title': 'No Title Set' + } + def __init__(self): + """ + write out the nav + """ + import json, os + + self.data = {} + if os.path.exists('config/sitenav.json'): + nfile = open('config/sitenav.json') + self.data = json.loads(nfile.read()) + nfile.close() + + def page_info(self): + """ + return dict with href as the key + """ + ret = {} + import copy + + ul = copy.deepcopy(self.data) + + for li in ul: + ret[li.get('href')] = li + + # has subitems, loop + if li.get('subitems'): + for lia in li.get('subitems'): + if not lia.get('href') in ret.keys(): + ul.append(lia) + + return ret + + def html(self, list_class=''): + """ + return nested lists
    in html + """ + self.list_class = list_class + return self.make_list(self.data) + + def make_list(self, ul): + """ + return a list with
  • and elements + """ + lis = [] + link_html = '%(label)s' + + for li in ul: + if not 'title' in li: + li['title'] = 'No Title' + + if 'subitems' in li: + h = ('\t
  • ' + link_html + self.make_list(li['subitems']) +'
  • ') % li + else: + h = ('\t
  • ' + link_html + '
  • ') % li + + lis.append(h) + + return '\n
      \n%s\n
    ' % (self.list_class, '\n'.join(lis)) \ No newline at end of file diff --git a/py/build/project.py b/py/build/project.py new file mode 100644 index 0000000000..2ffa393f9c --- /dev/null +++ b/py/build/project.py @@ -0,0 +1,83 @@ +verbose = False + +class Project: + """ + Build a project + Make files:: + + index.html + assets/template.html + assets/js/core.min.js + assets/timestamps.json + """ + def __init__(self,): + """ + load libraries + """ + from build.timestamps import Timestamps + from build.bundle import Bundle + from nav import Nav + + self.timestamps = Timestamps() + self.bundle = Bundle() + self.nav = Nav() + + def boot(self): + """ + returns bootstrap js + """ + import json + + corejs = open('lib/js/core.min.js', 'r') + + boot = 'var asset_timestamps_=' + self.timestamps.get('json', ('js', 'html', 'css')) \ + + '\n' + corejs.read() + + corejs.close() + return boot + + def render_templates(self): + """ + Generate static files from templates + """ + + # render templates + import os + from jinja2 import Environment, FileSystemLoader + from build.markdown2_extn import Markdown2Extension + + env = Environment(loader=FileSystemLoader('templates'), extensions=[Markdown2Extension]) + + # dynamic boot info + env.globals['boot'] = self.boot() + env.globals['nav'] = self.nav.html() + page_info = self.nav.page_info() + + for wt in os.walk('templates'): + for fname in wt[2]: + if fname.split('.')[-1]=='html' and not fname.startswith('template'): + fpath = os.path.relpath(os.path.join(wt[0], fname), 'templates') + temp = env.get_template(fpath) + + env.globals.update(self.nav.page_info_template) + env.globals.update(page_info.get(fpath, {})) + + # out file in parent folder of template + f = open(fpath, 'w') + f.write(temp.render()) + f.close() + print "Rendered %s | %.2fkb" % (fpath, os.path.getsize(fpath) / 1024.0) + + + def build(self): + """ + Build all js files, timestamps.js, index.html and template.html + """ + + # make bundles + self.bundle.bundle(self.timestamps) + + # index, template if framework is dirty + if self.timestamps.dirty: + self.render_templates() + self.timestamps.write() \ No newline at end of file diff --git a/py/build/timestamps.py b/py/build/timestamps.py new file mode 100644 index 0000000000..2a1b45e4e0 --- /dev/null +++ b/py/build/timestamps.py @@ -0,0 +1,147 @@ +class Timestamps: + """ + Build / manage json timestamp files + """ + previous = {} + dirty = [] + bundled = [] + current = {} + ignore_hidden = True + ignore_extn = ('pyc', 'DS_Store', 'gitignore') + """ + load timestamps and dirty files + """ + def __init__(self): + self.load() + self.get_current() + self.check_dirty() + + def check_dirty(self): + """ + Returns true if the current folder is dirty + """ + from build import verbose + + import os + self.dirty = [] + + if not self.previous: + if verbose: + print 'Dirty: no timestamps!' + self.dirty = self.current.keys() + else: + # check both ways for missing files + + for f in self.current: + if self.current[f] != self.previous.get(f): + print '**** %s changed | %s -> %s' % (f, self.previous.get(f), self.current.get(f)) + self.dirty.append(f) + + for f in self.previous: + if self.previous[f] != self.current.get(f): + if f not in self.dirty: + print '**** %s changed | %s -> %s' % (f, self.previous.get(f), self.current.get(f)) + self.dirty.append(f) + + # unique + self.dirty = list(set(self.dirty)) + + def get_current(self): + """ + build timestamps dict for specified files + """ + try: + import config.assets + except ImportError: + return self.get_current_from_folders() + + ts = {} + for fname in config.assets.file_list: + ts[fname] = str(int(os.stat(fname).st_mtime)) + + self.current = ts + + + def get_current_from_folders(self): + """ + walk in all folders and build tree of all js, css, html, md files + """ + import os + ts = {} + + # walk the parent folder and build all files as defined in the build.json files + for wt in os.walk('.', followlinks=True): + # build timestamps + if self.ignore_hidden: + for d in wt[1]: + if d.startswith('.'): + wt[1].remove(d) + if os.path.exists(os.path.join(wt[0], d, '.no_timestamps')): + wt[1].remove(d) + + for f in wt[2]: + if f.split('.')[-1] not in self.ignore_extn and f!='_timestamps.js': + fname = os.path.relpath(os.path.join(wt[0], f), os.curdir) + ts[fname] = str(int(os.stat(fname).st_mtime)) + + self.current = ts + + + def write(self): + """ + Write timestamp if dirty + """ + import json, os + + ts_path = 'config/_timestamps.js' + + # write timestamps + f = open(ts_path, 'w') + self.get_current() + f.write(json.dumps(self.current)) + f.close() + + def load(self): + """ + Get all timestamps from file + """ + from build import verbose + import json, os + + ts_path = os.path.join('config', '_timestamps.js') + if os.path.exists(ts_path): + ts = open(ts_path, 'r') + # merge the timestamps + tmp = json.loads(ts.read()) + ts.close() + else: + if verbose: + print "** No timestamps **" + tmp = {} + + self.previous = tmp + + def update(self, fname): + """ + Update timestamp of the given file and add to dirty + """ + import os + self.current[fname] = str(int(os.stat(fname).st_mtime)) + self.dirty.append(fname) + + def get(self, rettype='dict', types=[]): + """ + return timestamps (ignore the ones not wanted) + """ + # remove all .md timestamps + ret = {} + for t in self.current: + if t.split('.')[-1] in types: + if t not in self.bundled: + ret[t] = self.current[t] + + if rettype=='dict': + return ret + else: + import json + return json.dumps(ret) \ No newline at end of file diff --git a/py/common.py b/py/common.py new file mode 100644 index 0000000000..fad04f7c29 --- /dev/null +++ b/py/common.py @@ -0,0 +1,13 @@ +_store=None + +def store(): + """ + Return the redis datastore + """ + import redis + global _store + + if not _store: + _store = redis.Redis('localhost', port=6379, db=0) + + return _store diff --git a/py/core/.no_timestamps b/py/core/.no_timestamps new file mode 100644 index 0000000000..e69de29bb2 diff --git a/py/tests.py b/py/tests.py new file mode 100644 index 0000000000..919278e407 --- /dev/null +++ b/py/tests.py @@ -0,0 +1,12 @@ +import unittest +import urllib, urllib2, os + +class TestREST(unittest.TestCase): + def test_home(self): + req = urllib2.Request('http://localhost/rmehta/wnframework-client/') + req.get_method = lambda: 'GET' + response = urllib2.urlopen(req) + self.assertTrue(response.getcode()==200) + +if __name__=='__main__': + unittest.main() \ No newline at end of file diff --git a/py/watch.py b/py/watch.py new file mode 100644 index 0000000000..0430e08ba2 --- /dev/null +++ b/py/watch.py @@ -0,0 +1,11 @@ +""" +Watch the folder at regular intervals and build if files have been changed +""" + +if __name__=='__main__': + import time, build + + while 1: + build.run() + time.sleep(2) + diff --git a/py/webnotes/.no_timestamps b/py/webnotes/.no_timestamps new file mode 100644 index 0000000000..e69de29bb2