├── examples ├── style.css ├── index.html ├── example-new.html ├── example-basic.html ├── example-modal.html ├── utils.js └── example-embedded.html ├── test ├── lib │ ├── jasmine-3.1.0 │ │ ├── jasmine_favicon.png │ │ ├── boot.js │ │ ├── jasmine.css │ │ └── jasmine-html.js │ └── jquery.jasmine.js ├── eslint.json ├── spec │ ├── medea.helper.js │ ├── medea.events.js │ ├── medea.usage.js │ └── medea.core.js ├── helper │ └── medea.js └── index.html ├── vendor └── bootstrap │ ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.ttf │ ├── glyphicons-halflings-regular.woff │ └── glyphicons-halflings-regular.woff2 │ ├── js │ └── npm.js │ └── css │ ├── bootstrap-theme.min.css │ ├── bootstrap-theme.min.css.map │ └── bootstrap-theme.css ├── readme.md └── lib └── jquery.medea.js /examples/style.css: -------------------------------------------------------------------------------- 1 | 2 | label.editable { 3 | 4 | } 5 | 6 | .modal-dialog { 7 | width: 70%; 8 | } 9 | -------------------------------------------------------------------------------- /test/lib/jasmine-3.1.0/jasmine_favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/julianbrowne/medea/HEAD/test/lib/jasmine-3.1.0/jasmine_favicon.png -------------------------------------------------------------------------------- /vendor/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/julianbrowne/medea/HEAD/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/julianbrowne/medea/HEAD/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /vendor/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/julianbrowne/medea/HEAD/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /vendor/bootstrap/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/julianbrowne/medea/HEAD/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /test/eslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "jquery": true 5 | }, 6 | "rules": { 7 | "no-trailing-spaces": 0 8 | } 9 | } -------------------------------------------------------------------------------- /vendor/bootstrap/js/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /test/spec/medea.helper.js: -------------------------------------------------------------------------------- 1 | describe("Medea", function() { 2 | 3 | describe("Helper", function() { 4 | 5 | it("should create and remove an element", function() { 6 | medeaHelper.addTestContainer("test"); 7 | expect($("#test").length).toEqual(1); 8 | medeaHelper.removeTestContainer("test"); 9 | expect($("#test").length).toEqual(0); 10 | }); 11 | 12 | it("should clear bootstrap modals", function() { 13 | var modal = $("
").attr("class","modal"); 14 | $("body").append(modal); 15 | expect($(".modal").length).toEqual(1); 16 | medeaHelper.clearModals(); 17 | expect($(".modal").length).toEqual(0); 18 | }); 19 | 20 | }); 21 | 22 | }); 23 | -------------------------------------------------------------------------------- /examples/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Medea Examples 6 | 7 | 8 | 9 | 10 | 11 | 12 |

Examples

13 | 14 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /test/helper/medea.js: -------------------------------------------------------------------------------- 1 | var medeaHelper = { 2 | 3 | addTestContainer: function(id) { 4 | var container = $("
").attr("id",id); 5 | return $("body").append(container); 6 | }, 7 | 8 | removeTestContainer: function(id) { 9 | $("#"+id).remove(); 10 | }, 11 | 12 | clearModals: function() { 13 | $(".modal").remove(); 14 | $(".modal-backdrop").remove(); 15 | }, 16 | 17 | formLabel: function() { 18 | return $("div.form-group").find("label"); 19 | }, 20 | 21 | formInput: function() { 22 | return $("div.form-group").find("input.form-control"); 23 | }, 24 | 25 | matcher: function() { 26 | return { 27 | form: $("div.form-group"), 28 | firstInput: $("div.form-group").find("input.form-control").first(), 29 | allInputs: $("div.form-group").find("input.form-control"), 30 | firstLabel: $("div.form-group").find("label").first(), 31 | allLabels: $("div.form-group").find("label") 32 | } 33 | } 34 | 35 | }; 36 | -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Medea: Tests 6 | 7 | 8 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /examples/example-new.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Medea Example: New Object 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | examples 16 | 17 |

New Object Example

18 |

Create full object from scratch

19 | 20 |

Code

21 |
$(selector).medea({});
22 | 23 |
24 |
25 |

Source

26 |
27 |

Events

28 |
29 |
30 |
31 |

Form

32 |
33 |
34 |
35 | 36 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /examples/example-basic.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Medea Example: Basic 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | examples 16 | 17 |

Basic Example

18 |

Simplest use of medea: turn object into form and vv

19 | 20 |

Code

21 |
$(selector).medea(object);
22 | 23 |
24 |
25 |

Source

26 |
27 |

Events

28 |
29 |
30 |
31 |

Form

32 |
33 |
34 |
35 | 36 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /test/spec/medea.events.js: -------------------------------------------------------------------------------- 1 | describe("Medea", function() { 2 | 3 | describe("Events", function() { 4 | 5 | /** 6 | * @todo: 7 | * 8 | * medea.add with buttons 9 | * medea.add without buttons 10 | * medea.submit 11 | * medea.cancel 12 | * medea.toggle 13 | * 14 | **/ 15 | 16 | it("should respond to a 'medea.add' event", function() { 17 | medeaHelper.addTestContainer("test"); 18 | var container = $("#test"); 19 | container.medea({ abc: 123}); 20 | var match = medeaHelper.matcher(); 21 | expect($("form").length).toEqual(1); 22 | expect(match.allInputs.length).toEqual(1); 23 | // add 1 field 24 | container.trigger("medea.add"); 25 | var match = medeaHelper.matcher(); 26 | expect($("form").length).toEqual(1); 27 | expect(match.allInputs.length).toEqual(2); 28 | medeaHelper.removeTestContainer("test"); 29 | }); 30 | 31 | it("should fire 'medea.submit' event on form submit", function() { 32 | medeaHelper.addTestContainer("test"); 33 | var container = $("#test"); 34 | container.medea({ fieldOne: 55}); 35 | var form = $("form"); 36 | var spy = spyOnEvent(container, "medea.submit"); 37 | var submitHandler = jasmine.createSpy().and.returnValue(false); 38 | form.submit(submitHandler); 39 | form.trigger("submit"); 40 | expect("medea.submit").toHaveBeenTriggeredOn(container); 41 | expect(spy).toHaveBeenTriggered(); 42 | medeaHelper.removeTestContainer("test"); 43 | }); 44 | 45 | }); 46 | 47 | }); 48 | -------------------------------------------------------------------------------- /examples/example-modal.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Medea Example: Modal 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | examples 16 | 17 |

Modal Example

18 |

19 | Uses Bootstrap modal to render form 20 | 21 |

22 | 23 |

Code

24 |
$(selector).medea(obj, {modal: true});
25 | 26 |
27 |
28 |

Source

29 |
30 |

Events

31 |
32 |
33 |
34 |
35 |
36 |
37 | 38 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /examples/utils.js: -------------------------------------------------------------------------------- 1 | 2 | var utils = (function() { 3 | 4 | function prettyPrint(obj) { 5 | return JSON.stringify(obj, null, 2); 6 | } 7 | 8 | function parseEventName(e) { 9 | return e.type + ":" + e.namespace; 10 | } 11 | 12 | function prepContainerForCode(elementName) { 13 | var wrapper = $("#" + elementName); 14 | wrapper.append($("
"));
15 |         wrapper.find("pre").append($(""));
16 |         return wrapper;
17 |     }
18 | 
19 |     function findAndPrepTargetElement(elementName) { 
20 |         var wrapper = $("#" + elementName);
21 |         if(wrapper.find("pre").length === 0) { 
22 |             prepContainerForCode(elementName);
23 |         }
24 |         return wrapper.find("code");
25 |     }
26 | 
27 |     function logEvent(container) { 
28 |         var target = findAndPrepTargetElement(container);
29 |         return function(e) { 
30 |             target.append(parseEventName(e) + "\n");
31 |         }
32 |     }
33 | 
34 |     function logObjectChangeEvent(container) { 
35 |         var target = findAndPrepTargetElement(container);
36 |         return function(e, obj) { 
37 |             target.html(prettyPrint(obj));
38 |         }
39 |     }
40 | 
41 |     function prettyPrintSource(obj, container) { 
42 |         var target = findAndPrepTargetElement(container);
43 |         target.html(prettyPrint(obj));
44 |     }
45 | 
46 |     var simpleObject = { 
47 |         firstName: "John",
48 |         lastName: "Smith"
49 |     };
50 | 
51 |     var testObject = { 
52 |         name: { 
53 |             firstName: "John",
54 |             lastName: "Smith"
55 |         },
56 |         personal: { 
57 |             age: 42,
58 |             likesIceCream: true
59 |         },
60 |         hobbies: [ 
61 |             "football",
62 |             "golf"
63 |         ],
64 |         address: { 
65 |             road: { number: "1", street: "the street" },
66 |             town: "townington",
67 |             county: "Shireshire"
68 |         }
69 |     };
70 | 
71 |     return { 
72 |         logEvent: logEvent,
73 |         logObjectChangeEvent: logObjectChangeEvent,
74 |         prettyPrint: prettyPrint,
75 |         testObject: testObject,
76 |         simpleObject: simpleObject,
77 |         prettyPrintSource: prettyPrintSource
78 |     };
79 | 
80 | }());
81 | 


--------------------------------------------------------------------------------
/test/spec/medea.usage.js:
--------------------------------------------------------------------------------
 1 | describe("Medea", function() { 
 2 | 
 3 |     describe("Usage", function() { 
 4 | 
 5 |         it("should inject stylesheet once and only once", function() { 
 6 |             medeaHelper.addTestContainer("test");
 7 |             $("#test").medea({});
 8 |             expect($("#medea-style").length).toEqual(1);
 9 |             $("#test").medea({});
10 |             $("#test").medea({});
11 |             expect($("#medea-style").length).toEqual(1);
12 |             medeaHelper.removeTestContainer("test");
13 |         });
14 | 
15 |         it("should error if input is not an object", function() { 
16 |             expect(function() { $("body").medea(999); }).toThrow("not an object");
17 |         });
18 | 
19 |         it("should warn when no selection present", function() { 
20 |             medeaHelper.addTestContainer("test");
21 |             var spy = spyOn(console,"warn");
22 |             var obj = Medea.form2object("#nonexistent");
23 |             expect(obj).toEqual({});
24 |             expect(spy).toHaveBeenCalled();
25 |             medeaHelper.removeTestContainer("test");
26 |         });
27 | 
28 |         it("should warn when no inputs fields are present", function() { 
29 |             medeaHelper.addTestContainer("test");
30 |             $("#test").html("
"); 31 | var spy = spyOn(console,"warn"); 32 | var obj = Medea.form2object("#test"); 33 | expect(obj).toEqual({}); 34 | expect(spy).toHaveBeenCalled(); 35 | medeaHelper.removeTestContainer("test"); 36 | }); 37 | 38 | it("should map fields into parent element with existing form tag", function() { 39 | medeaHelper.addTestContainer("test"); 40 | var container = $("#test"); 41 | container.append($("
")); 42 | var spy = spyOn(console, "error"); 43 | $("#test form").medea({ one: { two: 55} }, {noForm: true}); 44 | expect($("#test form input").length).toEqual(2); 45 | expect(spy).not.toHaveBeenCalled(); 46 | medeaHelper.removeTestContainer("test"); 47 | }); 48 | 49 | it("should error if parent form tag is missing", function() { 50 | medeaHelper.addTestContainer("test"); 51 | var spy = spyOn(console, "error"); 52 | $("#test").medea({ one: { two: 55} }, {noForm: true}); 53 | expect($("#test form input").length).toEqual(0); 54 | expect(spy).toHaveBeenCalled(); 55 | medeaHelper.removeTestContainer("test"); 56 | }); 57 | 58 | }); 59 | 60 | }); 61 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | 2 | # Medea 3 | 4 | Medea loves JSON. Give Medea a JSON object, even one with nested objects, and it will be converted into an HTML form. The form allows fields in the object to be edited, or deleted, or for new ones to be created. The modified object is returned via the submit event. 5 | 6 | ## Installation 7 | 8 | If you have git installed, copy the repository into a local directory: 9 | 10 | git clone https://github.com/julianbrowne/medea.git 11 | 12 | Or fetch the zip file from ```https://github.com/julianbrowne/medea/archive/master.zip``` 13 | 14 | ## Usage 15 | 16 | Check out the bundled [examples](http://julianbrowne.github.io/medea/examples/index.html). 17 | 18 | Make sure you have jQuery and Medea included in your app: 19 | 20 | 21 | 22 | 23 | Using Medea is a simple as: 24 | 25 | $(jquery-selector).medea(object); 26 | 27 | Where ``jquery-selector`` is the identifier of a target container (e.g. div) on the page and ``object`` is the javascript or JSON object you wish to edit. 28 | 29 | For example: 30 | 31 | $("body").medea({hello: "world"}); 32 | 33 | The target element will emit a submit event when the form is submitted with the OK button. 34 | 35 | $(jquery-selector).on("medea.submit", function(updated-json-object) { 36 | // do something with updated-json-object here .. 37 | }); 38 | 39 | ## Events 40 | 41 | Events emitted: 42 | 43 | * ``medea.shown``: form rendered onto display 44 | * ``medea.submit``: form (or parent form) submitted 45 | * ``medea.cancel``: editing cancelled with cancel button 46 | * ``medea.add``: new field added 47 | * ``medea.remove``: existing field deleted 48 | 49 | "shown", "submit" and "cancel" events return the JSON object. 50 | 51 | ## Options 52 | 53 | Medea takes a number of options: 54 | 55 | $(selector).medea(object, options); 56 | 57 | ``options`` is an object with these fields: 58 | 59 | * ``removeOnSubmit`` - true/false: remove the created elements from the DOM when the form is submitted. Default is false. 60 | * ``buttons`` - Create save and cancel buttons for the form. Default is true. 61 | * ``labelColumns`` - Number of columns to use for the form labels. Medea uses bootstrap classes, so this just means that field LABEL tags will be classed with ``col-sm-{labelColumns}``. Default is 2. 62 | * ``inputColums`` - Number of colums to use for the div encapsulating form INPUT tags. Default is 10. 63 | * ``noForm`` - Replaces the FORM tag with a DIV tag. Useful if a form already exists in the DOM and the generated field sets are just to be inserted into it. Default is false. 64 | 65 | @todo 66 | 67 | modal 68 | modalId 69 | 70 | -------------------------------------------------------------------------------- /examples/example-embedded.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Medea Example: Embedded in Form 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | examples 16 | 17 |

Embedded Example

18 |

Existing form on the page. Medea object is embedded into the form which works as before

19 | 20 |

Code

21 |
$("#medea-here").medea(obj, { id: "formid", buttons: false, labelColumns: 2, inputColumns: 8, noForm: true })
22 | 23 |
24 |
25 |

Source

26 |
27 |

Events

28 |
29 |
30 |
31 |

Form

32 |
33 | 34 |
35 | 36 |
37 | 38 |
39 |
40 |
41 | 42 |
43 |
44 |
45 |
46 |
47 | 48 | 49 |
50 | 51 |
52 |
53 |
54 | 55 | 77 | 78 | -------------------------------------------------------------------------------- /test/lib/jasmine-3.1.0/boot.js: -------------------------------------------------------------------------------- 1 | /** 2 | Starting with version 2.0, this file "boots" Jasmine, performing all of the necessary initialization before executing the loaded environment and all of a project's specs. This file should be loaded after `jasmine.js` and `jasmine_html.js`, but before any project source files or spec files are loaded. Thus this file can also be used to customize Jasmine for a project. 3 | 4 | If a project is using Jasmine via the standalone distribution, this file can be customized directly. If a project is using Jasmine via the [Ruby gem][jasmine-gem], this file can be copied into the support directory via `jasmine copy_boot_js`. Other environments (e.g., Python) will have different mechanisms. 5 | 6 | The location of `boot.js` can be specified and/or overridden in `jasmine.yml`. 7 | 8 | [jasmine-gem]: http://github.com/pivotal/jasmine-gem 9 | */ 10 | 11 | (function() { 12 | 13 | /** 14 | * ## Require & Instantiate 15 | * 16 | * Require Jasmine's core files. Specifically, this requires and attaches all of Jasmine's code to the `jasmine` reference. 17 | */ 18 | window.jasmine = jasmineRequire.core(jasmineRequire); 19 | 20 | /** 21 | * Since this is being run in a browser and the results should populate to an HTML page, require the HTML-specific Jasmine code, injecting the same reference. 22 | */ 23 | jasmineRequire.html(jasmine); 24 | 25 | /** 26 | * Create the Jasmine environment. This is used to run all specs in a project. 27 | */ 28 | var env = jasmine.getEnv(); 29 | 30 | /** 31 | * ## The Global Interface 32 | * 33 | * Build up the functions that will be exposed as the Jasmine public interface. A project can customize, rename or alias any of these functions as desired, provided the implementation remains unchanged. 34 | */ 35 | var jasmineInterface = jasmineRequire.interface(jasmine, env); 36 | 37 | /** 38 | * Add all of the Jasmine global/public interface to the global scope, so a project can use the public interface directly. For example, calling `describe` in specs instead of `jasmine.getEnv().describe`. 39 | */ 40 | extend(window, jasmineInterface); 41 | 42 | /** 43 | * ## Runner Parameters 44 | * 45 | * More browser specific code - wrap the query string in an object and to allow for getting/setting parameters from the runner user interface. 46 | */ 47 | 48 | var queryString = new jasmine.QueryString({ 49 | getWindowLocation: function() { return window.location; } 50 | }); 51 | 52 | var filterSpecs = !!queryString.getParam("spec"); 53 | 54 | var stoppingOnSpecFailure = queryString.getParam("failFast"); 55 | env.stopOnSpecFailure(stoppingOnSpecFailure); 56 | 57 | var throwingExpectationFailures = queryString.getParam("throwFailures"); 58 | env.throwOnExpectationFailure(throwingExpectationFailures); 59 | 60 | var random = queryString.getParam("random"); 61 | 62 | if (random !== undefined && random !== "") { 63 | env.randomizeTests(random); 64 | } 65 | 66 | var seed = queryString.getParam("seed"); 67 | if (seed) { 68 | env.seed(seed); 69 | } 70 | 71 | /** 72 | * ## Reporters 73 | * The `HtmlReporter` builds all of the HTML UI for the runner page. This reporter paints the dots, stars, and x's for specs, as well as all spec names and all failures (if any). 74 | */ 75 | var htmlReporter = new jasmine.HtmlReporter({ 76 | env: env, 77 | navigateWithNewParam: function(key, value) { return queryString.navigateWithNewParam(key, value); }, 78 | addToExistingQueryString: function(key, value) { return queryString.fullStringWithNewParam(key, value); }, 79 | getContainer: function() { return document.body; }, 80 | createElement: function() { return document.createElement.apply(document, arguments); }, 81 | createTextNode: function() { return document.createTextNode.apply(document, arguments); }, 82 | timer: new jasmine.Timer(), 83 | filterSpecs: filterSpecs 84 | }); 85 | 86 | /** 87 | * The `jsApiReporter` also receives spec results, and is used by any environment that needs to extract the results from JavaScript. 88 | */ 89 | env.addReporter(jasmineInterface.jsApiReporter); 90 | env.addReporter(htmlReporter); 91 | 92 | /** 93 | * Filter which specs will be run by matching the start of the full name against the `spec` query param. 94 | */ 95 | var specFilter = new jasmine.HtmlSpecFilter({ 96 | filterString: function() { return queryString.getParam("spec"); } 97 | }); 98 | 99 | env.specFilter = function(spec) { 100 | return specFilter.matches(spec.getFullName()); 101 | }; 102 | 103 | /** 104 | * Setting up timing functions to be able to be overridden. Certain browsers (Safari, IE 8, phantomjs) require this hack. 105 | */ 106 | window.setTimeout = window.setTimeout; 107 | window.setInterval = window.setInterval; 108 | window.clearTimeout = window.clearTimeout; 109 | window.clearInterval = window.clearInterval; 110 | 111 | /** 112 | * ## Execution 113 | * 114 | * Replace the browser window's `onload`, ensure it's called, and then run all of the loaded specs. This includes initializing the `HtmlReporter` instance and then executing the loaded Jasmine environment. All of this will happen after all of the specs are loaded. 115 | */ 116 | var currentWindowOnload = window.onload; 117 | 118 | window.onload = function() { 119 | if (currentWindowOnload) { 120 | currentWindowOnload(); 121 | } 122 | htmlReporter.initialize(); 123 | env.execute(); 124 | }; 125 | 126 | /** 127 | * Helper function for readability above. 128 | */ 129 | function extend(destination, source) { 130 | for (var property in source) destination[property] = source[property]; 131 | return destination; 132 | } 133 | 134 | }()); 135 | -------------------------------------------------------------------------------- /test/spec/medea.core.js: -------------------------------------------------------------------------------- 1 | 2 | describe("Medea", function() { 3 | 4 | describe("Basics", function() { 5 | 6 | it("should have jQuery available", function() { 7 | expect(jQuery).toBeDefined(); 8 | }); 9 | 10 | it("should exist", function() { 11 | expect(jQuery.fn.medea).toBeDefined(); 12 | expect(Medea).toBeDefined(); 13 | }); 14 | 15 | }); 16 | 17 | describe("Utilities", function() { 18 | 19 | it("should turn an empty object into an empty form", function() { 20 | medeaHelper.addTestContainer("test"); 21 | $("#test").medea({}); 22 | expect($("#test form").length).toEqual(1); 23 | medeaHelper.removeTestContainer("test"); 24 | }); 25 | 26 | it("should clean up camelCase", function() { 27 | var before = "myCamelCaseLabel"; 28 | Medea.regularCase(before); 29 | expect(Medea.regularCase(before)).toEqual("My Camel Case Label"); 30 | }); 31 | 32 | it("should convert primitives to fields", function() { 33 | function makeField(value, name) { 34 | return $(Medea.primToField(value, name)).find("input"); 35 | }; 36 | var f = makeField(9, "nine"); 37 | expect(f.val()).toEqual("9"); 38 | expect(f.attr("type")).toEqual("number"); 39 | expect(f.attr("name")).toEqual("nine"); 40 | 41 | var f = makeField("abc", "str"); 42 | expect(f.val()).toEqual("abc"); 43 | expect(f.attr("type")).toEqual("text"); 44 | expect(f.attr("name")).toEqual("str"); 45 | 46 | var f = makeField(true, "tf"); 47 | expect(f.val()).toEqual("true"); 48 | expect(f.attr("type")).toEqual("checkbox"); 49 | expect(f.attr("name")).toEqual("tf"); 50 | }); 51 | 52 | it("should determine integerness", function() { 53 | expect(Medea.isInteger(1)).toBe(true); 54 | expect(Medea.isInteger(11.9)).toBe(false); 55 | expect(Medea.isInteger("blah")).toBe(false); 56 | }); 57 | 58 | }); 59 | 60 | describe("HTML", function() { 61 | 62 | it("should make a button", function() { 63 | var btnHTML = Medea.button("plus")[0].outerHTML; 64 | expect(btnHTML).toEqual(''); 65 | }); 66 | 67 | it("should make an icon", function() { 68 | var iconHTML = Medea.icon("plus", function() {})[0].outerHTML; 69 | expect(iconHTML).toEqual(''); 70 | }); 71 | 72 | it("should generate form field names", function() { 73 | expect(Medea.generateFieldName("a", "b")).toEqual("b.a"); 74 | expect(Medea.generateFieldName(99, "b")).toEqual("b[99]"); 75 | }); 76 | 77 | it("should make a number form", function() { 78 | medeaHelper.addTestContainer("test"); 79 | $("#test").medea({ num: 999 }); 80 | expect(medeaHelper.formLabel().html()).toEqual("Num"); 81 | expect(medeaHelper.formInput().attr("type")).toEqual("number"); 82 | expect(medeaHelper.formInput().attr("data-json-type")).toEqual("number"); 83 | expect(medeaHelper.formInput().val()).toEqual("999"); 84 | medeaHelper.removeTestContainer("test"); 85 | }); 86 | 87 | it("should make a string form", function() { 88 | medeaHelper.addTestContainer("test"); 89 | $("#test").medea({ text: "abc" }); 90 | expect(medeaHelper.formLabel().html()).toEqual("Text"); 91 | expect(medeaHelper.formInput().attr("type")).toEqual("text"); 92 | expect(medeaHelper.formInput().attr("data-json-type")).toEqual("string"); 93 | expect(medeaHelper.formInput().val()).toEqual("abc"); 94 | medeaHelper.removeTestContainer("test"); 95 | }); 96 | 97 | it("should make a boolean form", function() { 98 | medeaHelper.addTestContainer("test"); 99 | $("#test").medea({ amIRight: true }); 100 | expect(medeaHelper.formLabel().html()).toEqual("Am I Right"); 101 | expect(medeaHelper.formInput().attr("type")).toEqual("checkbox"); 102 | expect(medeaHelper.formInput().attr("data-json-type")).toEqual("boolean"); 103 | expect(medeaHelper.formInput().val()).toEqual("true"); 104 | medeaHelper.removeTestContainer("test"); 105 | }); 106 | 107 | it("should make an array form", function() { 108 | medeaHelper.addTestContainer("test"); 109 | var list = ["a","b","c"]; 110 | $("#test").medea({list: list}); 111 | expect(medeaHelper.formLabel().html()).toEqual("List[0]"); 112 | expect(medeaHelper.formInput().length).toEqual(3); 113 | expect(medeaHelper.formInput().attr("type")).toEqual("text"); 114 | expect(medeaHelper.formInput().attr("data-json-type")).toEqual("string"); 115 | medeaHelper.formInput().each(function(index) { 116 | expect($(this).val()).toEqual(list[index]); 117 | }); 118 | medeaHelper.removeTestContainer("test"); 119 | }); 120 | 121 | it("should make a dynamic input field", function() { 122 | 123 | medeaHelper.addTestContainer("test"); 124 | var input = Medea.dynamicInputElement("name", "bob", "text"); 125 | $("#test").append(input); 126 | 127 | var inputField = $("#test input.form-control[type=text]"); 128 | expect(inputField.length).toEqual(1); 129 | expect(inputField.val()).toEqual("bob"); 130 | 131 | // should have three buttons: toggler, delete, duplicate 132 | var buttons = $("div.input-group-addon"); 133 | expect(buttons.length).toEqual(3); 134 | 135 | // toggle to a checkbox 136 | var toggleButton=$("span.glyphicon-refresh"); 137 | toggleButton.trigger("click"); 138 | var oldInputField = $("#test input.form-control[type=text]"); 139 | var newInputField = $("#test input.form-control[type=checkbox]"); 140 | expect(oldInputField.length).toEqual(0); 141 | expect(newInputField.length).toEqual(1); 142 | 143 | medeaHelper.removeTestContainer("test"); 144 | }); 145 | 146 | it("should handle multi-level form elements", function() { 147 | medeaHelper.addTestContainer("test"); 148 | $("#test").medea({ top: 10, level: { sub: "abc" } }); 149 | var match = medeaHelper.matcher(); 150 | // top level keys 151 | expect(match.firstLabel.html()).toEqual("Top"); 152 | expect(match.firstInput.val()).toEqual("10"); 153 | expect(match.allInputs.length).toEqual(2); 154 | expect(match.allLabels.length).toEqual(2); 155 | // next level keys 156 | expect(match.allLabels.last().html()).toEqual("Sub"); 157 | expect(match.allInputs.last().val()).toEqual("abc"); 158 | medeaHelper.removeTestContainer("test"); 159 | }); 160 | 161 | it("should have add, cancel and ok buttons", function() { 162 | medeaHelper.addTestContainer("test"); 163 | $("#test").medea({}); 164 | expect($("#test button").length).toEqual(3); 165 | medeaHelper.removeTestContainer("test"); 166 | }); 167 | 168 | }); 169 | 170 | describe("Modals", function() { 171 | 172 | it("should throw modalise dependecy errors", function() { 173 | medeaHelper.addTestContainer("test"); 174 | var spy = spyOn(console,"error"); 175 | var savedModal = $.extend({}, { fn: jQuery.fn.modal }); 176 | jQuery.fn.modal = undefined; 177 | $("#test").medea({}, {modal: true}); 178 | expect($("div.modal-dialog").length).toEqual(0); 179 | expect(spy).toHaveBeenCalled(); 180 | jQuery.fn.modal = savedModal.fn; 181 | medeaHelper.removeTestContainer("test"); 182 | }); 183 | 184 | it("should modalise", function() { 185 | medeaHelper.addTestContainer("test"); 186 | $("#test").medea({}, {modal: true}); 187 | expect($("div.modal-dialog").length).toEqual(1); 188 | expect($("#test").length).toEqual(1); 189 | expect($("#medea-modal").length).toEqual(0); 190 | medeaHelper.clearModals(); 191 | }); 192 | 193 | }); 194 | 195 | describe("Conversion", function() { 196 | 197 | it("should convert string form field to json", function() { 198 | medeaHelper.addTestContainer("test"); 199 | $("#test").html("
"); 200 | var obj = Medea.form2object("form"); 201 | expect(obj).toEqual({ iceCream: "99" }); 202 | medeaHelper.removeTestContainer("test"); 203 | }); 204 | 205 | it("should convert integer form field to json", function() { 206 | medeaHelper.addTestContainer("test"); 207 | $("#test").html("
"); 208 | var obj = Medea.form2object("form"); 209 | expect(obj).toEqual({ iceCream: 99 }); 210 | medeaHelper.removeTestContainer("test"); 211 | }); 212 | 213 | it("should convert array form field to json", function() { 214 | medeaHelper.addTestContainer("test"); 215 | $("#test").html("
"); 216 | var obj = Medea.form2object("form"); 217 | expect(obj).toEqual({ hobbies: ["tennis", "running"] }); 218 | medeaHelper.removeTestContainer("test"); 219 | }); 220 | 221 | it("should convert float form field to json", function() { 222 | medeaHelper.addTestContainer("test"); 223 | $("#test").html("
"); 224 | var obj = Medea.form2object("form"); 225 | expect(obj).toEqual({ pi: 3.14159 }); 226 | medeaHelper.removeTestContainer("test"); 227 | }); 228 | 229 | it("should convert boolean form field to json", function() { 230 | medeaHelper.addTestContainer("test"); 231 | $("#test").html("
"); 232 | var obj = Medea.form2object("form"); 233 | expect(obj).toEqual({ theCatIsDead: true }); 234 | medeaHelper.removeTestContainer("test"); 235 | }); 236 | 237 | it("should convert multi boolean form field to json", function() { 238 | medeaHelper.addTestContainer("test"); 239 | $("#test").html("
\ 240 | \ 241 | \ 242 |
"); 243 | var obj = Medea.form2object("form"); 244 | expect(obj).toEqual({ theCatIsAlive: true, theCatIsDead: false }); 245 | medeaHelper.removeTestContainer("test"); 246 | }); 247 | 248 | }); 249 | 250 | describe("Options", function() { 251 | 252 | it("should respect 'buttons' option", function() { 253 | medeaHelper.addTestContainer("test"); 254 | $("#test").medea({}); 255 | expect($("#test button").length).toEqual(3); 256 | medeaHelper.removeTestContainer("test"); 257 | medeaHelper.addTestContainer("test"); 258 | $("#test").medea({}, {buttons: false}); 259 | expect($("#test button").length).toEqual(0); 260 | medeaHelper.removeTestContainer("test"); 261 | }); 262 | 263 | it("should respect 'id' option", function() { 264 | medeaHelper.addTestContainer("test"); 265 | $("#test").medea({}, {id: "sumner"}); 266 | expect($("#sumner").length).toEqual(1); 267 | medeaHelper.removeTestContainer("test"); 268 | }); 269 | 270 | it("should respect 'labelColumns' option", function() { 271 | medeaHelper.addTestContainer("test"); 272 | $("#test").medea({ 273 | testValue: 10 274 | }, 275 | { 276 | id: "sumner", 277 | labelColumns: 3 278 | }); 279 | expect($("#sumner label").hasClass("col-sm-3")).toEqual(true); 280 | medeaHelper.removeTestContainer("test"); 281 | }); 282 | 283 | it("should respect 'inputColumns' option", function() { 284 | medeaHelper.addTestContainer("test"); 285 | $("#test").medea({ 286 | testValue: 10 287 | }, 288 | { 289 | id: "sumner", 290 | inputColumns: 8 291 | }); 292 | expect($("#sumner div.form-group div").hasClass("col-sm-8")).toEqual(true); 293 | medeaHelper.removeTestContainer("test"); 294 | }); 295 | 296 | it("should respect 'noForm' option", function() { 297 | medeaHelper.addTestContainer("test"); 298 | $("#test").append($("
")); 299 | $("#test form").medea({testValue: 10}, {noForm: true}); 300 | expect($("form").length).toEqual(1); 301 | medeaHelper.removeTestContainer("test"); 302 | }); 303 | 304 | }); 305 | 306 | describe("Interactions", function() { 307 | 308 | it("should delete a form field", function() { 309 | medeaHelper.addTestContainer("test"); 310 | var field = Medea.inputGroup("abc", 99, "text"); 311 | $("#test").html(field); 312 | var input = $("#test").find("input"); 313 | expect(input.length).toEqual(1); 314 | var button = $("#test").find("span.glyphicon-trash"); 315 | expect(button.length).toEqual(1); 316 | button.trigger("click"); 317 | var deleted = $("#test").find("span.glyphicon-trash"); 318 | expect(deleted.length).toEqual(0); 319 | input = $("#test").find("input"); 320 | expect(input.length).toEqual(0); 321 | medeaHelper.removeTestContainer("test"); 322 | }); 323 | 324 | it("should not submit form when enter key pressed", function() { 325 | medeaHelper.addTestContainer("test"); 326 | $("#test").medea({ fieldOne: 12345}); 327 | var spy = spyOnEvent($("#test"), "medea.submit"); 328 | expect($("input").length).toEqual(2); 329 | var e = jQuery.Event( "keypress", { keyCode: 13 } ); 330 | $("input").trigger(e); 331 | expect("medea.submit").not.toHaveBeenTriggeredOn($("#test")); 332 | expect(spy).not.toHaveBeenTriggered(); 333 | medeaHelper.removeTestContainer("test"); 334 | }); 335 | 336 | it("should process whole of parent form when noForm used", function(done) { 337 | medeaHelper.addTestContainer("test"); 338 | var container = $("#test"); 339 | container.append($("")); 340 | $("form").append('
'); 341 | $("form").append('
'); 342 | $("form").append('
'); 343 | $("form").append('
'); 344 | $("form").append('
'); 345 | var medeaContent = $("#insertion-point"); 346 | medeaContent.medea({ three: 3, four: 4}, {noForm: true}); 347 | medeaContent.on("medea.submit", function(e, data) { 348 | expect(data.one).toEqual(1); 349 | expect(data.two).toEqual(2); 350 | expect(data.three).toEqual(3); 351 | expect(data.four).toEqual(4); 352 | done(); 353 | }); 354 | $("form").trigger("submit"); 355 | medeaHelper.removeTestContainer("test"); 356 | }); 357 | 358 | }); 359 | 360 | }); 361 | -------------------------------------------------------------------------------- /test/lib/jasmine-3.1.0/jasmine.css: -------------------------------------------------------------------------------- 1 | body { overflow-y: scroll; } 2 | 3 | .jasmine_html-reporter { background-color: #eee; padding: 5px; margin: -8px; font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333; } 4 | .jasmine_html-reporter a { text-decoration: none; } 5 | .jasmine_html-reporter a:hover { text-decoration: underline; } 6 | .jasmine_html-reporter p, .jasmine_html-reporter h1, .jasmine_html-reporter h2, .jasmine_html-reporter h3, .jasmine_html-reporter h4, .jasmine_html-reporter h5, .jasmine_html-reporter h6 { margin: 0; line-height: 14px; } 7 | .jasmine_html-reporter .jasmine-banner, .jasmine_html-reporter .jasmine-symbol-summary, .jasmine_html-reporter .jasmine-summary, .jasmine_html-reporter .jasmine-result-message, .jasmine_html-reporter .jasmine-spec .jasmine-description, .jasmine_html-reporter .jasmine-spec-detail .jasmine-description, .jasmine_html-reporter .jasmine-alert .jasmine-bar, .jasmine_html-reporter .jasmine-stack-trace { padding-left: 9px; padding-right: 9px; } 8 | .jasmine_html-reporter .jasmine-banner { position: relative; } 9 | .jasmine_html-reporter .jasmine-banner .jasmine-title { background: url('data:image/png;base64,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') no-repeat; background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iNjgxLjk2MjUyIgogICBoZWlnaHQ9IjE4Ny41IgogICBpZD0ic3ZnMiIKICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhOCI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczYiPjxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoMTgiPjxwYXRoCiAgICAgICAgIGQ9Ik0gMCwxNTAwIDAsMCBsIDU0NTUuNzQsMCAwLDE1MDAgTCAwLDE1MDAgeiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgaWQ9InBhdGgyMCIgLz48L2NsaXBQYXRoPjwvZGVmcz48ZwogICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMjUsMCwwLC0xLjI1LDAsMTg3LjUpIgogICAgIGlkPSJnMTAiPjxnCiAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuMSwwLjEpIgogICAgICAgaWQ9ImcxMiI+PGcKICAgICAgICAgaWQ9ImcxNCI+PGcKICAgICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxOCkiCiAgICAgICAgICAgaWQ9ImcxNiI+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTU0NCw1OTkuNDM0IGMgMC45MiwtNDAuMzUyIDI1LjY4LC04MS42MDIgNzEuNTMsLTgxLjYwMiAyNy41MSwwIDQ3LjY4LDEyLjgzMiA2MS40NCwzNS43NTQgMTIuODMsMjIuOTMgMTIuODMsNTYuODUyIDEyLjgzLDgyLjUyNyBsIDAsMzI5LjE4NCAtNzEuNTIsMCAwLDEwNC41NDMgMjY2LjgzLDAgMCwtMTA0LjU0MyAtNzAuNiwwIDAsLTM0NC43NyBjIDAsLTU4LjY5MSAtMy42OCwtMTA0LjUzMSAtNDQuOTMsLTE1Mi4yMTggLTM2LjY4LC00Mi4xOCAtOTYuMjgsLTY2LjAyIC0xNTMuMTQsLTY2LjAyIC0xMTcuMzcsMCAtMjA3LjI0LDc3Ljk0MSAtMjAyLjY0LDE5Ny4xNDUgbCAxMzAuMiwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMjIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDIzMDEuNCw2NjIuNjk1IGMgMCw4MC43MDMgLTY2Ljk0LDE0NS44MTMgLTE0Ny42MywxNDUuODEzIC04My40NCwwIC0xNDcuNjMsLTY4Ljc4MSAtMTQ3LjYzLC0xNTEuMzAxIDAsLTc5Ljc4NSA2Ni45NCwtMTQ1LjgwMSAxNDUuOCwtMTQ1LjgwMSA4NC4zNSwwIDE0OS40Niw2Ny44NTIgMTQ5LjQ2LDE1MS4yODkgeiBtIC0xLjgzLC0xODEuNTQ3IGMgLTM1Ljc3LC01NC4wOTcgLTkzLjUzLC03OC44NTkgLTE1Ny43MiwtNzguODU5IC0xNDAuMywwIC0yNTEuMjQsMTE2LjQ0OSAtMjUxLjI0LDI1NC45MTggMCwxNDIuMTI5IDExMy43LDI2MC40MSAyNTYuNzQsMjYwLjQxIDYzLjI3LDAgMTE4LjI5LC0yOS4zMzYgMTUyLjIyLC04Mi41MjMgbCAwLDY5LjY4NyAxNzUuMTQsMCAwLC0xMDQuNTI3IC02MS40NCwwIDAsLTI4MC41OTggNjEuNDQsMCAwLC0xMDQuNTI3IC0xNzUuMTQsMCAwLDY2LjAxOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAyNjIyLjMzLDU1Ny4yNTggYyAzLjY3LC00NC4wMTYgMzMuMDEsLTczLjM0OCA3OC44NiwtNzMuMzQ4IDMzLjkzLDAgNjYuOTMsMjMuODI0IDY2LjkzLDYwLjUwNCAwLDQ4LjYwNiAtNDUuODQsNTYuODU2IC04My40NCw2Ni45NDEgLTg1LjI4LDIyLjAwNCAtMTc4LjgxLDQ4LjYwNiAtMTc4LjgxLDE1NS44NzkgMCw5My41MzYgNzguODYsMTQ3LjYzMyAxNjUuOTgsMTQ3LjYzMyA0NCwwIDgzLjQzLC05LjE3NiAxMTAuOTQsLTQ0LjAwOCBsIDAsMzMuOTIyIDgyLjUzLDAgMCwtMTMyLjk2NSAtMTA4LjIxLDAgYyAtMS44MywzNC44NTYgLTI4LjQyLDU3Ljc3NCAtNjMuMjYsNTcuNzc0IC0zMC4yNiwwIC02Mi4zNSwtMTcuNDIyIC02Mi4zNSwtNTEuMzQ4IDAsLTQ1Ljg0NyA0NC45MywtNTUuOTMgODAuNjksLTY0LjE4IDg4LjAyLC0yMC4xNzUgMTgyLjQ3LC00Ny42OTUgMTgyLjQ3LC0xNTcuNzM0IDAsLTk5LjAyNyAtODMuNDQsLTE1NC4wMzkgLTE3NS4xMywtMTU0LjAzOSAtNDkuNTMsMCAtOTQuNDYsMTUuNTgyIC0xMjYuNTUsNTMuMTggbCAwLC00MC4zNCAtODUuMjcsMCAwLDE0Mi4xMjkgMTE0LjYyLDAiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGgyNiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjk4OC4xOCw4MDAuMjU0IC02My4yNiwwIDAsMTA0LjUyNyAxNjUuMDUsMCAwLC03My4zNTUgYyAzMS4xOCw1MS4zNDcgNzguODYsODUuMjc3IDE0MS4yMSw4NS4yNzcgNjcuODUsMCAxMjQuNzEsLTQxLjI1OCAxNTIuMjEsLTEwMi42OTkgMjYuNiw2Mi4zNTEgOTIuNjIsMTAyLjY5OSAxNjAuNDcsMTAyLjY5OSA1My4xOSwwIDEwNS40NiwtMjIgMTQxLjIxLC02Mi4zNTEgMzguNTIsLTQ0LjkzOCAzOC41MiwtOTMuNTMyIDM4LjUyLC0xNDkuNDU3IGwgMCwtMTg1LjIzOSA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40MiwwIDAsMTA0LjUyNyA2My4yOCwwIDAsMTU3LjcxNSBjIDAsMzIuMTAyIDAsNjAuNTI3IC0xNC42Nyw4OC45NTcgLTE4LjM0LDI2LjU4MiAtNDguNjEsNDAuMzQ0IC03OS43Nyw0MC4zNDQgLTMwLjI2LDAgLTYzLjI4LC0xMi44NDQgLTgyLjUzLC0zNi42NzIgLTIyLjkzLC0yOS4zNTUgLTIyLjkzLC01Ni44NjMgLTIyLjkzLC05Mi42MjkgbCAwLC0xNTcuNzE1IDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM4LjQxLDAgMCwxMDQuNTI3IDYzLjI4LDAgMCwxNTAuMzgzIGMgMCwyOS4zNDggMCw2Ni4wMjMgLTE0LjY3LDkxLjY5OSAtMTUuNTksMjkuMzM2IC00Ny42OSw0NC45MzQgLTgwLjcsNDQuOTM0IC0zMS4xOCwwIC01Ny43NywtMTEuMDA4IC03Ny45NCwtMzUuNzc0IC0yNC43NywtMzAuMjUzIC0yNi42LC02Mi4zNDMgLTI2LjYsLTk5Ljk0MSBsIDAsLTE1MS4zMDEgNjMuMjcsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNiwwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAzOTk4LjY2LDk1MS41NDcgLTExMS44NywwIDAsMTE4LjI5MyAxMTEuODcsMCAwLC0xMTguMjkzIHogbSAwLC00MzEuODkxIDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM5LjMzLDAgMCwxMDQuNTI3IDY0LjE5LDAgMCwyODAuNTk4IC02My4yNywwIDAsMTA0LjUyNyAxNzUuMTQsMCAwLC0zODUuMTI1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDQxNTkuMTIsODAwLjI1NCAtNjMuMjcsMCAwLDEwNC41MjcgMTc1LjE0LDAgMCwtNjkuNjg3IGMgMjkuMzUsNTQuMTAxIDg0LjM2LDgwLjY5OSAxNDQuODcsODAuNjk5IDUzLjE5LDAgMTA1LjQ1LC0yMi4wMTYgMTQxLjIyLC02MC41MjcgNDAuMzQsLTQ0LjkzNCA0MS4yNiwtODguMDMyIDQxLjI2LC0xNDMuOTU3IGwgMCwtMTkxLjY1MyA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40LDAgMCwxMDQuNTI3IDYzLjI2LDAgMCwxNTguNjM3IGMgMCwzMC4yNjIgMCw2MS40MzQgLTE5LjI2LDg4LjAzNSAtMjAuMTcsMjYuNTgyIC01My4xOCwzOS40MTQgLTg2LjE5LDM5LjQxNCAtMzMuOTMsMCAtNjguNzcsLTEzLjc1IC04OC45NCwtNDEuMjUgLTIxLjA5LC0yNy41IC0yMS4wOSwtNjkuNjg3IC0yMS4wOSwtMTAyLjcwNyBsIDAsLTE0Mi4xMjkgNjMuMjYsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNywwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDMyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA1MDgyLjQ4LDcwMy45NjUgYyAtMTkuMjQsNzAuNjA1IC04MS42LDExNS41NDcgLTE1NC4wNCwxMTUuNTQ3IC02Ni4wNCwwIC0xMjkuMywtNTEuMzQ4IC0xNDMuMDUsLTExNS41NDcgbCAyOTcuMDksMCB6IG0gODUuMjcsLTE0NC44ODMgYyAtMzguNTEsLTkzLjUyMyAtMTI5LjI3LC0xNTYuNzkzIC0yMzEuMDUsLTE1Ni43OTMgLTE0My4wNywwIC0yNTcuNjgsMTExLjg3MSAtMjU3LjY4LDI1NS44MzYgMCwxNDQuODgzIDEwOS4xMiwyNjEuMzI4IDI1NC45MSwyNjEuMzI4IDY3Ljg3LDAgMTM1LjcyLC0zMC4yNTggMTgzLjM5LC03OC44NjMgNDguNjIsLTUxLjM0NCA2OC43OSwtMTEzLjY5NSA2OC43OSwtMTgzLjM4MyBsIC0zLjY3LC0zOS40MzQgLTM5Ni4xMywwIGMgMTQuNjcsLTY3Ljg2MyA3Ny4wMywtMTE3LjM2MyAxNDYuNzIsLTExNy4zNjMgNDguNTksMCA5MC43NiwxOC4zMjggMTE4LjI4LDU4LjY3MiBsIDExNi40NCwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDY5MC44OTUsODUwLjcwMyA5MC43NSwwIDIyLjU0MywzMS4wMzUgMCwyNDMuMTIyIC0xMzUuODI5LDAgMCwtMjQzLjE0MSAyMi41MzYsLTMxLjAxNiIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDM2IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA2MzIuMzk1LDc0Mi4yNTggMjguMDM5LDg2LjMwNCAtMjIuNTUxLDMxLjA0IC0yMzEuMjIzLDc1LjEyOCAtNDEuOTc2LC0xMjkuMTgzIDIzMS4yNTcsLTc1LjEzNyAzNi40NTQsMTEuODQ4IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDcxNy40NDksNjUzLjEwNSAtNzMuNDEsNTMuMzYgLTM2LjQ4OCwtMTEuODc1IC0xNDIuOTAzLC0xOTYuNjkyIDEwOS44ODMsLTc5LjgyOCAxNDIuOTE4LDE5Ni43MDMgMCwzOC4zMzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0MCIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gODI4LjUyLDcwNi40NjUgLTczLjQyNiwtNTMuMzQgMC4wMTEsLTM4LjM1OSBMIDg5OC4wMDQsNDE4LjA3IDEwMDcuOSw0OTcuODk4IDg2NC45NzMsNjk0LjYwOSA4MjguNTIsNzA2LjQ2NSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA4MTIuMDg2LDgyOC41ODYgMjguMDU1LC04Ni4zMiAzNi40ODQsLTExLjgzNiAyMzEuMjI1LDc1LjExNyAtNDEuOTcsMTI5LjE4MyAtMjMxLjIzOSwtNzUuMTQgLTIyLjU1NSwtMzEuMDA0IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNDQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDczNi4zMDEsMTMzNS44OCBjIC0zMjMuMDQ3LDAgLTU4NS44NzUsLTI2Mi43OCAtNTg1Ljg3NSwtNTg1Ljc4MiAwLC0zMjMuMTE4IDI2Mi44MjgsLTU4NS45NzcgNTg1Ljg3NSwtNTg1Ljk3NyAzMjMuMDE5LDAgNTg1LjgwOSwyNjIuODU5IDU4NS44MDksNTg1Ljk3NyAwLDMyMy4wMDIgLTI2Mi43OSw1ODUuNzgyIC01ODUuODA5LDU4NS43ODIgbCAwLDAgeiBtIDAsLTExOC42MSBjIDI1Ny45NzIsMCA0NjcuMTg5LC0yMDkuMTMgNDY3LjE4OSwtNDY3LjE3MiAwLC0yNTguMTI5IC0yMDkuMjE3LC00NjcuMzQ4IC00NjcuMTg5LC00NjcuMzQ4IC0yNTguMDc0LDAgLTQ2Ny4yNTQsMjA5LjIxOSAtNDY3LjI1NCw0NjcuMzQ4IDAsMjU4LjA0MiAyMDkuMTgsNDY3LjE3MiA0NjcuMjU0LDQ2Ny4xNzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0NiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTA5MS4xMyw2MTkuODgzIC0xNzUuNzcxLDU3LjEyMSAxMS42MjksMzUuODA4IDE3NS43NjIsLTU3LjEyMSAtMTEuNjIsLTM1LjgwOCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQ4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA4NjYuOTU3LDkwMi4wNzQgODM2LjUsOTI0LjE5OSA5NDUuMTIxLDEwNzMuNzMgOTc1LjU4NiwxMDUxLjYxIDg2Ni45NTcsOTAyLjA3NCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDUwIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA2MDcuNDY1LDkwMy40NDUgNDk4Ljg1NSwxMDUyLjk3IDUyOS4zMiwxMDc1LjEgNjM3LjkzLDkyNS41NjYgNjA3LjQ2NSw5MDMuNDQ1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDM4MC42ODgsNjIyLjEyOSAtMTEuNjI2LDM1LjgwMSAxNzUuNzU4LDU3LjA5IDExLjYyMSwtMzUuODAxIC0xNzUuNzUzLC01Ny4wOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDU0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA3MTYuMjg5LDM3Ni41OSAzNy42NDA2LDAgMCwxODQuODE2IC0zNy42NDA2LDAgMCwtMTg0LjgxNiB6IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4=') no-repeat, none; -moz-background-size: 100%; -o-background-size: 100%; -webkit-background-size: 100%; background-size: 100%; display: block; float: left; width: 90px; height: 25px; } 10 | .jasmine_html-reporter .jasmine-banner .jasmine-version { margin-left: 14px; position: relative; top: 6px; } 11 | .jasmine_html-reporter #jasmine_content { position: fixed; right: 100%; } 12 | .jasmine_html-reporter .jasmine-version { color: #aaa; } 13 | .jasmine_html-reporter .jasmine-banner { margin-top: 14px; } 14 | .jasmine_html-reporter .jasmine-duration { color: #fff; float: right; line-height: 28px; padding-right: 9px; } 15 | .jasmine_html-reporter .jasmine-symbol-summary { overflow: hidden; *zoom: 1; margin: 14px 0; } 16 | .jasmine_html-reporter .jasmine-symbol-summary li { display: inline-block; height: 10px; width: 14px; font-size: 16px; } 17 | .jasmine_html-reporter .jasmine-symbol-summary li.jasmine-passed { font-size: 14px; } 18 | .jasmine_html-reporter .jasmine-symbol-summary li.jasmine-passed:before { color: #007069; content: "\02022"; } 19 | .jasmine_html-reporter .jasmine-symbol-summary li.jasmine-failed { line-height: 9px; } 20 | .jasmine_html-reporter .jasmine-symbol-summary li.jasmine-failed:before { color: #ca3a11; content: "\d7"; font-weight: bold; margin-left: -1px; } 21 | .jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded { font-size: 14px; } 22 | .jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded:before { color: #bababa; content: "\02022"; } 23 | .jasmine_html-reporter .jasmine-symbol-summary li.jasmine-pending { line-height: 17px; } 24 | .jasmine_html-reporter .jasmine-symbol-summary li.jasmine-pending:before { color: #ba9d37; content: "*"; } 25 | .jasmine_html-reporter .jasmine-symbol-summary li.jasmine-empty { font-size: 14px; } 26 | .jasmine_html-reporter .jasmine-symbol-summary li.jasmine-empty:before { color: #ba9d37; content: "\02022"; } 27 | .jasmine_html-reporter .jasmine-run-options { float: right; margin-right: 5px; border: 1px solid #8a4182; color: #8a4182; position: relative; line-height: 20px; } 28 | .jasmine_html-reporter .jasmine-run-options .jasmine-trigger { cursor: pointer; padding: 8px 16px; } 29 | .jasmine_html-reporter .jasmine-run-options .jasmine-payload { position: absolute; display: none; right: -1px; border: 1px solid #8a4182; background-color: #eee; white-space: nowrap; padding: 4px 8px; } 30 | .jasmine_html-reporter .jasmine-run-options .jasmine-payload.jasmine-open { display: block; } 31 | .jasmine_html-reporter .jasmine-bar { line-height: 28px; font-size: 14px; display: block; color: #eee; } 32 | .jasmine_html-reporter .jasmine-bar.jasmine-failed, .jasmine_html-reporter .jasmine-bar.jasmine-errored { background-color: #ca3a11; border-bottom: 1px solid #eee; } 33 | .jasmine_html-reporter .jasmine-bar.jasmine-passed { background-color: #007069; } 34 | .jasmine_html-reporter .jasmine-bar.jasmine-incomplete { background-color: #bababa; } 35 | .jasmine_html-reporter .jasmine-bar.jasmine-skipped { background-color: #bababa; } 36 | .jasmine_html-reporter .jasmine-bar.jasmine-warning { background-color: #ba9d37; color: #333; } 37 | .jasmine_html-reporter .jasmine-bar.jasmine-menu { background-color: #fff; color: #aaa; } 38 | .jasmine_html-reporter .jasmine-bar.jasmine-menu a { color: #333; } 39 | .jasmine_html-reporter .jasmine-bar a { color: white; } 40 | .jasmine_html-reporter.jasmine-spec-list .jasmine-bar.jasmine-menu.jasmine-failure-list, .jasmine_html-reporter.jasmine-spec-list .jasmine-results .jasmine-failures { display: none; } 41 | .jasmine_html-reporter.jasmine-failure-list .jasmine-bar.jasmine-menu.jasmine-spec-list, .jasmine_html-reporter.jasmine-failure-list .jasmine-summary { display: none; } 42 | .jasmine_html-reporter .jasmine-results { margin-top: 14px; } 43 | .jasmine_html-reporter .jasmine-summary { margin-top: 14px; } 44 | .jasmine_html-reporter .jasmine-summary ul { list-style-type: none; margin-left: 14px; padding-top: 0; padding-left: 0; } 45 | .jasmine_html-reporter .jasmine-summary ul.jasmine-suite { margin-top: 7px; margin-bottom: 7px; } 46 | .jasmine_html-reporter .jasmine-summary li.jasmine-passed a { color: #007069; } 47 | .jasmine_html-reporter .jasmine-summary li.jasmine-failed a { color: #ca3a11; } 48 | .jasmine_html-reporter .jasmine-summary li.jasmine-empty a { color: #ba9d37; } 49 | .jasmine_html-reporter .jasmine-summary li.jasmine-pending a { color: #ba9d37; } 50 | .jasmine_html-reporter .jasmine-summary li.jasmine-excluded a { color: #bababa; } 51 | .jasmine_html-reporter .jasmine-description + .jasmine-suite { margin-top: 0; } 52 | .jasmine_html-reporter .jasmine-suite { margin-top: 14px; } 53 | .jasmine_html-reporter .jasmine-suite a { color: #333; } 54 | .jasmine_html-reporter .jasmine-failures .jasmine-spec-detail { margin-bottom: 28px; } 55 | .jasmine_html-reporter .jasmine-failures .jasmine-spec-detail .jasmine-description { background-color: #ca3a11; color: white; } 56 | .jasmine_html-reporter .jasmine-failures .jasmine-spec-detail .jasmine-description a { color: white; } 57 | .jasmine_html-reporter .jasmine-result-message { padding-top: 14px; color: #333; white-space: pre; } 58 | .jasmine_html-reporter .jasmine-result-message span.jasmine-result { display: block; } 59 | .jasmine_html-reporter .jasmine-stack-trace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666; border: 1px solid #ddd; background: white; white-space: pre; } 60 | -------------------------------------------------------------------------------- /vendor/bootstrap/css/bootstrap-theme.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.7 (http://getbootstrap.com) 3 | * Copyright 2011-2016 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} 6 | /*# sourceMappingURL=bootstrap-theme.min.css.map */ -------------------------------------------------------------------------------- /test/lib/jasmine-3.1.0/jasmine-html.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2008-2018 Pivotal Labs 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining 5 | a copy of this software and associated documentation files (the 6 | "Software"), to deal in the Software without restriction, including 7 | without limitation the rights to use, copy, modify, merge, publish, 8 | distribute, sublicense, and/or sell copies of the Software, and to 9 | permit persons to whom the Software is furnished to do so, subject to 10 | the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | */ 23 | jasmineRequire.html = function(j$) { 24 | j$.ResultsNode = jasmineRequire.ResultsNode(); 25 | j$.HtmlReporter = jasmineRequire.HtmlReporter(j$); 26 | j$.QueryString = jasmineRequire.QueryString(); 27 | j$.HtmlSpecFilter = jasmineRequire.HtmlSpecFilter(); 28 | }; 29 | 30 | jasmineRequire.HtmlReporter = function(j$) { 31 | 32 | var noopTimer = { 33 | start: function() {}, 34 | elapsed: function() { return 0; } 35 | }; 36 | 37 | function ResultsStateBuilder() { 38 | this.topResults = new j$.ResultsNode({}, '', null); 39 | this.currentParent = this.topResults; 40 | this.specsExecuted = 0; 41 | this.failureCount = 0; 42 | this.pendingSpecCount = 0; 43 | } 44 | 45 | ResultsStateBuilder.prototype.suiteStarted = function(result) { 46 | this.currentParent.addChild(result, 'suite'); 47 | this.currentParent = this.currentParent.last(); 48 | }; 49 | 50 | ResultsStateBuilder.prototype.suiteDone = function(result) { 51 | this.currentParent.updateResult(result); 52 | if (this.currentParent !== this.topResults) { 53 | this.currentParent = this.currentParent.parent; 54 | } 55 | 56 | if (result.status === 'failed') { 57 | this.failureCount++; 58 | } 59 | }; 60 | 61 | ResultsStateBuilder.prototype.specStarted = function(result) { 62 | }; 63 | 64 | ResultsStateBuilder.prototype.specDone = function(result) { 65 | this.currentParent.addChild(result, 'spec'); 66 | 67 | if (result.status !== 'excluded') { 68 | this.specsExecuted++; 69 | } 70 | 71 | if (result.status === 'failed') { 72 | this.failureCount++; 73 | } 74 | 75 | if (result.status == 'pending') { 76 | this.pendingSpecCount++; 77 | } 78 | }; 79 | 80 | 81 | 82 | function HtmlReporter(options) { 83 | var env = options.env || {}, 84 | getContainer = options.getContainer, 85 | createElement = options.createElement, 86 | createTextNode = options.createTextNode, 87 | navigateWithNewParam = options.navigateWithNewParam || function() {}, 88 | addToExistingQueryString = options.addToExistingQueryString || defaultQueryString, 89 | filterSpecs = options.filterSpecs, 90 | timer = options.timer || noopTimer, 91 | htmlReporterMain, 92 | symbols, 93 | deprecationWarnings = []; 94 | 95 | this.initialize = function() { 96 | clearPrior(); 97 | htmlReporterMain = createDom('div', {className: 'jasmine_html-reporter'}, 98 | createDom('div', {className: 'jasmine-banner'}, 99 | createDom('a', {className: 'jasmine-title', href: 'http://jasmine.github.io/', target: '_blank'}), 100 | createDom('span', {className: 'jasmine-version'}, j$.version) 101 | ), 102 | createDom('ul', {className: 'jasmine-symbol-summary'}), 103 | createDom('div', {className: 'jasmine-alert'}), 104 | createDom('div', {className: 'jasmine-results'}, 105 | createDom('div', {className: 'jasmine-failures'}) 106 | ) 107 | ); 108 | getContainer().appendChild(htmlReporterMain); 109 | }; 110 | 111 | var totalSpecsDefined; 112 | this.jasmineStarted = function(options) { 113 | totalSpecsDefined = options.totalSpecsDefined || 0; 114 | timer.start(); 115 | }; 116 | 117 | var summary = createDom('div', {className: 'jasmine-summary'}); 118 | 119 | var stateBuilder = new ResultsStateBuilder(); 120 | 121 | this.suiteStarted = function(result) { 122 | stateBuilder.suiteStarted(result); 123 | }; 124 | 125 | this.suiteDone = function(result) { 126 | stateBuilder.suiteDone(result); 127 | 128 | if (result.status === 'failed') { 129 | failures.push(failureDom(result)); 130 | } 131 | addDeprecationWarnings(result); 132 | }; 133 | 134 | this.specStarted = function(result) { 135 | stateBuilder.specStarted(result); 136 | }; 137 | 138 | var failures = []; 139 | this.specDone = function(result) { 140 | stateBuilder.specDone(result); 141 | 142 | if(noExpectations(result) && typeof console !== 'undefined' && typeof console.error !== 'undefined') { 143 | console.error('Spec \'' + result.fullName + '\' has no expectations.'); 144 | } 145 | 146 | if (!symbols){ 147 | symbols = find('.jasmine-symbol-summary'); 148 | } 149 | 150 | symbols.appendChild(createDom('li', { 151 | className: noExpectations(result) ? 'jasmine-empty' : 'jasmine-' + result.status, 152 | id: 'spec_' + result.id, 153 | title: result.fullName 154 | } 155 | )); 156 | 157 | if (result.status === 'failed') { 158 | failures.push(failureDom(result)); 159 | } 160 | 161 | addDeprecationWarnings(result); 162 | }; 163 | 164 | this.jasmineDone = function(doneResult) { 165 | var banner = find('.jasmine-banner'); 166 | var alert = find('.jasmine-alert'); 167 | var order = doneResult && doneResult.order; 168 | alert.appendChild(createDom('span', {className: 'jasmine-duration'}, 'finished in ' + timer.elapsed() / 1000 + 's')); 169 | 170 | banner.appendChild(optionsMenu(env)); 171 | 172 | if (stateBuilder.specsExecuted < totalSpecsDefined) { 173 | var skippedMessage = 'Ran ' + stateBuilder.specsExecuted + ' of ' + totalSpecsDefined + ' specs - run all'; 174 | var skippedLink = addToExistingQueryString('spec', ''); 175 | alert.appendChild( 176 | createDom('span', {className: 'jasmine-bar jasmine-skipped'}, 177 | createDom('a', {href: skippedLink, title: 'Run all specs'}, skippedMessage) 178 | ) 179 | ); 180 | } 181 | var statusBarMessage = ''; 182 | var statusBarClassName = 'jasmine-overall-result jasmine-bar '; 183 | var globalFailures = (doneResult && doneResult.failedExpectations) || []; 184 | var failed = stateBuilder.failureCount + globalFailures.length > 0; 185 | 186 | if (totalSpecsDefined > 0 || failed) { 187 | statusBarMessage += pluralize('spec', stateBuilder.specsExecuted) + ', ' + pluralize('failure', stateBuilder.failureCount); 188 | if (stateBuilder.pendingSpecCount) { statusBarMessage += ', ' + pluralize('pending spec', stateBuilder.pendingSpecCount); } 189 | } 190 | 191 | if (doneResult.overallStatus === 'passed') { 192 | statusBarClassName += ' jasmine-passed '; 193 | } else if (doneResult.overallStatus === 'incomplete') { 194 | statusBarClassName += ' jasmine-incomplete '; 195 | statusBarMessage = 'Incomplete: ' + doneResult.incompleteReason + ', ' + statusBarMessage; 196 | } else { 197 | statusBarClassName += ' jasmine-failed '; 198 | } 199 | 200 | var seedBar; 201 | if (order && order.random) { 202 | seedBar = createDom('span', {className: 'jasmine-seed-bar'}, 203 | ', randomized with seed ', 204 | createDom('a', {title: 'randomized with seed ' + order.seed, href: seedHref(order.seed)}, order.seed) 205 | ); 206 | } 207 | 208 | alert.appendChild(createDom('span', {className: statusBarClassName}, statusBarMessage, seedBar)); 209 | 210 | var errorBarClassName = 'jasmine-bar jasmine-errored'; 211 | var afterAllMessagePrefix = 'AfterAll '; 212 | 213 | for(i = 0; i < globalFailures.length; i++) { 214 | alert.appendChild(createDom('span', {className: errorBarClassName}, globalFailureMessage(globalFailures[i]))); 215 | } 216 | 217 | function globalFailureMessage(failure) { 218 | if (failure.globalErrorType === 'load') { 219 | var prefix = 'Error during loading: ' + failure.message; 220 | 221 | if (failure.filename) { 222 | return prefix + ' in ' + failure.filename + ' line ' + failure.lineno; 223 | } else { 224 | return prefix; 225 | } 226 | } else { 227 | return afterAllMessagePrefix + failure.message; 228 | } 229 | } 230 | 231 | addDeprecationWarnings(doneResult); 232 | 233 | var warningBarClassName = 'jasmine-bar jasmine-warning'; 234 | for(i = 0; i < deprecationWarnings.length; i++) { 235 | var warning = deprecationWarnings[i]; 236 | alert.appendChild(createDom('span', {className: warningBarClassName}, 'DEPRECATION: ' + warning)); 237 | } 238 | 239 | var results = find('.jasmine-results'); 240 | results.appendChild(summary); 241 | 242 | summaryList(stateBuilder.topResults, summary); 243 | 244 | if (failures.length) { 245 | alert.appendChild( 246 | createDom('span', {className: 'jasmine-menu jasmine-bar jasmine-spec-list'}, 247 | createDom('span', {}, 'Spec List | '), 248 | createDom('a', {className: 'jasmine-failures-menu', href: '#'}, 'Failures'))); 249 | alert.appendChild( 250 | createDom('span', {className: 'jasmine-menu jasmine-bar jasmine-failure-list'}, 251 | createDom('a', {className: 'jasmine-spec-list-menu', href: '#'}, 'Spec List'), 252 | createDom('span', {}, ' | Failures '))); 253 | 254 | find('.jasmine-failures-menu').onclick = function() { 255 | setMenuModeTo('jasmine-failure-list'); 256 | }; 257 | find('.jasmine-spec-list-menu').onclick = function() { 258 | setMenuModeTo('jasmine-spec-list'); 259 | }; 260 | 261 | setMenuModeTo('jasmine-failure-list'); 262 | 263 | var failureNode = find('.jasmine-failures'); 264 | for (i = 0; i < failures.length; i++) { 265 | failureNode.appendChild(failures[i]); 266 | } 267 | } 268 | }; 269 | 270 | return this; 271 | 272 | function failureDom(result) { 273 | var failure = 274 | createDom('div', {className: 'jasmine-spec-detail jasmine-failed'}, 275 | failureDescription(result, stateBuilder.currentParent), 276 | createDom('div', {className: 'jasmine-messages'}) 277 | ); 278 | var messages = failure.childNodes[1]; 279 | 280 | for (var i = 0; i < result.failedExpectations.length; i++) { 281 | var expectation = result.failedExpectations[i]; 282 | messages.appendChild(createDom('div', {className: 'jasmine-result-message'}, expectation.message)); 283 | messages.appendChild(createDom('div', {className: 'jasmine-stack-trace'}, expectation.stack)); 284 | } 285 | 286 | return failure; 287 | } 288 | 289 | function summaryList(resultsTree, domParent) { 290 | var specListNode; 291 | for (var i = 0; i < resultsTree.children.length; i++) { 292 | var resultNode = resultsTree.children[i]; 293 | if (filterSpecs && !hasActiveSpec(resultNode)) { 294 | continue; 295 | } 296 | if (resultNode.type === 'suite') { 297 | var suiteListNode = createDom('ul', {className: 'jasmine-suite', id: 'suite-' + resultNode.result.id}, 298 | createDom('li', {className: 'jasmine-suite-detail jasmine-' + resultNode.result.status}, 299 | createDom('a', {href: specHref(resultNode.result)}, resultNode.result.description) 300 | ) 301 | ); 302 | 303 | summaryList(resultNode, suiteListNode); 304 | domParent.appendChild(suiteListNode); 305 | } 306 | if (resultNode.type === 'spec') { 307 | if (domParent.getAttribute('class') !== 'jasmine-specs') { 308 | specListNode = createDom('ul', {className: 'jasmine-specs'}); 309 | domParent.appendChild(specListNode); 310 | } 311 | var specDescription = resultNode.result.description; 312 | if(noExpectations(resultNode.result)) { 313 | specDescription = 'SPEC HAS NO EXPECTATIONS ' + specDescription; 314 | } 315 | if(resultNode.result.status === 'pending' && resultNode.result.pendingReason !== '') { 316 | specDescription = specDescription + ' PENDING WITH MESSAGE: ' + resultNode.result.pendingReason; 317 | } 318 | specListNode.appendChild( 319 | createDom('li', { 320 | className: 'jasmine-' + resultNode.result.status, 321 | id: 'spec-' + resultNode.result.id 322 | }, 323 | createDom('a', {href: specHref(resultNode.result)}, specDescription) 324 | ) 325 | ); 326 | } 327 | } 328 | } 329 | 330 | function optionsMenu(env) { 331 | var optionsMenuDom = createDom('div', { className: 'jasmine-run-options' }, 332 | createDom('span', { className: 'jasmine-trigger' }, 'Options'), 333 | createDom('div', { className: 'jasmine-payload' }, 334 | createDom('div', { className: 'jasmine-stop-on-failure' }, 335 | createDom('input', { 336 | className: 'jasmine-fail-fast', 337 | id: 'jasmine-fail-fast', 338 | type: 'checkbox' 339 | }), 340 | createDom('label', { className: 'jasmine-label', 'for': 'jasmine-fail-fast' }, 'stop execution on spec failure')), 341 | createDom('div', { className: 'jasmine-throw-failures' }, 342 | createDom('input', { 343 | className: 'jasmine-throw', 344 | id: 'jasmine-throw-failures', 345 | type: 'checkbox' 346 | }), 347 | createDom('label', { className: 'jasmine-label', 'for': 'jasmine-throw-failures' }, 'stop spec on expectation failure')), 348 | createDom('div', { className: 'jasmine-random-order' }, 349 | createDom('input', { 350 | className: 'jasmine-random', 351 | id: 'jasmine-random-order', 352 | type: 'checkbox' 353 | }), 354 | createDom('label', { className: 'jasmine-label', 'for': 'jasmine-random-order' }, 'run tests in random order')) 355 | ) 356 | ); 357 | 358 | var failFastCheckbox = optionsMenuDom.querySelector('#jasmine-fail-fast'); 359 | failFastCheckbox.checked = env.stoppingOnSpecFailure(); 360 | failFastCheckbox.onclick = function() { 361 | navigateWithNewParam('failFast', !env.stoppingOnSpecFailure()); 362 | }; 363 | 364 | var throwCheckbox = optionsMenuDom.querySelector('#jasmine-throw-failures'); 365 | throwCheckbox.checked = env.throwingExpectationFailures(); 366 | throwCheckbox.onclick = function() { 367 | navigateWithNewParam('throwFailures', !env.throwingExpectationFailures()); 368 | }; 369 | 370 | var randomCheckbox = optionsMenuDom.querySelector('#jasmine-random-order'); 371 | randomCheckbox.checked = env.randomTests(); 372 | randomCheckbox.onclick = function() { 373 | navigateWithNewParam('random', !env.randomTests()); 374 | }; 375 | 376 | var optionsTrigger = optionsMenuDom.querySelector('.jasmine-trigger'), 377 | optionsPayload = optionsMenuDom.querySelector('.jasmine-payload'), 378 | isOpen = /\bjasmine-open\b/; 379 | 380 | optionsTrigger.onclick = function() { 381 | if (isOpen.test(optionsPayload.className)) { 382 | optionsPayload.className = optionsPayload.className.replace(isOpen, ''); 383 | } else { 384 | optionsPayload.className += ' jasmine-open'; 385 | } 386 | }; 387 | 388 | return optionsMenuDom; 389 | } 390 | 391 | function failureDescription(result, suite) { 392 | var wrapper = createDom('div', {className: 'jasmine-description'}, 393 | createDom('a', {title: result.description, href: specHref(result)}, result.description) 394 | ); 395 | var suiteLink; 396 | 397 | while (suite && suite.parent) { 398 | wrapper.insertBefore(createTextNode(' > '), wrapper.firstChild); 399 | suiteLink = createDom('a', {href: suiteHref(suite)}, suite.result.description); 400 | wrapper.insertBefore(suiteLink, wrapper.firstChild); 401 | 402 | suite = suite.parent; 403 | } 404 | 405 | return wrapper; 406 | } 407 | 408 | function suiteHref(suite) { 409 | var els = []; 410 | 411 | while (suite && suite.parent) { 412 | els.unshift(suite.result.description); 413 | suite = suite.parent; 414 | } 415 | 416 | return addToExistingQueryString('spec', els.join(' ')); 417 | } 418 | 419 | function addDeprecationWarnings(result) { 420 | if (result && result.deprecationWarnings) { 421 | for(var i = 0; i < result.deprecationWarnings.length; i++) { 422 | var warning = result.deprecationWarnings[i].message; 423 | if (!j$.util.arrayContains(warning)) { 424 | deprecationWarnings.push(warning); 425 | } 426 | } 427 | } 428 | } 429 | 430 | function find(selector) { 431 | return getContainer().querySelector('.jasmine_html-reporter ' + selector); 432 | } 433 | 434 | function clearPrior() { 435 | // return the reporter 436 | var oldReporter = find(''); 437 | 438 | if(oldReporter) { 439 | getContainer().removeChild(oldReporter); 440 | } 441 | } 442 | 443 | function createDom(type, attrs, childrenVarArgs) { 444 | var el = createElement(type); 445 | 446 | for (var i = 2; i < arguments.length; i++) { 447 | var child = arguments[i]; 448 | 449 | if (typeof child === 'string') { 450 | el.appendChild(createTextNode(child)); 451 | } else { 452 | if (child) { 453 | el.appendChild(child); 454 | } 455 | } 456 | } 457 | 458 | for (var attr in attrs) { 459 | if (attr == 'className') { 460 | el[attr] = attrs[attr]; 461 | } else { 462 | el.setAttribute(attr, attrs[attr]); 463 | } 464 | } 465 | 466 | return el; 467 | } 468 | 469 | function pluralize(singular, count) { 470 | var word = (count == 1 ? singular : singular + 's'); 471 | 472 | return '' + count + ' ' + word; 473 | } 474 | 475 | function specHref(result) { 476 | return addToExistingQueryString('spec', result.fullName); 477 | } 478 | 479 | function seedHref(seed) { 480 | return addToExistingQueryString('seed', seed); 481 | } 482 | 483 | function defaultQueryString(key, value) { 484 | return '?' + key + '=' + value; 485 | } 486 | 487 | function setMenuModeTo(mode) { 488 | htmlReporterMain.setAttribute('class', 'jasmine_html-reporter ' + mode); 489 | } 490 | 491 | function noExpectations(result) { 492 | return (result.failedExpectations.length + result.passedExpectations.length) === 0 && 493 | result.status === 'passed'; 494 | } 495 | 496 | function hasActiveSpec(resultNode) { 497 | if (resultNode.type == 'spec' && resultNode.result.status != 'excluded') { 498 | return true; 499 | } 500 | 501 | if (resultNode.type == 'suite') { 502 | for (var i = 0, j = resultNode.children.length; i < j; i++) { 503 | if (hasActiveSpec(resultNode.children[i])) { 504 | return true; 505 | } 506 | } 507 | } 508 | } 509 | } 510 | 511 | return HtmlReporter; 512 | }; 513 | 514 | jasmineRequire.HtmlSpecFilter = function() { 515 | function HtmlSpecFilter(options) { 516 | var filterString = options && options.filterString() && options.filterString().replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); 517 | var filterPattern = new RegExp(filterString); 518 | 519 | this.matches = function(specName) { 520 | return filterPattern.test(specName); 521 | }; 522 | } 523 | 524 | return HtmlSpecFilter; 525 | }; 526 | 527 | jasmineRequire.ResultsNode = function() { 528 | function ResultsNode(result, type, parent) { 529 | this.result = result; 530 | this.type = type; 531 | this.parent = parent; 532 | 533 | this.children = []; 534 | 535 | this.addChild = function(result, type) { 536 | this.children.push(new ResultsNode(result, type, this)); 537 | }; 538 | 539 | this.last = function() { 540 | return this.children[this.children.length - 1]; 541 | }; 542 | 543 | this.updateResult = function(result) { 544 | this.result = result; 545 | }; 546 | } 547 | 548 | return ResultsNode; 549 | }; 550 | 551 | jasmineRequire.QueryString = function() { 552 | function QueryString(options) { 553 | 554 | this.navigateWithNewParam = function(key, value) { 555 | options.getWindowLocation().search = this.fullStringWithNewParam(key, value); 556 | }; 557 | 558 | this.fullStringWithNewParam = function(key, value) { 559 | var paramMap = queryStringToParamMap(); 560 | paramMap[key] = value; 561 | return toQueryString(paramMap); 562 | }; 563 | 564 | this.getParam = function(key) { 565 | return queryStringToParamMap()[key]; 566 | }; 567 | 568 | return this; 569 | 570 | function toQueryString(paramMap) { 571 | var qStrPairs = []; 572 | for (var prop in paramMap) { 573 | qStrPairs.push(encodeURIComponent(prop) + '=' + encodeURIComponent(paramMap[prop])); 574 | } 575 | return '?' + qStrPairs.join('&'); 576 | } 577 | 578 | function queryStringToParamMap() { 579 | var paramStr = options.getWindowLocation().search.substring(1), 580 | params = [], 581 | paramMap = {}; 582 | 583 | if (paramStr.length > 0) { 584 | params = paramStr.split('&'); 585 | for (var i = 0; i < params.length; i++) { 586 | var p = params[i].split('='); 587 | var value = decodeURIComponent(p[1]); 588 | if (value === 'true' || value === 'false') { 589 | value = JSON.parse(value); 590 | } 591 | paramMap[decodeURIComponent(p[0])] = value; 592 | } 593 | } 594 | 595 | return paramMap; 596 | } 597 | 598 | } 599 | 600 | return QueryString; 601 | }; 602 | -------------------------------------------------------------------------------- /vendor/bootstrap/css/bootstrap-theme.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} -------------------------------------------------------------------------------- /lib/jquery.medea.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Medea 3 | * 4 | * v0.1.1 5 | * 6 | **/ 7 | 8 | window.Medea = (function($) { 9 | 10 | "use strict"; 11 | 12 | var options = {}; 13 | 14 | var defaults = { 15 | removeOnSubmit: false, 16 | buttons: true, 17 | labelColumns: 2, 18 | inputColumns: 10, 19 | noForm: false, 20 | modal: false, 21 | modalId: guid("") 22 | }; 23 | 24 | var events = { 25 | MEDEA_FIELD_ADD: "medea.add", 26 | MEDEA_SUBMITTED: "medea.submit", 27 | MEDEA_CANCELLED: "medea.cancel", 28 | MEDEA_TOGGLE: "medea.toggle" 29 | }; 30 | 31 | var elements = { 32 | container: null, 33 | form: null 34 | }; 35 | 36 | var css = { 37 | formRowClass: "medea-form-data-row", 38 | buttonRowClass: "medea-form-buttons-row", 39 | }; 40 | 41 | function defaultValue(value, def) { 42 | return (typeof value === "undefined") ? def : value; 43 | } 44 | 45 | function regularCase(str) { 46 | if(str === null) { return ""; } 47 | return str 48 | .replace(/([a-z])([A-Z])/g, "$1 $2") 49 | .replace(/\b([A-Z]+)([A-Z])([a-z])/, "$1 $2$3") 50 | .replace(/^./, function(s){ return s.toUpperCase(); }); 51 | } 52 | 53 | function form2object(selector, delimiter) { 54 | var form = $(selector); 55 | if(form.length === 0) { 56 | console.warn("medea.form2object: no form found at %s", selector); 57 | return {}; 58 | } 59 | delimiter = delimiter || "."; 60 | var formValues = form.find(":input").serializeArray(); 61 | var checkBoxValues = form.find("input[type=checkbox]:not(:checked)") 62 | .map(function() { 63 | return { "name": this.name, "value": $(this).is(":checked") } 64 | }).get(); 65 | formValues = formValues.concat(checkBoxValues); 66 | if(formValues.length === 0) { 67 | console.warn("medea.form2object: no input fields found at %s", selector); 68 | return {}; 69 | } 70 | var result = {}; 71 | var arrays = {}; 72 | for(var i = 0; i < formValues.length; i++) { 73 | var value = formValues[i].value; 74 | var inputField = form.find("input[name='" + formValues[i].name + "']"); 75 | //console.log(inputField.length); 76 | if(inputField.attr("data-json-type")==="number") { 77 | if( (value % 1) !== 0) { 78 | value = parseFloat(value); 79 | } 80 | else { 81 | value = parseInt(value); 82 | } 83 | } 84 | if(inputField.attr("data-json-type")==="boolean") { 85 | var lc = value.toString().toLowerCase(); 86 | value = (lc === "true"||lc === "on") ? true : false; 87 | } 88 | if (value === "") { continue; } 89 | var name = formValues[i].name; 90 | var nameParts = name.split(delimiter); 91 | var currResult = result; 92 | for (var j = 0; j < nameParts.length; j++) { 93 | var namePart = nameParts[j]; 94 | var arrName; 95 | if(namePart.indexOf("[]") > -1 && j === nameParts.length - 1) { 96 | arrName = namePart.substr(0, namePart.indexOf("[")); 97 | if (!currResult[arrName]) { currResult[arrName] = []; } 98 | currResult[arrName].push(value); 99 | } 100 | else { 101 | if(namePart.indexOf("[") > -1) { 102 | arrName = namePart.substr(0, namePart.indexOf("[")); 103 | var arrIdx = namePart.replace(/^[a-z]+\[|\]$/gi, ""); 104 | if(!arrays[arrName]) { 105 | arrays[arrName] = {}; 106 | } 107 | if(!currResult[arrName]) { 108 | currResult[arrName] = []; 109 | } 110 | if(j === nameParts.length - 1) { 111 | currResult[arrName].push(value); 112 | } 113 | else { 114 | if(!arrays[arrName][arrIdx]) { 115 | currResult[arrName].push({}); 116 | arrays[arrName][arrIdx] = currResult[arrName][currResult[arrName].length - 1]; 117 | } 118 | } 119 | currResult = arrays[arrName][arrIdx]; 120 | } 121 | else { 122 | if(j < (nameParts.length - 1)) { 123 | if (!currResult[namePart]) { currResult[namePart] = {}; } 124 | currResult = currResult[namePart]; 125 | } 126 | else { 127 | if(!isInteger(currResult)) { 128 | currResult[namePart] = value; 129 | } 130 | else { 131 | // @todo: raise proper (useful) error event 132 | console.error("invalid object"); 133 | } 134 | } 135 | } 136 | } 137 | } 138 | } 139 | return result; 140 | } 141 | 142 | function button(context) { 143 | var btn = $("