diff --git a/htdocs/js/apps/LibraryBrowser/docs/docco.css b/htdocs/js/apps/LibraryBrowser/docs/docco.css new file mode 100644 index 000000000..5aa0a8d73 --- /dev/null +++ b/htdocs/js/apps/LibraryBrowser/docs/docco.css @@ -0,0 +1,186 @@ +/*--------------------- Layout and Typography ----------------------------*/ +body { + font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; + font-size: 15px; + line-height: 22px; + color: #252519; + margin: 0; padding: 0; +} +a { + color: #261a3b; +} + a:visited { + color: #261a3b; + } +p { + margin: 0 0 15px 0; +} +h1, h2, h3, h4, h5, h6 { + margin: 0px 0 15px 0; +} + h1 { + margin-top: 40px; + } +#container { + position: relative; +} +#background { + position: fixed; + top: 0; left: 525px; right: 0; bottom: 0; + background: #f5f5ff; + border-left: 1px solid #e5e5ee; + z-index: -1; +} +#jump_to, #jump_page { + background: white; + -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777; + -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; + font: 10px Arial; + text-transform: uppercase; + cursor: pointer; + text-align: right; +} +#jump_to, #jump_wrapper { + position: fixed; + right: 0; top: 0; + padding: 5px 10px; +} + #jump_wrapper { + padding: 0; + display: none; + } + #jump_to:hover #jump_wrapper { + display: block; + } + #jump_page { + padding: 5px 0 3px; + margin: 0 0 25px 25px; + } + #jump_page .source { + display: block; + padding: 5px 10px; + text-decoration: none; + border-top: 1px solid #eee; + } + #jump_page .source:hover { + background: #f5f5ff; + } + #jump_page .source:first-child { + } +table td { + border: 0; + outline: 0; +} + td.docs, th.docs { + max-width: 450px; + min-width: 450px; + min-height: 5px; + padding: 10px 25px 1px 50px; + overflow-x: hidden; + vertical-align: top; + text-align: left; + } + .docs pre { + margin: 15px 0 15px; + padding-left: 15px; + } + .docs p tt, .docs p code { + background: #f8f8ff; + border: 1px solid #dedede; + font-size: 12px; + padding: 0 0.2em; + } + .pilwrap { + position: relative; + } + .pilcrow { + font: 12px Arial; + text-decoration: none; + color: #454545; + position: absolute; + top: 3px; left: -20px; + padding: 1px 2px; + opacity: 0; + -webkit-transition: opacity 0.2s linear; + } + td.docs:hover .pilcrow { + opacity: 1; + } + td.code, th.code { + padding: 14px 15px 16px 25px; + width: 100%; + vertical-align: top; + background: #f5f5ff; + border-left: 1px solid #e5e5ee; + } + pre, tt, code { + font-size: 12px; line-height: 18px; + font-family: Monaco, Consolas, "Lucida Console", monospace; + margin: 0; padding: 0; + } + + +/*---------------------- Syntax Highlighting -----------------------------*/ +td.linenos { background-color: #f0f0f0; padding-right: 10px; } +span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; } +body .hll { background-color: #ffffcc } +body .c { color: #408080; font-style: italic } /* Comment */ +body .err { border: 1px solid #FF0000 } /* Error */ +body .k { color: #954121 } /* Keyword */ +body .o { color: #666666 } /* Operator */ +body .cm { color: #408080; font-style: italic } /* Comment.Multiline */ +body .cp { color: #BC7A00 } /* Comment.Preproc */ +body .c1 { color: #408080; font-style: italic } /* Comment.Single */ +body .cs { color: #408080; font-style: italic } /* Comment.Special */ +body .gd { color: #A00000 } /* Generic.Deleted */ +body .ge { font-style: italic } /* Generic.Emph */ +body .gr { color: #FF0000 } /* Generic.Error */ +body .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +body .gi { color: #00A000 } /* Generic.Inserted */ +body .go { color: #808080 } /* Generic.Output */ +body .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +body .gs { font-weight: bold } /* Generic.Strong */ +body .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +body .gt { color: #0040D0 } /* Generic.Traceback */ +body .kc { color: #954121 } /* Keyword.Constant */ +body .kd { color: #954121; font-weight: bold } /* Keyword.Declaration */ +body .kn { color: #954121; font-weight: bold } /* Keyword.Namespace */ +body .kp { color: #954121 } /* Keyword.Pseudo */ +body .kr { color: #954121; font-weight: bold } /* Keyword.Reserved */ +body .kt { color: #B00040 } /* Keyword.Type */ +body .m { color: #666666 } /* Literal.Number */ +body .s { color: #219161 } /* Literal.String */ +body .na { color: #7D9029 } /* Name.Attribute */ +body .nb { color: #954121 } /* Name.Builtin */ +body .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +body .no { color: #880000 } /* Name.Constant */ +body .nd { color: #AA22FF } /* Name.Decorator */ +body .ni { color: #999999; font-weight: bold } /* Name.Entity */ +body .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ +body .nf { color: #0000FF } /* Name.Function */ +body .nl { color: #A0A000 } /* Name.Label */ +body .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +body .nt { color: #954121; font-weight: bold } /* Name.Tag */ +body .nv { color: #19469D } /* Name.Variable */ +body .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +body .w { color: #bbbbbb } /* Text.Whitespace */ +body .mf { color: #666666 } /* Literal.Number.Float */ +body .mh { color: #666666 } /* Literal.Number.Hex */ +body .mi { color: #666666 } /* Literal.Number.Integer */ +body .mo { color: #666666 } /* Literal.Number.Oct */ +body .sb { color: #219161 } /* Literal.String.Backtick */ +body .sc { color: #219161 } /* Literal.String.Char */ +body .sd { color: #219161; font-style: italic } /* Literal.String.Doc */ +body .s2 { color: #219161 } /* Literal.String.Double */ +body .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ +body .sh { color: #219161 } /* Literal.String.Heredoc */ +body .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ +body .sx { color: #954121 } /* Literal.String.Other */ +body .sr { color: #BB6688 } /* Literal.String.Regex */ +body .s1 { color: #219161 } /* Literal.String.Single */ +body .ss { color: #19469D } /* Literal.String.Symbol */ +body .bp { color: #954121 } /* Name.Builtin.Pseudo */ +body .vc { color: #19469D } /* Name.Variable.Class */ +body .vg { color: #19469D } /* Name.Variable.Global */ +body .vi { color: #19469D } /* Name.Variable.Instance */ +body .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/htdocs/js/apps/LibraryBrowser/docs/library_browser.html b/htdocs/js/apps/LibraryBrowser/docs/library_browser.html new file mode 100644 index 000000000..ca7430fb9 --- /dev/null +++ b/htdocs/js/apps/LibraryBrowser/docs/library_browser.html @@ -0,0 +1,446 @@ +
library_browser.js | |
|---|---|
| | |
Library Browser 3+ +This is the current iteration of the library browser for webwork.
+It's built out of models contained in the The idea was to use this as a proof of concept of how to write single page +webapps for webwork out of a general client side framework quickly, easily +and in a way that's maintainable. + +The javascript framework is currently written with extensibility in mind.
+So base models in the webwork.js file are added too and additional models are
+provided for different situations. For instance since library browser is used
+by teachers we include the files in the | |
| Start things off by wrapping everything in jquery so it will load after the dom is ready. | $(function () { |
| Since many of the views we'll define will all want to post alerts and messages to the same place +we define a global template and alert function for them. | var alert_template = _.template('<div class="alert <%= classes %> fade in"><a class="close" data-dismiss="alert" href="#">×</a><%= message %></div>'); |
| set up alerts to close | $().alert();
+
+ var alert = function(message, classes){
+ $('#messages').html(alert_template({message: message, classes: classes}));
+ setTimeout(function(){$(".alert").alert('close')}, 5000);
+ }; |
The problem View | |
| A view defined for the browser app for the webwork Problem model. +There's no reason this same view couldn't be used in other pages almost as is. | var ProblemView = Backbone.View.extend({ |
| We want the problem to render in a | tagName:"li", |
| Add the 'problem' class to every problem | className: "problem", |
| This is the template for a problem, the html is defined in SetMaker3.pm | template: _.template($('#problem-template').html()), |
| Register events that a problem's view should listen for, +in this case it removes the problem if the button with class 'remove' is clicked. | events:{
+ "click .remove": 'clear'
+ }, |
| In most model views initialize is used to set up listeners +on the views model. | initialize:function () {
+ this.model.on('change:data', this.render, this);
+ if(!this.options.remove_display){
+ this.options.remove_display = "block";
+ }
+ this.model.on('destroy', this.remove, this);
+ },
+
+ render:function () {
+ var problem = this.model;
+ var self = this;
+
+ if(problem.get('data')){
+ var jsonInfo = this.model.toJSON();
+ _.extend(jsonInfo, self.options);
+ this.$el.html(this.template(jsonInfo));
+ } else {
+ this.$el.html('<img src="/webwork2_files/images/ajax-loader.gif" alt="loading"/>');
+ problem.render();
+ }
+
+ this.el.setAttribute('data-path', problem.get('path'));
+ this.el.id = this.model.cid;
+ this.$el.draggable({
+ helper:'clone',
+ revert:true,
+ handle:'.problem',
+ appendTo:'body',
+ cursorAt:{
+ top:0,
+ left:0
+ },
+ opacity:0.35
+ });
+
+
+ return this;
+ },
+
+ clear: function(){
+ this.model.collection.remove(this.model);
+ this.model.clear();
+ }
+ }); |
The library View | var LibraryView = Backbone.View.extend({
+ template:_.template($('#Library-template').html()),
+
+ events:{
+ "click .next_group": "loadNextGroup"
+ },
+
+ initialize: function(){
+ var self = this;
+ this.group_size = 25;
+ this.model.get('problems').on('reset', this.render, this);
+ this.model.get('problems').on('syncing', function(value){
+ if(value){
+ $("[href=#"+self.model.get('name')+"]").addClass("syncing");
+ } else {
+ $("[href=#"+self.model.get('name')+"]").removeClass("syncing");
+ }
+ }, this);
+ this.model.get('problems').on('alert', function(message){alert(message);});
+
+ if(!(this.model.get('problems').length > 0)){
+ this.model.get('problems').fetch();
+ }
+ },
+
+ render: function(){
+
+ var self = this;
+
+ if ($('#problems_container #' + this.model.get('name')).length == 0) {
+ $('#problems_container').tabs('add', "#"+this.model.get('name'), this.model.get('name') + " (" + this.model.get('problems').length + ")"); //could move to an after?
+ this.setElement(document.getElementById(this.model.get('name')));
+ } else { |
| select | $('#problems_container').tabs('select', this.model.get('name'));
+ $("[href=#"+this.model.get('name')+"]").html(this.model.get('name') + " (" + this.model.get('problems').length + ")");
+ }
+
+ if(self.model.get('problems').syncing){
+ $("[href=#"+self.model.get('name')+"]").addClass("syncing");
+ }
+
+ this.$el.addClass("library_tab");
+ this.startIndex = 0;
+
+ var jsonInfo = this.model.toJSON();
+ jsonInfo['group_size'] = this.group_size;
+
+ jsonInfo['enough_problems'] = (this.model.get('problems').length > this.startIndex)? "block" : "none";
+
+ this.$el.html(this.template(jsonInfo));
+
+ this.loadNextGroup();
+
+ return this;
+ }, |
| Define a new function loadNextGroup so that we can just load a few problems at once, +otherwise things get unwieldy :P | loadNextGroup: function(){
+ console.log("load more");
+ console.log(this.startIndex);
+ console.log(this.group_size);
+
+ var problems = this.model.get('problems');
+ console.log(problems.length);
+ for(var i = 0; i < this.group_size && this.startIndex < problems.length; i++, this.startIndex++){
+ console.log("adding a problem");
+ var problem = problems.at(this.startIndex);
+ var view = new ProblemView({model: problem, remove_display: "none"});
+ this.$(".list").append(view.render().el);
+ }
+
+ if(!(this.model.get('problems').length > this.startIndex)){
+ this.$(".next_group").css('display', "none");
+ }
+ }
+
+ });
+
+ var LibraryListView = Backbone.View.extend({
+ tagName:'span',
+ template:_.template($('#LibraryList-template').html()),
+
+ events: { |
| 'change .list': 'lib_selected' | },
+
+ initialize:function () {
+ var self = this;
+ this.model.on("reset", this.render, this);
+ this.model.on("add", this.addOne, this);
+ this.model.on('alert', function(message){alert(message);}, this);
+ this.model.on('syncing', function(value){
+ if(value){
+ self.$el.addClass("syncing white");
+ } else {
+ self.$el.removeClass("syncing white");
+ }
+ }, this); |
| not the strongest solution but it will do | if(!(this.model.length > 0)){
+ this.model.fetch();
+ }
+ },
+
+ render:function () {
+
+ var self = this;
+ if(self.model.syncing){
+ self.$el.addClass("syncing white");
+ }
+ this.$el.html(this.template({name: this.options.name}));
+ self.$("."+this.options.name+".list").on('change', function(event){self.lib_selected(event)});
+ this.addAll();
+ return this;
+ },
+
+ addOne: function(lib){
+ var self = this;
+ var option = document.createElement("option")
+ option.value = lib.cid;
+ option.innerHTML = lib.get('name');
+ this.$('.'+this.options.name + '.list').append(option);//what's the null?
+ },
+
+ addAll: function(){
+ var self = this;
+ if(this.model.length > 0){ |
| should show number of problems in the bar | this.model.each(function(lib){self.addOne(lib)});
+ } else {
+ this.$('.'+this.options.name+".list").css("display", "none");
+ }
+ },
+
+ lib_selected:function (event) {
+ var self = this;
+ self.$el.removeClass("syncing white");
+ var selectedLib = this.model.getByCid(event.target.value);
+ if(selectedLib){
+ var view = new LibraryListView({model:selectedLib.get('children'), name: selectedLib.cid});
+ this.$('.'+this.options.name+".children").html(view.render().el);
+ libToLoad = selectedLib;
+ }
+ }
+
+ }); |
The main Set view | var SetView = Backbone.View.extend({
+ template:_.template($('#set-template').html()),
+ events:{
+ },
+
+ initialize:function () {
+ var self = this;
+ this.model.get('problems').on('add', function(model){self.addOne(model)}, this);
+ this.model.get('problems').on('reset', function(){self.addAll();}, this);
+ this.model.get('problems').on('all', function(){
+ $("[href=#"+self.model.get('name')+"]").html(self.model.get('name') + " (" + self.model.get('problems').length + ")");
+ }, this);
+ this.model.get('problems').on('alert', function(message){alert(message);});
+
+ this.model.get('problems').on('syncing', function(value){
+ if(value){
+ $("[href=#"+self.model.get('name')+"]").addClass("syncing");
+ } else {
+ $("[href=#"+self.model.get('name')+"]").removeClass("syncing");
+ }
+ }, this);
+
+ },
+
+ render:function () {
+
+ var self = this;
+ if ($('#problems_container #' + this.model.get('name')).length == 0) {
+ $('#problems_container').tabs('add', "#"+this.model.get('name'), this.model.get('name') + " (" + this.model.get('problems').length + ")"); //could move to an after?
+ this.setElement(document.getElementById(this.model.get('name')));
+ }
+
+ this.$el.html(self.template(self.model.toJSON()));
+
+ if(self.model.get('problems').syncing){
+ $("[href=#"+self.model.get('name')+"]").addClass("syncing");
+ }
+
+ this.$('.list').sortable({
+ axis:'y',
+ start:function (event, ui) { |
| self.previousOrder = $(this).sortable('toArray'); | },
+ update:function (event, ui) { |
| self.reorderProblems($(this).sortable('toArray')); | var newOrder = self.$('.list').sortable('toArray');
+ for(var i = 0; i < newOrder.length; i++){
+ var problem = self.model.get('problems').getByCid(newOrder[i]);
+ if(problem){
+ problem.set('place', i);
+ }
+ }
+
+ self.model.get('problems').reorder();
+ }
+ });
+
+ this.addAll();
+ return this;
+ },
+
+ addOne: function(problem){
+ var view = new ProblemView({model:problem});
+ var rendered_problem = view.render().el;
+ this.$(".list").append(rendered_problem);
+ this.$('.list').sortable('refresh');
+
+ },
+
+ addAll: function(){
+ var self = this;
+ this.model.get('problems').each(function(model){self.addOne(model)});
+ }
+ }); |
The Set view for the setlists | var SetNameView = Backbone.View.extend({
+ tagName:"li",
+ template:_.template($('#setName-template').html()),
+
+ events:{
+ 'click':'view'
+ },
+
+ initialize:function () {
+ this.bigView = false;
+ var self = this;
+ this.model.get('problems').on('all', function(){self.render()}, this);
+ this.model.get('problems').on('alert', function(message){alert(message);});
+ this.model.on('highlight', function(){self.$el.addClass("contains_problem")});
+ },
+
+ render:function () {
+ var self = this;
+
+ self.$el.html(self.template({name: self.model.get('name'), problem_count: self.model.get('problems').length}));
+ self.$el.droppable({
+ tolerance:'pointer',
+
+ hoverClass:'drophover',
+
+ drop:function (event, ui) { |
| var newProblem = new webwork.Problem({path:ui.draggable.attr("data-path")}); | self.model.get("problems").add({path:ui.draggable.attr("data-path")});
+ }
+ });
+
+ return this;
+ },
+
+ view:function () {
+ console.log("clicked " + this.model.get('name'));
+ if ($('#problems_container #' + this.model.get('name')).length > 0) {
+ $('#problems_container').tabs('select', this.model.get('name'));
+ } else {
+ console.log("rendering the set");
+ var view = new SetView({model:this.model}); |
| $('#problems_container').append(view.render().el); | view.render();
+ } |
| render the full tab thing, or switch to it | }
+ }); |
The SetList view | var SetListView = Backbone.View.extend({
+ tagName:"ul",
+ template:_.template($('#setList-template').html()),
+ className:"nav nav-list",
+
+ initialize:function () {
+ var self = this;
+ this.model.bind('add', function(model){self.addOne(model);}, this);
+ this.model.bind('reset', function(){self.addAll()}, this); |
| this.model.bind('all', this.render, this); | if(!(this.model.length > 0)){
+ this.model.fetch();
+ }
+ },
+
+ render:function () {
+ var self = this;
+
+ self.$el.html(self.template());
+
+ return this;
+ },
+
+ addOne:function (added_set) {
+ var view = new SetNameView({model: added_set});
+ this.$el.append(view.render().el);
+ },
+
+ addAll:function () {
+ var self = this;
+ this.model.each(function(model){self.addOne(model)});
+ }
+ /*
+ startCreate: function(){
+ this.$("#dialog").dialog('open');
+ }
+ */
+ }); |
| This is global in order not to confuse the poor select boxes.. +They can never tell who went last :) | var libToLoad = false;
+ $("#load_problems").on("click", function(event){
+ if(libToLoad){
+ var view = new LibraryView({model: libToLoad});
+ view.render();
+
+ }
+ }); |
| The APP!! yay!! | var LibraryBrowser = Backbone.View.extend({
+ el:$('#app_box'),
+
+ events:{
+ "click #undo_button":"undo",
+ "click #redo_button":"redo",
+ "hover .problem": "highlightSets",
+ "click #create_set": "createHomeworkSet"
+ },
+
+ initialize:function () {
+ var self = this; |
| Some default ajax stuff we can keep it or not | $(document).ajaxError(function(e, jqxhr, settings, exception) {
+ alert(exception, "alert-error");
+ }); |
| get usernames and keys from hidden variables and set up webwork object: | var myUser = document.getElementById("hidden_user").value;
+ var mySessionKey = document.getElementById("hidden_key").value;
+ var myCourseID = document.getElementById("hidden_courseID").value; |
| check to make sure that our credentials are available. | if (myUser && mySessionKey && myCourseID) {
+ webwork.requestObject.user = myUser;
+ webwork.requestObject.session_key = mySessionKey;
+ webwork.requestObject.courseID = myCourseID;
+ } else {
+ alert("missing hidden credentials: user "
+ + myUser + " session_key " + mySessionKey
+ + " courseID" + myCourseID, "alert-error");
+ } |
| Set up the tabbed set lists and libraries: | $("#problems_container").tabs(
+ {
+ closable:true,
+ add:function (event, ui) { |
| document.getElementById("librarylink").removeChild(document.getElementById("librarylink").lastChild); | console.log("adding a tab");
+ $('#problems_container').tabs('select', '#' + ui.panel.id);
+ $(".ww_selected").removeClass("ww_selected");// probably reduntant but I want to make sure nothing stays selected
+ },
+ create:function (event, ui) { |
| document.getElementById("librarylink").removeChild(document.getElementById("librarylink").lastChild); | $(".ww_selected").removeClass("ww_selected");
+ },
+ select:function (event, ui) {
+ $(".ww_selected").removeClass("ww_selected");
+ },
+ remove:function (event, ui) { |
| document.getElementById("librarylink").removeChild(document.getElementById("librarylink").lastChild); | $(".ww_selected").removeClass("ww_selected");
+ }
+ }); |
| set up our models | this.homeworkSets = new webwork.SetList;
+ this.cardCatalog = new webwork.LibraryList;
+ this.cardCatalog.defaultRequestObject.xml_command = "listLibraries"
+
+ this.render();
+ },
+
+ createHomeworkSet: function(){
+ if(this.$("#dialog_text").val()){
+ this.homeworkSets.create({name: this.$("#dialog_text").val()});
+ }
+ this.$("#dialog_text").val('');
+ },
+
+ highlightSets: function(event) {
+ switch(event.type){
+ case "mouseenter": |
| console.log(this.getAttribute("data-path")); | var problemPath = event.currentTarget.getAttribute("data-path");
+
+ this.homeworkSets.each(function(set){
+ if(set.get('problems').find(function(problem){return problem.get('path') == problemPath})){
+ set.trigger('highlight');
+ }
+ });
+ break;
+ default:
+ $(".contains_problem").removeClass("contains_problem");
+ break;
+ }
+
+ },
+
+ render: function(){
+ var homeworkSetsView = new SetListView({model: this.homeworkSets});
+ this.$("#homework_sets_container").append(homeworkSetsView.render().el);
+
+ var cardCatalogView = new LibraryListView({model: this.cardCatalog, name: "root"});
+ this.$("#CardCatalog").append(cardCatalogView.render().el);
+ },
+
+ undo:function () { |
| pop the stack and call the function, that's it | var undoFunc = undo_stack.pop();
+ undoing = true;
+ undoFunc();
+ },
+
+ redo:function () {
+ var redoFunc = redo_stack.pop();
+ redoFunc();
+ }
+ }); |
| instantiate an instance of our app. | var App = new LibraryBrowser;
+
+});
+
+ |
// elements inside
+ blocks. */
+pre code, pre kbd, pre samp { font-size: 100%; }
+
+/* Used to denote text that shouldn't be selectable, such as line numbers or
+ shell prompts. Guess which browser this doesn't work in. */
+.noselect {
+ -moz-user-select: -moz-none;
+ -khtml-user-select: none;
+ -webkit-user-select: none;
+ -o-user-select: none;
+ user-select: none;
+}
+
+/* -- Lists ----------------------------------------------------------------- */
+dd { margin: 0.2em 0 0.7em 1em; }
+dl { margin: 1em 0; }
+dt { font-weight: bold; }
+
+/* -- Tables ---------------------------------------------------------------- */
+caption, th { text-align: left; }
+
+table {
+ border-collapse: collapse;
+ width: 100%;
+}
+
+td, th {
+ border: 1px solid #fff;
+ padding: 5px 12px;
+ vertical-align: top;
+}
+
+td { background: #E6E9F5; }
+td dl { margin: 0; }
+td dl dl { margin: 1em 0; }
+td pre:first-child { margin-top: 0; }
+
+th {
+ background: #D2D7E6;/*#97A0BF*/
+ border-bottom: none;
+ border-top: none;
+ color: #000;/*#FFF1D5*/
+ font-family: 'Trebuchet MS', sans-serif;
+ font-weight: bold;
+ line-height: 1.3;
+ white-space: nowrap;
+}
+
+
+/* -- Layout and Content ---------------------------------------------------- */
+#doc {
+ margin: auto;
+ min-width: 1024px;
+}
+
+.content { padding: 0 20px 0 25px; }
+
+.sidebar {
+ padding: 0 15px 0 10px;
+}
+#bd {
+ padding: 7px 0 130px;
+ position: relative;
+ width: 99%;
+}
+
+/* -- Table of Contents ----------------------------------------------------- */
+
+/* The #toc id refers to the single global table of contents, while the .toc
+ class refers to generic TOC lists that could be used throughout the page. */
+
+.toc code, .toc kbd, .toc samp { font-size: 100%; }
+.toc li { font-weight: bold; }
+.toc li li { font-weight: normal; }
+
+/* -- Intro and Example Boxes ----------------------------------------------- */
+/*
+.intro, .example { margin-bottom: 2em; }
+.example {
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: 0 0 5px #bfbfbf;
+ -webkit-box-shadow: 0 0 5px #bfbfbf;
+ box-shadow: 0 0 5px #bfbfbf;
+ padding: 1em;
+}
+.intro {
+ background: none repeat scroll 0 0 #F0F1F8; border: 1px solid #D4D8EB; padding: 0 1em;
+}
+*/
+
+/* -- Other Styles ---------------------------------------------------------- */
+
+/* These are probably YUI-specific, and should be moved out of Selleck's default
+ theme. */
+
+.button {
+ border: 1px solid #dadada;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ color: #444;
+ display: inline-block;
+ font-family: Helvetica, Arial, sans-serif;
+ font-size: 92.308%;
+ font-weight: bold;
+ padding: 4px 13px 3px;
+ -moz-text-shadow: 1px 1px 0 #fff;
+ -webkit-text-shadow: 1px 1px 0 #fff;
+ text-shadow: 1px 1px 0 #fff;
+ white-space: nowrap;
+
+ background: #EFEFEF; /* old browsers */
+ background: -moz-linear-gradient(top, #f5f5f5 0%, #efefef 50%, #e5e5e5 51%, #dfdfdf 100%); /* firefox */
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(50%,#efefef), color-stop(51%,#e5e5e5), color-stop(100%,#dfdfdf)); /* webkit */
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#dfdfdf',GradientType=0 ); /* ie */
+}
+
+.button:hover {
+ border-color: #466899;
+ color: #fff;
+ text-decoration: none;
+ -moz-text-shadow: 1px 1px 0 #222;
+ -webkit-text-shadow: 1px 1px 0 #222;
+ text-shadow: 1px 1px 0 #222;
+
+ background: #6396D8; /* old browsers */
+ background: -moz-linear-gradient(top, #6396D8 0%, #5A83BC 50%, #547AB7 51%, #466899 100%); /* firefox */
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#6396D8), color-stop(50%,#5A83BC), color-stop(51%,#547AB7), color-stop(100%,#466899)); /* webkit */
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6396D8', endColorstr='#466899',GradientType=0 ); /* ie */
+}
+
+.newwindow { text-align: center; }
+
+.header .version em {
+ display: block;
+ text-align: right;
+}
+
+
+#classdocs .item {
+ border-bottom: 1px solid #466899;
+ margin: 1em 0;
+ padding: 1.5em;
+}
+
+#classdocs .item .params p,
+ #classdocs .item .returns p,{
+ display: inline;
+}
+
+#classdocs .item em code, #classdocs .item em.comment {
+ color: green;
+}
+
+#classdocs .item em.comment a {
+ color: green;
+ text-decoration: underline;
+}
+
+#classdocs .foundat {
+ font-size: 11px;
+ font-style: normal;
+}
+
+.attrs .emits {
+ margin-left: 2em;
+ padding: .5em;
+ border-left: 1px dashed #ccc;
+}
+
+abbr {
+ border-bottom: 1px dashed #ccc;
+ font-size: 80%;
+ cursor: help;
+}
+
+.prettyprint li.L0,
+.prettyprint li.L1,
+.prettyprint li.L2,
+.prettyprint li.L3,
+.prettyprint li.L5,
+.prettyprint li.L6,
+.prettyprint li.L7,
+.prettyprint li.L8 {
+ list-style: decimal;
+}
+
+ul li p {
+ margin-top: 0;
+}
+
+.method .name {
+ font-size: 110%;
+}
+
+.apidocs .methods .extends .method,
+.apidocs .properties .extends .property,
+.apidocs .attrs .extends .attr,
+.apidocs .events .extends .event {
+ font-weight: bold;
+}
+
+.apidocs .methods .extends .inherited,
+.apidocs .properties .extends .inherited,
+.apidocs .attrs .extends .inherited,
+.apidocs .events .extends .inherited {
+ font-weight: normal;
+}
+
+#hd {
+ background: whiteSmoke;
+ background: -moz-linear-gradient(top,#DCDBD9 0,#F6F5F3 100%);
+ background: -webkit-gradient(linear,left top,left bottom,color-stop(0%,#DCDBD9),color-stop(100%,#F6F5F3));
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dcdbd9',endColorstr='#F6F5F3',GradientType=0);
+ border-bottom: 1px solid #DFDFDF;
+ padding: 0 15px 1px 20px;
+ margin-bottom: 15px;
+}
+
+#hd img {
+ margin-right: 10px;
+ vertical-align: middle;
+}
+
+
+/* -- API Docs CSS ---------------------------------------------------------- */
+
+/*
+This file is organized so that more generic styles are nearer the top, and more
+specific styles are nearer the bottom of the file. This allows us to take full
+advantage of the cascade to avoid redundant style rules. Please respect this
+convention when making changes.
+*/
+
+/* -- Generic TabView styles ------------------------------------------------ */
+
+/*
+These styles apply to all API doc tabviews. To change styles only for a
+specific tabview, see the other sections below.
+*/
+
+.yui3-js-enabled .apidocs .tabview {
+ visibility: hidden; /* Hide until the TabView finishes rendering. */
+ _visibility: visible;
+}
+
+.apidocs .tabview.yui3-tabview-content { visibility: visible; }
+.apidocs .tabview .yui3-tabview-panel { background: #fff; }
+
+/* -- Generic Content Styles ------------------------------------------------ */
+
+/* Headings */
+h2, h3, h4, h5, h6 {
+ border: none;
+ color: #30418C;
+ font-weight: bold;
+ text-decoration: none;
+}
+
+.link-docs {
+ float: right;
+ font-size: 15px;
+ margin: 4px 4px 6px;
+ padding: 6px 30px 5px;
+}
+
+.apidocs { zoom: 1; }
+
+/* Generic box styles. */
+.apidocs .box {
+ border: 1px solid;
+ border-radius: 3px;
+ margin: 1em 0;
+ padding: 0 1em;
+}
+
+/* A flag is a compact, capsule-like indicator of some kind. It's used to
+ indicate private and protected items, item return types, etc. in an
+ attractive and unobtrusive way. */
+.apidocs .flag {
+ background: #bababa;
+ border-radius: 3px;
+ color: #fff;
+ font-size: 11px;
+ margin: 0 0.5em;
+ padding: 2px 4px 1px;
+}
+
+/* Class/module metadata such as "Uses", "Extends", "Defined in", etc. */
+.apidocs .meta {
+ background: #f9f9f9;
+ border-color: #efefef;
+ color: #555;
+ font-size: 11px;
+ padding: 3px 6px;
+}
+
+.apidocs .meta p { margin: 0; }
+
+/* Deprecation warning. */
+.apidocs .box.deprecated,
+.apidocs .flag.deprecated {
+ background: #fdac9f;
+ border: 1px solid #fd7775;
+}
+
+.apidocs .box.deprecated p { margin: 0.5em 0; }
+.apidocs .flag.deprecated { color: #333; }
+
+/* Module/Class intro description. */
+.apidocs .intro {
+ background: #f0f1f8;
+ border-color: #d4d8eb;
+}
+
+/* Loading spinners. */
+#bd.loading .apidocs,
+#api-list.loading .yui3-tabview-panel {
+ background: #fff url(../img/spinner.gif) no-repeat center 70px;
+ min-height: 150px;
+}
+
+#bd.loading .apidocs .content,
+#api-list.loading .yui3-tabview-panel .apis {
+ display: none;
+}
+
+.apidocs .no-visible-items { color: #666; }
+
+/* Generic inline list. */
+.apidocs ul.inline {
+ display: inline;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+.apidocs ul.inline li { display: inline; }
+
+/* Comma-separated list. */
+.apidocs ul.commas li:after { content: ','; }
+.apidocs ul.commas li:last-child:after { content: ''; }
+
+/* Keyboard shortcuts. */
+kbd .cmd { font-family: Monaco, Helvetica; }
+
+/* -- Generic Access Level styles ------------------------------------------- */
+.apidocs .item.protected,
+.apidocs .item.private,
+.apidocs .index-item.protected,
+.apidocs .index-item.deprecated,
+.apidocs .index-item.private {
+ display: none;
+}
+
+.show-deprecated .item.deprecated,
+.show-deprecated .index-item.deprecated,
+.show-protected .item.protected,
+.show-protected .index-item.protected,
+.show-private .item.private,
+.show-private .index-item.private {
+ display: block;
+}
+
+.hide-inherited .item.inherited,
+.hide-inherited .index-item.inherited {
+ display: none;
+}
+
+/* -- Generic Item Index styles --------------------------------------------- */
+.apidocs .index { margin: 1.5em 0 3em; }
+
+.apidocs .index h3 {
+ border-bottom: 1px solid #efefef;
+ color: #333;
+ font-size: 13px;
+ margin: 2em 0 0.6em;
+ padding-bottom: 2px;
+}
+
+.apidocs .index .no-visible-items { margin-top: 2em; }
+
+.apidocs .index-list {
+ border-color: #efefef;
+ font-size: 12px;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ -moz-column-count: 4;
+ -moz-column-gap: 10px;
+ -moz-column-width: 170px;
+ -ms-column-count: 4;
+ -ms-column-gap: 10px;
+ -ms-column-width: 170px;
+ -o-column-count: 4;
+ -o-column-gap: 10px;
+ -o-column-width: 170px;
+ -webkit-column-count: 4;
+ -webkit-column-gap: 10px;
+ -webkit-column-width: 170px;
+ column-count: 4;
+ column-gap: 10px;
+ column-width: 170px;
+}
+
+.apidocs .no-columns .index-list {
+ -moz-column-count: 1;
+ -ms-column-count: 1;
+ -o-column-count: 1;
+ -webkit-column-count: 1;
+ column-count: 1;
+}
+
+.apidocs .index-item { white-space: nowrap; }
+
+.apidocs .index-item .flag {
+ background: none;
+ border: none;
+ color: #afafaf;
+ display: inline;
+ margin: 0 0 0 0.2em;
+ padding: 0;
+}
+
+/* -- Generic API item styles ----------------------------------------------- */
+.apidocs .args {
+ display: inline;
+ margin: 0 0.5em;
+}
+
+.apidocs .flag.chainable { background: #46ca3b; }
+.apidocs .flag.protected { background: #9b86fc; }
+.apidocs .flag.private { background: #fd6b1b; }
+.apidocs .flag.async { background: #356de4; }
+.apidocs .flag.required { background: #e60923; }
+
+.apidocs .item {
+ border-bottom: 1px solid #efefef;
+ margin: 1.5em 0 2em;
+ padding-bottom: 2em;
+}
+
+.apidocs .item h4,
+.apidocs .item h5,
+.apidocs .item h6 {
+ color: #333;
+ font-family: inherit;
+ font-size: 100%;
+}
+
+.apidocs .item .description p,
+.apidocs .item pre.code {
+ margin: 1em 0 0;
+}
+
+.apidocs .item .meta {
+ background: none;
+ border: none;
+ padding: 0;
+}
+
+.apidocs .item .name {
+ display: inline;
+ font-size: 14px;
+}
+
+.apidocs .item .type,
+.apidocs .item .type a,
+.apidocs .returns-inline {
+ color: #555;
+}
+
+.apidocs .item .type,
+.apidocs .returns-inline {
+ font-size: 11px;
+ margin: 0 0 0 0;
+}
+
+.apidocs .item .type a { border-bottom: 1px dotted #afafaf; }
+.apidocs .item .type a:hover { border: none; }
+
+/* -- Item Parameter List --------------------------------------------------- */
+.apidocs .params-list {
+ list-style: square;
+ margin: 1em 0 0 2em;
+ padding: 0;
+}
+
+.apidocs .param { margin-bottom: 1em; }
+
+.apidocs .param .type,
+.apidocs .param .type a {
+ color: #666;
+}
+
+.apidocs .param .type {
+ margin: 0 0 0 0.5em;
+ *margin-left: 0.5em;
+}
+
+.apidocs .param-name { font-weight: bold; }
+
+/* -- Item "Emits" block ---------------------------------------------------- */
+.apidocs .item .emits {
+ background: #f9f9f9;
+ border-color: #eaeaea;
+}
+
+/* -- Item "Returns" block -------------------------------------------------- */
+.apidocs .item .returns .type,
+.apidocs .item .returns .type a {
+ font-size: 100%;
+ margin: 0;
+}
+
+/* -- Class Constructor block ----------------------------------------------- */
+.apidocs .constructor .item {
+ border: none;
+ padding-bottom: 0;
+}
+
+/* -- File Source View ------------------------------------------------------ */
+.apidocs .file pre.code,
+#doc .apidocs .file pre.prettyprint {
+ background: inherit;
+ border: none;
+ overflow: visible;
+ padding: 0;
+}
+
+.apidocs .L0,
+.apidocs .L1,
+.apidocs .L2,
+.apidocs .L3,
+.apidocs .L4,
+.apidocs .L5,
+.apidocs .L6,
+.apidocs .L7,
+.apidocs .L8,
+.apidocs .L9 {
+ background: inherit;
+}
+
+/* -- Submodule List -------------------------------------------------------- */
+.apidocs .module-submodule-description {
+ font-size: 12px;
+ margin: 0.3em 0 1em;
+}
+
+.apidocs .module-submodule-description p:first-child { margin-top: 0; }
+
+/* -- Sidebar TabView ------------------------------------------------------- */
+#api-tabview { margin-top: 0.6em; }
+
+#api-tabview-filter,
+#api-tabview-panel {
+ border: 1px solid #dfdfdf;
+}
+
+#api-tabview-filter {
+ border-bottom: none;
+ border-top: none;
+ padding: 0.6em 10px 0 10px;
+}
+
+#api-tabview-panel { border-top: none; }
+#api-filter { width: 97%; }
+
+/* -- Content TabView ------------------------------------------------------- */
+#classdocs .yui3-tabview-panel { border: none; }
+
+/* -- Source File Contents -------------------------------------------------- */
+.prettyprint li.L0,
+.prettyprint li.L1,
+.prettyprint li.L2,
+.prettyprint li.L3,
+.prettyprint li.L5,
+.prettyprint li.L6,
+.prettyprint li.L7,
+.prettyprint li.L8 {
+ list-style: decimal;
+}
+
+/* -- API options ----------------------------------------------------------- */
+#api-options {
+ font-size: 11px;
+ margin-top: 2.2em;
+ position: absolute;
+ right: 1.5em;
+}
+
+/*#api-options label { margin-right: 0.6em; }*/
+
+/* -- API list -------------------------------------------------------------- */
+#api-list {
+ margin-top: 1.5em;
+ *zoom: 1;
+}
+
+.apis {
+ font-size: 12px;
+ line-height: 1.4;
+ list-style: none;
+ margin: 0;
+ padding: 0.5em 0 0.5em 0.4em;
+}
+
+.apis a {
+ border: 1px solid transparent;
+ display: block;
+ margin: 0 0 0 -4px;
+ padding: 1px 4px 0;
+ text-decoration: none;
+ _border: none;
+ _display: inline;
+}
+
+.apis a:hover,
+.apis a:focus {
+ background: #E8EDFC;
+ background: -moz-linear-gradient(top, #e8edfc 0%, #becef7 100%);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#E8EDFC), color-stop(100%,#BECEF7));
+ border-color: #AAC0FA;
+ border-radius: 3px;
+ color: #333;
+ outline: none;
+}
+
+.api-list-item a:hover,
+.api-list-item a:focus {
+ font-weight: bold;
+ text-shadow: 1px 1px 1px #fff;
+}
+
+.apis .message { color: #888; }
+.apis .result a { padding: 3px 5px 2px; }
+
+.apis .result .type {
+ right: 4px;
+ top: 7px;
+}
+
+.api-list-item .yui3-highlight {
+ font-weight: bold;
+}
+
diff --git a/htdocs/js/lib/webwork/out/assets/favicon.png b/htdocs/js/lib/webwork/out/assets/favicon.png
new file mode 100644
index 000000000..5a95ddab6
Binary files /dev/null and b/htdocs/js/lib/webwork/out/assets/favicon.png differ
diff --git a/htdocs/js/lib/webwork/out/assets/img/spinner.gif b/htdocs/js/lib/webwork/out/assets/img/spinner.gif
new file mode 100644
index 000000000..44f96ba68
Binary files /dev/null and b/htdocs/js/lib/webwork/out/assets/img/spinner.gif differ
diff --git a/htdocs/js/lib/webwork/out/assets/index.html b/htdocs/js/lib/webwork/out/assets/index.html
new file mode 100644
index 000000000..487fe15b2
--- /dev/null
+++ b/htdocs/js/lib/webwork/out/assets/index.html
@@ -0,0 +1,10 @@
+
+
+
+ Redirector
+
+
+
+ Click here to redirect
+
+
diff --git a/htdocs/js/lib/webwork/out/assets/js/api-filter.js b/htdocs/js/lib/webwork/out/assets/js/api-filter.js
new file mode 100644
index 000000000..8a2710018
--- /dev/null
+++ b/htdocs/js/lib/webwork/out/assets/js/api-filter.js
@@ -0,0 +1,52 @@
+YUI.add('api-filter', function (Y) {
+
+Y.APIFilter = Y.Base.create('apiFilter', Y.Base, [Y.AutoCompleteBase], {
+ // -- Initializer ----------------------------------------------------------
+ initializer: function () {
+ this._bindUIACBase();
+ this._syncUIACBase();
+ },
+ getDisplayName: function(name) {
+
+ Y.each(Y.YUIDoc.meta.allModules, function(i) {
+ if (i.name === name && i.displayName) {
+ name = i.displayName;
+ }
+ });
+
+ return name;
+ }
+
+}, {
+ // -- Attributes -----------------------------------------------------------
+ ATTRS: {
+ resultHighlighter: {
+ value: 'phraseMatch'
+ },
+
+ // May be set to "classes" or "modules".
+ queryType: {
+ value: 'classes'
+ },
+
+ source: {
+ valueFn: function() {
+ var self = this;
+ return function(q) {
+ var data = Y.YUIDoc.meta[self.get('queryType')];
+ var out = [];
+ Y.each(data, function(v) {
+ if (v.toLowerCase().indexOf(q.toLowerCase()) > -1) {
+ out.push(v);
+ }
+ });
+ return out;
+ }
+ }
+ }
+ }
+});
+
+}, '3.4.0', {requires: [
+ 'autocomplete-base', 'autocomplete-highlighters', 'autocomplete-sources'
+]});
diff --git a/htdocs/js/lib/webwork/out/assets/js/api-list.js b/htdocs/js/lib/webwork/out/assets/js/api-list.js
new file mode 100644
index 000000000..88905b52e
--- /dev/null
+++ b/htdocs/js/lib/webwork/out/assets/js/api-list.js
@@ -0,0 +1,251 @@
+YUI.add('api-list', function (Y) {
+
+var Lang = Y.Lang,
+ YArray = Y.Array,
+
+ APIList = Y.namespace('APIList'),
+
+ classesNode = Y.one('#api-classes'),
+ inputNode = Y.one('#api-filter'),
+ modulesNode = Y.one('#api-modules'),
+ tabviewNode = Y.one('#api-tabview'),
+
+ tabs = APIList.tabs = {},
+
+ filter = APIList.filter = new Y.APIFilter({
+ inputNode : inputNode,
+ maxResults: 1000,
+
+ on: {
+ results: onFilterResults
+ }
+ }),
+
+ search = APIList.search = new Y.APISearch({
+ inputNode : inputNode,
+ maxResults: 100,
+
+ on: {
+ clear : onSearchClear,
+ results: onSearchResults
+ }
+ }),
+
+ tabview = APIList.tabview = new Y.TabView({
+ srcNode : tabviewNode,
+ panelNode: '#api-tabview-panel',
+ render : true,
+
+ on: {
+ selectionChange: onTabSelectionChange
+ }
+ }),
+
+ focusManager = APIList.focusManager = tabviewNode.plug(Y.Plugin.NodeFocusManager, {
+ circular : true,
+ descendants: '#api-filter, .yui3-tab-panel-selected .api-list-item a, .yui3-tab-panel-selected .result a',
+ keys : {next: 'down:40', previous: 'down:38'}
+ }).focusManager,
+
+ LIST_ITEM_TEMPLATE =
+ '' +
+ '{displayName}' +
+ ' ';
+
+// -- Init ---------------------------------------------------------------------
+
+// Duckpunch FocusManager's key event handling to prevent it from handling key
+// events when a modifier is pressed.
+Y.before(function (e, activeDescendant) {
+ if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {
+ return new Y.Do.Prevent();
+ }
+}, focusManager, '_focusPrevious', focusManager);
+
+Y.before(function (e, activeDescendant) {
+ if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) {
+ return new Y.Do.Prevent();
+ }
+}, focusManager, '_focusNext', focusManager);
+
+// Create a mapping of tabs in the tabview so we can refer to them easily later.
+tabview.each(function (tab, index) {
+ var name = tab.get('label').toLowerCase();
+
+ tabs[name] = {
+ index: index,
+ name : name,
+ tab : tab
+ };
+});
+
+// Switch tabs on Ctrl/Cmd-Left/Right arrows.
+tabviewNode.on('key', onTabSwitchKey, 'down:37,39');
+
+// Focus the filter input when the `/` key is pressed.
+Y.one(Y.config.doc).on('key', onSearchKey, 'down:83');
+
+// Keep the Focus Manager up to date.
+inputNode.on('focus', function () {
+ focusManager.set('activeDescendant', inputNode);
+});
+
+// Update all tabview links to resolved URLs.
+tabview.get('panelNode').all('a').each(function (link) {
+ link.setAttribute('href', link.get('href'));
+});
+
+// -- Private Functions --------------------------------------------------------
+function getFilterResultNode() {
+ return filter.get('queryType') === 'classes' ? classesNode : modulesNode;
+}
+
+// -- Event Handlers -----------------------------------------------------------
+function onFilterResults(e) {
+ var frag = Y.one(Y.config.doc.createDocumentFragment()),
+ resultNode = getFilterResultNode(),
+ typePlural = filter.get('queryType'),
+ typeSingular = typePlural === 'classes' ? 'class' : 'module';
+
+ if (e.results.length) {
+ YArray.each(e.results, function (result) {
+ frag.append(Lang.sub(LIST_ITEM_TEMPLATE, {
+ rootPath : APIList.rootPath,
+ displayName : filter.getDisplayName(result.highlighted),
+ name : result.text,
+ typePlural : typePlural,
+ typeSingular: typeSingular
+ }));
+ });
+ } else {
+ frag.append(
+ ''
+ );
+ }
+
+ resultNode.empty(true);
+ resultNode.append(frag);
+
+ focusManager.refresh();
+}
+
+function onSearchClear(e) {
+
+ focusManager.refresh();
+}
+
+function onSearchKey(e) {
+ var target = e.target;
+
+ if (target.test('input,select,textarea')
+ || target.get('isContentEditable')) {
+ return;
+ }
+
+ e.preventDefault();
+
+ inputNode.focus();
+ focusManager.refresh();
+}
+
+function onSearchResults(e) {
+ var frag = Y.one(Y.config.doc.createDocumentFragment());
+
+ if (e.results.length) {
+ YArray.each(e.results, function (result) {
+ frag.append(result.display);
+ });
+ } else {
+ frag.append(
+ ''
+ );
+ }
+
+
+ focusManager.refresh();
+}
+
+function onTabSelectionChange(e) {
+ var tab = e.newVal,
+ name = tab.get('label').toLowerCase();
+
+ tabs.selected = {
+ index: tab.get('index'),
+ name : name,
+ tab : tab
+ };
+
+ switch (name) {
+ case 'classes': // fallthru
+ case 'modules':
+ filter.setAttrs({
+ minQueryLength: 0,
+ queryType : name
+ });
+
+ search.set('minQueryLength', -1);
+
+ // Only send a request if this isn't the initially-selected tab.
+ if (e.prevVal) {
+ filter.sendRequest(filter.get('value'));
+ }
+ break;
+
+ case 'everything':
+ filter.set('minQueryLength', -1);
+ search.set('minQueryLength', 1);
+
+ if (search.get('value')) {
+ search.sendRequest(search.get('value'));
+ } else {
+ inputNode.focus();
+ }
+ break;
+
+ default:
+ // WTF? We shouldn't be here!
+ filter.set('minQueryLength', -1);
+ search.set('minQueryLength', -1);
+ }
+
+ if (focusManager) {
+ setTimeout(function () {
+ focusManager.refresh();
+ }, 1);
+ }
+}
+
+function onTabSwitchKey(e) {
+ var currentTabIndex = tabs.selected.index;
+
+ if (!(e.ctrlKey || e.metaKey)) {
+ return;
+ }
+
+ e.preventDefault();
+
+ switch (e.keyCode) {
+ case 37: // left arrow
+ if (currentTabIndex > 0) {
+ tabview.selectChild(currentTabIndex - 1);
+ inputNode.focus();
+ }
+ break;
+
+ case 39: // right arrow
+ if (currentTabIndex < (Y.Object.size(tabs) - 2)) {
+ tabview.selectChild(currentTabIndex + 1);
+ inputNode.focus();
+ }
+ break;
+ }
+}
+
+}, '3.4.0', {requires: [
+ 'api-filter', 'api-search', 'event-key', 'node-focusmanager', 'tabview'
+]});
diff --git a/htdocs/js/lib/webwork/out/assets/js/api-search.js b/htdocs/js/lib/webwork/out/assets/js/api-search.js
new file mode 100644
index 000000000..ecad56489
--- /dev/null
+++ b/htdocs/js/lib/webwork/out/assets/js/api-search.js
@@ -0,0 +1,98 @@
+YUI.add('api-search', function (Y) {
+
+var Lang = Y.Lang,
+ Node = Y.Node,
+ YArray = Y.Array;
+
+Y.APISearch = Y.Base.create('apiSearch', Y.Base, [Y.AutoCompleteBase], {
+ // -- Public Properties ----------------------------------------------------
+ RESULT_TEMPLATE:
+ '' +
+ '' +
+ '{name}
' +
+ '{resultType}' +
+ '{description}' +
+ '{class}' +
+ '' +
+ ' ',
+
+ // -- Initializer ----------------------------------------------------------
+ initializer: function () {
+ this._bindUIACBase();
+ this._syncUIACBase();
+ },
+
+ // -- Protected Methods ----------------------------------------------------
+ _apiResultFilter: function (query, results) {
+ // Filter components out of the results.
+ return YArray.filter(results, function (result) {
+ return result.raw.resultType === 'component' ? false : result;
+ });
+ },
+
+ _apiResultFormatter: function (query, results) {
+ return YArray.map(results, function (result) {
+ var raw = Y.merge(result.raw), // create a copy
+ desc = raw.description || '';
+
+ // Convert description to text and truncate it if necessary.
+ desc = Node.create('' + desc + '').get('text');
+
+ if (desc.length > 65) {
+ desc = Y.Escape.html(desc.substr(0, 65)) + ' …';
+ } else {
+ desc = Y.Escape.html(desc);
+ }
+
+ raw['class'] || (raw['class'] = '');
+ raw.description = desc;
+
+ // Use the highlighted result name.
+ raw.name = result.highlighted;
+
+ return Lang.sub(this.RESULT_TEMPLATE, raw);
+ }, this);
+ },
+
+ _apiTextLocator: function (result) {
+ return result.displayName || result.name;
+ }
+}, {
+ // -- Attributes -----------------------------------------------------------
+ ATTRS: {
+ resultFormatter: {
+ valueFn: function () {
+ return this._apiResultFormatter;
+ }
+ },
+
+ resultFilters: {
+ valueFn: function () {
+ return this._apiResultFilter;
+ }
+ },
+
+ resultHighlighter: {
+ value: 'phraseMatch'
+ },
+
+ resultListLocator: {
+ value: 'data.results'
+ },
+
+ resultTextLocator: {
+ valueFn: function () {
+ return this._apiTextLocator;
+ }
+ },
+
+ source: {
+ value: '/api/v1/search?q={query}&count={maxResults}'
+ }
+ }
+});
+
+}, '3.4.0', {requires: [
+ 'autocomplete-base', 'autocomplete-highlighters', 'autocomplete-sources',
+ 'escape'
+]});
diff --git a/htdocs/js/lib/webwork/out/assets/js/apidocs.js b/htdocs/js/lib/webwork/out/assets/js/apidocs.js
new file mode 100644
index 000000000..5c6e72c39
--- /dev/null
+++ b/htdocs/js/lib/webwork/out/assets/js/apidocs.js
@@ -0,0 +1,351 @@
+YUI().use(
+ 'yuidoc-meta',
+ 'api-list', 'history-hash', 'node-screen', 'node-style', 'pjax',
+function (Y) {
+
+var win = Y.config.win,
+ localStorage = win.localStorage,
+
+ bdNode = Y.one('#bd'),
+
+ pjax,
+
+ classTabView,
+ selectedTab;
+
+// Kill pjax functionality unless serving over HTTP.
+if (!Y.getLocation().protocol.match(/^https?\:/)) {
+ Y.Router.html5 = false;
+}
+
+pjax = new Y.Pjax({
+ container : '#docs-main',
+ contentSelector: '#docs-main > .content',
+ linkSelector : '#bd a',
+ titleSelector : '#xhr-title',
+
+ navigateOnHash: true,
+ root : '/',
+ routes : [
+ // -- / ----------------------------------------------------------------
+ {path: '/(index.html)?', callback: '_defaultRoute'},
+
+ // -- /classes/* -------------------------------------------------------
+ {path: '/classes/:class.html*', callback: 'handleClasses'},
+ {path: '/classes/:class.html*', callback: '_defaultRoute'},
+
+ // -- /files/* ---------------------------------------------------------
+ {path: '/files/*file', callback: 'handleFiles'},
+ {path: '/files/*file', callback: '_defaultRoute'},
+
+ // -- /modules/* -------------------------------------------------------
+ {path: '/modules/:module.html*', callback: '_defaultRoute'}
+ ]
+});
+
+// -- Utility Functions --------------------------------------------------------
+
+pjax.checkVisibility = function (tab) {
+ tab || (tab = selectedTab);
+
+ if (!tab) { return; }
+
+ var panelNode = tab.get('panelNode'),
+ visibleItems;
+
+ // If no items are visible in the tab panel due to the current visibility
+ // settings, display a message to that effect.
+ visibleItems = panelNode.all('.item,.index-item').some(function (itemNode) {
+ if (itemNode.getComputedStyle('display') !== 'none') {
+ return true;
+ }
+ });
+
+ panelNode.all('.no-visible-items').remove();
+
+ if (!visibleItems) {
+ if (Y.one('#index .index-item')) {
+ panelNode.append(
+ '' +
+ '' +
+ 'Some items are not shown due to the current visibility ' +
+ 'settings. Use the checkboxes at the upper right of this ' +
+ 'page to change the visibility settings.' +
+ '
' +
+ ''
+ );
+ } else {
+ panelNode.append(
+ '' +
+ '' +
+ 'This class doesn\'t provide any methods, properties, ' +
+ 'attributes, or events.' +
+ '
' +
+ ''
+ );
+ }
+ }
+
+ // Hide index sections without any visible items.
+ Y.all('.index-section').each(function (section) {
+ var items = 0,
+ visibleItems = 0;
+
+ section.all('.index-item').each(function (itemNode) {
+ items += 1;
+
+ if (itemNode.getComputedStyle('display') !== 'none') {
+ visibleItems += 1;
+ }
+ });
+
+ section.toggleClass('hidden', !visibleItems);
+ section.toggleClass('no-columns', visibleItems < 4);
+ });
+};
+
+pjax.initClassTabView = function () {
+ if (!Y.all('#classdocs .api-class-tab').size()) {
+ return;
+ }
+
+ if (classTabView) {
+ classTabView.destroy();
+ selectedTab = null;
+ }
+
+ classTabView = new Y.TabView({
+ srcNode: '#classdocs',
+
+ on: {
+ selectionChange: pjax.onTabSelectionChange
+ }
+ });
+
+ pjax.updateTabState();
+ classTabView.render();
+};
+
+pjax.initLineNumbers = function () {
+ var hash = win.location.hash.substring(1),
+ container = pjax.get('container'),
+ hasLines, node;
+
+ // Add ids for each line number in the file source view.
+ container.all('.linenums>li').each(function (lineNode, index) {
+ lineNode.set('id', 'l' + (index + 1));
+ lineNode.addClass('file-line');
+ hasLines = true;
+ });
+
+ // Scroll to the desired line.
+ if (hasLines && /^l\d+$/.test(hash)) {
+ if ((node = container.one('#' + hash))) {
+ win.scroll(0, node.getY());
+ }
+ }
+};
+
+pjax.initRoot = function () {
+ var terminators = /^(?:classes|files|modules)$/,
+ parts = pjax._getRoot().split('/'),
+ root = [],
+ i, len, part;
+
+ for (i = 0, len = parts.length; i < len; i += 1) {
+ part = parts[i];
+
+ if (part.match(terminators)) {
+ // Makes sure the path will end with a "/".
+ root.push('');
+ break;
+ }
+
+ root.push(part);
+ }
+
+ pjax.set('root', root.join('/'));
+};
+
+pjax.updateTabState = function (src) {
+ var hash = win.location.hash.substring(1),
+ defaultTab, node, tab, tabPanel;
+
+ function scrollToNode() {
+ if (node.hasClass('protected')) {
+ Y.one('#api-show-protected').set('checked', true);
+ pjax.updateVisibility();
+ }
+
+ if (node.hasClass('private')) {
+ Y.one('#api-show-private').set('checked', true);
+ pjax.updateVisibility();
+ }
+
+ setTimeout(function () {
+ // For some reason, unless we re-get the node instance here,
+ // getY() always returns 0.
+ var node = Y.one('#classdocs #' + hash);
+ win.scrollTo(0, node.getY() - 70);
+ }, 1);
+ }
+
+ if (!classTabView) {
+ return;
+ }
+
+ if (src === 'hashchange' && !hash) {
+ defaultTab = 'index';
+ } else {
+ if (localStorage) {
+ defaultTab = localStorage.getItem('tab_' + pjax.getPath()) ||
+ 'index';
+ } else {
+ defaultTab = 'index';
+ }
+ }
+
+ if (hash && (node = Y.one('#classdocs #' + hash))) {
+ if ((tabPanel = node.ancestor('.api-class-tabpanel', true))) {
+ if ((tab = Y.one('#classdocs .api-class-tab.' + tabPanel.get('id')))) {
+ if (classTabView.get('rendered')) {
+ Y.Widget.getByNode(tab).set('selected', 1);
+ } else {
+ tab.addClass('yui3-tab-selected');
+ }
+ }
+ }
+
+ // Scroll to the desired element if this is a hash URL.
+ if (node) {
+ if (classTabView.get('rendered')) {
+ scrollToNode();
+ } else {
+ classTabView.once('renderedChange', scrollToNode);
+ }
+ }
+ } else {
+ tab = Y.one('#classdocs .api-class-tab.' + defaultTab);
+
+ if (classTabView.get('rendered')) {
+ Y.Widget.getByNode(tab).set('selected', 1);
+ } else {
+ tab.addClass('yui3-tab-selected')
+ }
+ }
+};
+
+pjax.updateVisibility = function () {
+ var container = pjax.get('container');
+
+ container.toggleClass('hide-inherited',
+ !Y.one('#api-show-inherited').get('checked'));
+
+ container.toggleClass('show-deprecated',
+ Y.one('#api-show-deprecated').get('checked'));
+
+ container.toggleClass('show-protected',
+ Y.one('#api-show-protected').get('checked'));
+
+ container.toggleClass('show-private',
+ Y.one('#api-show-private').get('checked'));
+
+ pjax.checkVisibility();
+};
+
+// -- Route Handlers -----------------------------------------------------------
+
+pjax.handleClasses = function (req, res, next) {
+ pjax.onceAfter(['error', 'load'], function (e) {
+ if (e.type === 'pjax:load') {
+ pjax.initClassTabView();
+ }
+ });
+
+ next();
+};
+
+pjax.handleFiles = function (req, res, next) {
+ pjax.onceAfter(['error', 'load'], function (e) {
+ if (e.type === 'pjax:load') {
+ pjax.initLineNumbers();
+ }
+ });
+
+ next();
+};
+
+// -- Event Handlers -----------------------------------------------------------
+
+pjax.afterContent = function (e) {
+ // Enable syntax highlighting on the loaded content.
+ prettyPrint();
+
+ bdNode.removeClass('loading');
+};
+
+pjax.onNavigate = function (e) {
+ var hash = e.hash,
+ originTarget = e.originEvent && e.originEvent.target,
+ tab;
+
+ if (hash) {
+ tab = originTarget && originTarget.ancestor('.yui3-tab', true);
+
+ if (hash === win.location.hash) {
+ pjax.updateTabState('hashchange');
+ } else if (!tab) {
+ win.location.hash = hash;
+ }
+
+ e.preventDefault();
+ return;
+ }
+
+ // Only scroll to the top of the page when the URL doesn't have a hash.
+ this.set('scrollToTop', !e.url.match(/#.+$/));
+
+ bdNode.addClass('loading');
+};
+
+pjax.onOptionClick = function (e) {
+ pjax.updateVisibility();
+};
+
+pjax.onTabSelectionChange = function (e) {
+ var tab = e.newVal,
+ tabId = tab.get('contentBox').getAttribute('href').substring(1);
+
+ selectedTab = tab;
+
+ // If switching from a previous tab (i.e., this is not the default tab),
+ // replace the history entry with a hash URL that will cause this tab to
+ // be selected if the user navigates away and then returns using the back
+ // or forward buttons.
+ if (e.prevVal && localStorage) {
+ localStorage.setItem('tab_' + pjax.getPath(), tabId);
+ }
+
+ pjax.checkVisibility(tab);
+};
+
+// -- Init ---------------------------------------------------------------------
+
+pjax.on('navigate', pjax.onNavigate);
+pjax.after(['error', 'load'], pjax.afterContent);
+
+pjax.initRoot();
+pjax.initClassTabView();
+pjax.initLineNumbers();
+pjax.updateVisibility();
+pjax.upgrade();
+
+Y.APIList.rootPath = pjax.get('root');
+
+Y.one('#api-options').delegate('click', pjax.onOptionClick, 'input');
+
+Y.on('hashchange', function (e) {
+ pjax.updateTabState('hashchange');
+}, win);
+
+});
diff --git a/htdocs/js/lib/webwork/out/assets/js/tabs.js b/htdocs/js/lib/webwork/out/assets/js/tabs.js
new file mode 100644
index 000000000..77ab37c7f
--- /dev/null
+++ b/htdocs/js/lib/webwork/out/assets/js/tabs.js
@@ -0,0 +1,38 @@
+YUI({
+ insertBefore: 'site_styles'
+}).use('tabview', function(Y) {
+ var classdocs = Y.one('#classdocs'),
+ tabviewIndexTable = {};
+ if (classdocs) {
+ if (classdocs.all('li').size()) {
+ var tabview = new Y.TabView({ srcNode: classdocs });
+ tabview.render();
+ classdocs.all('li a').each(function (item, index) {
+ var hash = item.get(['hash']);
+ type = hash.substring(1);
+ if (!tabviewIndexTable[type]) {
+ tabviewIndexTable[type] = index;
+ }
+ })
+ Y.all('.sidebox.on-page').each(function (item, index) {
+ var children = item.all('li a');
+ children.each(function (cItem, cIndex) {
+ return function () {
+ var handleClick = function (e) {
+ var node = Y.one(this),
+ hash = node.get(['hash']),
+ hashValue = hash.substring(1).split('_'),
+ type = hashValue.shift(),
+ ogKey = hashValue.join('_'); // in case the hash had other underscores
+ if (tabviewIndexTable[type] > -1 && tabviewIndexTable[type] !== currentTab) {
+ currentTab = tabviewIndexTable[type];
+ tabview.selectChild(tabviewIndexTable[type]);
+ }
+ }
+ Y.on('click', handleClick, cItem)
+ }()
+ })
+ });
+ }
+ }
+});
diff --git a/htdocs/js/lib/webwork/out/assets/js/yui-prettify.js b/htdocs/js/lib/webwork/out/assets/js/yui-prettify.js
new file mode 100644
index 000000000..18de86495
--- /dev/null
+++ b/htdocs/js/lib/webwork/out/assets/js/yui-prettify.js
@@ -0,0 +1,17 @@
+YUI().use('node', function(Y) {
+ var code = Y.all('.prettyprint.linenums');
+ if (code.size()) {
+ code.each(function(c) {
+ var lis = c.all('ol li'),
+ l = 1;
+ lis.each(function(n) {
+ n.prepend('');
+ l++;
+ });
+ });
+ var h = location.hash;
+ location.hash = '';
+ h = h.replace('LINE_', 'LINENUM_');
+ location.hash = h;
+ }
+});
diff --git a/htdocs/js/lib/webwork/out/assets/vendor/prettify/CHANGES.html b/htdocs/js/lib/webwork/out/assets/vendor/prettify/CHANGES.html
new file mode 100644
index 000000000..b50b84149
--- /dev/null
+++ b/htdocs/js/lib/webwork/out/assets/vendor/prettify/CHANGES.html
@@ -0,0 +1,130 @@
+
+
+
+ Change Log
+
+
+ README
+
+ Known Issues
+
+ - Perl formatting is really crappy. Partly because the author is lazy and
+ partly because Perl is
+ hard to parse.
+
- On some browsers,
<code> elements with newlines in the text
+ which use CSS to specify white-space:pre will have the newlines
+ improperly stripped if the element is not attached to the document at the time
+ the stripping is done. Also, on IE 6, all newlines will be stripped from
+ <code> elements because of the way IE6 produces
+ innerHTML. Workaround: use <pre> for code with
+ newlines.
+
+
+ Change Log
+ 29 March 2007
+
+ - Added tests for PHP support
+ to address
+ issue 3.
+
- Fixed
+ bug:
prettyPrintOne was not halting. This was not
+ reachable through the normal entry point.
+ - Fixed
+ bug: recursing into a script block or PHP tag that was not properly
+ closed would not silently drop the content.
+ (test)
+
- Fixed
+ bug: was eating tabs
+ (test)
+
- Fixed entity handling so that the caveat
+
+ Caveats: please properly escape less-thans. x<y
+ instead of x<y, and use " instead of
+ " for string delimiters.
+
+ is no longer applicable.
+ - Added noisefree's C#
+ patch
+
- Added a distribution that has comments and
+ whitespace removed to reduce download size from 45.5kB to 12.8kB.
+
+ 4 Jul 2008
+
+ - Added language specific formatters that are triggered by the presence
+ of a
lang-<language-file-extension>
+ - Fixed bug: python handling of
'''string'''
+ - Fixed bug:
/ in regex [charsets] should not end regex
+
+ 5 Jul 2008
+
+ - Defined language extensions for Lisp and Lua
+
+ nocode spans to allow embedding of line
+ numbers and code annotations which should not be styled or otherwise
+ affect the tokenization of prettified code.
+ See the issue 22
+ testcase.
+ <code> blocks with embedded newlines.
+   instead of
+ so that the output works when embedded in XML.
+ Bug
+ 108.+<link href="prettify.css" type="text/css" rel="stylesheet" /> +<script type="text/javascript" src="prettify.js"></script>+
onload="prettyPrint()" to your
+ document's body tag.
+ Put code snippets in + <pre class="prettyprint">...</pre> + or <code class="prettyprint">...</code> + and it will automatically be pretty printed. + +
| The original + | Prettier + |
|---|---|
class Voila { +public: + // Voila + static const string VOILA = "Voila"; + + // will not interfere with embedded tags. +}+ + | class Voila { +public: + // Voila + static const string VOILA = "Voila"; + + // will not interfere with embedded tags. +}+ |
The comments in prettify.js are authoritative but the lexer + should work on a number of languages including C and friends, + Java, Python, Bash, SQL, HTML, XML, CSS, Javascript, and Makefiles. + It works passably on Ruby, PHP, VB, and Awk and a decent subset of Perl + and Ruby, but, because of commenting conventions, doesn't work on + Smalltalk, or CAML-like languages.
+ +LISPy languages are supported via an extension:
+ lang-lisp.js.
And similarly for
+ CSS,
+ Haskell,
+ Lua,
+ OCAML, SML, F#,
+ Visual Basic,
+ SQL,
+ Protocol Buffers, and
+ WikiText..
+
+
If you'd like to add an extension for your favorite language, please + look at src/lang-lisp.js and file an + issue including your language extension, and a testcase.
+ +You don't need to specify the language since prettyprint()
+ will guess. You can specify a language by specifying the language extension
+ along with the prettyprint class like so:
<pre class="prettyprint lang-html"> + The lang-* class specifies the language file extensions. + File extensions supported by default include + "bsh", "c", "cc", "cpp", "cs", "csh", "cyc", "cv", "htm", "html", + "java", "js", "m", "mxml", "perl", "pl", "pm", "py", "rb", "sh", + "xhtml", "xml", "xsl". +</pre>+ +
Yes. Prettifying obfuscated code is like putting lipstick on a pig + — i.e. outside the scope of this tool.
+ +It's been tested with IE 6, Firefox 1.5 & 2, and Safari 2.0.4. + Look at the test page to see if it + works in your browser.
+ +See the change log
+ +Apparently wordpress does "smart quoting" which changes close quotes. + This causes end quotes to not match up with open quotes. +
This breaks prettifying as well as copying and pasting of code samples. + See + WordPress's help center for info on how to stop smart quoting of code + snippets.
+ +You can use the linenums class to turn on line
+ numbering. If your code doesn't start at line number 1, you can
+ add a colon and a line number to the end of that class as in
+ linenums:52.
+
+
For example +
<pre class="prettyprint linenums:4" +>// This is line 4. +foo(); +bar(); +baz(); +boo(); +far(); +faz(); +<pre>+ produces +
// This is line 4. +foo(); +bar(); +baz(); +boo(); +far(); +faz(); ++ +
You can use the nocode class to identify a span of markup
+ that is not code.
+
<pre class=prettyprint> +int x = foo(); /* This is a comment <span class="nocode">This is not code</span> + Continuation of comment */ +int y = bar(); +</pre>+produces +
+int x = foo(); /* This is a comment This is not code
+ Continuation of comment */
+int y = bar();
+
+
+ For a more complete example see the issue22 + testcase.
+ +If you are calling prettyPrint via an event handler, wrap it in a function.
+ Instead of doing
+
+ addEventListener('load', prettyPrint, false);
+
+ wrap it in a closure like
+
+ addEventListener('load', function (event) { prettyPrint() }, false);
+
+ so that the browser does not pass an event object to prettyPrint which
+ will confuse it.
+
+ =0;){var e=p.indexOf(";",k);if(e>=0){var h=p.substring(k+3,e),g=10;if(h&&h.charAt(0)==="x"){h=h.substring(1);g=16}var s=parseInt(h,g);isNaN(s)||(p=p.substring(0,k)+String.fromCharCode(s)+p.substring(e+1))}}a=p.replace(ea,"<").replace(fa,">").replace(ga,"'").replace(ha,'"').replace(ia," ").replace(ja, +"&")}f.push(a);n+=a.length}}o={source:f.join(""),h:r};var v=o.source;b.source=v;b.c=0;b.g=o.h;Q(i,v)(b);$(b)}catch(w){if("console"in window)console.log(w&&w.stack?w.stack:w)}}var A="str",R="kwd",C="com",S="typ",J="lit",E="pun",z="pln",P="src",V="nocode",Z=function(){for(var b=["!","!=","!==","#","%","%=","&","&&","&&=","&=","(","*","*=","+=",",","-=","->","/","/=",":","::",";","<","<<","<<=","<=","=","==","===",">",">=",">>",">>=",">>>",">>>=","?","@","[","^","^=","^^","^^=","{","|","|=","||","||=", +"~","break","case","continue","delete","do","else","finally","instanceof","return","throw","try","typeof"],f="(?:^^|[+-]",i=0;i:&a-z])/g,"\\$1");f+=")\\s*";return f}(),L=/&/g,M=//g,X=/\"/g,ea=/</g,fa=/>/g,ga=/'/g,ha=/"/g,ja=/&/g,ia=/ /g,ka=/[\r\n]/g,K=null,aa=RegExp("[^<]+|