Commit 5e6ba8afab0d8bb963b50013a4b8da24bf2a143f
1 parent
bf9c3f73
datalet doc update
Showing
570 changed files
with
950 additions
and
163911 deletions
Too many changes.
To preserve performance only 100 of 570 files are displayed.
datalets/barchart-datalet/barchart-datalet.html
1 | 1 | <!-- |
2 | -The MIT License (MIT) | |
3 | - | |
4 | -Copyright (c) 2015 ROUTE-TO-PA CONSORTIUM | |
5 | - | |
6 | -Permission is hereby granted, free of charge, to any person obtaining a copy | |
7 | -of this software and associated documentation files (the "Software"), to deal | |
8 | -in the Software without restriction, including without limitation the rights | |
9 | -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
10 | -copies of the Software, and to permit persons to whom the Software is | |
11 | -furnished to do so, subject to the following conditions: | |
12 | - | |
13 | -The above copyright notice and this permission notice shall be included in | |
14 | -all copies or substantial portions of the Software. | |
15 | - | |
16 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
17 | -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
18 | -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
19 | -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
20 | -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
21 | -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
22 | -THE SOFTWARE. | |
2 | +@license | |
3 | + The MIT License (MIT) | |
4 | + | |
5 | + Copyright (c) 2015 Dipartimento di Informatica - Universitร di Salerno - Italy | |
6 | + | |
7 | + Permission is hereby granted, free of charge, to any person obtaining a copy | |
8 | + of this software and associated documentation files (the "Software"), to deal | |
9 | + in the Software without restriction, including without limitation the rights | |
10 | + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
11 | + copies of the Software, and to permit persons to whom the Software is | |
12 | + furnished to do so, subject to the following conditions: | |
13 | + | |
14 | + The above copyright notice and this permission notice shall be included in | |
15 | + all copies or substantial portions of the Software. | |
16 | + | |
17 | + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
20 | + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
21 | + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
22 | + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
23 | + THE SOFTWARE. | |
23 | 24 | --> |
24 | 25 | |
25 | 26 | <link rel="import" href="../highcharts-datalet/highcharts-datalet.html"> |
26 | 27 | |
27 | 28 | <!-- |
28 | 29 | |
29 | -`barchart-datalet` is a barchart datalet based on highcharts project <http://www.highcharts.com/> | |
30 | +`barchart-datalet` is a barchart datalet based on highcharts project http://www.highcharts.com/ | |
30 | 31 | |
31 | 32 | Example: |
32 | 33 | |
33 | -<barchart-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&limit=10000" | |
34 | - fields='["result,records,Lat","result,records,Lng"]'></barchart-datalet> | |
35 | - | |
34 | + <barchart-datalet | |
35 | + data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=#" | |
36 | + fields='["field1","field2"]'> | |
37 | + </barchart-datalet> | |
36 | 38 | |
39 | +@element barchart-datalet | |
40 | +@status v0.1 | |
41 | +@demo demo/index.html | |
42 | +@group datalets | |
37 | 43 | --> |
38 | 44 | |
39 | 45 | <dom-module name="barchart-datalet"> | ... | ... |
datalets/barchart-datalet/demo/index.html
0 โ 100644
1 | +<!DOCTYPE html> | |
2 | +<html lang="en"> | |
3 | +<head> | |
4 | + <meta charset="UTF-8"> | |
5 | + <title></title> | |
6 | + | |
7 | + <script> | |
8 | + </script> | |
9 | + | |
10 | +</head> | |
11 | +<body> | |
12 | + | |
13 | +<script src="https://code.jquery.com/jquery-2.1.4.min.js" type="text/javascript"></script> | |
14 | +<link rel="import" href="../barchart-datalet.html" /> | |
15 | + | |
16 | +<barchart-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&limit=10000" | |
17 | + fields='["result,records,Lat","result,records,Lng"]'></barchart-datalet> | |
18 | + | |
19 | +</body> | |
20 | +</html> | |
0 | 21 | \ No newline at end of file | ... | ... |
datalets/base-ajax-json-jsonpath-datalet/base-ajax-json-jsonpath-datalet.html
1 | 1 | <!-- |
2 | -The MIT License (MIT) | |
3 | - | |
4 | -Copyright (c) 2015 ROUTE-TO-PA CONSORTIUM | |
5 | - | |
6 | -Permission is hereby granted, free of charge, to any person obtaining a copy | |
7 | -of this software and associated documentation files (the "Software"), to deal | |
8 | -in the Software without restriction, including without limitation the rights | |
9 | -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
10 | -copies of the Software, and to permit persons to whom the Software is | |
11 | -furnished to do so, subject to the following conditions: | |
12 | - | |
13 | -The above copyright notice and this permission notice shall be included in | |
14 | -all copies or substantial portions of the Software. | |
15 | - | |
16 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
17 | -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
18 | -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
19 | -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
20 | -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
21 | -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
22 | -THE SOFTWARE. | |
2 | +@license | |
3 | + The MIT License (MIT) | |
4 | + | |
5 | + Copyright (c) 2015 Dipartimento di Informatica - Universitร di Salerno - Italy | |
6 | + | |
7 | + Permission is hereby granted, free of charge, to any person obtaining a copy | |
8 | + of this software and associated documentation files (the "Software"), to deal | |
9 | + in the Software without restriction, including without limitation the rights | |
10 | + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
11 | + copies of the Software, and to permit persons to whom the Software is | |
12 | + furnished to do so, subject to the following conditions: | |
13 | + | |
14 | + The above copyright notice and this permission notice shall be included in | |
15 | + all copies or substantial portions of the Software. | |
16 | + | |
17 | + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
20 | + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
21 | + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
22 | + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
23 | + THE SOFTWARE. | |
23 | 24 | --> |
24 | 25 | |
25 | 26 | <link rel="import" href="../base-datalet/base-datalet.html"> |
26 | 27 | |
27 | 28 | <!-- |
28 | -@group ROUTETOPA Base Web Component | |
29 | - | |
30 | -The `base-datalet` is a base-datalet web component that has built up by using Polymer. | |
31 | -Pass to this component a data url(CKAN api uri) and a string with one or multiple query in JsonPath format(separated by spaces) and it'll build an object | |
32 | -you can use to set up the structures for presentation. | |
29 | +The `base-ajax-json-jsonpath-datalet` extend the base component and define the mechanism to access and select data. | |
30 | +This datalet handles AJAX request with JSON response and uses JSONPATH for data selection and filtering. | |
33 | 31 | |
34 | -### Code | |
32 | +Example : | |
35 | 33 | |
36 | -Example | |
37 | - | |
38 | - <base-datalet | |
39 | - dataUrl="http://demo.ckan.org/api/action/datastore_search?resource_id=8324a4c9-66d6-47bf-a898-94237cc39b9f&limit=50" | |
40 | - query="$.result.records..Supplier $.result.records..Amount"> | |
41 | - </base-datalet> | |
42 | - | |
43 | -### HTML | |
44 | - | |
45 | - <base-datalet | |
46 | - dataUrl="http://demo.ckan.org/api/action/datastore_search?resource_id=8324a4c9-66d6-47bf-a898-94237cc39b9f&limit=50" | |
47 | - query="$.result.records..Supplier $.result.records..Amount"> | |
48 | - </base-datalet> | |
34 | + <dom-module id="every-datalet-that-handle-ajax-json"> | |
35 | + <template> | |
36 | + ... | |
37 | + <base-ajax-json-jsonpath-datalet data-url="{{dataUrl}}" fields="{{fields}}"></base-ajax-json-jsonpath-datalet> | |
38 | + ... | |
39 | + </template> | |
40 | + </dom-module> | |
49 | 41 | |
50 | -@class base-datalet | |
42 | +@element base-ajax-json-jsonpath-datalet | |
43 | +@status v0.1 | |
44 | +@homepage | |
45 | +@group datalets | |
51 | 46 | --> |
52 | 47 | |
53 | 48 | <dom-module id="base-ajax-json-jsonpath-datalet"> | ... | ... |
datalets/base-ajax-json-jsonpath-datalet/docs.html
0 โ 100644
1 | +<!DOCTYPE html> | |
2 | +<html lang="en"> | |
3 | +<head> | |
4 | + <link rel="import" href="../../bower_components/iron-component-page/iron-component-page.html"> | |
5 | + <meta charset="UTF-8"> | |
6 | +</head> | |
7 | +<body> | |
8 | + | |
9 | +<iron-component-page src="base-ajax-json-jsonpath-datalet.html"></iron-component-page> | |
10 | + | |
11 | +</body> | |
12 | +</html> | |
0 | 13 | \ No newline at end of file | ... | ... |
datalets/base-ajax-json-jsonpath-datalet/static/js/AjaxJsonJsonPathBehavior.js
1 | 1 | /* |
2 | - The MIT License (MIT) | |
2 | +@license | |
3 | + The MIT License (MIT) | |
3 | 4 | |
4 | - Copyright (c) 2015 Dipartimento di Informatica - Universitร di Salerno, Italy | |
5 | + Copyright (c) 2015 Dipartimento di Informatica - Universitร di Salerno - Italy | |
5 | 6 | |
6 | - Permission is hereby granted, free of charge, to any person obtaining a copy | |
7 | - of this software and associated documentation files (the "Software"), to deal | |
8 | - in the Software without restriction, including without limitation the rights | |
9 | - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
10 | - copies of the Software, and to permit persons to whom the Software is | |
11 | - furnished to do so, subject to the following conditions: | |
7 | + Permission is hereby granted, free of charge, to any person obtaining a copy | |
8 | + of this software and associated documentation files (the "Software"), to deal | |
9 | + in the Software without restriction, including without limitation the rights | |
10 | + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
11 | + copies of the Software, and to permit persons to whom the Software is | |
12 | + furnished to do so, subject to the following conditions: | |
12 | 13 | |
13 | - The above copyright notice and this permission notice shall be included in | |
14 | - all copies or substantial portions of the Software. | |
14 | + The above copyright notice and this permission notice shall be included in | |
15 | + all copies or substantial portions of the Software. | |
16 | + | |
17 | + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
20 | + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
21 | + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
22 | + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
23 | + THE SOFTWARE. | |
24 | +*/ | |
15 | 25 | |
16 | - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
17 | - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
18 | - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
19 | - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
20 | - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
21 | - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
22 | - THE SOFTWARE. | |
23 | - */ | |
24 | 26 | |
25 | 27 | var AjaxJsonJsonPathBehavior = { |
26 | 28 | |
... | ... | @@ -39,6 +41,11 @@ var AjaxJsonJsonPathBehavior = { |
39 | 41 | } |
40 | 42 | }, |
41 | 43 | |
44 | + /** | |
45 | + * Make an AJAX call to the dataset URL | |
46 | + * | |
47 | + * @method requestData | |
48 | + */ | |
42 | 49 | requestData: function(){ |
43 | 50 | |
44 | 51 | var comp = this; |
... | ... | @@ -53,10 +60,7 @@ var AjaxJsonJsonPathBehavior = { |
53 | 60 | }, |
54 | 61 | |
55 | 62 | /** |
56 | - * Called when core-ajax component receive the json data from called url. It is responsible to | |
57 | - * extract data from response, coded in json, and refine it by using JsonPath queries in the query attribute. | |
58 | - * After this phase it parses the resulting object to populate the structure(keys,values) to fill the final table by using | |
59 | - * angularJs syntax. | |
63 | + * Called when core-ajax component receive the json data from called url. | |
60 | 64 | * |
61 | 65 | * @method handleResponse |
62 | 66 | */ |
... | ... | @@ -65,6 +69,12 @@ var AjaxJsonJsonPathBehavior = { |
65 | 69 | this.runWorkcycle(); |
66 | 70 | }, |
67 | 71 | |
72 | + /** | |
73 | + * selectData built a JSONPATH query based on the user selected fields then extract data from the JSON response. | |
74 | + * This method built an objects <name, data> for every user selected field and push it into the data array. | |
75 | + * | |
76 | + * @method selectData | |
77 | + */ | |
68 | 78 | selectData : function(){ |
69 | 79 | |
70 | 80 | this.data = []; | ... | ... |
datalets/base-csv-datalet/base-csv-datalet.html
1 | +<!-- | |
2 | +@license | |
3 | + The MIT License (MIT) | |
4 | + | |
5 | + Copyright (c) 2015 Dipartimento di Informatica - Universitร di Salerno - Italy | |
6 | + | |
7 | + Permission is hereby granted, free of charge, to any person obtaining a copy | |
8 | + of this software and associated documentation files (the "Software"), to deal | |
9 | + in the Software without restriction, including without limitation the rights | |
10 | + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
11 | + copies of the Software, and to permit persons to whom the Software is | |
12 | + furnished to do so, subject to the following conditions: | |
13 | + | |
14 | + The above copyright notice and this permission notice shall be included in | |
15 | + all copies or substantial portions of the Software. | |
16 | + | |
17 | + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
20 | + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
21 | + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
22 | + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
23 | + THE SOFTWARE. | |
24 | +--> | |
25 | + | |
1 | 26 | <link rel="import" href="../../bower_components/polymer/polymer.html"> |
2 | 27 | |
3 | 28 | <dom-module id="base-csv-datalet"> | ... | ... |
datalets/base-datalet/base-datalet.html
1 | 1 | <!-- |
2 | -The MIT License (MIT) | |
3 | - | |
4 | -Copyright (c) 2015 ROUTE-TO-PA CONSORTIUM | |
5 | - | |
6 | -Permission is hereby granted, free of charge, to any person obtaining a copy | |
7 | -of this software and associated documentation files (the "Software"), to deal | |
8 | -in the Software without restriction, including without limitation the rights | |
9 | -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
10 | -copies of the Software, and to permit persons to whom the Software is | |
11 | -furnished to do so, subject to the following conditions: | |
12 | - | |
13 | -The above copyright notice and this permission notice shall be included in | |
14 | -all copies or substantial portions of the Software. | |
15 | - | |
16 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
17 | -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
18 | -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
19 | -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
20 | -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
21 | -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
22 | -THE SOFTWARE. | |
2 | +@license | |
3 | + The MIT License (MIT) | |
4 | + | |
5 | + Copyright (c) 2015 Dipartimento di Informatica - Universitร di Salerno - Italy | |
6 | + | |
7 | + Permission is hereby granted, free of charge, to any person obtaining a copy | |
8 | + of this software and associated documentation files (the "Software"), to deal | |
9 | + in the Software without restriction, including without limitation the rights | |
10 | + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
11 | + copies of the Software, and to permit persons to whom the Software is | |
12 | + furnished to do so, subject to the following conditions: | |
13 | + | |
14 | + The above copyright notice and this permission notice shall be included in | |
15 | + all copies or substantial portions of the Software. | |
16 | + | |
17 | + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
20 | + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
21 | + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
22 | + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
23 | + THE SOFTWARE. | |
23 | 24 | --> |
24 | 25 | |
25 | 26 | <link rel="import" href="../../bower_components/polymer/polymer.html"> |
26 | 27 | |
27 | 28 | <!-- |
28 | -@group ROUTETOPA Base Web Component | |
29 | - | |
30 | -The `base-datalet` is a base-datalet web component that has built up by using Polymer. | |
31 | -Pass to this component a data url(CKAN api uri) and a string with one or multiple query in JsonPath format(separated by spaces) and it'll build an object | |
32 | -you can use to set up the structures for presentation. | |
33 | - | |
34 | -### Code | |
35 | - | |
36 | -Example | |
37 | - | |
38 | - <base-datalet | |
39 | - dataUrl="http://demo.ckan.org/api/action/datastore_search?resource_id=8324a4c9-66d6-47bf-a898-94237cc39b9f&limit=50" | |
40 | - query="$.result.records..Supplier $.result.records..Amount"> | |
41 | - </base-datalet> | |
42 | - | |
43 | -### HTML | |
44 | - | |
45 | - <base-datalet | |
46 | - dataUrl="http://demo.ckan.org/api/action/datastore_search?resource_id=8324a4c9-66d6-47bf-a898-94237cc39b9f&limit=50" | |
47 | - query="$.result.records..Supplier $.result.records..Amount"> | |
48 | - </base-datalet> | |
49 | - | |
50 | -@class base-datalet | |
29 | +The `base-datalet` is the base component that includes datalet footer (with information about dataset domain and ROUTE-TO-PA project). | |
30 | +Base datalet includes polymer.html and the BaseDataletBehaviors javascript file that define the datalet workcycle and the datalet base properties : dataUrl, fields and data. | |
31 | +Every datalet must include this one in its `<template>` section. | |
32 | + | |
33 | +Example : | |
34 | + | |
35 | + <dom-module id="every-datalet"> | |
36 | + <template> | |
37 | + ... | |
38 | + <base-datalet data-url="{{dataUrl}}" fields="{{fields}}"></base-datalet> | |
39 | + ... | |
40 | + </template> | |
41 | + </dom-module> | |
42 | + | |
43 | +@element base-datalet | |
44 | +@status v0.1 | |
45 | +@homepage | |
46 | +@group datalets | |
51 | 47 | --> |
52 | 48 | |
53 | 49 | <dom-module id="base-datalet"> |
... | ... | @@ -75,6 +71,17 @@ Example |
75 | 71 | <script> |
76 | 72 | BaseDatalet = Polymer({ |
77 | 73 | is: 'base-datalet', |
74 | + | |
75 | + /** | |
76 | + * It is called after the elementโs template has been stamped and all elements inside the elementโs local | |
77 | + * DOM have been configured (with values bound from parents, deserialized attributes, or else default values) | |
78 | + * and had their ready method called. | |
79 | + * | |
80 | + * Extract the dataset domain from the entire URL and set the text content of the datalet footer. | |
81 | + * | |
82 | + * @method ready | |
83 | + * | |
84 | + */ | |
78 | 85 | ready: function(){ |
79 | 86 | this.$.domain.textContent = this.dataUrl.split("/")[0] + "//" + this.dataUrl.split("/")[2]; |
80 | 87 | } | ... | ... |
datalets/base-datalet/docs.html
1 | 1 | <!DOCTYPE html> |
2 | 2 | <html lang="en"> |
3 | 3 | <head> |
4 | - <link rel="import" href="../../bower_components/iron-component-page/iron-component-page.html"> | |
5 | 4 | <meta charset="UTF-8"> |
5 | + <link rel="import" href="../../bower_components/iron-component-page/iron-component-page.html"> | |
6 | 6 | </head> |
7 | 7 | <body> |
8 | 8 | ... | ... |
datalets/base-datalet/static/js/BaseDataletBehaviors.js
1 | 1 | /* |
2 | +@license | |
2 | 3 | The MIT License (MIT) |
3 | 4 | |
4 | - Copyright (c) 2015 ROUTE-TO-PA CONSORTIUM | |
5 | + Copyright (c) 2015 Dipartimento di Informatica - Universitร di Salerno - Italy | |
5 | 6 | |
6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy |
7 | 8 | of this software and associated documentation files (the "Software"), to deal |
... | ... | @@ -74,6 +75,7 @@ var BaseDataletBehavior ={ |
74 | 75 | var WorkcycleBehavior = { |
75 | 76 | |
76 | 77 | _component: null, |
78 | + | |
77 | 79 | /** |
78 | 80 | * Request data from source(e.g. CKAN by api) using some kind of technology(e.g. Ajax) |
79 | 81 | * |
... | ... | @@ -118,12 +120,9 @@ var WorkcycleBehavior = { |
118 | 120 | }, |
119 | 121 | |
120 | 122 | /** |
121 | - * Called when iron-ajax component receive the json data from called url. It is responsible to | |
122 | - * extract data from response, coded in json, and refine it by using JsonPath queries in the query attribute. | |
123 | - * After this phase it parses the resulting object to populate the structure(keys,values) to fill the final table by using | |
124 | - * angularJs syntax. | |
123 | + * This method represents the entire datalet workcycle. | |
125 | 124 | * |
126 | - * @method handleResponse | |
125 | + * @method runWorkcycle | |
127 | 126 | */ |
128 | 127 | runWorkcycle: function() { |
129 | 128 | this.selectData(); |
... | ... | @@ -132,6 +131,11 @@ var WorkcycleBehavior = { |
132 | 131 | this.presentData(); |
133 | 132 | }, |
134 | 133 | |
134 | + /** | |
135 | + * This method save the reference to the polymer object related to the datalet. | |
136 | + * | |
137 | + * @method init | |
138 | + */ | |
135 | 139 | init: function(component){ |
136 | 140 | this._component = component; |
137 | 141 | this.requestData(); | ... | ... |
datalets/column3Dchart-datalet/column3Dchart-datalet.html
1 | 1 | <!-- |
2 | -The MIT License (MIT) | |
3 | - | |
4 | -Copyright (c) 2015 ROUTE-TO-PA CONSORTIUM | |
5 | - | |
6 | -Permission is hereby granted, free of charge, to any person obtaining a copy | |
7 | -of this software and associated documentation files (the "Software"), to deal | |
8 | -in the Software without restriction, including without limitation the rights | |
9 | -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
10 | -copies of the Software, and to permit persons to whom the Software is | |
11 | -furnished to do so, subject to the following conditions: | |
12 | - | |
13 | -The above copyright notice and this permission notice shall be included in | |
14 | -all copies or substantial portions of the Software. | |
15 | - | |
16 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
17 | -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
18 | -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
19 | -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
20 | -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
21 | -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
22 | -THE SOFTWARE. | |
2 | +@license | |
3 | + The MIT License (MIT) | |
4 | + | |
5 | + Copyright (c) 2015 Dipartimento di Informatica - Universitร di Salerno - Italy | |
6 | + | |
7 | + Permission is hereby granted, free of charge, to any person obtaining a copy | |
8 | + of this software and associated documentation files (the "Software"), to deal | |
9 | + in the Software without restriction, including without limitation the rights | |
10 | + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
11 | + copies of the Software, and to permit persons to whom the Software is | |
12 | + furnished to do so, subject to the following conditions: | |
13 | + | |
14 | + The above copyright notice and this permission notice shall be included in | |
15 | + all copies or substantial portions of the Software. | |
16 | + | |
17 | + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
20 | + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
21 | + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
22 | + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
23 | + THE SOFTWARE. | |
23 | 24 | --> |
24 | 25 | |
25 | 26 | |
... | ... | @@ -33,10 +34,15 @@ THE SOFTWARE. |
33 | 34 | |
34 | 35 | Example: |
35 | 36 | |
36 | -<column3dchart-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&limit=10000" | |
37 | - query="$['result']['records'][*]['Lat']###$['result']['records'][*]['Lng']"> | |
38 | - | |
37 | + <column3dchart-datalet | |
38 | + data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=#" | |
39 | + fields='["field1","field2"]'> | |
40 | + </column3dchart-datalet> | |
39 | 41 | |
42 | +@element column3Dchart-datalet | |
43 | +@status v0.1 | |
44 | +@demo demo/index.html | |
45 | +@group datalets | |
40 | 46 | --> |
41 | 47 | |
42 | 48 | ... | ... |
datalets/column3Dchart-datalet/demo/index.html
0 โ 100644
1 | +<!DOCTYPE html> | |
2 | +<html lang="en"> | |
3 | +<head> | |
4 | + <meta charset="UTF-8"> | |
5 | + <title></title> | |
6 | + | |
7 | + <script> | |
8 | + </script> | |
9 | + | |
10 | +</head> | |
11 | +<body> | |
12 | + | |
13 | +<script src="https://code.jquery.com/jquery-2.1.4.min.js" type="text/javascript"></script> | |
14 | +<link rel="import" href="../column3Dchart-datalet.html" /> | |
15 | + | |
16 | +<column3Dchart-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&limit=10000" | |
17 | + fields='["result,records,Lat","result,records,Lng"]'></column3Dchart-datalet> | |
18 | + | |
19 | +</body> | |
20 | +</html> | |
0 | 21 | \ No newline at end of file | ... | ... |
datalets/columnchart-datalet/columnchart-datalet.html
1 | 1 | <!-- |
2 | -The MIT License (MIT) | |
3 | - | |
4 | -Copyright (c) 2015 ROUTE-TO-PA CONSORTIUM | |
5 | - | |
6 | -Permission is hereby granted, free of charge, to any person obtaining a copy | |
7 | -of this software and associated documentation files (the "Software"), to deal | |
8 | -in the Software without restriction, including without limitation the rights | |
9 | -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
10 | -copies of the Software, and to permit persons to whom the Software is | |
11 | -furnished to do so, subject to the following conditions: | |
12 | - | |
13 | -The above copyright notice and this permission notice shall be included in | |
14 | -all copies or substantial portions of the Software. | |
15 | - | |
16 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
17 | -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
18 | -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
19 | -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
20 | -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
21 | -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
22 | -THE SOFTWARE. | |
2 | +@license | |
3 | + The MIT License (MIT) | |
4 | + | |
5 | + Copyright (c) 2015 Dipartimento di Informatica - Universitร di Salerno - Italy | |
6 | + | |
7 | + Permission is hereby granted, free of charge, to any person obtaining a copy | |
8 | + of this software and associated documentation files (the "Software"), to deal | |
9 | + in the Software without restriction, including without limitation the rights | |
10 | + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
11 | + copies of the Software, and to permit persons to whom the Software is | |
12 | + furnished to do so, subject to the following conditions: | |
13 | + | |
14 | + The above copyright notice and this permission notice shall be included in | |
15 | + all copies or substantial portions of the Software. | |
16 | + | |
17 | + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
20 | + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
21 | + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
22 | + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
23 | + THE SOFTWARE. | |
23 | 24 | --> |
24 | 25 | |
25 | 26 | <link rel="import" href="../highcharts-datalet/highcharts-datalet.html"> |
... | ... | @@ -30,10 +31,15 @@ THE SOFTWARE. |
30 | 31 | |
31 | 32 | Example: |
32 | 33 | |
33 | -<columnchart-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&limit=10000" | |
34 | - query="$['result']['records'][*]['Lat']###$['result']['records'][*]['Lng']"> | |
35 | - | |
34 | + <columnchart-datalet | |
35 | + data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=#" | |
36 | + fields='["field1","field2"]'> | |
37 | + </columnchart-datalet> | |
36 | 38 | |
39 | +@element columnchart-datalet | |
40 | +@status v0.1 | |
41 | +@demo demo/index.html | |
42 | +@group datalets | |
37 | 43 | --> |
38 | 44 | |
39 | 45 | <dom-module id="columnchart-datalet"> | ... | ... |
datalets/columnchart-datalet/demo/index.html
0 โ 100644
1 | +<!DOCTYPE html> | |
2 | +<html lang="en"> | |
3 | +<head> | |
4 | + <meta charset="UTF-8"> | |
5 | + <title></title> | |
6 | + | |
7 | + <script> | |
8 | + </script> | |
9 | + | |
10 | +</head> | |
11 | +<body> | |
12 | + | |
13 | +<script src="https://code.jquery.com/jquery-2.1.4.min.js" type="text/javascript"></script> | |
14 | +<link rel="import" href="../columnchart-datalet.html" /> | |
15 | + | |
16 | +<columnchart-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&limit=10000" | |
17 | + fields='["result,records,Lat","result,records,Lng"]'></columnchart-datalet> | |
18 | + | |
19 | +</body> | |
20 | +</html> | |
0 | 21 | \ No newline at end of file | ... | ... |
datalets/datatable-datalet/datatable-datalet.html
1 | 1 | <!-- |
2 | -@group ROUTETOPA Polymer Core Elements | |
2 | +@license | |
3 | + The MIT License (MIT) | |
3 | 4 | |
4 | -The `datatables-datalet` is a porting of Datatables JQuery library in a web component that has built up by using Polymer. | |
5 | + Copyright (c) 2015 Dipartimento di Informatica - Universitร di Salerno - Italy | |
6 | + | |
7 | + Permission is hereby granted, free of charge, to any person obtaining a copy | |
8 | + of this software and associated documentation files (the "Software"), to deal | |
9 | + in the Software without restriction, including without limitation the rights | |
10 | + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
11 | + copies of the Software, and to permit persons to whom the Software is | |
12 | + furnished to do so, subject to the following conditions: | |
13 | + | |
14 | + The above copyright notice and this permission notice shall be included in | |
15 | + all copies or substantial portions of the Software. | |
16 | + | |
17 | + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
20 | + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
21 | + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
22 | + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
23 | + THE SOFTWARE. | |
24 | +--> | |
25 | + | |
26 | +<link rel="import" href="../base-ajax-json-jsonpath-datalet/base-ajax-json-jsonpath-datalet.html"> | |
27 | + | |
28 | +<!-- | |
29 | +The `datatable-datalet` is a porting of Datatables JQuery library in a web component that has built up by using Polymer. | |
5 | 30 | Pass to this component a data url(CKAN api uri) and a string with one or multiple query in JsonPath format(separated by spaces) and it'll show a |
6 | 31 | table with data and query attributes with all Datatables library features. |
7 | 32 | |
8 | -### Code | |
33 | +Example: | |
9 | 34 | |
10 | -Example | |
11 | - | |
12 | - <datatables-datalet | |
13 | - dataUrl="http://demo.ckan.org/api/action/datastore_search?resource_id=8324a4c9-66d6-47bf-a898-94237cc39b9f&limit=50" | |
14 | - query="$.result.records..Supplier $.result.records..Amount"> | |
35 | + <datatable-datalet | |
36 | + data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=#" | |
37 | + fields='["field1","field2"]'> | |
15 | 38 | </datatables-datalet> |
16 | 39 | |
17 | -@class datatables-datalet | |
40 | +@element datatable-datalet | |
41 | +@status v0.1 | |
42 | +@demo demo/index.html | |
43 | +@group datalets | |
18 | 44 | --> |
19 | -<link rel="import" href="../base-ajax-json-jsonpath-datalet/base-ajax-json-jsonpath-datalet.html"> | |
20 | 45 | |
21 | 46 | <dom-module id="datatable-datalet"> |
22 | 47 | <template> | ... | ... |
datalets/datatable-datalet/demo/index.html
0 โ 100644
1 | +<!DOCTYPE html> | |
2 | +<html lang="en"> | |
3 | +<head> | |
4 | + <meta charset="UTF-8"> | |
5 | + <title></title> | |
6 | + | |
7 | + <script> | |
8 | + </script> | |
9 | + | |
10 | +</head> | |
11 | +<body> | |
12 | + | |
13 | +<script src="https://code.jquery.com/jquery-2.1.4.min.js" type="text/javascript"></script> | |
14 | +<link rel="import" href="../datatable-datalet.html" /> | |
15 | + | |
16 | +<datatable-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&limit=10000" | |
17 | + fields='["result,records,Lat","result,records,Lng"]'></datatable-datalet> | |
18 | + | |
19 | +</body> | |
20 | +</html> | |
0 | 21 | \ No newline at end of file | ... | ... |
datalets/highcharts-datalet/highcharts-datalet.html
1 | +<!-- | |
2 | +@license | |
3 | + The MIT License (MIT) | |
4 | + | |
5 | + Copyright (c) 2015 Dipartimento di Informatica - Universitร di Salerno - Italy | |
6 | + | |
7 | + Permission is hereby granted, free of charge, to any person obtaining a copy | |
8 | + of this software and associated documentation files (the "Software"), to deal | |
9 | + in the Software without restriction, including without limitation the rights | |
10 | + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
11 | + copies of the Software, and to permit persons to whom the Software is | |
12 | + furnished to do so, subject to the following conditions: | |
13 | + | |
14 | + The above copyright notice and this permission notice shall be included in | |
15 | + all copies or substantial portions of the Software. | |
16 | + | |
17 | + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
20 | + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
21 | + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
22 | + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
23 | + THE SOFTWARE. | |
24 | +--> | |
25 | + | |
1 | 26 | <link rel="import" href="../base-ajax-json-jsonpath-datalet/base-ajax-json-jsonpath-datalet.html"> |
2 | 27 | |
28 | +<!-- | |
29 | +The `highcharts-datalet` uses the base-ajax-json-jsonpath-datalet as data retriving and selection mechanism. It defines the common properties | |
30 | +for all the highchart datalets : categories, series and series_type. Overmore override the transformData method | |
31 | +to create and populate categories and series array. Every specific highchart chart implementation (eg linechart, barchart, columnchart ...) | |
32 | +will use highcharts-datalet properties to create the appropriate chart. | |
33 | + | |
34 | +Example : | |
35 | + | |
36 | + <dom-module id="highcarts-chart-datalet"> | |
37 | + <template> | |
38 | + ... | |
39 | + <highcharts-datalet id="charts" data-url="{{dataUrl}}" fields="{{fields}}"></highcharts-datalet> | |
40 | + ... | |
41 | + </template> | |
42 | + </dom-module> | |
43 | + | |
44 | +@element highcharts-datalet | |
45 | +@status v0.1 | |
46 | +@homepage | |
47 | +@group datalets | |
48 | +--> | |
49 | + | |
3 | 50 | <dom-module id="highcharts-datalet"> |
4 | 51 | |
5 | 52 | <template> |
... | ... | @@ -7,8 +54,8 @@ |
7 | 54 | <base-ajax-json-jsonpath-datalet data-url="{{dataUrl}}" fields="{{fields}}"></base-ajax-json-jsonpath-datalet> |
8 | 55 | </template> |
9 | 56 | |
10 | - <script src="http://code.highcharts.com/highcharts.js"></script> | |
11 | - <script src="http://code.highcharts.com/modules/exporting.js"></script> | |
57 | + <script src="static/js/highcharts.js"></script> | |
58 | + <script src="static/js/exporting.js"></script> | |
12 | 59 | |
13 | 60 | <script> |
14 | 61 | var HighchartsBehavior = { |
... | ... | @@ -31,6 +78,13 @@ |
31 | 78 | } |
32 | 79 | }, |
33 | 80 | |
81 | + /** | |
82 | + * Populate the categories and the series array. | |
83 | + * | |
84 | + * @method transformData | |
85 | + * | |
86 | + * @param {Event} e | |
87 | + */ | |
34 | 88 | transformData: function () { |
35 | 89 | |
36 | 90 | this.properties.categories.value = this.data[0].data; |
... | ... | @@ -40,6 +94,7 @@ |
40 | 94 | |
41 | 95 | this.data[i].data.every(function (element, index, array) { |
42 | 96 | try { |
97 | + // TODO fix this parsing mechanism | |
43 | 98 | (isNaN(parseFloat(element))) ? array[index] = parseFloat(element.match(/[0-9]+/g).join(".")) : |
44 | 99 | array[index] = parseFloat(element); |
45 | 100 | }catch(e){ | ... | ... |
datalets/highcharts-datalet/static/js/exporting.js
0 โ 100644
1 | +/* | |
2 | + Highcharts JS v4.1.9 (2015-10-07) | |
3 | + Exporting module | |
4 | + | |
5 | + (c) 2010-2014 Torstein Honsi | |
6 | + | |
7 | + License: www.highcharts.com/license | |
8 | + */ | |
9 | +(function(g){var z=g.Chart,s=g.addEvent,A=g.removeEvent,B=HighchartsAdapter.fireEvent,j=g.createElement,p=g.discardElement,u=g.css,l=g.merge,m=g.each,q=g.extend,E=g.splat,F=Math.max,k=document,C=window,G=g.isTouchDevice,H=g.Renderer.prototype.symbols,r=g.getOptions(),x;q(r.lang,{printChart:"Print chart",downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image",contextButtonTitle:"Chart context menu"});r.navigation= | |
10 | +{menuStyle:{border:"1px solid #A0A0A0",background:"#FFFFFF",padding:"5px 0"},menuItemStyle:{padding:"0 10px",background:"none",color:"#303030",fontSize:G?"14px":"11px"},menuItemHoverStyle:{background:"#4572A5",color:"#FFFFFF"},buttonOptions:{symbolFill:"#E0E0E0",symbolSize:14,symbolStroke:"#666",symbolStrokeWidth:3,symbolX:12.5,symbolY:10.5,align:"right",buttonSpacing:3,height:22,theme:{fill:"white",stroke:"none"},verticalAlign:"top",width:24}};r.exporting={type:"image/png",url:"http://export.highcharts.com/", | |
11 | + buttons:{contextButton:{menuClassName:"highcharts-contextmenu",symbol:"menu",_titleKey:"contextButtonTitle",menuItems:[{textKey:"printChart",onclick:function(){this.print()}},{separator:!0},{textKey:"downloadPNG",onclick:function(){this.exportChart()}},{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},{textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},{textKey:"downloadSVG",onclick:function(){this.exportChart({type:"image/svg+xml"})}}]}}}; | |
12 | + g.post=function(b,a,e){var c,b=j("form",l({method:"post",action:b,enctype:"multipart/form-data"},e),{display:"none"},k.body);for(c in a)j("input",{type:"hidden",name:c,value:a[c]},null,b);b.submit();p(b)};q(z.prototype,{sanitizeSVG:function(b){return b.replace(/zIndex="[^"]+"/g,"").replace(/isShadow="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/url\([^#]+#/g,"url(#").replace(/<svg /,'<svg xmlns:xlink="http://www.w3.org/1999/xlink" ').replace(/ (NS[0-9]+\:)?href=/g, | |
13 | + " xlink:href=").replace(/\n/," ").replace(/<\/svg>.*?$/,"</svg>").replace(/(fill|stroke)="rgba\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\.]+)\)"/g,'$1="rgb($2)" $1-opacity="$3"').replace(/ /g,"\u00a0").replace(/­/g,"\u00ad").replace(/<IMG /g,"<image ").replace(/<(\/?)TITLE>/g,"<$1title>").replace(/height=([^" ]+)/g,'height="$1"').replace(/width=([^" ]+)/g,'width="$1"').replace(/hc-svg-href="([^"]+)">/g,'xlink:href="$1"/>').replace(/ id=([^" >]+)/g,' id="$1"').replace(/class=([^" >]+)/g,'class="$1"').replace(/ transform /g, | |
14 | + " ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(a){return a.toLowerCase()})},getChartHTML:function(){return this.container.innerHTML},getSVG:function(b){var a=this,e,c,f,y,h,d=l(a.options,b),I=d.exporting.allowHTML;if(!k.createElementNS)k.createElementNS=function(a,b){return k.createElement(b)};c=j("div",null,{position:"absolute",top:"-9999em",width:a.chartWidth+"px",height:a.chartHeight+"px"},k.body);f=a.renderTo.style.width;h=a.renderTo.style.height;f=d.exporting.sourceWidth|| | |
15 | + d.chart.width||/px$/.test(f)&&parseInt(f,10)||600;h=d.exporting.sourceHeight||d.chart.height||/px$/.test(h)&&parseInt(h,10)||400;q(d.chart,{animation:!1,renderTo:c,forExport:!0,renderer:"SVGRenderer",width:f,height:h});d.exporting.enabled=!1;delete d.data;d.series=[];m(a.series,function(a){y=l(a.options,{animation:!1,enableMouseTracking:!1,showCheckbox:!1,visible:a.visible});y.isInternal||d.series.push(y)});b&&m(["xAxis","yAxis"],function(a){m(E(b[a]),function(b,c){d[a][c]=l(d[a][c],b)})});e=new g.Chart(d, | |
16 | + a.callback);m(["xAxis","yAxis"],function(b){m(a[b],function(a,c){var d=e[b][c],f=a.getExtremes(),h=f.userMin,f=f.userMax;d&&(h!==void 0||f!==void 0)&&d.setExtremes(h,f,!0,!1)})});f=e.getChartHTML();d=null;e.destroy();p(c);if(I&&(c=f.match(/<\/svg>(.*?$)/)))c='<foreignObject x="0" y="0" width="200" height="200"><body xmlns="http://www.w3.org/1999/xhtml">'+c[1]+"</body></foreignObject>",f=f.replace("</svg>",c+"</svg>");f=this.sanitizeSVG(f);return f=f.replace(/(url\(#highcharts-[0-9]+)"/g,"$1").replace(/"/g, | |
17 | + "'")},getSVGForExport:function(b,a){var e=this.options.exporting;return this.getSVG(l({chart:{borderRadius:0}},e.chartOptions,a,{exporting:{sourceWidth:b&&b.sourceWidth||e.sourceWidth,sourceHeight:b&&b.sourceHeight||e.sourceHeight}}))},exportChart:function(b,a){var e=this.getSVGForExport(b,a),b=l(this.options.exporting,b);g.post(b.url,{filename:b.filename||"chart",type:b.type,width:b.width||0,scale:b.scale||2,svg:e},b.formAttributes)},print:function(){var b=this,a=b.container,e=[],c=a.parentNode, | |
18 | + f=k.body,g=f.childNodes;if(!b.isPrinting)b.isPrinting=!0,B(b,"beforePrint"),m(g,function(a,b){if(a.nodeType===1)e[b]=a.style.display,a.style.display="none"}),f.appendChild(a),C.focus(),C.print(),setTimeout(function(){c.appendChild(a);m(g,function(a,b){if(a.nodeType===1)a.style.display=e[b]});b.isPrinting=!1;B(b,"afterPrint")},1E3)},contextMenu:function(b,a,e,c,f,g,h){var d=this,l=d.options.navigation,D=l.menuItemStyle,n=d.chartWidth,o=d.chartHeight,k="cache-"+b,i=d[k],t=F(f,g),v,w,p,r=function(a){d.pointer.inClass(a.target, | |
19 | + b)||w()};if(!i)d[k]=i=j("div",{className:b},{position:"absolute",zIndex:1E3,padding:t+"px"},d.container),v=j("div",null,q({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},l.menuStyle),i),w=function(){u(i,{display:"none"});h&&h.setState(0);d.openMenu=!1},s(i,"mouseleave",function(){p=setTimeout(w,500)}),s(i,"mouseenter",function(){clearTimeout(p)}),s(document,"mouseup",r),s(d,"destroy",function(){A(document,"mouseup",r)}),m(a,function(a){if(a){var b= | |
20 | + a.separator?j("hr",null,null,v):j("div",{onmouseover:function(){u(this,l.menuItemHoverStyle)},onmouseout:function(){u(this,D)},onclick:function(b){b.stopPropagation();w();a.onclick&&a.onclick.apply(d,arguments)},innerHTML:a.text||d.options.lang[a.textKey]},q({cursor:"pointer"},D),v);d.exportDivElements.push(b)}}),d.exportDivElements.push(v,i),d.exportMenuWidth=i.offsetWidth,d.exportMenuHeight=i.offsetHeight;a={display:"block"};e+d.exportMenuWidth>n?a.right=n-e-f-t+"px":a.left=e-t+"px";c+g+d.exportMenuHeight> | |
21 | + o&&h.alignOptions.verticalAlign!=="top"?a.bottom=o-c-t+"px":a.top=c+g-t+"px";u(i,a);d.openMenu=!0},addButton:function(b){var a=this,e=a.renderer,c=l(a.options.navigation.buttonOptions,b),f=c.onclick,k=c.menuItems,h,d,m={stroke:c.symbolStroke,fill:c.symbolFill},j=c.symbolSize||12;if(!a.btnCount)a.btnCount=0;if(!a.exportDivElements)a.exportDivElements=[],a.exportSVGElements=[];if(c.enabled!==!1){var n=c.theme,o=n.states,p=o&&o.hover,o=o&&o.select,i;delete n.states;f?i=function(b){b.stopPropagation(); | |
22 | + f.call(a,b)}:k&&(i=function(){a.contextMenu(d.menuClassName,k,d.translateX,d.translateY,d.width,d.height,d);d.setState(2)});c.text&&c.symbol?n.paddingLeft=g.pick(n.paddingLeft,25):c.text||q(n,{width:c.width,height:c.height,padding:0});d=e.button(c.text,0,0,i,n,p,o).attr({title:a.options.lang[c._titleKey],"stroke-linecap":"round"});d.menuClassName=b.menuClassName||"highcharts-menu-"+a.btnCount++;c.symbol&&(h=e.symbol(c.symbol,c.symbolX-j/2,c.symbolY-j/2,j,j).attr(q(m,{"stroke-width":c.symbolStrokeWidth|| | |
23 | + 1,zIndex:1})).add(d));d.add().align(q(c,{width:d.width,x:g.pick(c.x,x)}),!0,"spacingBox");x+=(d.width+c.buttonSpacing)*(c.align==="right"?-1:1);a.exportSVGElements.push(d,h)}},destroyExport:function(b){var b=b.target,a,e;for(a=0;a<b.exportSVGElements.length;a++)if(e=b.exportSVGElements[a])e.onclick=e.ontouchstart=null,b.exportSVGElements[a]=e.destroy();for(a=0;a<b.exportDivElements.length;a++)e=b.exportDivElements[a],A(e,"mouseleave"),b.exportDivElements[a]=e.onmouseout=e.onmouseover=e.ontouchstart= | |
24 | + e.onclick=null,p(e)}});H.menu=function(b,a,e,c){return["M",b,a+2.5,"L",b+e,a+2.5,"M",b,a+c/2+0.5,"L",b+e,a+c/2+0.5,"M",b,a+c-1.5,"L",b+e,a+c-1.5]};z.prototype.callbacks.push(function(b){var a,e=b.options.exporting,c=e.buttons;x=0;if(e.enabled!==!1){for(a in c)b.addButton(c[a]);s(b,"destroy",b.destroyExport)}})})(Highcharts); | |
0 | 25 | \ No newline at end of file | ... | ... |
datalets/highcharts-datalet/static/js/highcharts.js
0 โ 100644
1 | +/* | |
2 | + Highcharts JS v4.1.9 (2015-10-07) | |
3 | + | |
4 | + (c) 2009-2014 Torstein Honsi | |
5 | + | |
6 | + License: www.highcharts.com/license | |
7 | + */ | |
8 | +(function(){function D(){var a,b=arguments,c,d={},e=function(a,b){var c,d;typeof a!=="object"&&(a={});for(d in b)b.hasOwnProperty(d)&&(c=b[d],a[d]=c&&typeof c==="object"&&Object.prototype.toString.call(c)!=="[object Array]"&&d!=="renderTo"&&typeof c.nodeType!=="number"?e(a[d]||{},c):b[d]);return a};b[0]===!0&&(d=b[1],b=Array.prototype.slice.call(b,2));c=b.length;for(a=0;a<c;a++)d=e(d,b[a]);return d}function G(a,b){return parseInt(a,b||10)}function Ba(a){return typeof a==="string"}function da(a){return a&& | |
9 | + typeof a==="object"}function Ga(a){return Object.prototype.toString.call(a)==="[object Array]"}function qa(a){return typeof a==="number"}function Ca(a){return V.log(a)/V.LN10}function ia(a){return V.pow(10,a)}function ja(a,b){for(var c=a.length;c--;)if(a[c]===b){a.splice(c,1);break}}function q(a){return a!==x&&a!==null}function K(a,b,c){var d,e;if(Ba(b))q(c)?a.setAttribute(b,c):a&&a.getAttribute&&(e=a.getAttribute(b));else if(q(b)&&da(b))for(d in b)a.setAttribute(d,b[d]);return e}function ra(a){return Ga(a)? | |
10 | + a:[a]}function M(a,b){if(sa&&!ca&&b&&b.opacity!==x)b.filter="alpha(opacity="+b.opacity*100+")";t(a.style,b)}function $(a,b,c,d,e){a=C.createElement(a);b&&t(a,b);e&&M(a,{padding:0,border:P,margin:0});c&&M(a,c);d&&d.appendChild(a);return a}function ka(a,b){var c=function(){return x};c.prototype=new a;t(c.prototype,b);return c}function Ha(a,b){return Array((b||2)+1-String(a).length).join(0)+a}function Wa(a){return(db&&db(a)||nb||0)*6E4}function Ia(a,b){for(var c="{",d=!1,e,f,g,h,i,j=[];(c=a.indexOf(c))!== | |
11 | +-1;){e=a.slice(0,c);if(d){f=e.split(":");g=f.shift().split(".");i=g.length;e=b;for(h=0;h<i;h++)e=e[g[h]];if(f.length)f=f.join(":"),g=/\.([0-9])/,h=S.lang,i=void 0,/f$/.test(f)?(i=(i=f.match(g))?i[1]:-1,e!==null&&(e=B.numberFormat(e,i,h.decimalPoint,f.indexOf(",")>-1?h.thousandsSep:""))):e=Na(f,e)}j.push(e);a=a.slice(c+1);c=(d=!d)?"}":"{"}j.push(a);return j.join("")}function ob(a){return V.pow(10,T(V.log(a)/V.LN10))}function pb(a,b,c,d,e){var f,g=a,c=p(c,1);f=a/c;b||(b=[1,2,2.5,5,10],d===!1&&(c=== | |
12 | +1?b=[1,2,5,10]:c<=0.1&&(b=[1/c])));for(d=0;d<b.length;d++)if(g=b[d],e&&g*c>=a||!e&&f<=(b[d]+(b[d+1]||b[d]))/2)break;g*=c;return g}function qb(a,b){var c=a.length,d,e;for(e=0;e<c;e++)a[e].ss_i=e;a.sort(function(a,c){d=b(a,c);return d===0?a.ss_i-c.ss_i:d});for(e=0;e<c;e++)delete a[e].ss_i}function Oa(a){for(var b=a.length,c=a[0];b--;)a[b]<c&&(c=a[b]);return c}function Da(a){for(var b=a.length,c=a[0];b--;)a[b]>c&&(c=a[b]);return c}function Pa(a,b){for(var c in a)a[c]&&a[c]!==b&&a[c].destroy&&a[c].destroy(), | |
13 | + delete a[c]}function Qa(a){eb||(eb=$(Ja));a&&eb.appendChild(a);eb.innerHTML=""}function la(a,b){var c="Highcharts error #"+a+": www.highcharts.com/errors/"+a;if(b)throw c;L.console&&console.log(c)}function ea(a,b){return parseFloat(a.toPrecision(b||14))}function Ra(a,b){b.renderer.globalAnimation=p(a,b.animation)}function Cb(){var a=S.global,b=a.useUTC,c=b?"getUTC":"get",d=b?"setUTC":"set";ya=a.Date||window.Date;nb=b&&a.timezoneOffset;db=b&&a.getTimezoneOffset;fb=function(a,c,d,h,i,j){var k;b?(k= | |
14 | + ya.UTC.apply(0,arguments),k+=Wa(k)):k=(new ya(a,c,p(d,1),p(h,0),p(i,0),p(j,0))).getTime();return k};rb=c+"Minutes";sb=c+"Hours";tb=c+"Day";Xa=c+"Date";Ya=c+"Month";Za=c+"FullYear";Db=d+"Milliseconds";Eb=d+"Seconds";Fb=d+"Minutes";Gb=d+"Hours";ub=d+"Date";vb=d+"Month";wb=d+"FullYear"}function Q(){}function Sa(a,b,c,d){this.axis=a;this.pos=b;this.type=c||"";this.isNew=!0;!c&&!d&&this.addLabel()}function Hb(a,b,c,d,e){var f=a.chart.inverted;this.axis=a;this.isNegative=c;this.options=b;this.x=d;this.total= | |
15 | + null;this.points={};this.stack=e;this.alignOptions={align:b.align||(f?c?"left":"right":"center"),verticalAlign:b.verticalAlign||(f?"middle":c?"bottom":"top"),y:p(b.y,f?4:c?14:-6),x:p(b.x,f?c?-6:6:0)};this.textAlign=b.textAlign||(f?c?"right":"left":"center")}var x,C=document,L=window,V=Math,w=V.round,T=V.floor,ta=V.ceil,s=V.max,z=V.min,O=V.abs,W=V.cos,aa=V.sin,ma=V.PI,ga=ma*2/360,za=navigator.userAgent,Ib=L.opera,sa=/(msie|trident|edge)/i.test(za)&&!Ib,gb=C.documentMode===8,hb=!sa&&/AppleWebKit/.test(za), | |
16 | + Ka=/Firefox/.test(za),Jb=/(Mobile|Android|Windows Phone)/.test(za),Ea="http://www.w3.org/2000/svg",ca=!!C.createElementNS&&!!C.createElementNS(Ea,"svg").createSVGRect,Nb=Ka&&parseInt(za.split("Firefox/")[1],10)<4,fa=!ca&&!sa&&!!C.createElement("canvas").getContext,$a,ab,Kb={},xb=0,eb,S,Na,yb,F,ua=function(){return x},X=[],bb=0,Ja="div",P="none",Ob=/^[0-9]+$/,ib=["plotTop","marginRight","marginBottom","plotLeft"],Pb="stroke-width",ya,fb,nb,db,rb,sb,tb,Xa,Ya,Za,Db,Eb,Fb,Gb,ub,vb,wb,N={},B;B=L.Highcharts= | |
17 | + L.Highcharts?la(16,!0):{};B.seriesTypes=N;var t=B.extend=function(a,b){var c;a||(a={});for(c in b)a[c]=b[c];return a},p=B.pick=function(){var a=arguments,b,c,d=a.length;for(b=0;b<d;b++)if(c=a[b],c!==x&&c!==null)return c},Ta=B.wrap=function(a,b,c){var d=a[b];a[b]=function(){var a=Array.prototype.slice.call(arguments);a.unshift(d);return c.apply(this,a)}};Na=function(a,b,c){if(!q(b)||isNaN(b))return S.lang.invalidDate||"";var a=p(a,"%Y-%m-%d %H:%M:%S"),d=new ya(b-Wa(b)),e,f=d[sb](),g=d[tb](),h=d[Xa](), | |
18 | + i=d[Ya](),j=d[Za](),k=S.lang,m=k.weekdays,d=t({a:m[g].substr(0,3),A:m[g],d:Ha(h),e:h,w:g,b:k.shortMonths[i],B:k.months[i],m:Ha(i+1),y:j.toString().substr(2,2),Y:j,H:Ha(f),k:f,I:Ha(f%12||12),l:f%12||12,M:Ha(d[rb]()),p:f<12?"AM":"PM",P:f<12?"am":"pm",S:Ha(d.getSeconds()),L:Ha(w(b%1E3),3)},B.dateFormats);for(e in d)for(;a.indexOf("%"+e)!==-1;)a=a.replace("%"+e,typeof d[e]==="function"?d[e](b):d[e]);return c?a.substr(0,1).toUpperCase()+a.substr(1):a};F={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5, | |
19 | + week:6048E5,month:24192E5,year:314496E5};B.numberFormat=function(a,b,c,d){var e=S.lang,a=+a||0,f=b===-1?z((a.toString().split(".")[1]||"").length,20):isNaN(b=O(b))?2:b,b=c===void 0?e.decimalPoint:c,d=d===void 0?e.thousandsSep:d,e=a<0?"-":"",c=String(G(a=O(a).toFixed(f))),g=c.length>3?c.length%3:0;return e+(g?c.substr(0,g)+d:"")+c.substr(g).replace(/(\d{3})(?=\d)/g,"$1"+d)+(f?b+O(a-c).toFixed(f).slice(2):"")};yb={init:function(a,b,c){var b=b||"",d=a.shift,e=b.indexOf("C")>-1,f=e?7:3,g,b=b.split(" "), | |
20 | + c=[].concat(c),h,i,j=function(a){for(g=a.length;g--;)a[g]==="M"&&a.splice(g+1,0,a[g+1],a[g+2],a[g+1],a[g+2])};e&&(j(b),j(c));a.isArea&&(h=b.splice(b.length-6,6),i=c.splice(c.length-6,6));if(d<=c.length/f&&b.length===c.length)for(;d--;)c=[].concat(c).splice(0,f).concat(c);a.shift=0;if(b.length)for(a=c.length;b.length<a;)d=[].concat(b).splice(b.length-f,f),e&&(d[f-6]=d[f-2],d[f-5]=d[f-1]),b=b.concat(d);h&&(b=b.concat(h),c=c.concat(i));return[b,c]},step:function(a,b,c,d){var e=[],f=a.length;if(c===1)e= | |
21 | + d;else if(f===b.length&&c<1)for(;f--;)d=parseFloat(a[f]),e[f]=isNaN(d)?a[f]:c*parseFloat(b[f]-d)+d;else e=b;return e}};(function(a){L.HighchartsAdapter=L.HighchartsAdapter||a&&{init:function(b){var c=a.fx;a.extend(a.easing,{easeOutQuad:function(a,b,c,g,h){return-g*(b/=h)*(b-2)+c}});a.each(["cur","_default","width","height","opacity"],function(b,e){var f=c.step,g;e==="cur"?f=c.prototype:e==="_default"&&a.Tween&&(f=a.Tween.propHooks[e],e="set");(g=f[e])&&(f[e]=function(a){var c,a=b?a:this;if(a.prop!== | |
22 | + "align")return c=a.elem,c.attr?c.attr(a.prop,e==="cur"?x:a.now):g.apply(this,arguments)})});Ta(a.cssHooks.opacity,"get",function(a,b,c){return b.attr?b.opacity||0:a.call(this,b,c)});this.addAnimSetter("d",function(a){var c=a.elem,f;if(!a.started)f=b.init(c,c.d,c.toD),a.start=f[0],a.end=f[1],a.started=!0;c.attr("d",b.step(a.start,a.end,a.pos,c.toD))});this.each=Array.prototype.forEach?function(a,b){return Array.prototype.forEach.call(a,b)}:function(a,b){var c,g=a.length;for(c=0;c<g;c++)if(b.call(a[c], | |
23 | + a[c],c,a)===!1)return c};a.fn.highcharts=function(){var a="Chart",b=arguments,c,g;if(this[0]){Ba(b[0])&&(a=b[0],b=Array.prototype.slice.call(b,1));c=b[0];if(c!==x)c.chart=c.chart||{},c.chart.renderTo=this[0],new B[a](c,b[1]),g=this;c===x&&(g=X[K(this[0],"data-highcharts-chart")])}return g}},addAnimSetter:function(b,c){a.Tween?a.Tween.propHooks[b]={set:c}:a.fx.step[b]=c},getScript:a.getScript,inArray:a.inArray,adapterRun:function(b,c){return a(b)[c]()},grep:a.grep,map:function(a,c){for(var d=[],e= | |
24 | + 0,f=a.length;e<f;e++)d[e]=c.call(a[e],a[e],e,a);return d},offset:function(b){return a(b).offset()},addEvent:function(b,c,d){a(b).bind(c,d)},removeEvent:function(b,c,d){var e=C.removeEventListener?"removeEventListener":"detachEvent";C[e]&&b&&!b[e]&&(b[e]=function(){});a(b).unbind(c,d)},fireEvent:function(b,c,d,e){var f=a.Event(c),g="detached"+c,h;!sa&&d&&(delete d.layerX,delete d.layerY,delete d.returnValue);t(f,d);b[c]&&(b[g]=b[c],b[c]=null);a.each(["preventDefault","stopPropagation"],function(a, | |
25 | + b){var c=f[b];f[b]=function(){try{c.call(f)}catch(a){b==="preventDefault"&&(h=!0)}}});a(b).trigger(f);b[g]&&(b[c]=b[g],b[g]=null);e&&!f.isDefaultPrevented()&&!h&&e(f)},washMouseEvent:function(a){var c=a.originalEvent||a;if(c.pageX===x)c.pageX=a.pageX,c.pageY=a.pageY;return c},animate:function(b,c,d){var e=a(b);if(!b.style)b.style={};if(c.d)b.toD=c.d,c.d=1;e.stop();c.opacity!==x&&b.attr&&(c.opacity+="px");b.hasAnim=1;e.animate(c,d)},stop:function(b){b.hasAnim&&a(b).stop()}}})(L.jQuery);var U=L.HighchartsAdapter, | |
26 | + E=U||{};U&&U.init.call(U,yb);var jb=E.adapterRun,Qb=E.getScript,La=E.inArray,o=B.each=E.each,kb=E.grep,Rb=E.offset,Ua=E.map,I=E.addEvent,Y=E.removeEvent,J=E.fireEvent,Sb=E.washMouseEvent,lb=E.animate,cb=E.stop;S={colors:"#7cb5ec,#434348,#90ed7d,#f7a35c,#8085e9,#f15c80,#e4d354,#2b908f,#f45b5b,#91e8e1".split(","),symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January,February,March,April,May,June,July,August,September,October,November,December".split(","), | |
27 | + shortMonths:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),weekdays:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),decimalPoint:".",numericSymbols:"k,M,G,T,P,E".split(","),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:" "},global:{useUTC:!0,canvasToolsURL:"http://code.highcharts.com/4.1.9/modules/canvas-tools.js",VMLRadialGradientURL:"http://code.highcharts.com/4.1.9/gfx/vml-radial-gradient.png"},chart:{borderColor:"#4572A7",borderRadius:0, | |
28 | + defaultSeriesType:"line",ignoreHiddenSeries:!0,spacing:[10,10,15,10],backgroundColor:"#FFFFFF",plotBorderColor:"#C0C0C0",resetZoomButton:{theme:{zIndex:20},position:{align:"right",x:-10,y:10}}},title:{text:"Chart title",align:"center",margin:15,style:{color:"#333333",fontSize:"18px"}},subtitle:{text:"",align:"center",style:{color:"#555555"}},plotOptions:{line:{allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},lineWidth:2,marker:{lineWidth:0,radius:4,lineColor:"#FFFFFF",states:{hover:{enabled:!0, | |
29 | + lineWidthPlus:1,radiusPlus:2},select:{fillColor:"#FFFFFF",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:{align:"center",formatter:function(){return this.y===null?"":B.numberFormat(this.y,-1)},style:{color:"contrast",fontSize:"11px",fontWeight:"bold",textShadow:"0 0 6px contrast, 0 0 3px contrast"},verticalAlign:"bottom",x:0,y:0,padding:5},cropThreshold:300,pointRange:0,softThreshold:!0,states:{hover:{lineWidthPlus:1,marker:{},halo:{size:10,opacity:0.25}},select:{marker:{}}},stickyTracking:!0, | |
30 | + turboThreshold:1E3}},labels:{style:{position:"absolute",color:"#3E576F"}},legend:{enabled:!0,align:"center",layout:"horizontal",labelFormatter:function(){return this.name},borderColor:"#909090",borderRadius:0,navigation:{activeColor:"#274b6d",inactiveColor:"#CCC"},shadow:!1,itemStyle:{color:"#333333",fontSize:"12px",fontWeight:"bold"},itemHoverStyle:{color:"#000"},itemHiddenStyle:{color:"#CCC"},itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},symbolPadding:5,verticalAlign:"bottom", | |
31 | + x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"45%"},style:{position:"absolute",backgroundColor:"white",opacity:0.5,textAlign:"center"}},tooltip:{enabled:!0,animation:ca,backgroundColor:"rgba(249, 249, 249, .85)",borderWidth:1,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y", | |
32 | + year:"%Y"},footerFormat:"",headerFormat:'<span style="font-size: 10px">{point.key}</span><br/>',pointFormat:'<span style="color:{point.color}">\u25cf</span> {series.name}: <b>{point.y}</b><br/>',shadow:!0,snap:Jb?25:10,style:{color:"#333333",cursor:"default",fontSize:"12px",padding:"8px",pointerEvents:"none",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"Highcharts.com",href:"http://www.highcharts.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#909090", | |
33 | + fontSize:"9px"}}};var ba=S.plotOptions,U=ba.line;Cb();var Tb=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,Ub=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,Vb=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,na=function(a){var b=[],c,d;(function(a){a&&a.stops?d=Ua(a.stops,function(a){return na(a[1])}):(c=Tb.exec(a))?b=[G(c[1]),G(c[2]),G(c[3]),parseFloat(c[4],10)]:(c=Ub.exec(a))?b=[G(c[1],16),G(c[2],16),G(c[3],16),1]:(c=Vb.exec(a))&& | |
34 | +(b=[G(c[1]),G(c[2]),G(c[3]),1])})(a);return{get:function(c){var f;d?(f=D(a),f.stops=[].concat(f.stops),o(d,function(a,b){f.stops[b]=[f.stops[b][0],a.get(c)]})):f=b&&!isNaN(b[0])?c==="rgb"?"rgb("+b[0]+","+b[1]+","+b[2]+")":c==="a"?b[3]:"rgba("+b.join(",")+")":a;return f},brighten:function(a){if(d)o(d,function(b){b.brighten(a)});else if(qa(a)&&a!==0){var c;for(c=0;c<3;c++)b[c]+=G(a*255),b[c]<0&&(b[c]=0),b[c]>255&&(b[c]=255)}return this},rgba:b,setOpacity:function(a){b[3]=a;return this},raw:a}};Q.prototype= | |
35 | +{opacity:1,textProps:"fontSize,fontWeight,fontFamily,fontStyle,color,lineHeight,width,textDecoration,textOverflow,textShadow".split(","),init:function(a,b){this.element=b==="span"?$(b):C.createElementNS(Ea,b);this.renderer=a},animate:function(a,b,c){b=p(b,this.renderer.globalAnimation,!0);cb(this);if(b){b=D(b,{});if(c)b.complete=c;lb(this,a,b)}else this.attr(a,null,c);return this},colorGradient:function(a,b,c){var d=this.renderer,e,f,g,h,i,j,k,m,n,l,u,r=[];a.linearGradient?f="linearGradient":a.radialGradient&& | |
36 | +(f="radialGradient");if(f){g=a[f];i=d.gradients;k=a.stops;l=c.radialReference;Ga(g)&&(a[f]=g={x1:g[0],y1:g[1],x2:g[2],y2:g[3],gradientUnits:"userSpaceOnUse"});f==="radialGradient"&&l&&!q(g.gradientUnits)&&(h=g,g=D(g,d.getRadialAttr(l,h),{gradientUnits:"userSpaceOnUse"}));for(u in g)u!=="id"&&r.push(u,g[u]);for(u in k)r.push(k[u]);r=r.join(",");i[r]?a=i[r].attr("id"):(g.id=a="highcharts-"+xb++,i[r]=j=d.createElement(f).attr(g).add(d.defs),j.radAttr=h,j.stops=[],o(k,function(a){a[1].indexOf("rgba")=== | |
37 | +0?(e=na(a[1]),m=e.get("rgb"),n=e.get("a")):(m=a[1],n=1);a=d.createElement("stop").attr({offset:a[0],"stop-color":m,"stop-opacity":n}).add(j);j.stops.push(a)}));c.setAttribute(b,"url("+d.url+"#"+a+")");c.gradient=r}},applyTextShadow:function(a){var b=this.element,c,d=a.indexOf("contrast")!==-1,e={},f=this.renderer.forExport,g=f||b.style.textShadow!==x&&!sa;if(d)e.textShadow=a=a.replace(/contrast/g,this.renderer.getContrast(b.style.fill));if(hb||f)e.textRendering="geometricPrecision";g?this.css(e): | |
38 | + (this.fakeTS=!0,this.ySetter=this.xSetter,c=[].slice.call(b.getElementsByTagName("tspan")),o(a.split(/\s?,\s?/g),function(a){var d=b.firstChild,e,f,a=a.split(" ");e=a[a.length-1];(f=a[a.length-2])&&o(c,function(a,c){var g;c===0&&(a.setAttribute("x",b.getAttribute("x")),c=b.getAttribute("y"),a.setAttribute("y",c||0),c===null&&b.setAttribute("y",0));g=a.cloneNode(1);K(g,{"class":"highcharts-text-shadow",fill:e,stroke:e,"stroke-opacity":1/s(G(f),3),"stroke-width":f,"stroke-linejoin":"round"});b.insertBefore(g, | |
39 | + d)})}))},attr:function(a,b,c){var d,e=this.element,f,g=this,h;typeof a==="string"&&b!==x&&(d=a,a={},a[d]=b);if(typeof a==="string")g=(this[a+"Getter"]||this._defaultGetter).call(this,a,e);else{for(d in a){b=a[d];h=!1;this.symbolName&&/^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(d)&&(f||(this.symbolAttr(a),f=!0),h=!0);if(this.rotation&&(d==="x"||d==="y"))this.doTransform=!0;h||(this[d+"Setter"]||this._defaultSetter).call(this,b,d,e);this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(d)&& | |
40 | +this.updateShadows(d,b)}if(this.doTransform)this.updateTransform(),this.doTransform=!1}c&&c();return g},updateShadows:function(a,b){for(var c=this.shadows,d=c.length;d--;)c[d].setAttribute(a,a==="height"?s(b-(c[d].cutHeight||0),0):a==="d"?this.d:b)},addClass:function(a){var b=this.element,c=K(b,"class")||"";c.indexOf(a)===-1&&K(b,"class",c+" "+a);return this},symbolAttr:function(a){var b=this;o("x,y,r,start,end,width,height,innerR,anchorX,anchorY".split(","),function(c){b[c]=p(a[c],b[c])});b.attr({d:b.renderer.symbols[b.symbolName](b.x, | |
41 | + b.y,b.width,b.height,b)})},clip:function(a){return this.attr("clip-path",a?"url("+this.renderer.url+"#"+a.id+")":P)},crisp:function(a){var b,c={},d,e=a.strokeWidth||this.strokeWidth||0;d=w(e)%2/2;a.x=T(a.x||this.x||0)+d;a.y=T(a.y||this.y||0)+d;a.width=T((a.width||this.width||0)-2*d);a.height=T((a.height||this.height||0)-2*d);a.strokeWidth=e;for(b in a)this[b]!==a[b]&&(this[b]=c[b]=a[b]);return c},css:function(a){var b=this.styles,c={},d=this.element,e,f,g="";e=!b;if(a&&a.color)a.fill=a.color;if(b)for(f in a)a[f]!== | |
42 | +b[f]&&(c[f]=a[f],e=!0);if(e){e=this.textWidth=a&&a.width&&d.nodeName.toLowerCase()==="text"&&G(a.width)||this.textWidth;b&&(a=t(b,c));this.styles=a;e&&(fa||!ca&&this.renderer.forExport)&&delete a.width;if(sa&&!ca)M(this.element,a);else{b=function(a,b){return"-"+b.toLowerCase()};for(f in a)g+=f.replace(/([A-Z])/g,b)+":"+a[f]+";";K(d,"style",g)}e&&this.added&&this.renderer.buildText(this)}return this},on:function(a,b){var c=this,d=c.element;ab&&a==="click"?(d.ontouchstart=function(a){c.touchEventFired= | |
43 | + ya.now();a.preventDefault();b.call(d,a)},d.onclick=function(a){(za.indexOf("Android")===-1||ya.now()-(c.touchEventFired||0)>1100)&&b.call(d,a)}):d["on"+a]=b;return this},setRadialReference:function(a){var b=this.renderer.gradients[this.element.gradient];this.element.radialReference=a;b&&b.radAttr&&b.animate(this.renderer.getRadialAttr(a,b.radAttr));return this},translate:function(a,b){return this.attr({translateX:a,translateY:b})},invert:function(){this.inverted=!0;this.updateTransform();return this}, | |
44 | + updateTransform:function(){var a=this.translateX||0,b=this.translateY||0,c=this.scaleX,d=this.scaleY,e=this.inverted,f=this.rotation,g=this.element;e&&(a+=this.attr("width"),b+=this.attr("height"));a=["translate("+a+","+b+")"];e?a.push("rotate(90) scale(-1,1)"):f&&a.push("rotate("+f+" "+(g.getAttribute("x")||0)+" "+(g.getAttribute("y")||0)+")");(q(c)||q(d))&&a.push("scale("+p(c,1)+" "+p(d,1)+")");a.length&&g.setAttribute("transform",a.join(" "))},toFront:function(){var a=this.element;a.parentNode.appendChild(a); | |
45 | + return this},align:function(a,b,c){var d,e,f,g,h={};e=this.renderer;f=e.alignedObjects;if(a){if(this.alignOptions=a,this.alignByTranslate=b,!c||Ba(c))this.alignTo=d=c||"renderer",ja(f,this),f.push(this),c=null}else a=this.alignOptions,b=this.alignByTranslate,d=this.alignTo;c=p(c,e[d],e);d=a.align;e=a.verticalAlign;f=(c.x||0)+(a.x||0);g=(c.y||0)+(a.y||0);if(d==="right"||d==="center")f+=(c.width-(a.width||0))/{right:1,center:2}[d];h[b?"translateX":"x"]=w(f);if(e==="bottom"||e==="middle")g+=(c.height- | |
46 | + (a.height||0))/({bottom:1,middle:2}[e]||1);h[b?"translateY":"y"]=w(g);this[this.placed?"animate":"attr"](h);this.placed=!0;this.alignAttr=h;return this},getBBox:function(a){var b,c=this.renderer,d,e=this.rotation,f=this.element,g=this.styles,h=e*ga;d=this.textStr;var i,j=f.style,k,m;d!==x&&(m=["",e||0,g&&g.fontSize,f.style.width].join(","),m=d===""||Ob.test(d)?"num:"+d.toString().length+m:d+m);m&&!a&&(b=c.cache[m]);if(!b){if(f.namespaceURI===Ea||c.forExport){try{k=this.fakeTS&&function(a){o(f.querySelectorAll(".highcharts-text-shadow"), | |
47 | + function(b){b.style.display=a})},Ka&&j.textShadow?(i=j.textShadow,j.textShadow=""):k&&k(P),b=f.getBBox?t({},f.getBBox()):{width:f.offsetWidth,height:f.offsetHeight},i?j.textShadow=i:k&&k("")}catch(n){}if(!b||b.width<0)b={width:0,height:0}}else b=this.htmlGetBBox();if(c.isSVG){a=b.width;d=b.height;if(sa&&g&&g.fontSize==="11px"&&d.toPrecision(3)==="16.9")b.height=d=14;if(e)b.width=O(d*aa(h))+O(a*W(h)),b.height=O(d*W(h))+O(a*aa(h))}m&&(c.cache[m]=b)}return b},show:function(a){return this.attr({visibility:a? | |
48 | + "inherit":"visible"})},hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(a){var b=this;b.animate({opacity:0},{duration:a||150,complete:function(){b.attr({y:-9999})}})},add:function(a){var b=this.renderer,c=this.element,d;if(a)this.parentGroup=a;this.parentInverted=a&&a.inverted;this.textStr!==void 0&&b.buildText(this);this.added=!0;if(!a||a.handleZ||this.zIndex)d=this.zIndexSetter();d||(a?a.element:b.box).appendChild(c);if(this.onAdd)this.onAdd();return this},safeRemoveChild:function(a){var b= | |
49 | + a.parentNode;b&&b.removeChild(a)},destroy:function(){var a=this,b=a.element||{},c=a.shadows,d=a.renderer.isSVG&&b.nodeName==="SPAN"&&a.parentGroup,e,f;b.onclick=b.onmouseout=b.onmouseover=b.onmousemove=b.point=null;cb(a);if(a.clipPath)a.clipPath=a.clipPath.destroy();if(a.stops){for(f=0;f<a.stops.length;f++)a.stops[f]=a.stops[f].destroy();a.stops=null}a.safeRemoveChild(b);for(c&&o(c,function(b){a.safeRemoveChild(b)});d&&d.div&&d.div.childNodes.length===0;)b=d.parentGroup,a.safeRemoveChild(d.div),delete d.div, | |
50 | + d=b;a.alignTo&&ja(a.renderer.alignedObjects,a);for(e in a)delete a[e];return null},shadow:function(a,b,c){var d=[],e,f,g=this.element,h,i,j,k;if(a){i=p(a.width,3);j=(a.opacity||0.15)/i;k=this.parentInverted?"(-1,-1)":"("+p(a.offsetX,1)+", "+p(a.offsetY,1)+")";for(e=1;e<=i;e++){f=g.cloneNode(0);h=i*2+1-2*e;K(f,{isShadow:"true",stroke:a.color||"black","stroke-opacity":j*e,"stroke-width":h,transform:"translate"+k,fill:P});if(c)K(f,"height",s(K(f,"height")-h,0)),f.cutHeight=h;b?b.element.appendChild(f): | |
51 | + g.parentNode.insertBefore(f,g);d.push(f)}this.shadows=d}return this},xGetter:function(a){this.element.nodeName==="circle"&&(a={x:"cx",y:"cy"}[a]||a);return this._defaultGetter(a)},_defaultGetter:function(a){a=p(this[a],this.element?this.element.getAttribute(a):null,0);/^[\-0-9\.]+$/.test(a)&&(a=parseFloat(a));return a},dSetter:function(a,b,c){a&&a.join&&(a=a.join(" "));/(NaN| {2}|^$)/.test(a)&&(a="M 0 0");c.setAttribute(b,a);this[b]=a},dashstyleSetter:function(a){var b;if(a=a&&a.toLowerCase()){a= | |
52 | + a.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot","3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(b=a.length;b--;)a[b]=G(a[b])*this["stroke-width"];a=a.join(",").replace("NaN","none");this.element.setAttribute("stroke-dasharray",a)}},alignSetter:function(a){this.element.setAttribute("text-anchor",{left:"start",center:"middle",right:"end"}[a])},opacitySetter:function(a, | |
53 | + b,c){this[b]=a;c.setAttribute(b,a)},titleSetter:function(a){var b=this.element.getElementsByTagName("title")[0];b||(b=C.createElementNS(Ea,"title"),this.element.appendChild(b));b.appendChild(C.createTextNode(String(p(a),"").replace(/<[^>]*>/g,"")))},textSetter:function(a){if(a!==this.textStr)delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this)},fillSetter:function(a,b,c){typeof a==="string"?c.setAttribute(b,a):a&&this.colorGradient(a,b,c)},visibilitySetter:function(a,b,c){a=== | |
54 | +"inherit"?c.removeAttribute(b):c.setAttribute(b,a)},zIndexSetter:function(a,b){var c=this.renderer,d=this.parentGroup,c=(d||c).element||c.box,e,f,g=this.element,h;e=this.added;var i;q(a)&&(g.setAttribute(b,a),a=+a,this[b]===a&&(e=!1),this[b]=a);if(e){if((a=this.zIndex)&&d)d.handleZ=!0;d=c.childNodes;for(i=0;i<d.length&&!h;i++)if(e=d[i],f=K(e,"zIndex"),e!==g&&(G(f)>a||!q(a)&&q(f)))c.insertBefore(g,e),h=!0;h||c.appendChild(g)}return h},_defaultSetter:function(a,b,c){c.setAttribute(b,a)}};Q.prototype.yGetter= | |
55 | + Q.prototype.xGetter;Q.prototype.translateXSetter=Q.prototype.translateYSetter=Q.prototype.rotationSetter=Q.prototype.verticalAlignSetter=Q.prototype.scaleXSetter=Q.prototype.scaleYSetter=function(a,b){this[b]=a;this.doTransform=!0};Q.prototype["stroke-widthSetter"]=Q.prototype.strokeSetter=function(a,b,c){this[b]=a;if(this.stroke&&this["stroke-width"])this.strokeWidth=this["stroke-width"],Q.prototype.fillSetter.call(this,this.stroke,"stroke",c),c.setAttribute("stroke-width",this["stroke-width"]), | |
56 | + this.hasStroke=!0;else if(b==="stroke-width"&&a===0&&this.hasStroke)c.removeAttribute("stroke"),this.hasStroke=!1};var Aa=function(){this.init.apply(this,arguments)};Aa.prototype={Element:Q,init:function(a,b,c,d,e,f){var g=location,h,d=this.createElement("svg").attr({version:"1.1"}).css(this.getStyle(d));h=d.element;a.appendChild(h);a.innerHTML.indexOf("xmlns")===-1&&K(h,"xmlns",Ea);this.isSVG=!0;this.box=h;this.boxWrapper=d;this.alignedObjects=[];this.url=(Ka||hb)&&C.getElementsByTagName("base").length? | |
57 | + g.href.replace(/#.*?$/,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(C.createTextNode("Created with Highcharts 4.1.9"));this.defs=this.createElement("defs").add();this.allowHTML=f;this.forExport=e;this.gradients={};this.cache={};this.setSize(b,c,!1);var i;if(Ka&&a.getBoundingClientRect)this.subPixelFix=b=function(){M(a,{left:0,top:0});i=a.getBoundingClientRect();M(a,{left:ta(i.left)-i.left+"px",top:ta(i.top)-i.top+"px"})},b(),I(L,"resize", | |
58 | + b)},getStyle:function(a){return this.style=t({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},a)},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();Pa(this.gradients||{});this.gradients=null;if(a)this.defs=a.destroy();this.subPixelFix&&Y(L,"resize",this.subPixelFix);return this.alignedObjects=null},createElement:function(a){var b=new this.Element; | |
59 | + b.init(this,a);return b},draw:function(){},getRadialAttr:function(a,b){return{cx:a[0]-a[2]/2+b.cx*a[2],cy:a[1]-a[2]/2+b.cy*a[2],r:b.r*a[2]}},buildText:function(a){for(var b=a.element,c=this,d=c.forExport,e=p(a.textStr,"").toString(),f=e.indexOf("<")!==-1,g=b.childNodes,h,i,j=K(b,"x"),k=a.styles,m=a.textWidth,n=k&&k.lineHeight,l=k&&k.textShadow,u=k&&k.textOverflow==="ellipsis",r=g.length,Z=m&&!a.added&&this.box,A=function(a){return n?G(n):c.fontMetrics(/(px|em)$/.test(a&&a.style.fontSize)?a.style.fontSize: | |
60 | +k&&k.fontSize||c.style.fontSize||12,a).h},v=function(a){return a.replace(/</g,"<").replace(/>/g,">")};r--;)b.removeChild(g[r]);!f&&!l&&!u&&e.indexOf(" ")===-1?b.appendChild(C.createTextNode(v(e))):(h=/<.*style="([^"]+)".*>/,i=/<.*href="(http[^"]+)".*>/,Z&&Z.appendChild(b),e=f?e.replace(/<(b|strong)>/g,'<span style="font-weight:bold">').replace(/<(i|em)>/g,'<span style="font-style:italic">').replace(/<a/g,"<span").replace(/<\/(b|strong|i|em|a)>/g,"</span>").split(/<br.*?>/g):[e],e[e.length-1]=== | |
61 | +""&&e.pop(),o(e,function(e,f){var g,n=0,e=e.replace(/<span/g,"|||<span").replace(/<\/span>/g,"</span>|||");g=e.split("|||");o(g,function(e){if(e!==""||g.length===1){var l={},r=C.createElementNS(Ea,"tspan"),p;h.test(e)&&(p=e.match(h)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),K(r,"style",p));i.test(e)&&!d&&(K(r,"onclick",'location.href="'+e.match(i)[1]+'"'),M(r,{cursor:"pointer"}));e=v(e.replace(/<(.|\n)*?>/g,"")||" ");if(e!==" "){r.appendChild(C.createTextNode(e));if(n)l.dx=0;else if(f&&j!==null)l.x= | |
62 | + j;K(r,l);b.appendChild(r);!n&&f&&(!ca&&d&&M(r,{display:"block"}),K(r,"dy",A(r)));if(m){for(var l=e.replace(/([^\^])-/g,"$1- ").split(" "),Z=g.length>1||f||l.length>1&&k.whiteSpace!=="nowrap",o,y,q,s=[],x=A(r),t=1,w=a.rotation,z=e,D=z.length;(Z||u)&&(l.length||s.length);)a.rotation=0,o=a.getBBox(!0),q=o.width,!ca&&c.forExport&&(q=c.measureSpanWidth(r.firstChild.data,a.styles)),o=q>m,y===void 0&&(y=o),u&&y?(D/=2,z===""||!o&&D<0.5?l=[]:(o&&(y=!0),z=e.substring(0,z.length+(o?-1:1)*ta(D)),l=[z+(m>3?"\u2026": | |
63 | + "")],r.removeChild(r.firstChild))):!o||l.length===1?(l=s,s=[],l.length&&(t++,r=C.createElementNS(Ea,"tspan"),K(r,{dy:x,x:j}),p&&K(r,"style",p),b.appendChild(r)),q>m&&(m=q)):(r.removeChild(r.firstChild),s.unshift(l.pop())),l.length&&r.appendChild(C.createTextNode(l.join(" ").replace(/- /g,"-")));y&&a.attr("title",a.textStr);a.rotation=w}n++}}})}),Z&&Z.removeChild(b),l&&a.applyTextShadow&&a.applyTextShadow(l))},getContrast:function(a){a=na(a).rgba;return a[0]+a[1]+a[2]>384?"#000000":"#FFFFFF"},button:function(a, | |
64 | + b,c,d,e,f,g,h,i){var j=this.label(a,b,c,i,null,null,null,null,"button"),k=0,m,n,l,u,r,p,a={x1:0,y1:0,x2:0,y2:1},e=D({"stroke-width":1,stroke:"#CCCCCC",fill:{linearGradient:a,stops:[[0,"#FEFEFE"],[1,"#F6F6F6"]]},r:2,padding:5,style:{color:"black"}},e);l=e.style;delete e.style;f=D(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#FFF"],[1,"#ACF"]]}},f);u=f.style;delete f.style;g=D(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#9BD"],[1,"#CDF"]]}},g);r=g.style;delete g.style;h=D(e,{style:{color:"#CCC"}}, | |
65 | + h);p=h.style;delete h.style;I(j.element,sa?"mouseover":"mouseenter",function(){k!==3&&j.attr(f).css(u)});I(j.element,sa?"mouseout":"mouseleave",function(){k!==3&&(m=[e,f,g][k],n=[l,u,r][k],j.attr(m).css(n))});j.setState=function(a){(j.state=k=a)?a===2?j.attr(g).css(r):a===3&&j.attr(h).css(p):j.attr(e).css(l)};return j.on("click",function(a){k!==3&&d.call(j,a)}).attr(e).css(t({cursor:"default"},l))},crispLine:function(a,b){a[1]===a[4]&&(a[1]=a[4]=w(a[1])-b%2/2);a[2]===a[5]&&(a[2]=a[5]=w(a[2])+b%2/ | |
66 | + 2);return a},path:function(a){var b={fill:P};Ga(a)?b.d=a:da(a)&&t(b,a);return this.createElement("path").attr(b)},circle:function(a,b,c){a=da(a)?a:{x:a,y:b,r:c};b=this.createElement("circle");b.xSetter=function(a){this.element.setAttribute("cx",a)};b.ySetter=function(a){this.element.setAttribute("cy",a)};return b.attr(a)},arc:function(a,b,c,d,e,f){if(da(a))b=a.y,c=a.r,d=a.innerR,e=a.start,f=a.end,a=a.x;a=this.symbol("arc",a||0,b||0,c||0,c||0,{innerR:d||0,start:e||0,end:f||0});a.r=c;return a},rect:function(a, | |
67 | + b,c,d,e,f){var e=da(a)?a.r:e,g=this.createElement("rect"),a=da(a)?a:a===x?{}:{x:a,y:b,width:s(c,0),height:s(d,0)};if(f!==x)a.strokeWidth=f,a=g.crisp(a);if(e)a.r=e;g.rSetter=function(a){K(this.element,{rx:a,ry:a})};return g.attr(a)},setSize:function(a,b,c){var d=this.alignedObjects,e=d.length;this.width=a;this.height=b;for(this.boxWrapper[p(c,!0)?"animate":"attr"]({width:a,height:b});e--;)d[e].align()},g:function(a){var b=this.createElement("g");return q(a)?b.attr({"class":"highcharts-"+a}):b},image:function(a, | |
68 | + b,c,d,e){var f={preserveAspectRatio:P};arguments.length>1&&t(f,{x:b,y:c,width:d,height:e});f=this.createElement("image").attr(f);f.element.setAttributeNS?f.element.setAttributeNS("http://www.w3.org/1999/xlink","href",a):f.element.setAttribute("hc-svg-href",a);return f},symbol:function(a,b,c,d,e,f){var g,h=this.symbols[a],h=h&&h(w(b),w(c),d,e,f),i=/^url\((.*?)\)$/,j,k;if(h)g=this.path(h),t(g,{symbolName:a,x:b,y:c,width:d,height:e}),f&&t(g,f);else if(i.test(a))k=function(a,b){a.element&&(a.attr({width:b[0], | |
69 | + height:b[1]}),a.alignByTranslate||a.translate(w((d-b[0])/2),w((e-b[1])/2)))},j=a.match(i)[1],a=Kb[j]||f&&f.width&&f.height&&[f.width,f.height],g=this.image(j).attr({x:b,y:c}),g.isImg=!0,a?k(g,a):(g.attr({width:0,height:0}),$("img",{onload:function(){this.width===0&&(M(this,{position:"absolute",top:"-999em"}),document.body.appendChild(this));k(g,Kb[j]=[this.width,this.height]);this.parentNode&&this.parentNode.removeChild(this)},src:j}));return g},symbols:{circle:function(a,b,c,d){var e=0.166*c;return["M", | |
70 | + a+c/2,b,"C",a+c+e,b,a+c+e,b+d,a+c/2,b+d,"C",a-e,b+d,a-e,b,a+c/2,b,"Z"]},square:function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c,b+d,a,b+d,"Z"]},triangle:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d,a,b+d,"Z"]},"triangle-down":function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c/2,b+d,"Z"]},diamond:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d/2,a+c/2,b+d,a,b+d/2,"Z"]},arc:function(a,b,c,d,e){var f=e.start,c=e.r||c||d,g=e.end-0.001,d=e.innerR,h=e.open,i=W(f),j=aa(f),k=W(g),g=aa(g),e=e.end-f<ma?0:1; | |
71 | + return["M",a+c*i,b+c*j,"A",c,c,0,e,1,a+c*k,b+c*g,h?"M":"L",a+d*k,b+d*g,"A",d,d,0,e,0,a+d*i,b+d*j,h?"":"Z"]},callout:function(a,b,c,d,e){var f=z(e&&e.r||0,c,d),g=f+6,h=e&&e.anchorX,e=e&&e.anchorY,i;i=["M",a+f,b,"L",a+c-f,b,"C",a+c,b,a+c,b,a+c,b+f,"L",a+c,b+d-f,"C",a+c,b+d,a+c,b+d,a+c-f,b+d,"L",a+f,b+d,"C",a,b+d,a,b+d,a,b+d-f,"L",a,b+f,"C",a,b,a,b,a+f,b];h&&h>c&&e>b+g&&e<b+d-g?i.splice(13,3,"L",a+c,e-6,a+c+6,e,a+c,e+6,a+c,b+d-f):h&&h<0&&e>b+g&&e<b+d-g?i.splice(33,3,"L",a,e+6,a-6,e,a,e-6,a,b+f):e&&e> | |
72 | +d&&h>a+g&&h<a+c-g?i.splice(23,3,"L",h+6,b+d,h,b+d+6,h-6,b+d,a+f,b+d):e&&e<0&&h>a+g&&h<a+c-g&&i.splice(3,3,"L",h-6,b,h,b-6,h+6,b,c-f,b);return i}},clipRect:function(a,b,c,d){var e="highcharts-"+xb++,f=this.createElement("clipPath").attr({id:e}).add(this.defs),a=this.rect(a,b,c,d,0).add(f);a.id=e;a.clipPath=f;a.count=0;return a},text:function(a,b,c,d){var e=fa||!ca&&this.forExport,f={};if(d&&(this.allowHTML||!this.forExport))return this.html(a,b,c);f.x=Math.round(b||0);if(c)f.y=Math.round(c);if(a|| | |
73 | + a===0)f.text=a;a=this.createElement("text").attr(f);e&&a.css({position:"absolute"});if(!d)a.xSetter=function(a,b,c){var d=c.getElementsByTagName("tspan"),e,f=c.getAttribute(b),n;for(n=0;n<d.length;n++)e=d[n],e.getAttribute(b)===f&&e.setAttribute(b,a);c.setAttribute(b,a)};return a},fontMetrics:function(a,b){var c,d,a=a||this.style.fontSize;!a&&b&&L.getComputedStyle&&(b=b.element||b,a=(c=L.getComputedStyle(b,""))&&c.fontSize);a=/px/.test(a)?G(a):/em/.test(a)?parseFloat(a)*12:12;c=a<24?a+3:w(a*1.2); | |
74 | + d=w(c*0.8);return{h:c,b:d,f:a}},rotCorr:function(a,b,c){var d=a;b&&c&&(d=s(d*W(b*ga),4));return{x:-a/3*aa(b*ga),y:d}},label:function(a,b,c,d,e,f,g,h,i){function j(){var a,b;a=u.element.style;p=(s===void 0||va===void 0||l.styles.textAlign)&&q(u.textStr)&&u.getBBox();l.width=(s||p.width||0)+2*v+y;l.height=(va||p.height||0)+2*v;B=v+n.fontMetrics(a&&a.fontSize,u).b;if(E){if(!r)a=w(-A*v)+C,b=(h?-B:0)+C,l.box=r=d?n.symbol(d,a,b,l.width,l.height,H):n.rect(a,b,l.width,l.height,0,H[Pb]),r.isImg||r.attr("fill", | |
75 | + P),r.add(l);r.isImg||r.attr(t({width:w(l.width),height:w(l.height)},H));H=null}}function k(){var a=l.styles,a=a&&a.textAlign,b=y+v*(1-A),c;c=h?0:B;if(q(s)&&p&&(a==="center"||a==="right"))b+={center:0.5,right:1}[a]*(s-p.width);if(b!==u.x||c!==u.y)u.attr("x",b),c!==x&&u.attr("y",c);u.x=b;u.y=c}function m(a,b){r?r.attr(a,b):H[a]=b}var n=this,l=n.g(i),u=n.text("",0,0,g).attr({zIndex:1}),r,p,A=0,v=3,y=0,s,va,zb,z,C=0,H={},B,E;l.onAdd=function(){u.add(l);l.attr({text:a||a===0?a:"",x:b,y:c});r&&q(e)&&l.attr({anchorX:e, | |
76 | + anchorY:f})};l.widthSetter=function(a){s=a};l.heightSetter=function(a){va=a};l.paddingSetter=function(a){if(q(a)&&a!==v)v=l.padding=a,k()};l.paddingLeftSetter=function(a){q(a)&&a!==y&&(y=a,k())};l.alignSetter=function(a){A={left:0,center:0.5,right:1}[a]};l.textSetter=function(a){a!==x&&u.textSetter(a);j();k()};l["stroke-widthSetter"]=function(a,b){a&&(E=!0);C=a%2/2;m(b,a)};l.strokeSetter=l.fillSetter=l.rSetter=function(a,b){b==="fill"&&a&&(E=!0);m(b,a)};l.anchorXSetter=function(a,b){e=a;m(b,w(a)- | |
77 | + C-zb)};l.anchorYSetter=function(a,b){f=a;m(b,a-z)};l.xSetter=function(a){l.x=a;A&&(a-=A*((s||p.width)+v));zb=w(a);l.attr("translateX",zb)};l.ySetter=function(a){z=l.y=w(a);l.attr("translateY",z)};var G=l.css;return t(l,{css:function(a){if(a){var b={},a=D(a);o(l.textProps,function(c){a[c]!==x&&(b[c]=a[c],delete a[c])});u.css(b)}return G.call(l,a)},getBBox:function(){return{width:p.width+2*v,height:p.height+2*v,x:p.x-v,y:p.y-v}},shadow:function(a){r&&r.shadow(a);return l},destroy:function(){Y(l.element, | |
78 | + "mouseenter");Y(l.element,"mouseleave");u&&(u=u.destroy());r&&(r=r.destroy());Q.prototype.destroy.call(l);l=n=j=k=m=null}})}};$a=Aa;t(Q.prototype,{htmlCss:function(a){var b=this.element;if(b=a&&b.tagName==="SPAN"&&a.width)delete a.width,this.textWidth=b,this.updateTransform();if(a&&a.textOverflow==="ellipsis")a.whiteSpace="nowrap",a.overflow="hidden";this.styles=t(this.styles,a);M(this.element,a);return this},htmlGetBBox:function(){var a=this.element;if(a.nodeName==="text")a.style.position="absolute"; | |
79 | + return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,b=this.element,c=this.translateX||0,d=this.translateY||0,e=this.x||0,f=this.y||0,g=this.textAlign||"left",h={left:0,center:0.5,right:1}[g],i=this.shadows,j=this.styles;M(b,{marginLeft:c,marginTop:d});i&&o(i,function(a){M(a,{marginLeft:c+1,marginTop:d+1})});this.inverted&&o(b.childNodes,function(c){a.invertChild(c,b)});if(b.tagName==="SPAN"){var k=this.rotation, | |
80 | + m,n=G(this.textWidth),l=[k,g,b.innerHTML,this.textWidth,this.textAlign].join(",");if(l!==this.cTT){m=a.fontMetrics(b.style.fontSize).b;q(k)&&this.setSpanRotation(k,h,m);i=p(this.elemWidth,b.offsetWidth);if(i>n&&/[ \-]/.test(b.textContent||b.innerText))M(b,{width:n+"px",display:"block",whiteSpace:j&&j.whiteSpace||"normal"}),i=n;this.getSpanCorrection(i,m,h,k,g)}M(b,{left:e+(this.xCorr||0)+"px",top:f+(this.yCorr||0)+"px"});if(hb)m=b.offsetHeight;this.cTT=l}}else this.alignOnAdd=!0},setSpanRotation:function(a, | |
81 | + b,c){var d={},e=sa?"-ms-transform":hb?"-webkit-transform":Ka?"MozTransform":Ib?"-o-transform":"";d[e]=d.transform="rotate("+a+"deg)";d[e+(Ka?"Origin":"-origin")]=d.transformOrigin=b*100+"% "+c+"px";M(this.element,d)},getSpanCorrection:function(a,b,c){this.xCorr=-a*c;this.yCorr=-b}});t(Aa.prototype,{html:function(a,b,c){var d=this.createElement("span"),e=d.element,f=d.renderer;d.textSetter=function(a){a!==e.innerHTML&&delete this.bBox;e.innerHTML=this.textStr=a;d.htmlUpdateTransform()};d.xSetter=d.ySetter= | |
82 | + d.alignSetter=d.rotationSetter=function(a,b){b==="align"&&(b="textAlign");d[b]=a;d.htmlUpdateTransform()};d.attr({text:a,x:w(b),y:w(c)}).css({position:"absolute",fontFamily:this.style.fontFamily,fontSize:this.style.fontSize});e.style.whiteSpace="nowrap";d.css=d.htmlCss;if(f.isSVG)d.add=function(a){var b,c=f.box.parentNode,j=[];if(this.parentGroup=a){if(b=a.div,!b){for(;a;)j.push(a),a=a.parentGroup;o(j.reverse(),function(a){var d,e=K(a.element,"class");e&&(e={className:e});b=a.div=a.div||$(Ja,e,{position:"absolute", | |
83 | + left:(a.translateX||0)+"px",top:(a.translateY||0)+"px"},b||c);d=b.style;t(a,{translateXSetter:function(b,c){d.left=b+"px";a[c]=b;a.doTransform=!0},translateYSetter:function(b,c){d.top=b+"px";a[c]=b;a.doTransform=!0}});o(["opacity","visibility"],function(b){Ta(a,b+"Setter",function(a,b,c,e){a.call(this,b,c,e);d[c]=b})})})}}else b=c;b.appendChild(e);d.added=!0;d.alignOnAdd&&d.htmlUpdateTransform();return d};return d}});if(!ca&&!fa){E={init:function(a,b){var c=["<",b,' filled="f" stroked="f"'],d=["position: ", | |
84 | + "absolute",";"],e=b===Ja;(b==="shape"||e)&&d.push("left:0;top:0;width:1px;height:1px;");d.push("visibility: ",e?"hidden":"visible");c.push(' style="',d.join(""),'"/>');if(b)c=e||b==="span"||b==="img"?c.join(""):a.prepVML(c),this.element=$(c);this.renderer=a},add:function(a){var b=this.renderer,c=this.element,d=b.box,d=a?a.element||a:d;a&&a.inverted&&b.invertChild(c,d);d.appendChild(c);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();if(this.onAdd)this.onAdd();return this}, | |
85 | + updateTransform:Q.prototype.htmlUpdateTransform,setSpanRotation:function(){var a=this.rotation,b=W(a*ga),c=aa(a*ga);M(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11=",b,", M12=",-c,", M21=",c,", M22=",b,", sizingMethod='auto expand')"].join(""):P})},getSpanCorrection:function(a,b,c,d,e){var f=d?W(d*ga):1,g=d?aa(d*ga):0,h=p(this.elemHeight,this.element.offsetHeight),i;this.xCorr=f<0&&-a;this.yCorr=g<0&&-h;i=f*g<0;this.xCorr+=g*b*(i?1-c:c);this.yCorr-=f*b*(d?i?c:1-c:1);e&&e!== | |
86 | + "left"&&(this.xCorr-=a*c*(f<0?-1:1),d&&(this.yCorr-=h*c*(g<0?-1:1)),M(this.element,{textAlign:e}))},pathToVML:function(a){for(var b=a.length,c=[];b--;)if(qa(a[b]))c[b]=w(a[b]*10)-5;else if(a[b]==="Z")c[b]="x";else if(c[b]=a[b],a.isArc&&(a[b]==="wa"||a[b]==="at"))c[b+5]===c[b+7]&&(c[b+7]+=a[b+7]>a[b+5]?1:-1),c[b+6]===c[b+8]&&(c[b+8]+=a[b+8]>a[b+6]?1:-1);return c.join(" ")||"x"},clip:function(a){var b=this,c;a?(c=a.members,ja(c,b),c.push(b),b.destroyClip=function(){ja(c,b)},a=a.getCSS(b)):(b.destroyClip&& | |
87 | + b.destroyClip(),a={clip:gb?"inherit":"rect(auto)"});return b.css(a)},css:Q.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&Qa(a)},destroy:function(){this.destroyClip&&this.destroyClip();return Q.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+a]=function(){var a=L.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,b){var c,a=a.split(/[ ,]/);c=a.length;if(c===9||c===11)a[c-4]=a[c-2]=G(a[c-2])-10*b;return a.join(" ")},shadow:function(a,b,c){var d=[],e, | |
88 | + f=this.element,g=this.renderer,h,i=f.style,j,k=f.path,m,n,l,u;k&&typeof k.value!=="string"&&(k="x");n=k;if(a){l=p(a.width,3);u=(a.opacity||0.15)/l;for(e=1;e<=3;e++){m=l*2+1-2*e;c&&(n=this.cutOffPath(k.value,m+0.5));j=['<shape isShadow="true" strokeweight="',m,'" filled="false" path="',n,'" coordsize="10 10" style="',f.style.cssText,'" />'];h=$(g.prepVML(j),null,{left:G(i.left)+p(a.offsetX,1),top:G(i.top)+p(a.offsetY,1)});if(c)h.cutOff=m+1;j=['<stroke color="',a.color||"black",'" opacity="',u*e,'"/>']; | |
89 | + $(g.prepVML(j),null,null,h);b?b.element.appendChild(h):f.parentNode.insertBefore(h,f);d.push(h)}this.shadows=d}return this},updateShadows:ua,setAttr:function(a,b){gb?this.element[a]=b:this.element.setAttribute(a,b)},classSetter:function(a){this.element.className=a},dashstyleSetter:function(a,b,c){(c.getElementsByTagName("stroke")[0]||$(this.renderer.prepVML(["<stroke/>"]),null,null,c))[b]=a||"solid";this[b]=a},dSetter:function(a,b,c){var d=this.shadows,a=a||[];this.d=a.join&&a.join(" ");c.path=a= | |
90 | + this.pathToVML(a);if(d)for(c=d.length;c--;)d[c].path=d[c].cutOff?this.cutOffPath(a,d[c].cutOff):a;this.setAttr(b,a)},fillSetter:function(a,b,c){var d=c.nodeName;if(d==="SPAN")c.style.color=a;else if(d!=="IMG")c.filled=a!==P,this.setAttr("fillcolor",this.renderer.color(a,c,b,this))},opacitySetter:ua,rotationSetter:function(a,b,c){c=c.style;this[b]=c[b]=a;c.left=-w(aa(a*ga)+1)+"px";c.top=w(W(a*ga))+"px"},strokeSetter:function(a,b,c){this.setAttr("strokecolor",this.renderer.color(a,c,b))},"stroke-widthSetter":function(a, | |
91 | + b,c){c.stroked=!!a;this[b]=a;qa(a)&&(a+="px");this.setAttr("strokeweight",a)},titleSetter:function(a,b){this.setAttr(b,a)},visibilitySetter:function(a,b,c){a==="inherit"&&(a="visible");this.shadows&&o(this.shadows,function(c){c.style[b]=a});c.nodeName==="DIV"&&(a=a==="hidden"?"-999em":0,gb||(c.style[b]=a?"visible":"hidden"),b="top");c.style[b]=a},xSetter:function(a,b,c){this[b]=a;b==="x"?b="left":b==="y"&&(b="top");this.updateClipping?(this[b]=a,this.updateClipping()):c.style[b]=a},zIndexSetter:function(a, | |
92 | + b,c){c.style[b]=a}};B.VMLElement=E=ka(Q,E);E.prototype.ySetter=E.prototype.widthSetter=E.prototype.heightSetter=E.prototype.xSetter;var Ma={Element:E,isIE8:za.indexOf("MSIE 8.0")>-1,init:function(a,b,c,d){var e;this.alignedObjects=[];d=this.createElement(Ja).css(t(this.getStyle(d),{position:"relative"}));e=d.element;a.appendChild(d.element);this.isVML=!0;this.box=e;this.boxWrapper=d;this.cache={};this.setSize(b,c,!1);if(!C.namespaces.hcv){C.namespaces.add("hcv","urn:schemas-microsoft-com:vml");try{C.createStyleSheet().cssText= | |
93 | + "hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}catch(f){C.styleSheets[0].cssText+="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}}},isHidden:function(){return!this.box.offsetWidth},clipRect:function(a,b,c,d){var e=this.createElement(),f=da(a);return t(e,{members:[],count:0,left:(f?a.x:a)+1,top:(f?a.y:b)+1,width:(f?a.width:c)-1,height:(f?a.height:d)-1,getCSS:function(a){var b=a.element, | |
94 | + c=b.nodeName,a=a.inverted,d=this.top-(c==="shape"?b.offsetTop:0),e=this.left,b=e+this.width,f=d+this.height,d={clip:"rect("+w(a?e:d)+"px,"+w(a?f:b)+"px,"+w(a?b:f)+"px,"+w(a?d:e)+"px)"};!a&&gb&&c==="DIV"&&t(d,{width:b+"px",height:f+"px"});return d},updateClipping:function(){o(e.members,function(a){a.element&&a.css(e.getCSS(a))})}})},color:function(a,b,c,d){var e=this,f,g=/^rgba/,h,i,j=P;a&&a.linearGradient?i="gradient":a&&a.radialGradient&&(i="pattern");if(i){var k,m,n=a.linearGradient||a.radialGradient, | |
95 | + l,u,r,p,A,v="",a=a.stops,y,q=[],va=function(){h=['<fill colors="'+q.join(",")+'" opacity="',r,'" o:opacity2="',u,'" type="',i,'" ',v,'focus="100%" method="any" />'];$(e.prepVML(h),null,null,b)};l=a[0];y=a[a.length-1];l[0]>0&&a.unshift([0,l[1]]);y[0]<1&&a.push([1,y[1]]);o(a,function(a,b){g.test(a[1])?(f=na(a[1]),k=f.get("rgb"),m=f.get("a")):(k=a[1],m=1);q.push(a[0]*100+"% "+k);b?(r=m,p=k):(u=m,A=k)});if(c==="fill")if(i==="gradient")c=n.x1||n[0]||0,a=n.y1||n[1]||0,l=n.x2||n[2]||0,n=n.y2||n[3]||0,v= | |
96 | + 'angle="'+(90-V.atan((n-a)/(l-c))*180/ma)+'"',va();else{var j=n.r,s=j*2,x=j*2,t=n.cx,w=n.cy,z=b.radialReference,D,j=function(){z&&(D=d.getBBox(),t+=(z[0]-D.x)/D.width-0.5,w+=(z[1]-D.y)/D.height-0.5,s*=z[2]/D.width,x*=z[2]/D.height);v='src="'+S.global.VMLRadialGradientURL+'" size="'+s+","+x+'" origin="0.5,0.5" position="'+t+","+w+'" color2="'+A+'" ';va()};d.added?j():d.onAdd=j;j=p}else j=k}else if(g.test(a)&&b.tagName!=="IMG")f=na(a),h=["<",c,' opacity="',f.get("a"),'"/>'],$(this.prepVML(h),null,null, | |
97 | + b),j=f.get("rgb");else{j=b.getElementsByTagName(c);if(j.length)j[0].opacity=1,j[0].type="solid";j=a}return j},prepVML:function(a){var b=this.isIE8,a=a.join("");b?(a=a.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />'),a=a.indexOf('style="')===-1?a.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):a.replace('style="','style="display:inline-block;behavior:url(#default#VML);')):a=a.replace("<","<hcv:");return a},text:Aa.prototype.html,path:function(a){var b={coordsize:"10 10"}; | |
98 | + Ga(a)?b.d=a:da(a)&&t(b,a);return this.createElement("shape").attr(b)},circle:function(a,b,c){var d=this.symbol("circle");if(da(a))c=a.r,b=a.y,a=a.x;d.isCircle=!0;d.r=c;return d.attr({x:a,y:b})},g:function(a){var b;a&&(b={className:"highcharts-"+a,"class":"highcharts-"+a});return this.createElement(Ja).attr(b)},image:function(a,b,c,d,e){var f=this.createElement("img").attr({src:a});arguments.length>1&&f.attr({x:b,y:c,width:d,height:e});return f},createElement:function(a){return a==="rect"?this.symbol(a): | |
99 | + Aa.prototype.createElement.call(this,a)},invertChild:function(a,b){var c=this,d=b.style,e=a.tagName==="IMG"&&a.style;M(a,{flip:"x",left:G(d.width)-(e?G(e.top):1),top:G(d.height)-(e?G(e.left):1),rotation:-90});o(a.childNodes,function(b){c.invertChild(b,a)})},symbols:{arc:function(a,b,c,d,e){var f=e.start,g=e.end,h=e.r||c||d,c=e.innerR,d=W(f),i=aa(f),j=W(g),k=aa(g);if(g-f===0)return["x"];f=["wa",a-h,b-h,a+h,b+h,a+h*d,b+h*i,a+h*j,b+h*k];e.open&&!c&&f.push("e","M",a,b);f.push("at",a-c,b-c,a+c,b+c,a+c* | |
100 | + j,b+c*k,a+c*d,b+c*i,"x","e");f.isArc=!0;return f},circle:function(a,b,c,d,e){e&&(c=d=2*e.r);e&&e.isCircle&&(a-=c/2,b-=d/2);return["wa",a,b,a+c,b+d,a+c,b+d/2,a+c,b+d/2,"e"]},rect:function(a,b,c,d,e){return Aa.prototype.symbols[!q(e)||!e.r?"square":"callout"].call(0,a,b,c,d,e)}}};B.VMLRenderer=E=function(){this.init.apply(this,arguments)};E.prototype=D(Aa.prototype,Ma);$a=E}Aa.prototype.measureSpanWidth=function(a,b){var c=C.createElement("span"),d;d=C.createTextNode(a);c.appendChild(d);M(c,b);this.box.appendChild(c); | |
101 | + d=c.offsetWidth;Qa(c);return d};var Lb;if(fa)B.CanVGRenderer=E=function(){Ea="http://www.w3.org/1999/xhtml"},E.prototype.symbols={},Lb=function(){function a(){var a=b.length,d;for(d=0;d<a;d++)b[d]();b=[]}var b=[];return{push:function(c,d){b.length===0&&Qb(d,a);b.push(c)}}}(),$a=E;Sa.prototype={addLabel:function(){var a=this.axis,b=a.options,c=a.chart,d=a.categories,e=a.names,f=this.pos,g=b.labels,h=a.tickPositions,i=f===h[0],j=f===h[h.length-1],e=d?p(d[f],e[f],f):f,d=this.label,h=h.info,k;a.isDatetimeAxis&& | |
102 | +h&&(k=b.dateTimeLabelFormats[h.higherRanks[f]||h.unitName]);this.isFirst=i;this.isLast=j;b=a.labelFormatter.call({axis:a,chart:c,isFirst:i,isLast:j,dateTimeLabelFormat:k,value:a.isLog?ea(ia(e)):e});q(d)?d&&d.attr({text:b}):(this.labelLength=(this.label=d=q(b)&&g.enabled?c.renderer.text(b,0,0,g.useHTML).css(D(g.style)).add(a.labelGroup):null)&&d.getBBox().width,this.rotation=0)},getLabelSize:function(){return this.label?this.label.getBBox()[this.axis.horiz?"height":"width"]:0},handleOverflow:function(a){var b= | |
103 | + this.axis,c=a.x,d=b.chart.chartWidth,e=b.chart.spacing,f=p(b.labelLeft,z(b.pos,e[3])),e=p(b.labelRight,s(b.pos+b.len,d-e[1])),g=this.label,h=this.rotation,i={left:0,center:0.5,right:1}[b.labelAlign],j=g.getBBox().width,k=b.slotWidth,m=1,n,l={};if(h)h<0&&c-i*j<f?n=w(c/W(h*ga)-f):h>0&&c+i*j>e&&(n=w((d-c)/W(h*ga)));else if(d=c+(1-i)*j,c-i*j<f?k=a.x+k*(1-i)-f:d>e&&(k=e-a.x+k*i,m=-1),k=z(b.slotWidth,k),k<b.slotWidth&&b.labelAlign==="center"&&(a.x+=m*(b.slotWidth-k-i*(b.slotWidth-z(j,k)))),j>k||b.autoRotation&& | |
104 | + g.styles.width)n=k;if(n){l.width=n;if(!b.options.labels.style.textOverflow)l.textOverflow="ellipsis";g.css(l)}},getPosition:function(a,b,c,d){var e=this.axis,f=e.chart,g=d&&f.oldChartHeight||f.chartHeight;return{x:a?e.translate(b+c,null,null,d)+e.transB:e.left+e.offset+(e.opposite?(d&&f.oldChartWidth||f.chartWidth)-e.right-e.left:0),y:a?g-e.bottom+e.offset-(e.opposite?e.height:0):g-e.translate(b+c,null,null,d)-e.transB}},getLabelPosition:function(a,b,c,d,e,f,g,h){var i=this.axis,j=i.transA,k=i.reversed, | |
105 | + m=i.staggerLines,n=i.tickRotCorr||{x:0,y:0},c=p(e.y,n.y+(i.side===2?8:-(c.getBBox().height/2))),a=a+e.x+n.x-(f&&d?f*j*(k?-1:1):0),b=b+c-(f&&!d?f*j*(k?1:-1):0);m&&(b+=g/(h||1)%m*(i.labelOffset/m));return{x:a,y:w(b)}},getMarkPath:function(a,b,c,d,e,f){return f.crispLine(["M",a,b,"L",a+(e?0:-c),b+(e?c:0)],d)},render:function(a,b,c){var d=this.axis,e=d.options,f=d.chart.renderer,g=d.horiz,h=this.type,i=this.label,j=this.pos,k=e.labels,m=this.gridLine,n=h?h+"Grid":"grid",l=h?h+"Tick":"tick",u=e[n+"LineWidth"], | |
106 | + r=e[n+"LineColor"],o=e[n+"LineDashStyle"],A=e[l+"Length"],n=p(e[l+"Width"],!h&&d.isXAxis?1:0),v=e[l+"Color"],y=e[l+"Position"],l=this.mark,q=k.step,va=!0,s=d.tickmarkOffset,t=this.getPosition(g,j,s,b),w=t.x,t=t.y,z=g&&w===d.pos+d.len||!g&&t===d.pos?-1:1,c=p(c,1);this.isActive=!0;if(u){j=d.getPlotLinePath(j+s,u*z,b,!0);if(m===x){m={stroke:r,"stroke-width":u};if(o)m.dashstyle=o;if(!h)m.zIndex=1;if(b)m.opacity=0;this.gridLine=m=u?f.path(j).attr(m).add(d.gridGroup):null}if(!b&&m&&j)m[this.isNew?"attr": | |
107 | + "animate"]({d:j,opacity:c})}if(n&&A)y==="inside"&&(A=-A),d.opposite&&(A=-A),h=this.getMarkPath(w,t,A,n*z,g,f),l?l.animate({d:h,opacity:c}):this.mark=f.path(h).attr({stroke:v,"stroke-width":n,opacity:c}).add(d.axisGroup);if(i&&!isNaN(w))i.xy=t=this.getLabelPosition(w,t,i,g,k,s,a,q),this.isFirst&&!this.isLast&&!p(e.showFirstLabel,1)||this.isLast&&!this.isFirst&&!p(e.showLastLabel,1)?va=!1:g&&!d.isRadial&&!k.step&&!k.rotation&&!b&&c!==0&&this.handleOverflow(t),q&&a%q&&(va=!1),va&&!isNaN(t.y)?(t.opacity= | |
108 | + c,i[this.isNew?"attr":"animate"](t),this.isNew=!1):i.attr("y",-9999)},destroy:function(){Pa(this,this.axis)}};B.PlotLineOrBand=function(a,b){this.axis=a;if(b)this.options=b,this.id=b.id};B.PlotLineOrBand.prototype={render:function(){var a=this,b=a.axis,c=b.horiz,d=a.options,e=d.label,f=a.label,g=d.width,h=d.to,i=d.from,j=q(i)&&q(h),k=d.value,m=d.dashStyle,n=a.svgElem,l=[],u,r=d.color,p=d.zIndex,o=d.events,v={},y=b.chart.renderer;b.isLog&&(i=Ca(i),h=Ca(h),k=Ca(k));if(g){if(l=b.getPlotLinePath(k,g), | |
109 | + v={stroke:r,"stroke-width":g},m)v.dashstyle=m}else if(j){l=b.getPlotBandPath(i,h,d);if(r)v.fill=r;if(d.borderWidth)v.stroke=d.borderColor,v["stroke-width"]=d.borderWidth}else return;if(q(p))v.zIndex=p;if(n)if(l)n.animate({d:l},null,n.onGetPath);else{if(n.hide(),n.onGetPath=function(){n.show()},f)a.label=f=f.destroy()}else if(l&&l.length&&(a.svgElem=n=y.path(l).attr(v).add(),o))for(u in d=function(b){n.on(b,function(c){o[b].apply(a,[c])})},o)d(u);if(e&&q(e.text)&&l&&l.length&&b.width>0&&b.height>0){e= | |
110 | + D({align:c&&j&&"center",x:c?!j&&4:10,verticalAlign:!c&&j&&"middle",y:c?j?16:10:j?6:-4,rotation:c&&!j&&90},e);if(!f){v={align:e.textAlign||e.align,rotation:e.rotation};if(q(p))v.zIndex=p;a.label=f=y.text(e.text,0,0,e.useHTML).attr(v).css(e.style).add()}b=[l[1],l[4],j?l[6]:l[1]];j=[l[2],l[5],j?l[7]:l[2]];l=Oa(b);c=Oa(j);f.align(e,!1,{x:l,y:c,width:Da(b)-l,height:Da(j)-c});f.show()}else f&&f.hide();return a},destroy:function(){ja(this.axis.plotLinesAndBands,this);delete this.axis;Pa(this)}};var ha=B.Axis= | |
111 | + function(){this.init.apply(this,arguments)};ha.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,gridLineColor:"#D8D8D8",labels:{enabled:!0,style:{color:"#606060",cursor:"default",fontSize:"11px"},x:0,y:15},lineColor:"#C0D0E0",lineWidth:1,minPadding:0.01,maxPadding:0.01,minorGridLineColor:"#E0E0E0",minorGridLineWidth:1,minorTickColor:"#A0A0A0",minorTickLength:2, | |
112 | + minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickColor:"#C0D0E0",tickLength:10,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",title:{align:"middle",style:{color:"#707070"}},type:"linear"},defaultYAxisOptions:{endOnTick:!0,gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8,y:3},lineWidth:0,maxPadding:0.05,minPadding:0.05,startOnTick:!0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return B.numberFormat(this.total, | |
113 | + -1)},style:D(ba.line.dataLabels.style,{color:"#000000"})}},defaultLeftAxisOptions:{labels:{x:-15,y:null},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:15,y:null},title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],x:0,y:null},title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0,y:-15},title:{rotation:0}},init:function(a,b){var c=b.isX;this.chart=a;this.horiz=a.inverted?!c:c;this.coll=(this.isXAxis=c)?"xAxis":"yAxis";this.opposite=b.opposite;this.side= | |
114 | + b.side||(this.horiz?this.opposite?0:2:this.opposite?1:3);this.setOptions(b);var d=this.options,e=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter;this.userOptions=b;this.minPixelPadding=0;this.reversed=d.reversed;this.visible=d.visible!==!1;this.zoomEnabled=d.zoomEnabled!==!1;this.categories=d.categories||e==="category";this.names=this.names||[];this.isLog=e==="logarithmic";this.isDatetimeAxis=e==="datetime";this.isLinked=q(d.linkedTo);this.ticks={};this.labelEdge=[];this.minorTicks= | |
115 | +{};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom;this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stacksTouched=0;this.min=this.max=null;this.crosshair=p(d.crosshair,ra(a.options.tooltip.crosshairs)[c?0:1],!1);var f,d=this.options.events;La(this,a.axes)===-1&&(c&&!this.isColorAxis?a.axes.splice(a.xAxis.length,0,this):a.axes.push(this),a[this.coll].push(this));this.series=this.series||[];if(a.inverted&& | |
116 | + c&&this.reversed===x)this.reversed=!0;this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in d)I(this,f,d[f]);if(this.isLog)this.val2lin=Ca,this.lin2val=ia},setOptions:function(a){this.options=D(this.defaultOptions,this.isXAxis?{}:this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],D(S[this.coll],a))},defaultLabelFormatter:function(){var a=this.axis,b=this.value,c=a.categories,d= | |
117 | + this.dateTimeLabelFormat,e=S.lang.numericSymbols,f=e&&e.length,g,h=a.options.labels.format,a=a.isLog?b:a.tickInterval;if(h)g=Ia(h,this);else if(c)g=b;else if(d)g=Na(d,b);else if(f&&a>=1E3)for(;f--&&g===x;)c=Math.pow(1E3,f+1),a>=c&&b*10%c===0&&e[f]!==null&&(g=B.numberFormat(b/c,-1)+e[f]);g===x&&(g=O(b)>=1E4?B.numberFormat(b,-1):B.numberFormat(b,-1,x,""));return g},getSeriesExtremes:function(){var a=this,b=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis; | |
118 | + a.buildStacks&&a.buildStacks();o(a.series,function(c){if(c.visible||!b.options.chart.ignoreHiddenSeries){var d=c.options,e=d.threshold,f;a.hasVisibleSeries=!0;a.isLog&&e<=0&&(e=null);if(a.isXAxis){if(d=c.xData,d.length)a.dataMin=z(p(a.dataMin,d[0]),Oa(d)),a.dataMax=s(p(a.dataMax,d[0]),Da(d))}else{c.getExtremes();f=c.dataMax;c=c.dataMin;if(q(c)&&q(f))a.dataMin=z(p(a.dataMin,c),c),a.dataMax=s(p(a.dataMax,f),f);if(q(e))a.threshold=e;if(!d.softThreshold||a.isLog)a.softThreshold=!1}}})},translate:function(a, | |
119 | + b,c,d,e,f){var g=this.linkedParent||this,h=1,i=0,j=d?g.oldTransA:g.transA,d=d?g.oldMin:g.min,k=g.minPixelPadding,e=(g.doPostTranslate||g.isLog&&e)&&g.lin2val;if(!j)j=g.transA;if(c)h*=-1,i=g.len;g.reversed&&(h*=-1,i-=h*(g.sector||g.len));b?(a=a*h+i,a-=k,a=a/j+d,e&&(a=g.lin2val(a))):(e&&(a=g.val2lin(a)),f==="between"&&(f=0.5),a=h*(a-d)*j+i+h*k+(qa(f)?j*f*g.pointRange:0));return a},toPixels:function(a,b){return this.translate(a,!1,!this.horiz,null,!0)+(b?0:this.pos)},toValue:function(a,b){return this.translate(a- | |
120 | + (b?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,b,c,d,e){var f=this.chart,g=this.left,h=this.top,i,j,k=c&&f.oldChartHeight||f.chartHeight,m=c&&f.oldChartWidth||f.chartWidth,n;i=this.transB;var l=function(a,b,c){if(a<b||a>c)d?a=z(s(b,a),c):n=!0;return a},e=p(e,this.translate(a,null,null,c)),a=c=w(e+i);i=j=w(k-e-i);isNaN(e)?n=!0:this.horiz?(i=h,j=k-this.bottom,a=c=l(a,g,g+this.width)):(a=g,c=m-this.right,i=j=l(i,h,h+this.height));return n&&!d?null:f.renderer.crispLine(["M",a,i,"L", | |
121 | + c,j],b||1)},getLinearTickPositions:function(a,b,c){var d,e=ea(T(b/a)*a),f=ea(ta(c/a)*a),g=[];if(b===c&&qa(b))return[b];for(b=e;b<=f;){g.push(b);b=ea(b+a);if(b===d)break;d=b}return g},getMinorTickPositions:function(){var a=this.options,b=this.tickPositions,c=this.minorTickInterval,d=[],e,f=this.pointRangePadding||0;e=this.min-f;var f=this.max+f,g=f-e;if(g&&g/c<this.len/3)if(this.isLog){f=b.length;for(e=1;e<f;e++)d=d.concat(this.getLogTickPositions(c,b[e-1],b[e],!0))}else if(this.isDatetimeAxis&&a.minorTickInterval=== | |
122 | + "auto")d=d.concat(this.getTimeTicks(this.normalizeTimeTickInterval(c),e,f,a.startOfWeek));else for(b=e+(b[0]-e)%c;b<=f;b+=c)d.push(b);d.length!==0&&this.trimTicks(d,a.startOnTick,a.endOnTick);return d},adjustForMinRange:function(){var a=this.options,b=this.min,c=this.max,d,e=this.dataMax-this.dataMin>=this.minRange,f,g,h,i,j,k;if(this.isXAxis&&this.minRange===x&&!this.isLog)q(a.min)||q(a.max)?this.minRange=null:(o(this.series,function(a){i=a.xData;for(g=j=a.xIncrement?1:i.length-1;g>0;g--)if(h=i[g]- | |
123 | + i[g-1],f===x||h<f)f=h}),this.minRange=z(f*5,this.dataMax-this.dataMin));if(c-b<this.minRange){k=this.minRange;d=(k-c+b)/2;d=[b-d,p(a.min,b-d)];if(e)d[2]=this.dataMin;b=Da(d);c=[b+k,p(a.max,b+k)];if(e)c[2]=this.dataMax;c=Oa(c);c-b<k&&(d[0]=c-k,d[1]=p(a.min,c-k),b=Da(d))}this.min=b;this.max=c},setAxisTranslation:function(a){var b=this,c=b.max-b.min,d=b.axisPointRange||0,e,f=0,g=0,h=b.linkedParent,i=!!b.categories,j=b.transA,k=b.isXAxis;if(k||i||d)if(h?(f=h.minPointOffset,g=h.pointRangePadding):o(b.series, | |
124 | + function(a){var c=i?1:k?a.pointRange:b.axisPointRange||0,h=a.options.pointPlacement,j=a.closestPointRange;d=s(d,c);b.single||(f=s(f,Ba(h)?0:c/2),g=s(g,h==="on"?0:c));!a.noSharedTooltip&&q(j)&&(e=q(e)?z(e,j):j)}),h=b.ordinalSlope&&e?b.ordinalSlope/e:1,b.minPointOffset=f*=h,b.pointRangePadding=g*=h,b.pointRange=z(d,c),k)b.closestPointRange=e;if(a)b.oldTransA=j;b.translationSlope=b.transA=j=b.len/(c+g||1);b.transB=b.horiz?b.left:b.bottom;b.minPixelPadding=j*f},minFromRange:function(){return this.max- | |
125 | + this.range},setTickInterval:function(a){var b=this,c=b.chart,d=b.options,e=b.isLog,f=b.isDatetimeAxis,g=b.isXAxis,h=b.isLinked,i=d.maxPadding,j=d.minPadding,k=d.tickInterval,m=d.tickPixelInterval,n=b.categories,l=b.threshold,u=b.softThreshold,r,Z,A,v;!f&&!n&&!h&&this.getTickAmount();A=p(b.userMin,d.min);v=p(b.userMax,d.max);h?(b.linkedParent=c[b.coll][d.linkedTo],c=b.linkedParent.getExtremes(),b.min=p(c.min,c.dataMin),b.max=p(c.max,c.dataMax),d.type!==b.linkedParent.options.type&&la(11,1)):(!u&&q(l)&& | |
126 | +(b.dataMin>=l?(r=l,j=0):b.dataMax<=l&&(Z=l,i=0)),b.min=p(A,r,b.dataMin),b.max=p(v,Z,b.dataMax));if(e)!a&&z(b.min,p(b.dataMin,b.min))<=0&&la(10,1),b.min=ea(Ca(b.min),15),b.max=ea(Ca(b.max),15);if(b.range&&q(b.max))b.userMin=b.min=A=s(b.min,b.minFromRange()),b.userMax=v=b.max,b.range=null;b.beforePadding&&b.beforePadding();b.adjustForMinRange();if(!n&&!b.axisPointRange&&!b.usePercentage&&!h&&q(b.min)&&q(b.max)&&(c=b.max-b.min))!q(A)&&j&&(b.min-=c*j),!q(v)&&i&&(b.max+=c*i);if(qa(d.floor))b.min=s(b.min, | |
127 | + d.floor);if(qa(d.ceiling))b.max=z(b.max,d.ceiling);if(u&&q(b.dataMin))if(l=l||0,!q(A)&&b.min<l&&b.dataMin>=l)b.min=l;else if(!q(v)&&b.max>l&&b.dataMax<=l)b.max=l;b.tickInterval=b.min===b.max||b.min===void 0||b.max===void 0?1:h&&!k&&m===b.linkedParent.options.tickPixelInterval?k=b.linkedParent.tickInterval:p(k,this.tickAmount?(b.max-b.min)/s(this.tickAmount-1,1):void 0,n?1:(b.max-b.min)*m/s(b.len,m));g&&!a&&o(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0); | |
128 | + b.beforeSetTickPositions&&b.beforeSetTickPositions();if(b.postProcessTickInterval)b.tickInterval=b.postProcessTickInterval(b.tickInterval);if(b.pointRange)b.tickInterval=s(b.pointRange,b.tickInterval);a=p(d.minTickInterval,b.isDatetimeAxis&&b.closestPointRange);if(!k&&b.tickInterval<a)b.tickInterval=a;if(!f&&!e&&!k)b.tickInterval=pb(b.tickInterval,null,ob(b.tickInterval),p(d.allowDecimals,!(b.tickInterval>0.5&&b.tickInterval<5&&b.max>1E3&&b.max<9999)),!!this.tickAmount);if(!this.tickAmount&&this.len)b.tickInterval= | |
129 | + b.unsquish();this.setTickPositions()},setTickPositions:function(){var a=this.options,b,c=a.tickPositions,d=a.tickPositioner,e=a.startOnTick,f=a.endOnTick,g;this.tickmarkOffset=this.categories&&a.tickmarkPlacement==="between"&&this.tickInterval===1?0.5:0;this.minorTickInterval=a.minorTickInterval==="auto"&&this.tickInterval?this.tickInterval/5:a.minorTickInterval;this.tickPositions=b=c&&c.slice();if(!b&&(b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,a.units), | |
130 | + this.min,this.max,a.startOfWeek,this.ordinalPositions,this.closestPointRange,!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),b.length>this.len&&(b=[b[0],b.pop()]),this.tickPositions=b,d&&(d=d.apply(this,[this.min,this.max]))))this.tickPositions=b=d;if(!this.isLinked)this.trimTicks(b,e,f),this.min===this.max&&q(this.min)&&!this.tickAmount&&(g=!0,this.min-=0.5,this.max+=0.5),this.single=g,!c&&!d&&this.adjustTickAmount()}, | |
131 | + trimTicks:function(a,b,c){var d=a[0],e=a[a.length-1],f=this.minPointOffset||0;b?this.min=d:this.min-f>d&&a.shift();c?this.max=e:this.max+f<e&&a.pop();a.length===0&&q(d)&&a.push((e+d)/2)},getTickAmount:function(){var a={},b,c=this.options,d=c.tickAmount,e=c.tickPixelInterval;!q(c.tickInterval)&&this.len<e&&!this.isRadial&&!this.isLog&&c.startOnTick&&c.endOnTick&&(d=2);!d&&this.chart.options.chart.alignTicks!==!1&&c.alignTicks!==!1&&(o(this.chart[this.coll],function(c){var d=c.options,e=c.horiz,d=[e? | |
132 | + d.left:d.top,e?d.width:d.height,d.pane].join(",");c.series.length&&(a[d]?b=!0:a[d]=1)}),b&&(d=ta(this.len/e)+1));if(d<4)this.finalTickAmt=d,d=5;this.tickAmount=d},adjustTickAmount:function(){var a=this.tickInterval,b=this.tickPositions,c=this.tickAmount,d=this.finalTickAmt,e=b&&b.length;if(e<c){for(;b.length<c;)b.push(ea(b[b.length-1]+a));this.transA*=(e-1)/(c-1);this.max=b[b.length-1]}else e>c&&(this.tickInterval*=2,this.setTickPositions());if(q(d)){for(a=c=b.length;a--;)(d===3&&a%2===1||d<=2&&a> | |
133 | + 0&&a<c-1)&&b.splice(a,1);this.finalTickAmt=x}},setScale:function(){var a,b;this.oldMin=this.min;this.oldMax=this.max;this.oldAxisLength=this.len;this.setAxisSize();b=this.len!==this.oldAxisLength;o(this.series,function(b){if(b.isDirtyData||b.isDirty||b.xAxis.isDirty)a=!0});if(b||a||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax){if(this.resetStacks&&this.resetStacks(),this.forceRedraw=!1,this.getSeriesExtremes(),this.setTickInterval(),this.oldUserMin= | |
134 | + this.userMin,this.oldUserMax=this.userMax,!this.isDirty)this.isDirty=b||this.min!==this.oldMin||this.max!==this.oldMax}else this.cleanStacks&&this.cleanStacks()},setExtremes:function(a,b,c,d,e){var f=this,g=f.chart,c=p(c,!0);o(f.series,function(a){delete a.kdTree});e=t(e,{min:a,max:b});J(f,"setExtremes",e,function(){f.userMin=a;f.userMax=b;f.eventArgs=e;c&&g.redraw(d)})},zoom:function(a,b){var c=this.dataMin,d=this.dataMax,e=this.options,f=z(c,p(e.min,c)),e=s(d,p(e.max,d));this.allowZoomOutside|| | |
135 | + (q(c)&&a<=f&&(a=f),q(d)&&b>=e&&(b=e));this.displayBtn=a!==x||b!==x;this.setExtremes(a,b,!1,x,{trigger:"zoom"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=this.horiz,e=p(b.width,a.plotWidth-c+(b.offsetRight||0)),f=p(b.height,a.plotHeight),g=p(b.top,a.plotTop),b=p(b.left,a.plotLeft+c),c=/%$/;c.test(f)&&(f=parseFloat(f)/100*a.plotHeight);c.test(g)&&(g=parseFloat(g)/100*a.plotHeight+a.plotTop);this.left=b;this.top=g;this.width=e;this.height=f;this.bottom=a.chartHeight- | |
136 | + f-g;this.right=a.chartWidth-e-b;this.len=s(d?e:f,0);this.pos=d?b:g},getExtremes:function(){var a=this.isLog;return{min:a?ea(ia(this.min)):this.min,max:a?ea(ia(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=b?ia(this.min):this.min,b=b?ia(this.max):this.max;a===null?a=b<0?b:c:c>a?a=c:b<a&&(a=b);return this.translate(a,0,1,0,1)},autoLabelAlign:function(a){a=(p(a,0)-this.side*90+720)%360;return a>15&& | |
137 | + a<165?"right":a>195&&a<345?"left":"center"},unsquish:function(){var a=this.ticks,b=this.options.labels,c=this.horiz,d=this.tickInterval,e=d,f=this.len/(((this.categories?1:0)+this.max-this.min)/d),g,h=b.rotation,i=this.chart.renderer.fontMetrics(b.style.fontSize,a[0]&&a[0].label),j,k=Number.MAX_VALUE,m,n=function(a){a/=f||1;a=a>1?ta(a):1;return a*d};c?(m=!b.staggerLines&&!b.step&&(q(h)?[h]:f<p(b.autoRotationLimit,80)&&b.autoRotation))&&o(m,function(a){var b;if(a===h||a&&a>=-90&&a<=90)j=n(O(i.h/aa(ga* | |
138 | + a))),b=j+O(a/360),b<k&&(k=b,g=a,e=j)}):b.step||(e=n(i.h));this.autoRotation=m;this.labelRotation=p(g,h);return e},renderUnsquish:function(){var a=this.chart,b=a.renderer,c=this.tickPositions,d=this.ticks,e=this.options.labels,f=this.horiz,g=a.margin,h=this.categories?c.length:c.length-1,i=this.slotWidth=f&&!e.step&&!e.rotation&&(this.staggerLines||1)*a.plotWidth/h||!f&&(g[3]&&g[3]-a.spacing[3]||a.chartWidth*0.33),j=s(1,w(i-2*(e.padding||5))),k={},g=b.fontMetrics(e.style.fontSize,d[0]&&d[0].label), | |
139 | + h=e.style.textOverflow,m,n=0;if(!Ba(e.rotation))k.rotation=e.rotation||0;if(this.autoRotation)o(c,function(a){if((a=d[a])&&a.labelLength>n)n=a.labelLength}),n>j&&n>g.h?k.rotation=this.labelRotation:this.labelRotation=0;else if(i&&(m={width:j+"px"},!h)){m.textOverflow="clip";for(i=c.length;!f&&i--;)if(j=c[i],j=d[j].label)if(j.styles.textOverflow==="ellipsis"&&j.css({textOverflow:"clip"}),j.getBBox().height>this.len/c.length-(g.h-g.f))j.specCss={textOverflow:"ellipsis"}}if(k.rotation&&(m={width:(n> | |
140 | + a.chartHeight*0.5?a.chartHeight*0.33:a.chartHeight)+"px"},!h))m.textOverflow="ellipsis";this.labelAlign=k.align=e.align||this.autoLabelAlign(this.labelRotation);o(c,function(a){var b=(a=d[a])&&a.label;if(b)b.attr(k),m&&b.css(D(m,b.specCss)),delete b.specCss,a.rotation=k.rotation});this.tickRotCorr=b.rotCorr(g.b,this.labelRotation||0,this.side===2)},hasData:function(){return this.hasVisibleSeries||q(this.min)&&q(this.max)&&!!this.tickPositions},getOffset:function(){var a=this,b=a.chart,c=b.renderer, | |
141 | + d=a.options,e=a.tickPositions,f=a.ticks,g=a.horiz,h=a.side,i=b.inverted?[1,0,3,2][h]:h,j,k,m=0,n,l=0,u=d.title,r=d.labels,Z=0,A=b.axisOffset,b=b.clipOffset,v=[-1,1,1,-1][h],y,t=a.axisParent;j=a.hasData();a.showAxis=k=j||p(d.showEmpty,!0);a.staggerLines=a.horiz&&r.staggerLines;if(!a.axisGroup)a.gridGroup=c.g("grid").attr({zIndex:d.gridZIndex||1}).add(t),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).add(t),a.labelGroup=c.g("axis-labels").attr({zIndex:r.zIndex||7}).addClass("highcharts-"+a.coll.toLowerCase()+ | |
142 | + "-labels").add(t);if(j||a.isLinked){if(o(e,function(b){f[b]?f[b].addLabel():f[b]=new Sa(a,b)}),a.renderUnsquish(),o(e,function(b){if(h===0||h===2||{1:"left",3:"right"}[h]===a.labelAlign)Z=s(f[b].getLabelSize(),Z)}),a.staggerLines)Z*=a.staggerLines,a.labelOffset=Z}else for(y in f)f[y].destroy(),delete f[y];if(u&&u.text&&u.enabled!==!1){if(!a.axisTitle)a.axisTitle=c.text(u.text,0,0,u.useHTML).attr({zIndex:7,rotation:u.rotation||0,align:u.textAlign||{low:"left",middle:"center",high:"right"}[u.align]}).addClass("highcharts-"+ | |
143 | + this.coll.toLowerCase()+"-title").css(u.style).add(a.axisGroup),a.axisTitle.isNew=!0;if(k)m=a.axisTitle.getBBox()[g?"height":"width"],n=u.offset,l=q(n)?0:p(u.margin,g?5:10);a.axisTitle[k?"show":"hide"]()}a.offset=v*p(d.offset,A[h]);a.tickRotCorr=a.tickRotCorr||{x:0,y:0};c=h===2?a.tickRotCorr.y:0;g=Z+l+(Z&&v*(g?p(r.y,a.tickRotCorr.y+8):r.x)-c);a.axisTitleMargin=p(n,g);A[h]=s(A[h],a.axisTitleMargin+m+v*a.offset,g);d=d.offset?0:T(d.lineWidth/2)*2;b[i]=s(b[i],d)},getLinePath:function(a){var b=this.chart, | |
144 | + c=this.opposite,d=this.offset,e=this.horiz,f=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine(["M",e?this.left:f,e?d:this.top,"L",e?b.chartWidth-this.right:f,e?d:b.chartHeight-this.bottom],a)},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,e=this.options.title,f=a?b:c,g=this.opposite,h=this.offset,i=e.x||0,j=e.y||0,k=G(e.style.fontSize||12),d={low:f+(a?0:d),middle:f+d/2,high:f+(a?d:0)}[e.align],b=(a? | |
145 | + c+this.height:b)+(a?1:-1)*(g?-1:1)*this.axisTitleMargin+(this.side===2?k:0);return{x:a?d+i:b+(g?this.width:0)+h+i,y:a?b+j-(g?this.height:0)+h:d+j}},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,e=a.isLog,f=a.isLinked,g=a.tickPositions,h=a.axisTitle,i=a.ticks,j=a.minorTicks,k=a.alternateBands,m=d.stackLabels,n=d.alternateGridColor,l=a.tickmarkOffset,u=d.lineWidth,r,p=b.hasRendered&&q(a.oldMin)&&!isNaN(a.oldMin),A=a.showAxis,v=c.globalAnimation,y,s;a.labelEdge.length=0;a.overlap=!1; | |
146 | + o([i,j,k],function(a){for(var b in a)a[b].isActive=!1});if(a.hasData()||f){a.minorTickInterval&&!a.categories&&o(a.getMinorTickPositions(),function(b){j[b]||(j[b]=new Sa(a,b,"minor"));p&&j[b].isNew&&j[b].render(null,!0);j[b].render(null,!1,1)});if(g.length&&(o(g,function(b,c){if(!f||b>=a.min&&b<=a.max)i[b]||(i[b]=new Sa(a,b)),p&&i[b].isNew&&i[b].render(c,!0,0.1),i[b].render(c)}),l&&(a.min===0||a.single)))i[-1]||(i[-1]=new Sa(a,-1,null,!0)),i[-1].render(-1);n&&o(g,function(b,c){s=g[c+1]!==x?g[c+1]+ | |
147 | + l:a.max-l;if(c%2===0&&b<a.max&&s<=a.max-l)k[b]||(k[b]=new B.PlotLineOrBand(a)),y=b+l,k[b].options={from:e?ia(y):y,to:e?ia(s):s,color:n},k[b].render(),k[b].isActive=!0});if(!a._addedPlotLB)o((d.plotLines||[]).concat(d.plotBands||[]),function(b){a.addPlotBandOrLine(b)}),a._addedPlotLB=!0}o([i,j,k],function(a){var c,d,e=[],f=v?v.duration||500:0,g=function(){for(d=e.length;d--;)a[e[d]]&&!a[e[d]].isActive&&(a[e[d]].destroy(),delete a[e[d]])};for(c in a)if(!a[c].isActive)a[c].render(c,!1,0),a[c].isActive= | |
148 | + !1,e.push(c);a===k||!b.hasRendered||!f?g():f&&setTimeout(g,f)});if(u)r=a.getLinePath(u),a.axisLine?a.axisLine.animate({d:r}):a.axisLine=c.path(r).attr({stroke:d.lineColor,"stroke-width":u,zIndex:7}).add(a.axisGroup),a.axisLine[A?"show":"hide"]();if(h&&A)h[h.isNew?"attr":"animate"](a.getTitlePosition()),h.isNew=!1;m&&m.enabled&&a.renderStackTotals();a.isDirty=!1},redraw:function(){this.visible&&(this.render(),o(this.plotLinesAndBands,function(a){a.render()}));o(this.series,function(a){a.isDirty=!0})}, | |
149 | + destroy:function(a){var b=this,c=b.stacks,d,e=b.plotLinesAndBands;a||Y(b);for(d in c)Pa(c[d]),c[d]=null;o([b.ticks,b.minorTicks,b.alternateBands],function(a){Pa(a)});for(a=e.length;a--;)e[a].destroy();o("stackTotalGroup,axisLine,axisTitle,axisGroup,cross,gridGroup,labelGroup".split(","),function(a){b[a]&&(b[a]=b[a].destroy())});this.cross&&this.cross.destroy()},drawCrosshair:function(a,b){var c,d=this.crosshair,e=d.animation;if(!this.crosshair||(q(b)||!p(this.crosshair.snap,!0))===!1||b&&b.series&& | |
150 | + b.series[this.coll]!==this)this.hideCrosshair();else if(p(d.snap,!0)?q(b)&&(c=this.isXAxis?b.plotX:this.len-b.plotY):c=this.horiz?a.chartX-this.pos:this.len-a.chartY+this.pos,c=this.isRadial?this.getPlotLinePath(this.isXAxis?b.x:p(b.stackY,b.y))||null:this.getPlotLinePath(null,null,null,null,c)||null,c===null)this.hideCrosshair();else if(this.cross)this.cross.attr({visibility:"visible"})[e?"animate":"attr"]({d:c},e);else{e=this.categories&&!this.isRadial;e={"stroke-width":d.width||(e?this.transA: | |
151 | + 1),stroke:d.color||(e?"rgba(155,200,255,0.2)":"#C0C0C0"),zIndex:d.zIndex||2};if(d.dashStyle)e.dashstyle=d.dashStyle;this.cross=this.chart.renderer.path(c).attr(e).add()}},hideCrosshair:function(){this.cross&&this.cross.hide()}};t(ha.prototype,{getPlotBandPath:function(a,b){var c=this.getPlotLinePath(b,null,null,!0),d=this.getPlotLinePath(a,null,null,!0);d&&c&&d.toString()!==c.toString()?d.push(c[4],c[5],c[1],c[2]):d=null;return d},addPlotBand:function(a){return this.addPlotBandOrLine(a,"plotBands")}, | |
152 | + addPlotLine:function(a){return this.addPlotBandOrLine(a,"plotLines")},addPlotBandOrLine:function(a,b){var c=(new B.PlotLineOrBand(this,a)).render(),d=this.userOptions;c&&(b&&(d[b]=d[b]||[],d[b].push(a)),this.plotLinesAndBands.push(c));return c},removePlotBandOrLine:function(a){for(var b=this.plotLinesAndBands,c=this.options,d=this.userOptions,e=b.length;e--;)b[e].id===a&&b[e].destroy();o([c.plotLines||[],d.plotLines||[],c.plotBands||[],d.plotBands||[]],function(b){for(e=b.length;e--;)b[e].id===a&& | |
153 | + ja(b,b[e])})}});ha.prototype.getTimeTicks=function(a,b,c,d){var e=[],f={},g=S.global.useUTC,h,i=new ya(b-Wa(b)),j=a.unitRange,k=a.count;if(q(b)){i[Db](j>=F.second?0:k*T(i.getMilliseconds()/k));if(j>=F.second)i[Eb](j>=F.minute?0:k*T(i.getSeconds()/k));if(j>=F.minute)i[Fb](j>=F.hour?0:k*T(i[rb]()/k));if(j>=F.hour)i[Gb](j>=F.day?0:k*T(i[sb]()/k));if(j>=F.day)i[ub](j>=F.month?1:k*T(i[Xa]()/k));j>=F.month&&(i[vb](j>=F.year?0:k*T(i[Ya]()/k)),h=i[Za]());j>=F.year&&(h-=h%k,i[wb](h));if(j===F.week)i[ub](i[Xa]()- | |
154 | + i[tb]()+p(d,1));b=1;if(nb||db)i=i.getTime(),i=new ya(i+Wa(i));h=i[Za]();for(var d=i.getTime(),m=i[Ya](),n=i[Xa](),l=(F.day+(g?Wa(i):i.getTimezoneOffset()*6E4))%F.day;d<c;)e.push(d),j===F.year?d=fb(h+b*k,0):j===F.month?d=fb(h,m+b*k):!g&&(j===F.day||j===F.week)?d=fb(h,m,n+b*k*(j===F.day?1:7)):d+=j*k,b++;e.push(d);o(kb(e,function(a){return j<=F.hour&&a%F.day===l}),function(a){f[a]="day"})}e.info=t(a,{higherRanks:f,totalRange:j*k});return e};ha.prototype.normalizeTimeTickInterval=function(a,b){var c= | |
155 | + b||[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1,2]],["week",[1,2]],["month",[1,2,3,4,6]],["year",null]],d=c[c.length-1],e=F[d[0]],f=d[1],g;for(g=0;g<c.length;g++)if(d=c[g],e=F[d[0]],f=d[1],c[g+1]&&a<=(e*f[f.length-1]+F[c[g+1][0]])/2)break;e===F.year&&a<5*e&&(f=[1,2,5]);c=pb(a/e,f,d[0]==="year"?s(ob(a/e),1):1);return{unitRange:e,count:c,unitName:d[0]}};ha.prototype.getLogTickPositions=function(a,b,c,d){var e= | |
156 | + this.options,f=this.len,g=[];if(!d)this._minorAutoInterval=null;if(a>=0.5)a=w(a),g=this.getLinearTickPositions(a,b,c);else if(a>=0.08)for(var f=T(b),h,i,j,k,m,e=a>0.3?[1,2,4]:a>0.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];f<c+1&&!m;f++){i=e.length;for(h=0;h<i&&!m;h++)j=Ca(ia(f)*e[h]),j>b&&(!d||k<=c)&&k!==x&&g.push(k),k>c&&(m=!0),k=j}else if(b=ia(b),c=ia(c),a=e[d?"minorTickInterval":"tickInterval"],a=p(a==="auto"?null:a,this._minorAutoInterval,(c-b)*(e.tickPixelInterval/(d?5:1))/((d?f/this.tickPositions.length: | |
157 | + f)||1)),a=pb(a,null,ob(a)),g=Ua(this.getLinearTickPositions(a,b,c),Ca),!d)this._minorAutoInterval=a/5;if(!d)this.tickInterval=a;return g};var Mb=B.Tooltip=function(){this.init.apply(this,arguments)};Mb.prototype={init:function(a,b){var c=b.borderWidth,d=b.style,e=G(d.padding);this.chart=a;this.options=b;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.label=a.renderer.label("",0,0,b.shape||"callout",null,null,b.useHTML,null,"tooltip").attr({padding:e,fill:b.backgroundColor,"stroke-width":c, | |
158 | + r:b.borderRadius,zIndex:8}).css(d).css({padding:0}).add().attr({y:-9999});fa||this.label.shadow(b.shadow);this.shared=b.shared},destroy:function(){if(this.label)this.label=this.label.destroy();clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,b,c,d){var e=this,f=e.now,g=e.options.animation!==!1&&!e.isHidden&&(O(a-f.x)>1||O(b-f.y)>1),h=e.followPointer||e.len>1;t(f,{x:g?(2*f.x+a)/3:a,y:g?(f.y+b)/2:b,anchorX:h?x:g?(2*f.anchorX+c)/3:c,anchorY:h?x:g?(f.anchorY+d)/2:d});e.label.attr(f); | |
159 | + if(g)clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){e&&e.move(a,b,c,d)},32)},hide:function(a){var b=this;clearTimeout(this.hideTimer);if(!this.isHidden)this.hideTimer=setTimeout(function(){b.label.fadeOut();b.isHidden=!0},p(a,this.options.hideDelay,500))},getAnchor:function(a,b){var c,d=this.chart,e=d.inverted,f=d.plotTop,g=d.plotLeft,h=0,i=0,j,k,a=ra(a);c=a[0].tooltipPos;this.followPointer&&b&&(b.chartX===x&&(b=d.pointer.normalize(b)),c=[b.chartX-d.plotLeft,b.chartY- | |
160 | +f]);c||(o(a,function(a){j=a.series.yAxis;k=a.series.xAxis;h+=a.plotX+(!e&&k?k.left-g:0);i+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!e&&j?j.top-f:0)}),h/=a.length,i/=a.length,c=[e?d.plotWidth-i:h,this.shared&&!e&&a.length>1&&b?b.chartY-f:e?d.plotHeight-h:i]);return Ua(c,w)},getPosition:function(a,b,c){var d=this.chart,e=this.distance,f={},g=c.h||0,h,i=["y",d.chartHeight,b,c.plotY+d.plotTop,d.plotTop,d.plotTop+d.plotHeight],j=["x",d.chartWidth,a,c.plotX+d.plotLeft,d.plotLeft,d.plotLeft+d.plotWidth], | |
161 | + k=p(c.ttBelow,d.inverted&&!c.negative||!d.inverted&&c.negative),m=function(a,b,c,d,h,i){var j=c<d-e,n=d+e+c<b,m=d-e-c;d+=e;if(k&&n)f[a]=d;else if(!k&&j)f[a]=m;else if(j)f[a]=z(i-c,m-g<0?m:m-g);else if(n)f[a]=s(h,d+g+c>b?d:d+g);else return!1},n=function(a,b,c,d){if(d<e||d>b-e)return!1;else f[a]=d<c/2?1:d>b-c/2?b-c-2:d-c/2},l=function(a){var b=i;i=j;j=b;h=a},u=function(){m.apply(0,i)!==!1?n.apply(0,j)===!1&&!h&&(l(!0),u()):h?f.x=f.y=0:(l(!0),u())};(d.inverted||this.len>1)&&l();u();return f},defaultFormatter:function(a){var b= | |
162 | + this.points||ra(this),c;c=[a.tooltipFooterHeaderFormatter(b[0])];c=c.concat(a.bodyFormatter(b));c.push(a.tooltipFooterHeaderFormatter(b[0],!0));return c.join("")},refresh:function(a,b){var c=this.chart,d=this.label,e=this.options,f,g,h,i={},j,k=[];j=e.formatter||this.defaultFormatter;var i=c.hoverPoints,m,n=this.shared;clearTimeout(this.hideTimer);this.followPointer=ra(a)[0].series.tooltipOptions.followPointer;h=this.getAnchor(a,b);f=h[0];g=h[1];n&&(!a.series||!a.series.noSharedTooltip)?(c.hoverPoints= | |
163 | + a,i&&o(i,function(a){a.setState()}),o(a,function(a){a.setState("hover");k.push(a.getLabelConfig())}),i={x:a[0].category,y:a[0].y},i.points=k,this.len=k.length,a=a[0]):i=a.getLabelConfig();j=j.call(i,this);i=a.series;this.distance=p(i.tooltipOptions.distance,16);j===!1?this.hide():(this.isHidden&&(cb(d),d.attr("opacity",1).show()),d.attr({text:j}),m=e.borderColor||a.color||i.color||"#606060",d.attr({stroke:m}),this.updatePosition({plotX:f,plotY:g,negative:a.negative,ttBelow:a.ttBelow,h:h[2]||0}),this.isHidden= | |
164 | + !1);J(c,"tooltipRefresh",{text:j,x:f+c.plotLeft,y:g+c.plotTop,borderColor:m})},updatePosition:function(a){var b=this.chart,c=this.label,c=(this.options.positioner||this.getPosition).call(this,c.width,c.height,a);this.move(w(c.x),w(c.y||0),a.plotX+b.plotLeft,a.plotY+b.plotTop)},getXDateFormat:function(a,b,c){var d,b=b.dateTimeLabelFormats,e=c&&c.closestPointRange,f,g={millisecond:15,second:12,minute:9,hour:6,day:3},h,i="millisecond";if(e){h=Na("%m-%d %H:%M:%S.%L",a.x);for(f in F){if(e===F.week&&+Na("%w", | |
165 | + a.x)===c.options.startOfWeek&&h.substr(6)==="00:00:00.000"){f="week";break}else if(F[f]>e){f=i;break}else if(g[f]&&h.substr(g[f])!=="01-01 00:00:00.000".substr(g[f]))break;f!=="week"&&(i=f)}f&&(d=b[f])}else d=b.day;return d||b.year},tooltipFooterHeaderFormatter:function(a,b){var c=b?"footer":"header",d=a.series,e=d.tooltipOptions,f=e.xDateFormat,g=d.xAxis,h=g&&g.options.type==="datetime"&&qa(a.key),c=e[c+"Format"];h&&!f&&(f=this.getXDateFormat(a,e,g));h&&f&&(c=c.replace("{point.key}","{point.key:"+ | |
166 | + f+"}"));return Ia(c,{point:a,series:d})},bodyFormatter:function(a){return Ua(a,function(a){var c=a.series.tooltipOptions;return(c.pointFormatter||a.point.tooltipFormatter).call(a.point,c.pointFormat)})}};var oa;ab=C.documentElement.ontouchstart!==x;var Va=B.Pointer=function(a,b){this.init(a,b)};Va.prototype={init:function(a,b){var c=b.chart,d=c.events,e=fa?"":c.zoomType,c=a.inverted,f;this.options=b;this.chart=a;this.zoomX=f=/x/.test(e);this.zoomY=e=/y/.test(e);this.zoomHor=f&&!c||e&&c;this.zoomVert= | |
167 | + e&&!c||f&&c;this.hasZoom=f||e;this.runChartClick=d&&!!d.click;this.pinchDown=[];this.lastValidTouch={};if(B.Tooltip&&b.tooltip.enabled)a.tooltip=new Mb(a,b.tooltip),this.followTouchMove=p(b.tooltip.followTouchMove,!0);this.setDOMEvents()},normalize:function(a,b){var c,d,a=a||window.event,a=Sb(a);if(!a.target)a.target=a.srcElement;d=a.touches?a.touches.length?a.touches.item(0):a.changedTouches[0]:a;if(!b)this.chartPosition=b=Rb(this.chart.container);d.pageX===x?(c=s(a.x,a.clientX-b.left),d=a.y):(c= | |
168 | + d.pageX-b.left,d=d.pageY-b.top);return t(a,{chartX:w(c),chartY:w(d)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};o(this.chart.axes,function(c){b[c.isXAxis?"xAxis":"yAxis"].push({axis:c,value:c.toValue(a[c.horiz?"chartX":"chartY"])})});return b},runPointActions:function(a){var b=this.chart,c=b.series,d=b.tooltip,e=d?d.shared:!1,f=b.hoverPoint,g=b.hoverSeries,h,i=Number.MAX_VALUE,j,k,m=[],n,l;if(!e&&!g)for(h=0;h<c.length;h++)if(c[h].directTouch||!c[h].options.stickyTracking)c=[];g&&(e?g.noSharedTooltip: | |
169 | + g.directTouch)&&f?n=f:(o(c,function(b){j=b.noSharedTooltip&&e;k=!e&&b.directTouch;b.visible&&!j&&!k&&p(b.options.enableMouseTracking,!0)&&(l=b.searchPoint(a,!j&&b.kdDimensions===1))&&m.push(l)}),o(m,function(a){if(a&&typeof a.dist==="number"&&a.dist<i)i=a.dist,n=a}));if(n&&(n!==this.prevKDPoint||d&&d.isHidden)){if(e&&!n.series.noSharedTooltip){for(h=m.length;h--;)(m[h].clientX!==n.clientX||m[h].series.noSharedTooltip)&&m.splice(h,1);m.length&&d&&d.refresh(m,a);o(m,function(b){b.onMouseOver(a,b!== | |
170 | + (g&&g.directTouch&&f||n))})}else if(d&&d.refresh(n,a),!g||!g.directTouch)n.onMouseOver(a);this.prevKDPoint=n}else c=g&&g.tooltipOptions.followPointer,d&&c&&!d.isHidden&&(c=d.getAnchor([{}],a),d.updatePosition({plotX:c[0],plotY:c[1]}));if(d&&!this._onDocumentMouseMove)this._onDocumentMouseMove=function(a){if(X[oa])X[oa].pointer.onDocumentMouseMove(a)},I(C,"mousemove",this._onDocumentMouseMove);o(b.axes,function(b){b.drawCrosshair(a,p(n,f))})},reset:function(a,b){var c=this.chart,d=c.hoverSeries,e= | |
171 | + c.hoverPoint,f=c.hoverPoints,g=c.tooltip,h=g&&g.shared?f:e;(a=a&&g&&h)&&ra(h)[0].plotX===x&&(a=!1);if(a)g.refresh(h),e&&(e.setState(e.state,!0),o(c.axes,function(a){p(a.options.crosshair&&a.options.crosshair.snap,!0)?a.drawCrosshair(null,e):a.hideCrosshair()}));else{if(e)e.onMouseOut();f&&o(f,function(a){a.setState()});if(d)d.onMouseOut();g&&g.hide(b);if(this._onDocumentMouseMove)Y(C,"mousemove",this._onDocumentMouseMove),this._onDocumentMouseMove=null;o(c.axes,function(a){a.hideCrosshair()});this.hoverX= | |
172 | + c.hoverPoints=c.hoverPoint=null}},scaleGroups:function(a,b){var c=this.chart,d;o(c.series,function(e){d=a||e.getPlotBox();e.xAxis&&e.xAxis.zoomEnabled&&(e.group.attr(d),e.markerGroup&&(e.markerGroup.attr(d),e.markerGroup.clip(b?c.clipRect:null)),e.dataLabelsGroup&&e.dataLabelsGroup.attr(d))});c.clipRect.attr(b||c.clipBox)},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY=this.mouseDownY=a.chartY},drag:function(a){var b= | |
173 | + this.chart,c=b.options.chart,d=a.chartX,e=a.chartY,f=this.zoomHor,g=this.zoomVert,h=b.plotLeft,i=b.plotTop,j=b.plotWidth,k=b.plotHeight,m,n=this.selectionMarker,l=this.mouseDownX,u=this.mouseDownY,r=c.panKey&&a[c.panKey+"Key"];if(!n||!n.touch)if(d<h?d=h:d>h+j&&(d=h+j),e<i?e=i:e>i+k&&(e=i+k),this.hasDragged=Math.sqrt(Math.pow(l-d,2)+Math.pow(u-e,2)),this.hasDragged>10){m=b.isInsidePlot(l-h,u-i);if(b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&m&&!r&&!n)this.selectionMarker=n=b.renderer.rect(h,i, | |
174 | + f?1:j,g?1:k,0).attr({fill:c.selectionMarkerFill||"rgba(69,114,167,0.25)",zIndex:7}).add();n&&f&&(d-=l,n.attr({width:O(d),x:(d>0?0:d)+l}));n&&g&&(d=e-u,n.attr({height:O(d),y:(d>0?0:d)+u}));m&&!n&&c.panning&&b.pan(a,c.panning)}},drop:function(a){var b=this,c=this.chart,d=this.hasPinched;if(this.selectionMarker){var e={xAxis:[],yAxis:[],originalEvent:a.originalEvent||a},f=this.selectionMarker,g=f.attr?f.attr("x"):f.x,h=f.attr?f.attr("y"):f.y,i=f.attr?f.attr("width"):f.width,j=f.attr?f.attr("height"): | |
175 | + f.height,k;if(this.hasDragged||d)o(c.axes,function(c){if(c.zoomEnabled&&q(c.min)&&(d||b[{xAxis:"zoomX",yAxis:"zoomY"}[c.coll]])){var f=c.horiz,l=a.type==="touchend"?c.minPixelPadding:0,u=c.toValue((f?g:h)+l),f=c.toValue((f?g+i:h+j)-l);e[c.coll].push({axis:c,min:z(u,f),max:s(u,f)});k=!0}}),k&&J(c,"selection",e,function(a){c.zoom(t(a,d?{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy();d&&this.scaleGroups()}if(c)M(c.container,{cursor:c._cursor}),c.cancelClick=this.hasDragged> | |
176 | + 10,c.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[]},onContainerMouseDown:function(a){a=this.normalize(a);a.preventDefault&&a.preventDefault();this.dragStart(a)},onDocumentMouseUp:function(a){X[oa]&&X[oa].pointer.drop(a)},onDocumentMouseMove:function(a){var b=this.chart,c=this.chartPosition,a=this.normalize(a,c);c&&!this.inClass(a.target,"highcharts-tracker")&&!b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)&&this.reset()},onContainerMouseLeave:function(){var a=X[oa];if(a)a.pointer.reset(), | |
177 | + a.pointer.chartPosition=null},onContainerMouseMove:function(a){var b=this.chart;oa=b.index;a=this.normalize(a);a.returnValue=!1;b.mouseIsDown==="mousedown"&&this.drag(a);(this.inClass(a.target,"highcharts-tracker")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop))&&!b.openMenu&&this.runPointActions(a)},inClass:function(a,b){for(var c;a;){if(c=K(a,"class"))if(c.indexOf(b)!==-1)return!0;else if(c.indexOf("highcharts-container")!==-1)return!1;a=a.parentNode}},onTrackerMouseOut:function(a){var b= | |
178 | + this.chart.hoverSeries,a=a.relatedTarget||a.toElement;if(b&&!b.options.stickyTracking&&!this.inClass(a,"highcharts-tooltip")&&!this.inClass(a,"highcharts-series-"+b.index))b.onMouseOut()},onContainerClick:function(a){var b=this.chart,c=b.hoverPoint,d=b.plotLeft,e=b.plotTop,a=this.normalize(a);a.originalEvent=a;b.cancelClick||(c&&this.inClass(a.target,"highcharts-tracker")?(J(c.series,"click",t(a,{point:c})),b.hoverPoint&&c.firePointEvent("click",a)):(t(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX- | |
179 | + d,a.chartY-e)&&J(b,"click",a)))},setDOMEvents:function(){var a=this,b=a.chart.container;b.onmousedown=function(b){a.onContainerMouseDown(b)};b.onmousemove=function(b){a.onContainerMouseMove(b)};b.onclick=function(b){a.onContainerClick(b)};I(b,"mouseleave",a.onContainerMouseLeave);bb===1&&I(C,"mouseup",a.onDocumentMouseUp);if(ab)b.ontouchstart=function(b){a.onContainerTouchStart(b)},b.ontouchmove=function(b){a.onContainerTouchMove(b)},bb===1&&I(C,"touchend",a.onDocumentTouchEnd)},destroy:function(){var a; | |
180 | + Y(this.chart.container,"mouseleave",this.onContainerMouseLeave);bb||(Y(C,"mouseup",this.onDocumentMouseUp),Y(C,"touchend",this.onDocumentTouchEnd));clearInterval(this.tooltipTimeout);for(a in this)this[a]=null}};t(B.Pointer.prototype,{pinchTranslate:function(a,b,c,d,e,f){(this.zoomHor||this.pinchHor)&&this.pinchTranslateDirection(!0,a,b,c,d,e,f);(this.zoomVert||this.pinchVert)&&this.pinchTranslateDirection(!1,a,b,c,d,e,f)},pinchTranslateDirection:function(a,b,c,d,e,f,g,h){var i=this.chart,j=a?"x": | |
181 | + "y",k=a?"X":"Y",m="chart"+k,n=a?"width":"height",l=i["plot"+(a?"Left":"Top")],u,r,p=h||1,o=i.inverted,v=i.bounds[a?"h":"v"],s=b.length===1,q=b[0][m],t=c[0][m],x=!s&&b[1][m],w=!s&&c[1][m],z,c=function(){!s&&O(q-x)>20&&(p=h||O(t-w)/O(q-x));r=(l-t)/p+q;u=i["plot"+(a?"Width":"Height")]/p};c();b=r;b<v.min?(b=v.min,z=!0):b+u>v.max&&(b=v.max-u,z=!0);z?(t-=0.8*(t-g[j][0]),s||(w-=0.8*(w-g[j][1])),c()):g[j]=[t,w];o||(f[j]=r-l,f[n]=u);f=o?1/p:p;e[n]=u;e[j]=b;d[o?a?"scaleY":"scaleX":"scale"+k]=p;d["translate"+ | |
182 | +k]=f*l+(t-f*q)},pinch:function(a){var b=this,c=b.chart,d=b.pinchDown,e=a.touches,f=e.length,g=b.lastValidTouch,h=b.hasZoom,i=b.selectionMarker,j={},k=f===1&&(b.inClass(a.target,"highcharts-tracker")&&c.runTrackerClick||b.runChartClick),m={};if(f>1)b.initiated=!0;h&&b.initiated&&!k&&a.preventDefault();Ua(e,function(a){return b.normalize(a)});if(a.type==="touchstart")o(e,function(a,b){d[b]={chartX:a.chartX,chartY:a.chartY}}),g.x=[d[0].chartX,d[1]&&d[1].chartX],g.y=[d[0].chartY,d[1]&&d[1].chartY],o(c.axes, | |
183 | + function(a){if(a.zoomEnabled){var b=c.bounds[a.horiz?"h":"v"],d=a.minPixelPadding,e=a.toPixels(p(a.options.min,a.dataMin)),f=a.toPixels(p(a.options.max,a.dataMax)),g=z(e,f),e=s(e,f);b.min=z(a.pos,g-d);b.max=s(a.pos+a.len,e+d)}}),b.res=!0;else if(d.length){if(!i)b.selectionMarker=i=t({destroy:ua,touch:!0},c.plotBox);b.pinchTranslate(d,e,j,i,m,g);b.hasPinched=h;b.scaleGroups(j,m);if(!h&&b.followTouchMove&&f===1)this.runPointActions(b.normalize(a));else if(b.res)b.res=!1,this.reset(!1,0)}},touch:function(a, | |
184 | + b){var c=this.chart;oa=c.index;a.touches.length===1?(a=this.normalize(a),c.isInsidePlot(a.chartX-c.plotLeft,a.chartY-c.plotTop)&&!c.openMenu?(b&&this.runPointActions(a),this.pinch(a)):b&&this.reset()):a.touches.length===2&&this.pinch(a)},onContainerTouchStart:function(a){this.touch(a,!0)},onContainerTouchMove:function(a){this.touch(a)},onDocumentTouchEnd:function(a){X[oa]&&X[oa].pointer.drop(a)}});if(L.PointerEvent||L.MSPointerEvent){var wa={},Ab=!!L.PointerEvent,Wb=function(){var a,b=[];b.item=function(a){return this[a]}; | |
185 | + for(a in wa)wa.hasOwnProperty(a)&&b.push({pageX:wa[a].pageX,pageY:wa[a].pageY,target:wa[a].target});return b},Bb=function(a,b,c,d){a=a.originalEvent||a;if((a.pointerType==="touch"||a.pointerType===a.MSPOINTER_TYPE_TOUCH)&&X[oa])d(a),d=X[oa].pointer,d[b]({type:c,target:a.currentTarget,preventDefault:ua,touches:Wb()})};t(Va.prototype,{onContainerPointerDown:function(a){Bb(a,"onContainerTouchStart","touchstart",function(a){wa[a.pointerId]={pageX:a.pageX,pageY:a.pageY,target:a.currentTarget}})},onContainerPointerMove:function(a){Bb(a, | |
186 | + "onContainerTouchMove","touchmove",function(a){wa[a.pointerId]={pageX:a.pageX,pageY:a.pageY};if(!wa[a.pointerId].target)wa[a.pointerId].target=a.currentTarget})},onDocumentPointerUp:function(a){Bb(a,"onDocumentTouchEnd","touchend",function(a){delete wa[a.pointerId]})},batchMSEvents:function(a){a(this.chart.container,Ab?"pointerdown":"MSPointerDown",this.onContainerPointerDown);a(this.chart.container,Ab?"pointermove":"MSPointerMove",this.onContainerPointerMove);a(C,Ab?"pointerup":"MSPointerUp",this.onDocumentPointerUp)}}); | |
187 | + Ta(Va.prototype,"init",function(a,b,c){a.call(this,b,c);this.hasZoom&&M(b.container,{"-ms-touch-action":P,"touch-action":P})});Ta(Va.prototype,"setDOMEvents",function(a){a.apply(this);(this.hasZoom||this.followTouchMove)&&this.batchMSEvents(I)});Ta(Va.prototype,"destroy",function(a){this.batchMSEvents(Y);a.call(this)})}var mb=B.Legend=function(a,b){this.init(a,b)};mb.prototype={init:function(a,b){var c=this,d=b.itemStyle,e=b.itemMarginTop||0;this.options=b;if(b.enabled)c.itemStyle=d,c.itemHiddenStyle= | |
188 | + D(d,b.itemHiddenStyle),c.itemMarginTop=e,c.padding=d=p(b.padding,8),c.initialItemX=d,c.initialItemY=d-5,c.maxItemWidth=0,c.chart=a,c.itemHeight=0,c.symbolWidth=p(b.symbolWidth,16),c.pages=[],c.render(),I(c.chart,"endResize",function(){c.positionCheckboxes()})},colorizeItem:function(a,b){var c=this.options,d=a.legendItem,e=a.legendLine,f=a.legendSymbol,g=this.itemHiddenStyle.color,c=b?c.itemStyle.color:g,h=b?a.legendColor||a.color||"#CCC":g,g=a.options&&a.options.marker,i={fill:h},j;d&&d.css({fill:c, | |
189 | + color:c});e&&e.attr({stroke:h});if(f){if(g&&f.isMarker)for(j in i.stroke=h,g=a.convertAttribs(g),g)d=g[j],d!==x&&(i[j]=d);f.attr(i)}},positionItem:function(a){var b=this.options,c=b.symbolPadding,b=!b.rtl,d=a._legendItemPos,e=d[0],d=d[1],f=a.checkbox;(a=a.legendGroup)&&a.element&&a.translate(b?e:this.legendWidth-e-2*c-4,d);if(f)f.x=e,f.y=d},destroyItem:function(a){var b=a.checkbox;o(["legendItem","legendLine","legendSymbol","legendGroup"],function(b){a[b]&&(a[b]=a[b].destroy())});b&&Qa(a.checkbox)}, | |
190 | + destroy:function(){var a=this.group,b=this.box;if(b)this.box=b.destroy();if(a)this.group=a.destroy()},positionCheckboxes:function(a){var b=this.group.alignAttr,c,d=this.clipHeight||this.legendHeight;if(b)c=b.translateY,o(this.allItems,function(e){var f=e.checkbox,g;f&&(g=c+f.y+(a||0)+3,M(f,{left:b.translateX+e.checkboxOffset+f.x-20+"px",top:g+"px",display:g>c-6&&g<c+d-6?"":P}))})},renderTitle:function(){var a=this.padding,b=this.options.title,c=0;if(b.text){if(!this.title)this.title=this.chart.renderer.label(b.text, | |
191 | + a-3,a-4,null,null,null,null,null,"legend-title").attr({zIndex:1}).css(b.style).add(this.group);a=this.title.getBBox();c=a.height;this.offsetWidth=a.width;this.contentGroup.attr({translateY:c})}this.titleHeight=c},setText:function(a){var b=this.options;a.legendItem.attr({text:b.labelFormat?Ia(b.labelFormat,a):b.labelFormatter.call(a)})},renderItem:function(a){var b=this.chart,c=b.renderer,d=this.options,e=d.layout==="horizontal",f=this.symbolWidth,g=d.symbolPadding,h=this.itemStyle,i=this.itemHiddenStyle, | |
192 | + j=this.padding,k=e?p(d.itemDistance,20):0,m=!d.rtl,n=d.width,l=d.itemMarginBottom||0,u=this.itemMarginTop,r=this.initialItemX,o=a.legendItem,A=a.series&&a.series.drawLegendSymbol?a.series:a,v=A.options,v=this.createCheckboxForItem&&v&&v.showCheckbox,q=d.useHTML;if(!o){a.legendGroup=c.g("legend-item").attr({zIndex:1}).add(this.scrollGroup);a.legendItem=o=c.text("",m?f+g:-g,this.baseline||0,q).css(D(a.visible?h:i)).attr({align:m?"left":"right",zIndex:2}).add(a.legendGroup);if(!this.baseline)this.fontMetrics= | |
193 | + c.fontMetrics(h.fontSize,o),this.baseline=this.fontMetrics.f+3+u,o.attr("y",this.baseline);A.drawLegendSymbol(this,a);this.setItemEvents&&this.setItemEvents(a,o,q,h,i);this.colorizeItem(a,a.visible);v&&this.createCheckboxForItem(a)}this.setText(a);c=o.getBBox();f=a.checkboxOffset=d.itemWidth||a.legendItemWidth||f+g+c.width+k+(v?20:0);this.itemHeight=g=w(a.legendItemHeight||c.height);if(e&&this.itemX-r+f>(n||b.chartWidth-2*j-r-d.x))this.itemX=r,this.itemY+=u+this.lastLineHeight+l,this.lastLineHeight= | |
194 | + 0;this.maxItemWidth=s(this.maxItemWidth,f);this.lastItemY=u+this.itemY+l;this.lastLineHeight=s(g,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];e?this.itemX+=f:(this.itemY+=u+g+l,this.lastLineHeight=g);this.offsetWidth=n||s((e?this.itemX-r-k:f)+j,this.offsetWidth)},getAllItems:function(){var a=[];o(this.chart.series,function(b){var c=b.options;if(p(c.showInLegend,!q(c.linkedTo)?x:!1,!0))a=a.concat(b.legendItems||(c.legendType==="point"?b.data:b))});return a},adjustMargins:function(a, | |
195 | + b){var c=this.chart,d=this.options,e=d.align.charAt(0)+d.verticalAlign.charAt(0)+d.layout.charAt(0);this.display&&!d.floating&&o([/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/],function(f,g){f.test(e)&&!q(a[g])&&(c[ib[g]]=s(c[ib[g]],c.legend[(g+1)%2?"legendHeight":"legendWidth"]+[1,-1,-1,1][g]*d[g%2?"x":"y"]+p(d.margin,12)+b[g]))})},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.group,e,f,g,h,i=a.box,j=a.options,k=a.padding,m=j.borderWidth,n=j.backgroundColor;a.itemX=a.initialItemX; | |
196 | + a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;if(!d)a.group=d=c.g("legend").attr({zIndex:7}).add(),a.contentGroup=c.g().attr({zIndex:1}).add(d),a.scrollGroup=c.g().add(a.contentGroup);a.renderTitle();e=a.getAllItems();qb(e,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});j.reversed&&e.reverse();a.allItems=e;a.display=f=!!e.length;a.lastLineHeight=0;o(e,function(b){a.renderItem(b)});g=(j.width||a.offsetWidth)+k;h=a.lastItemY+a.lastLineHeight+ | |
197 | + a.titleHeight;h=a.handleOverflow(h);h+=k;if(m||n){if(i){if(g>0&&h>0)i[i.isNew?"attr":"animate"](i.crisp({width:g,height:h})),i.isNew=!1}else a.box=i=c.rect(0,0,g,h,j.borderRadius,m||0).attr({stroke:j.borderColor,"stroke-width":m||0,fill:n||P}).add(d).shadow(j.shadow),i.isNew=!0;i[f?"show":"hide"]()}a.legendWidth=g;a.legendHeight=h;o(e,function(b){a.positionItem(b)});f&&d.align(t({width:g,height:h},j),!0,"spacingBox");b.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,c= | |
198 | + this.chart,d=c.renderer,e=this.options,f=e.y,f=c.spacingBox.height+(e.verticalAlign==="top"?-f:f)-this.padding,g=e.maxHeight,h,i=this.clipRect,j=e.navigation,k=p(j.animation,!0),m=j.arrowSize||12,n=this.nav,l=this.pages,u=this.padding,r,q=this.allItems,A=function(a){i.attr({height:a});if(b.contentGroup.div)b.contentGroup.div.style.clip="rect("+u+"px,9999px,"+(u+a)+"px,0)"};e.layout==="horizontal"&&(f/=2);g&&(f=z(f,g));l.length=0;if(a>f){this.clipHeight=h=s(f-20-this.titleHeight-u,0);this.currentPage= | |
199 | + p(this.currentPage,1);this.fullHeight=a;o(q,function(a,b){var c=a._legendItemPos[1],d=w(a.legendItem.getBBox().height),e=l.length;if(!e||c-l[e-1]>h&&(r||c)!==l[e-1])l.push(r||c),e++;b===q.length-1&&c+d-l[e-1]>h&&l.push(c);c!==r&&(r=c)});if(!i)i=b.clipRect=d.clipRect(0,u,9999,0),b.contentGroup.clip(i);A(h);if(!n)this.nav=n=d.g().attr({zIndex:1}).add(this.group),this.up=d.symbol("triangle",0,0,m,m).on("click",function(){b.scroll(-1,k)}).add(n),this.pager=d.text("",15,10).css(j.style).add(n),this.down= | |
200 | + d.symbol("triangle-down",0,0,m,m).on("click",function(){b.scroll(1,k)}).add(n);b.scroll(0);a=f}else if(n)A(c.chartHeight),n.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0;return a},scroll:function(a,b){var c=this.pages,d=c.length,e=this.currentPage+a,f=this.clipHeight,g=this.options.navigation,h=g.activeColor,g=g.inactiveColor,i=this.pager,j=this.padding;e>d&&(e=d);if(e>0)b!==x&&Ra(b,this.chart),this.nav.attr({translateX:j,translateY:f+this.padding+7+this.titleHeight,visibility:"visible"}), | |
201 | + this.up.attr({fill:e===1?g:h}).css({cursor:e===1?"default":"pointer"}),i.attr({text:e+"/"+d}),this.down.attr({x:18+this.pager.getBBox().width,fill:e===d?g:h}).css({cursor:e===d?"default":"pointer"}),c=-c[e-1]+this.initialItemY,this.scrollGroup.animate({translateY:c}),this.currentPage=e,this.positionCheckboxes(c)}};Ma=B.LegendSymbolMixin={drawRectangle:function(a,b){var c=a.options.symbolHeight||a.fontMetrics.f;b.legendSymbol=this.chart.renderer.rect(0,a.baseline-c+1,a.symbolWidth,c,a.options.symbolRadius|| | |
202 | + 0).attr({zIndex:3}).add(b.legendGroup)},drawLineMarker:function(a){var b=this.options,c=b.marker,d;d=a.symbolWidth;var e=this.chart.renderer,f=this.legendGroup,a=a.baseline-w(a.fontMetrics.b*0.3),g;if(b.lineWidth){g={"stroke-width":b.lineWidth};if(b.dashStyle)g.dashstyle=b.dashStyle;this.legendLine=e.path(["M",0,a,"L",d,a]).attr(g).add(f)}if(c&&c.enabled!==!1)b=c.radius,this.legendSymbol=d=e.symbol(this.symbol,d/2-b,a-b,2*b,2*b).add(f),d.isMarker=!0}};(/Trident\/7\.0/.test(za)||Ka)&&Ta(mb.prototype, | |
203 | + "positionItem",function(a,b){var c=this,d=function(){b._legendItemPos&&a.call(c,b)};d();setTimeout(d)});E=B.Chart=function(){this.init.apply(this,arguments)};E.prototype={callbacks:[],init:function(a,b){var c,d=a.series;a.series=null;c=D(S,a);c.series=a.series=d;this.userOptions=a;d=c.chart;this.margin=this.splashArray("margin",d);this.spacing=this.splashArray("spacing",d);var e=d.events;this.bounds={h:{},v:{}};this.callback=b;this.isResizing=0;this.options=c;this.axes=[];this.series=[];this.hasCartesianSeries= | |
204 | + d.showAxes;var f=this,g;f.index=X.length;X.push(f);bb++;d.reflow!==!1&&I(f,"load",function(){f.initReflow()});if(e)for(g in e)I(f,g,e[g]);f.xAxis=[];f.yAxis=[];f.animation=fa?!1:p(d.animation,!0);f.pointCount=f.colorCounter=f.symbolCounter=0;f.firstRender()},initSeries:function(a){var b=this.options.chart;(b=N[a.type||b.type||b.defaultSeriesType])||la(17,!0);b=new b;b.init(this,a);return b},isInsidePlot:function(a,b,c){var d=c?b:a,a=c?a:b;return d>=0&&d<=this.plotWidth&&a>=0&&a<=this.plotHeight}, | |
205 | + redraw:function(a){var b=this.axes,c=this.series,d=this.pointer,e=this.legend,f=this.isDirtyLegend,g,h,i=this.hasCartesianSeries,j=this.isDirtyBox,k=c.length,m=k,n=this.renderer,l=n.isHidden(),p=[];Ra(a,this);l&&this.cloneRenderTo();for(this.layOutTitles();m--;)if(a=c[m],a.options.stacking&&(g=!0,a.isDirty)){h=!0;break}if(h)for(m=k;m--;)if(a=c[m],a.options.stacking)a.isDirty=!0;o(c,function(a){a.isDirty&&a.options.legendType==="point"&&(a.updateTotals&&a.updateTotals(),f=!0)});if(f&&e.options.enabled)e.render(), | |
206 | + this.isDirtyLegend=!1;g&&this.getStacks();if(i&&!this.isResizing)this.maxTicks=null,o(b,function(a){a.setScale()});this.getMargins();i&&(o(b,function(a){a.isDirty&&(j=!0)}),o(b,function(a){var b=a.min+","+a.max;if(a.extKey!==b)a.extKey=b,p.push(function(){J(a,"afterSetExtremes",t(a.eventArgs,a.getExtremes()));delete a.eventArgs});(j||g)&&a.redraw()}));j&&this.drawChartBox();o(c,function(a){a.isDirty&&a.visible&&(!a.isCartesian||a.xAxis)&&a.redraw()});d&&d.reset(!0);n.draw();J(this,"redraw");l&&this.cloneRenderTo(!0); | |
207 | + o(p,function(a){a.call()})},get:function(a){var b=this.axes,c=this.series,d,e;for(d=0;d<b.length;d++)if(b[d].options.id===a)return b[d];for(d=0;d<c.length;d++)if(c[d].options.id===a)return c[d];for(d=0;d<c.length;d++){e=c[d].points||[];for(b=0;b<e.length;b++)if(e[b].id===a)return e[b]}return null},getAxes:function(){var a=this,b=this.options,c=b.xAxis=ra(b.xAxis||{}),b=b.yAxis=ra(b.yAxis||{});o(c,function(a,b){a.index=b;a.isX=!0});o(b,function(a,b){a.index=b});c=c.concat(b);o(c,function(b){new ha(a, | |
208 | + b)})},getSelectedPoints:function(){var a=[];o(this.series,function(b){a=a.concat(kb(b.points||[],function(a){return a.selected}))});return a},getSelectedSeries:function(){return kb(this.series,function(a){return a.selected})},setTitle:function(a,b,c){var g;var d=this,e=d.options,f;f=e.title=D(e.title,a);g=e.subtitle=D(e.subtitle,b),e=g;o([["title",a,f],["subtitle",b,e]],function(a){var b=a[0],c=d[b],e=a[1],a=a[2];c&&e&&(d[b]=c=c.destroy());a&&a.text&&!c&&(d[b]=d.renderer.text(a.text,0,0,a.useHTML).attr({align:a.align, | |
209 | + "class":"highcharts-"+b,zIndex:a.zIndex||4}).css(a.style).add())});d.layOutTitles(c)},layOutTitles:function(a){var b=0,c=this.title,d=this.subtitle,e=this.options,f=e.title,e=e.subtitle,g=this.renderer,h=this.spacingBox.width-44;if(c&&(c.css({width:(f.width||h)+"px"}).align(t({y:g.fontMetrics(f.style.fontSize,c).b-3},f),!1,"spacingBox"),!f.floating&&!f.verticalAlign))b=c.getBBox().height;d&&(d.css({width:(e.width||h)+"px"}).align(t({y:b+(f.margin-13)+g.fontMetrics(e.style.fontSize,c).b},e),!1,"spacingBox"), | |
210 | + !e.floating&&!e.verticalAlign&&(b=ta(b+d.getBBox().height)));c=this.titleOffset!==b;this.titleOffset=b;if(!this.isDirtyBox&&c)this.isDirtyBox=c,this.hasRendered&&p(a,!0)&&this.isDirtyBox&&this.redraw()},getChartSize:function(){var a=this.options.chart,b=a.width,a=a.height,c=this.renderToClone||this.renderTo;if(!q(b))this.containerWidth=jb(c,"width");if(!q(a))this.containerHeight=jb(c,"height");this.chartWidth=s(0,b||this.containerWidth||600);this.chartHeight=s(0,p(a,this.containerHeight>19?this.containerHeight: | |
211 | + 400))},cloneRenderTo:function(a){var b=this.renderToClone,c=this.container;a?b&&(this.renderTo.appendChild(c),Qa(b),delete this.renderToClone):(c&&c.parentNode===this.renderTo&&this.renderTo.removeChild(c),this.renderToClone=b=this.renderTo.cloneNode(0),M(b,{position:"absolute",top:"-9999px",display:"block"}),b.style.setProperty&&b.style.setProperty("display","block","important"),C.body.appendChild(b),c&&b.appendChild(c))},getContainer:function(){var a,b=this.options,c=b.chart,d,e,f;this.renderTo= | |
212 | + a=c.renderTo;f="highcharts-"+xb++;if(Ba(a))this.renderTo=a=C.getElementById(a);a||la(13,!0);d=G(K(a,"data-highcharts-chart"));!isNaN(d)&&X[d]&&X[d].hasRendered&&X[d].destroy();K(a,"data-highcharts-chart",this.index);a.innerHTML="";!c.skipClone&&!a.offsetWidth&&this.cloneRenderTo();this.getChartSize();d=this.chartWidth;e=this.chartHeight;this.container=a=$(Ja,{className:"highcharts-container"+(c.className?" "+c.className:""),id:f},t({position:"relative",overflow:"hidden",width:d+"px",height:e+"px", | |
213 | + textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},c.style),this.renderToClone||a);this._cursor=a.style.cursor;this.renderer=new (B[c.renderer]||$a)(a,d,e,c.style,c.forExport,b.exporting&&b.exporting.allowHTML);fa&&this.renderer.create(this,a,d,e);this.renderer.chartIndex=this.index},getMargins:function(a){var b=this.spacing,c=this.margin,d=this.titleOffset;this.resetMargins();if(d&&!q(c[0]))this.plotTop=s(this.plotTop,d+this.options.title.margin+b[0]);this.legend.adjustMargins(c, | |
214 | + b);this.extraBottomMargin&&(this.marginBottom+=this.extraBottomMargin);this.extraTopMargin&&(this.plotTop+=this.extraTopMargin);a||this.getAxisMargins()},getAxisMargins:function(){var a=this,b=a.axisOffset=[0,0,0,0],c=a.margin;a.hasCartesianSeries&&o(a.axes,function(a){a.visible&&a.getOffset()});o(ib,function(d,e){q(c[e])||(a[d]+=b[e])});a.setChartSize()},reflow:function(a){var b=this,c=b.options.chart,d=b.renderTo,e=c.width||jb(d,"width"),f=c.height||jb(d,"height"),c=a?a.target:L,d=function(){if(b.container)b.setSize(e, | |
215 | + f,!1),b.hasUserSize=null};if(!b.hasUserSize&&!b.isPrinting&&e&&f&&(c===L||c===C)){if(e!==b.containerWidth||f!==b.containerHeight)clearTimeout(b.reflowTimeout),a?b.reflowTimeout=setTimeout(d,100):d();b.containerWidth=e;b.containerHeight=f}},initReflow:function(){var a=this,b=function(b){a.reflow(b)};I(L,"resize",b);I(a,"destroy",function(){Y(L,"resize",b)})},setSize:function(a,b,c){var d=this,e,f,g,h=d.renderer;d.isResizing+=1;g=function(){d&&J(d,"endResize",null,function(){d.isResizing-=1})};Ra(c, | |
216 | + d);d.oldChartHeight=d.chartHeight;d.oldChartWidth=d.chartWidth;if(q(a))d.chartWidth=e=s(0,w(a)),d.hasUserSize=!!e;if(q(b))d.chartHeight=f=s(0,w(b));a=h.globalAnimation;(a?lb:M)(d.container,{width:e+"px",height:f+"px"},a);d.setChartSize(!0);h.setSize(e,f,c);d.maxTicks=null;o(d.axes,function(a){a.isDirty=!0;a.setScale()});o(d.series,function(a){a.isDirty=!0});d.isDirtyLegend=!0;d.isDirtyBox=!0;d.layOutTitles();d.getMargins();d.redraw(c);d.oldChartHeight=null;J(d,"resize");a=h.globalAnimation;a===!1? | |
217 | + g():setTimeout(g,a&&a.duration||500)},setChartSize:function(a){var b=this.inverted,c=this.renderer,d=this.chartWidth,e=this.chartHeight,f=this.options.chart,g=this.spacing,h=this.clipOffset,i,j,k,m;this.plotLeft=i=w(this.plotLeft);this.plotTop=j=w(this.plotTop);this.plotWidth=k=s(0,w(d-i-this.marginRight));this.plotHeight=m=s(0,w(e-j-this.marginBottom));this.plotSizeX=b?m:k;this.plotSizeY=b?k:m;this.plotBorderWidth=f.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:g[3],y:g[0],width:d-g[3]-g[1], | |
218 | + height:e-g[0]-g[2]};this.plotBox=c.plotBox={x:i,y:j,width:k,height:m};d=2*T(this.plotBorderWidth/2);b=ta(s(d,h[3])/2);c=ta(s(d,h[0])/2);this.clipBox={x:b,y:c,width:T(this.plotSizeX-s(d,h[1])/2-b),height:s(0,T(this.plotSizeY-s(d,h[2])/2-c))};a||o(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=this;o(ib,function(b,c){a[b]=p(a.margin[c],a.spacing[c])});a.axisOffset=[0,0,0,0];a.clipOffset=[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,b=this.renderer, | |
219 | + c=this.chartWidth,d=this.chartHeight,e=this.chartBackground,f=this.plotBackground,g=this.plotBorder,h=this.plotBGImage,i=a.borderWidth||0,j=a.backgroundColor,k=a.plotBackgroundColor,m=a.plotBackgroundImage,n=a.plotBorderWidth||0,l,p=this.plotLeft,o=this.plotTop,q=this.plotWidth,s=this.plotHeight,v=this.plotBox,t=this.clipRect,x=this.clipBox;l=i+(a.shadow?8:0);if(i||j)if(e)e.animate(e.crisp({width:c-l,height:d-l}));else{e={fill:j||P};if(i)e.stroke=a.borderColor,e["stroke-width"]=i;this.chartBackground= | |
220 | + b.rect(l/2,l/2,c-l,d-l,a.borderRadius,i).attr(e).addClass("highcharts-background").add().shadow(a.shadow)}if(k)f?f.animate(v):this.plotBackground=b.rect(p,o,q,s,0).attr({fill:k}).add().shadow(a.plotShadow);if(m)h?h.animate(v):this.plotBGImage=b.image(m,p,o,q,s).add();t?t.animate({width:x.width,height:x.height}):this.clipRect=b.clipRect(x);if(n)g?g.animate(g.crisp({x:p,y:o,width:q,height:s,strokeWidth:-n})):this.plotBorder=b.rect(p,o,q,s,0,-n).attr({stroke:a.plotBorderColor,"stroke-width":n,fill:P, | |
221 | + zIndex:1}).add();this.isDirtyBox=!1},propFromSeries:function(){var a=this,b=a.options.chart,c,d=a.options.series,e,f;o(["inverted","angular","polar"],function(g){c=N[b.type||b.defaultSeriesType];f=a[g]||b[g]||c&&c.prototype[g];for(e=d&&d.length;!f&&e--;)(c=N[d[e].type])&&c.prototype[g]&&(f=!0);a[g]=f})},linkSeries:function(){var a=this,b=a.series;o(b,function(a){a.linkedSeries.length=0});o(b,function(b){var d=b.options.linkedTo;if(Ba(d)&&(d=d===":previous"?a.series[b.index-1]:a.get(d)))d.linkedSeries.push(b), | |
222 | + b.linkedParent=d,b.visible=p(b.options.visible,d.options.visible,b.visible)})},renderSeries:function(){o(this.series,function(a){a.translate();a.render()})},renderLabels:function(){var a=this,b=a.options.labels;b.items&&o(b.items,function(c){var d=t(b.style,c.style),e=G(d.left)+a.plotLeft,f=G(d.top)+a.plotTop+12;delete d.left;delete d.top;a.renderer.text(c.html,e,f).attr({zIndex:2}).css(d).add()})},render:function(){var a=this.axes,b=this.renderer,c=this.options,d,e,f,g;this.setTitle();this.legend= | |
223 | + new mb(this,c.legend);this.getStacks&&this.getStacks();this.getMargins(!0);this.setChartSize();d=this.plotWidth;e=this.plotHeight-=13;o(a,function(a){a.setScale()});this.getAxisMargins();f=d/this.plotWidth>1.1;g=e/this.plotHeight>1.1;if(f||g)this.maxTicks=null,o(a,function(a){(a.horiz&&f||!a.horiz&&g)&&a.setTickInterval(!0)}),this.getMargins();this.drawChartBox();this.hasCartesianSeries&&o(a,function(a){a.visible&&a.render()});if(!this.seriesGroup)this.seriesGroup=b.g("series-group").attr({zIndex:3}).add(); | |
224 | + this.renderSeries();this.renderLabels();this.showCredits(c.credits);this.hasRendered=!0},showCredits:function(a){if(a.enabled&&!this.credits)this.credits=this.renderer.text(a.text,0,0).on("click",function(){if(a.href)location.href=a.href}).attr({align:a.position.align,zIndex:8}).css(a.style).add().align(a.position)},destroy:function(){var a=this,b=a.axes,c=a.series,d=a.container,e,f=d&&d.parentNode;J(a,"destroy");X[a.index]=x;bb--;a.renderTo.removeAttribute("data-highcharts-chart");Y(a);for(e=b.length;e--;)b[e]= | |
225 | + b[e].destroy();for(e=c.length;e--;)c[e]=c[e].destroy();o("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(","),function(b){var c=a[b];c&&c.destroy&&(a[b]=c.destroy())});if(d)d.innerHTML="",Y(d),f&&Qa(d);for(e in a)delete a[e]},isReadyToRender:function(){var a=this;return!ca&&L==L.top&&C.readyState!=="complete"||fa&&!L.canvg?(fa?Lb.push(function(){a.firstRender()},a.options.global.canvasToolsURL): | |
226 | + C.attachEvent("onreadystatechange",function(){C.detachEvent("onreadystatechange",a.firstRender);C.readyState==="complete"&&a.firstRender()}),!1):!0},firstRender:function(){var a=this,b=a.options,c=a.callback;if(a.isReadyToRender()){a.getContainer();J(a,"init");a.resetMargins();a.setChartSize();a.propFromSeries();a.getAxes();o(b.series||[],function(b){a.initSeries(b)});a.linkSeries();J(a,"beforeRender");if(B.Pointer)a.pointer=new Va(a,b);a.render();a.renderer.draw();c&&c.apply(a,[a]);o(a.callbacks, | |
227 | + function(b){a.index!==x&&b.apply(a,[a])});J(a,"load");a.cloneRenderTo(!0)}},splashArray:function(a,b){var c=b[a],c=da(c)?c:[c,c,c,c];return[p(b[a+"Top"],c[0]),p(b[a+"Right"],c[1]),p(b[a+"Bottom"],c[2]),p(b[a+"Left"],c[3])]}};var Xb=B.CenteredSeriesMixin={getCenter:function(){var a=this.options,b=this.chart,c=2*(a.slicedOffset||0),d=b.plotWidth-2*c,b=b.plotHeight-2*c,e=a.center,e=[p(e[0],"50%"),p(e[1],"50%"),a.size||"100%",a.innerSize||0],f=z(d,b),g,h;for(g=0;g<4;++g)h=e[g],a=g<2||g===2&&/%$/.test(h), | |
228 | + e[g]=(/%$/.test(h)?[d,b,f,e[2]][g]*parseFloat(h)/100:parseFloat(h))+(a?c:0);e[3]>e[2]&&(e[3]=e[2]);return e}},Fa=function(){};Fa.prototype={init:function(a,b,c){this.series=a;this.color=a.color;this.applyOptions(b,c);this.pointAttr={};if(a.options.colorByPoint&&(b=a.options.colors||a.chart.options.colors,this.color=this.color||b[a.colorCounter++],a.colorCounter===b.length))a.colorCounter=0;a.chart.pointCount++;return this},applyOptions:function(a,b){var c=this.series,d=c.options.pointValKey||c.pointValKey, | |
229 | + a=Fa.prototype.optionsToObject.call(this,a);t(this,a);this.options=this.options?t(this.options,a):a;if(d)this.y=this[d];if(this.x===x&&c)this.x=b===x?c.autoIncrement():b;return this},optionsToObject:function(a){var b={},c=this.series,d=c.options.keys,e=d||c.pointArrayMap||["y"],f=e.length,g=0,h=0;if(typeof a==="number"||a===null)b[e[0]]=a;else if(Ga(a)){if(!d&&a.length>f){c=typeof a[0];if(c==="string")b.name=a[0];else if(c==="number")b.x=a[0];g++}for(;h<f;){if(!d||a[g]!==void 0)b[e[h]]=a[g];g++;h++}}else if(typeof a=== | |
230 | + "object"){b=a;if(a.dataLabels)c._hasPointLabels=!0;if(a.marker)c._hasPointMarkers=!0}return b},destroy:function(){var a=this.series.chart,b=a.hoverPoints,c;a.pointCount--;if(b&&(this.setState(),ja(b,this),!b.length))a.hoverPoints=null;if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)Y(this),this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(c in this)this[c]=null},destroyElements:function(){for(var a=["graphic","dataLabel","dataLabelUpper","connector","shadowGroup"], | |
231 | + b,c=6;c--;)b=a[c],this[b]&&(this[b]=this[b].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,color:this.color,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},tooltipFormatter:function(a){var b=this.series,c=b.tooltipOptions,d=p(c.valueDecimals,""),e=c.valuePrefix||"",f=c.valueSuffix||"";o(b.pointArrayMap||["y"],function(b){b="{point."+b;if(e||f)a=a.replace(b+"}",e+b+"}"+f);a=a.replace(b+"}",b+":,."+d+"f}")}); | |
232 | + return Ia(a,{point:this,series:this.series})},firePointEvent:function(a,b,c){var d=this,e=this.series.options;(e.point.events[a]||d.options&&d.options.events&&d.options.events[a])&&this.importEvents();a==="click"&&e.allowPointSelect&&(c=function(a){d.select&&d.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});J(this,a,b,c)},visible:!0};var R=B.Series=function(){};R.prototype={isCartesian:!0,type:"line",pointClass:Fa,sorted:!0,requireSorting:!0,pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth", | |
233 | + fill:"fillColor",r:"radius"},directTouch:!1,axisTypes:["xAxis","yAxis"],colorCounter:0,parallelArrays:["x","y"],init:function(a,b){var c=this,d,e,f=a.series,g=function(a,b){return p(a.options.index,a._i)-p(b.options.index,b._i)};c.chart=a;c.options=b=c.setOptions(b);c.linkedSeries=[];c.bindAxes();t(c,{name:b.name,state:"",pointAttr:{},visible:b.visible!==!1,selected:b.selected===!0});if(fa)b.animation=!1;e=b.events;for(d in e)I(c,d,e[d]);if(e&&e.click||b.point&&b.point.events&&b.point.events.click|| | |
234 | + b.allowPointSelect)a.runTrackerClick=!0;c.getColor();c.getSymbol();o(c.parallelArrays,function(a){c[a+"Data"]=[]});c.setData(b.data,!1);if(c.isCartesian)a.hasCartesianSeries=!0;f.push(c);c._i=f.length-1;qb(f,g);this.yAxis&&qb(this.yAxis.series,g);o(f,function(a,b){a.index=b;a.name=a.name||"Series "+(b+1)})},bindAxes:function(){var a=this,b=a.options,c=a.chart,d;o(a.axisTypes||[],function(e){o(c[e],function(c){d=c.options;if(b[e]===d.index||b[e]!==x&&b[e]===d.id||b[e]===x&&d.index===0)c.series.push(a), | |
235 | + a[e]=c,c.isDirty=!0});!a[e]&&a.optionalAxis!==e&&la(18,!0)})},updateParallelArrays:function(a,b){var c=a.series,d=arguments;o(c.parallelArrays,typeof b==="number"?function(d){var f=d==="y"&&c.toYData?c.toYData(a):a[d];c[d+"Data"][b]=f}:function(a){Array.prototype[b].apply(c[a+"Data"],Array.prototype.slice.call(d,2))})},autoIncrement:function(){var a=this.options,b=this.xIncrement,c,d=a.pointIntervalUnit,b=p(b,a.pointStart,0);this.pointInterval=c=p(this.pointInterval,a.pointInterval,1);if(d==="month"|| | |
236 | + d==="year")a=new ya(b),a=d==="month"?+a[vb](a[Ya]()+c):+a[wb](a[Za]()+c),c=a-b;this.xIncrement=b+c;return b},getSegments:function(){var a=-1,b=[],c,d=this.points,e=d.length;if(e)if(this.options.connectNulls){for(c=e;c--;)d[c].y===null&&d.splice(c,1);d.length&&(b=[d])}else o(d,function(c,g){c.y===null?(g>a+1&&b.push(d.slice(a+1,g)),a=g):g===e-1&&b.push(d.slice(a+1,g+1))});this.segments=b},setOptions:function(a){var b=this.chart,c=b.options.plotOptions,b=b.userOptions||{},d=b.plotOptions||{},e=c[this.type]; | |
237 | + this.userOptions=a;c=D(e,c.series,a);this.tooltipOptions=D(S.tooltip,S.plotOptions[this.type].tooltip,b.tooltip,d.series&&d.series.tooltip,d[this.type]&&d[this.type].tooltip,a.tooltip);e.marker===null&&delete c.marker;this.zoneAxis=c.zoneAxis;a=this.zones=(c.zones||[]).slice();if((c.negativeColor||c.negativeFillColor)&&!c.zones)a.push({value:c[this.zoneAxis+"Threshold"]||c.threshold||0,color:c.negativeColor,fillColor:c.negativeFillColor});a.length&&q(a[a.length-1].value)&&a.push({color:this.color, | |
238 | + fillColor:this.fillColor});return c},getCyclic:function(a,b,c){var d=this.userOptions,e="_"+a+"Index",f=a+"Counter";b||(q(d[e])?b=d[e]:(d[e]=b=this.chart[f]%c.length,this.chart[f]+=1),b=c[b]);this[a]=b},getColor:function(){this.options.colorByPoint?this.options.color=null:this.getCyclic("color",this.options.color||ba[this.type].color,this.chart.options.colors)},getSymbol:function(){var a=this.options.marker;this.getCyclic("symbol",a.symbol,this.chart.options.symbols);if(/^url/.test(this.symbol))a.radius= | |
239 | + 0},drawLegendSymbol:Ma.drawLineMarker,setData:function(a,b,c,d){var e=this,f=e.points,g=f&&f.length||0,h,i=e.options,j=e.chart,k=null,m=e.xAxis,n=m&&!!m.categories,l=i.turboThreshold,u=this.xData,r=this.yData,s=(h=e.pointArrayMap)&&h.length,a=a||[];h=a.length;b=p(b,!0);if(d!==!1&&h&&g===h&&!e.cropped&&!e.hasGroupedData&&e.visible)o(a,function(a,b){f[b].update&&f[b].update(a,!1,null,!1)});else{e.xIncrement=null;e.pointRange=n?1:i.pointRange;e.colorCounter=0;o(this.parallelArrays,function(a){e[a+"Data"].length= | |
240 | + 0});if(l&&h>l){for(c=0;k===null&&c<h;)k=a[c],c++;if(qa(k)){n=p(i.pointStart,0);k=p(i.pointInterval,1);for(c=0;c<h;c++)u[c]=n,r[c]=a[c],n+=k;e.xIncrement=n}else if(Ga(k))if(s)for(c=0;c<h;c++)k=a[c],u[c]=k[0],r[c]=k.slice(1,s+1);else for(c=0;c<h;c++)k=a[c],u[c]=k[0],r[c]=k[1];else la(12)}else for(c=0;c<h;c++)if(a[c]!==x&&(k={series:e},e.pointClass.prototype.applyOptions.apply(k,[a[c]]),e.updateParallelArrays(k,c),n&&q(k.name)))m.names[k.x]=k.name;Ba(r[0])&&la(14,!0);e.data=[];e.options.data=a;for(c= | |
241 | + g;c--;)f[c]&&f[c].destroy&&f[c].destroy();if(m)m.minRange=m.userMinRange;e.isDirty=e.isDirtyData=j.isDirtyBox=!0;c=!1}i.legendType==="point"&&(this.processData(),this.generatePoints());b&&j.redraw(c)},processData:function(a){var b=this.xData,c=this.yData,d=b.length,e;e=0;var f,g,h=this.xAxis,i,j=this.options;i=j.cropThreshold;var k=this.getExtremesFromAll||j.getExtremesFromAll,m=this.isCartesian,n,l;if(m&&!this.isDirty&&!h.isDirty&&!this.yAxis.isDirty&&!a)return!1;if(h)a=h.getExtremes(),n=a.min,l= | |
242 | + a.max;if(m&&this.sorted&&!k&&(!i||d>i||this.forceCrop))if(b[d-1]<n||b[0]>l)b=[],c=[];else if(b[0]<n||b[d-1]>l)e=this.cropData(this.xData,this.yData,n,l),b=e.xData,c=e.yData,e=e.start,f=!0;for(i=b.length-1;i>=0;i--)d=b[i]-b[i-1],d>0&&(g===x||d<g)?g=d:d<0&&this.requireSorting&&la(15);this.cropped=f;this.cropStart=e;this.processedXData=b;this.processedYData=c;if(j.pointRange===null)this.pointRange=g||1;this.closestPointRange=g},cropData:function(a,b,c,d){var e=a.length,f=0,g=e,h=p(this.cropShoulder, | |
243 | + 1),i;for(i=0;i<e;i++)if(a[i]>=c){f=s(0,i-h);break}for(;i<e;i++)if(a[i]>d){g=i+h;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,h=this.cropStart||0,i,j=this.hasGroupedData,k,m=[],n;if(!b&&!j)b=[],b.length=a.length,b=this.data=b;for(n=0;n<g;n++)i=h+n,j?m[n]=(new f).init(this,[d[n]].concat(ra(e[n]))):(b[i]?k=b[i]:a[i]!==x&&(b[i]=k=(new f).init(this, | |
244 | + a[i],d[n])),m[n]=k),m[n].index=i;if(b&&(g!==(c=b.length)||j))for(n=0;n<c;n++)if(n===h&&!j&&(n+=g),b[n])b[n].destroyElements(),b[n].plotX=x;this.data=b;this.points=m},getExtremes:function(a){var b=this.yAxis,c=this.processedXData,d,e=[],f=0;d=this.xAxis.getExtremes();var g=d.min,h=d.max,i,j,k,m,a=a||this.stackedYData||this.processedYData;d=a.length;for(m=0;m<d;m++)if(j=c[m],k=a[m],i=k!==null&&k!==x&&(!b.isLog||k.length||k>0),j=this.getExtremesFromAll||this.options.getExtremesFromAll||this.cropped|| | |
245 | + (c[m+1]||j)>=g&&(c[m-1]||j)<=h,i&&j)if(i=k.length)for(;i--;)k[i]!==null&&(e[f++]=k[i]);else e[f++]=k;this.dataMin=Oa(e);this.dataMax=Da(e)},translate:function(){this.processedXData||this.processData();this.generatePoints();for(var a=this.options,b=a.stacking,c=this.xAxis,d=c.categories,e=this.yAxis,f=this.points,g=f.length,h=!!this.modifyValue,i=a.pointPlacement,j=i==="between"||qa(i),k=a.threshold,m=a.startFromThreshold?k:0,n,l,u,o,t=Number.MAX_VALUE,a=0;a<g;a++){var A=f[a],v=A.x,y=A.y;l=A.low;var w= | |
246 | + b&&e.stacks[(this.negStacks&&y<(m?0:k)?"-":"")+this.stackKey];if(e.isLog&&y!==null&&y<=0)A.y=y=null,la(10);A.plotX=n=z(s(-1E5,c.translate(v,0,0,0,1,i,this.type==="flags")),1E5);if(b&&this.visible&&w&&w[v])o=this.getStackIndicator(o,v,this.index),w=w[v],y=w.points[o.key],l=y[0],y=y[1],l===m&&(l=p(k,e.min)),e.isLog&&l<=0&&(l=null),A.total=A.stackTotal=w.total,A.percentage=w.total&&A.y/w.total*100,A.stackY=y,w.setOffset(this.pointXOffset||0,this.barW||0);A.yBottom=q(l)?e.translate(l,0,1,0,1):null;h&& | |
247 | +(y=this.modifyValue(y,A));A.plotY=l=typeof y==="number"&&y!==Infinity?z(s(-1E5,e.translate(y,0,1,0,1)),1E5):x;A.isInside=l!==x&&l>=0&&l<=e.len&&n>=0&&n<=c.len;A.clientX=j?c.translate(v,0,0,0,1):n;A.negative=A.y<(k||0);A.category=d&&d[A.x]!==x?d[A.x]:A.x;a&&(t=z(t,O(n-u)));u=n}this.closestPointRangePx=t;this.getSegments()},setClip:function(a){var b=this.chart,c=this.options,d=b.renderer,e=b.inverted,f=this.clipBox,g=f||b.clipBox,h=this.sharedClipKey||["_sharedClip",a&&a.duration,a&&a.easing,g.height, | |
248 | + c.xAxis,c.yAxis].join(","),i=b[h],j=b[h+"m"];if(!i){if(a)g.width=0,b[h+"m"]=j=d.clipRect(-99,e?-b.plotLeft:-b.plotTop,99,e?b.chartWidth:b.chartHeight);b[h]=i=d.clipRect(g)}a&&(i.count+=1);if(c.clip!==!1)this.group.clip(a||f?i:b.clipRect),this.markerGroup.clip(j),this.sharedClipKey=h;a||(i.count-=1,i.count<=0&&h&&b[h]&&(f||(b[h]=b[h].destroy()),b[h+"m"]&&(b[h+"m"]=b[h+"m"].destroy())))},animate:function(a){var b=this.chart,c=this.options.animation,d;if(c&&!da(c))c=ba[this.type].animation;a?this.setClip(c): | |
249 | + (d=this.sharedClipKey,(a=b[d])&&a.animate({width:b.plotSizeX},c),b[d+"m"]&&b[d+"m"].animate({width:b.plotSizeX+99},c),this.animate=null)},afterAnimate:function(){this.setClip();J(this,"afterAnimate")},drawPoints:function(){var a,b=this.points,c=this.chart,d,e,f,g,h,i,j,k,m=this.options.marker,n=this.pointAttr[""],l,o,r,s=this.markerGroup,q=p(m.enabled,this.xAxis.isRadial,this.closestPointRangePx>2*m.radius);if(m.enabled!==!1||this._hasPointMarkers)for(f=b.length;f--;)if(g=b[f],d=T(g.plotX),e=g.plotY, | |
250 | + k=g.graphic,l=g.marker||{},o=!!g.marker,a=q&&l.enabled===x||l.enabled,r=g.isInside,a&&e!==x&&!isNaN(e)&&g.y!==null)if(a=g.pointAttr[g.selected?"select":""]||n,h=a.r,i=p(l.symbol,this.symbol),j=i.indexOf("url")===0,k)k[r?"show":"hide"](!0).animate(t({x:d-h,y:e-h},k.symbolName?{width:2*h,height:2*h}:{}));else{if(r&&(h>0||j))g.graphic=c.renderer.symbol(i,d-h,e-h,2*h,2*h,o?l:m).attr(a).add(s)}else if(k)g.graphic=k.destroy()},convertAttribs:function(a,b,c,d){var e=this.pointAttrToOptions,f,g,h={},a=a|| | |
251 | + {},b=b||{},c=c||{},d=d||{};for(f in e)g=e[f],h[f]=p(a[g],b[f],c[f],d[f]);return h},getAttribs:function(){var a=this,b=a.options,c=ba[a.type].marker?b.marker:b,d=c.states,e=d.hover,f,g=a.color,h=a.options.negativeColor;f={stroke:g,fill:g};var i=a.points||[],j,k,m=[],n=a.pointAttrToOptions;j=a.hasPointSpecificOptions;var l=c.lineColor,u=c.fillColor;k=b.turboThreshold;var r=a.zones,s=a.zoneAxis||"y",A;b.marker?(e.radius=e.radius||c.radius+e.radiusPlus,e.lineWidth=e.lineWidth||c.lineWidth+e.lineWidthPlus): | |
252 | + (e.color=e.color||na(e.color||g).brighten(e.brightness).get(),e.negativeColor=e.negativeColor||na(e.negativeColor||h).brighten(e.brightness).get());m[""]=a.convertAttribs(c,f);o(["hover","select"],function(b){m[b]=a.convertAttribs(d[b],m[""])});a.pointAttr=m;g=i.length;if(!k||g<k||j)for(;g--;){k=i[g];if((c=k.options&&k.options.marker||k.options)&&c.enabled===!1)c.radius=0;if(r.length){j=0;for(f=r[j];k[s]>=f.value;)f=r[++j];k.color=k.fillColor=p(f.color,a.color)}j=b.colorByPoint||k.color;if(k.options)for(A in n)q(c[n[A]])&& | |
253 | +(j=!0);if(j){c=c||{};j=[];d=c.states||{};f=d.hover=d.hover||{};if(!b.marker||k.negative&&!f.fillColor&&!e.fillColor)f[a.pointAttrToOptions.fill]=f.color||!k.options.color&&e[k.negative&&h?"negativeColor":"color"]||na(k.color).brighten(f.brightness||e.brightness).get();f={color:k.color};if(!u)f.fillColor=k.color;if(!l)f.lineColor=k.color;c.hasOwnProperty("color")&&!c.color&&delete c.color;j[""]=a.convertAttribs(t(f,c),m[""]);j.hover=a.convertAttribs(d.hover,m.hover,j[""]);j.select=a.convertAttribs(d.select, | |
254 | + m.select,j[""])}else j=m;k.pointAttr=j}},destroy:function(){var a=this,b=a.chart,c=/AppleWebKit\/533/.test(za),d,e=a.data||[],f,g,h;J(a,"destroy");Y(a);o(a.axisTypes||[],function(b){if(h=a[b])ja(h.series,a),h.isDirty=h.forceRedraw=!0});a.legendItem&&a.chart.legend.destroyItem(a);for(d=e.length;d--;)(f=e[d])&&f.destroy&&f.destroy();a.points=null;clearTimeout(a.animationTimeout);for(g in a)a[g]instanceof Q&&!a[g].survive&&(d=c&&g==="group"?"hide":"destroy",a[g][d]());if(b.hoverSeries===a)b.hoverSeries= | |
255 | + null;ja(b.series,a);for(g in a)delete a[g]},getSegmentPath:function(a){var b=this,c=[],d=b.options.step;o(a,function(e,f){var g=e.plotX,h=e.plotY,i;b.getPointSpline?c.push.apply(c,b.getPointSpline(a,e,f)):(c.push(f?"L":"M"),d&&f&&(i=a[f-1],d==="right"?c.push(i.plotX,h,"L"):d==="center"?c.push((i.plotX+g)/2,i.plotY,"L",(i.plotX+g)/2,h,"L"):c.push(g,i.plotY,"L")),c.push(e.plotX,e.plotY))});return c},getGraphPath:function(){var a=this,b=[],c,d=[];o(a.segments,function(e){c=a.getSegmentPath(e);e.length> | |
256 | +1?b=b.concat(c):d.push(e[0])});a.singlePoints=d;return a.graphPath=b},drawGraph:function(){var a=this,b=this.options,c=[["graph",b.lineColor||this.color,b.dashStyle]],d=b.lineWidth,e=b.linecap!=="square",f=this.getGraphPath(),g=this.fillGraph&&this.color||P;o(this.zones,function(d,e){c.push(["zoneGraph"+e,d.color||a.color,d.dashStyle||b.dashStyle])});o(c,function(c,i){var j=c[0],k=a[j];if(k)k.animate({d:f});else if((d||g)&&f.length)k={stroke:c[1],"stroke-width":d,fill:g,zIndex:1},c[2]?k.dashstyle= | |
257 | + c[2]:e&&(k["stroke-linecap"]=k["stroke-linejoin"]="round"),a[j]=a.chart.renderer.path(f).attr(k).add(a.group).shadow(i<2&&b.shadow)})},applyZones:function(){var a=this,b=this.chart,c=b.renderer,d=this.zones,e,f,g=this.clips||[],h,i=this.graph,j=this.area,k=s(b.chartWidth,b.chartHeight),m=this[(this.zoneAxis||"y")+"Axis"],n,l=m.reversed,u=b.inverted,r=m.horiz,q,t,v,y=!1;if(d.length&&(i||j)&&m.min!==x)i&&i.hide(),j&&j.hide(),n=m.getExtremes(),o(d,function(d,o){e=l?r?b.plotWidth:0:r?0:m.toPixels(n.min); | |
258 | + e=z(s(p(f,e),0),k);f=z(s(w(m.toPixels(p(d.value,n.max),!0)),0),k);y&&(e=f=m.toPixels(n.max));q=Math.abs(e-f);t=z(e,f);v=s(e,f);if(m.isXAxis){if(h={x:u?v:t,y:0,width:q,height:k},!r)h.x=b.plotHeight-h.x}else if(h={x:0,y:u?v:t,width:k,height:q},r)h.y=b.plotWidth-h.y;b.inverted&&c.isVML&&(h=m.isXAxis?{x:0,y:l?t:v,height:h.width,width:b.chartWidth}:{x:h.y-b.plotLeft-b.spacingBox.x,y:0,width:h.height,height:b.chartHeight});g[o]?g[o].animate(h):(g[o]=c.clipRect(h),i&&a["zoneGraph"+o].clip(g[o]),j&&a["zoneArea"+ | |
259 | + o].clip(g[o]));y=d.value>n.max}),this.clips=g},invertGroups:function(){function a(){var a={width:b.yAxis.len,height:b.xAxis.len};o(["group","markerGroup"],function(c){b[c]&&b[c].attr(a).invert()})}var b=this,c=b.chart;if(b.xAxis)I(c,"resize",a),I(b,"destroy",function(){Y(c,"resize",a)}),a(),b.invertGroups=a},plotGroup:function(a,b,c,d,e){var f=this[a],g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({visibility:c,zIndex:d||0.1}).add(e),f.addClass("highcharts-series-"+this.index));f[g?"attr":"animate"](this.getPlotBox()); | |
260 | + return f},getPlotBox:function(){var a=this.chart,b=this.xAxis,c=this.yAxis;if(a.inverted)b=c,c=this.xAxis;return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,b=a.chart,c,d=a.options,e=(c=d.animation)&&!!a.animate&&b.renderer.isSVG&&p(c.duration,500)||0,f=a.visible?"visible":"hidden",g=d.zIndex,h=a.hasRendered,i=b.seriesGroup;c=a.plotGroup("group","series",f,g,i);a.markerGroup=a.plotGroup("markerGroup","markers",f,g,i);e&&a.animate(!0); | |
261 | + a.getAttribs();c.inverted=a.isCartesian?b.inverted:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());o(a.points,function(a){a.redraw&&a.redraw()});a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&a.options.enableMouseTracking!==!1&&a.drawTracker();b.inverted&&a.invertGroups();d.clip!==!1&&!a.sharedClipKey&&!h&&c.clip(b.clipRect);e&&a.animate();if(!h)e?a.animationTimeout=setTimeout(function(){a.afterAnimate()},e):a.afterAnimate();a.isDirty=a.isDirtyData=!1;a.hasRendered=!0}, | |
262 | + redraw:function(){var a=this.chart,b=this.isDirtyData,c=this.isDirty,d=this.group,e=this.xAxis,f=this.yAxis;d&&(a.inverted&&d.attr({width:a.plotWidth,height:a.plotHeight}),d.animate({translateX:p(e&&e.left,a.plotLeft),translateY:p(f&&f.top,a.plotTop)}));this.translate();this.render();b&&J(this,"updatedData");(c||b)&&delete this.kdTree},kdDimensions:1,kdAxisArray:["clientX","plotY"],searchPoint:function(a,b){var c=this.xAxis,d=this.yAxis,e=this.chart.inverted;return this.searchKDTree({clientX:e?c.len- | |
263 | + a.chartY+c.pos:a.chartX-c.pos,plotY:e?d.len-a.chartX+d.pos:a.chartY-d.pos},b)},buildKDTree:function(){function a(b,d,g){var h,i;if(i=b&&b.length)return h=c.kdAxisArray[d%g],b.sort(function(a,b){return a[h]-b[h]}),i=Math.floor(i/2),{point:b[i],left:a(b.slice(0,i),d+1,g),right:a(b.slice(i+1),d+1,g)}}function b(){var b=kb(c.points||[],function(a){return a.y!==null});c.kdTree=a(b,d,d)}var c=this,d=c.kdDimensions;delete c.kdTree;c.options.kdSync?b():setTimeout(b)},searchKDTree:function(a,b){function c(a, | |
264 | + b,j,k){var m=b.point,n=d.kdAxisArray[j%k],l,p,o=m;p=q(a[e])&&q(m[e])?Math.pow(a[e]-m[e],2):null;l=q(a[f])&&q(m[f])?Math.pow(a[f]-m[f],2):null;l=(p||0)+(l||0);m.dist=q(l)?Math.sqrt(l):Number.MAX_VALUE;m.distX=q(p)?Math.sqrt(p):Number.MAX_VALUE;n=a[n]-m[n];l=n<0?"left":"right";p=n<0?"right":"left";b[l]&&(l=c(a,b[l],j+1,k),o=l[g]<o[g]?l:m);b[p]&&Math.sqrt(n*n)<o[g]&&(a=c(a,b[p],j+1,k),o=a[g]<o[g]?a:o);return o}var d=this,e=this.kdAxisArray[0],f=this.kdAxisArray[1],g=b?"distX":"dist";this.kdTree||this.buildKDTree(); | |
265 | + if(this.kdTree)return c(a,this.kdTree,this.kdDimensions,this.kdDimensions)}};Hb.prototype={destroy:function(){Pa(this,this.axis)},render:function(a){var b=this.options,c=b.format,c=c?Ia(c,this):b.formatter.call(this);this.label?this.label.attr({text:c,visibility:"hidden"}):this.label=this.axis.chart.renderer.text(c,null,null,b.useHTML).css(b.style).attr({align:this.textAlign,rotation:b.rotation,visibility:"hidden"}).add(a)},setOffset:function(a,b){var c=this.axis,d=c.chart,e=d.inverted,f=c.reversed, | |
266 | + f=this.isNegative&&!f||!this.isNegative&&f,g=c.translate(c.usePercentage?100:this.total,0,0,0,1),c=c.translate(0),c=O(g-c),h=d.xAxis[0].translate(this.x)+a,i=d.plotHeight,f={x:e?f?g:g-c:h,y:e?i-h-b:f?i-g-c:i-g,width:e?c:b,height:e?b:c};if(e=this.label)e.align(this.alignOptions,null,f),f=e.alignAttr,e[this.options.crop===!1||d.isInsidePlot(f.x,f.y)?"show":"hide"](!0)}};E.prototype.getStacks=function(){var a=this;o(a.yAxis,function(a){if(a.stacks&&a.hasVisibleSeries)a.oldStacks=a.stacks});o(a.series, | |
267 | + function(b){if(b.options.stacking&&(b.visible===!0||a.options.chart.ignoreHiddenSeries===!1))b.stackKey=b.type+p(b.options.stack,"")})};ha.prototype.buildStacks=function(){var a=this.series,b=p(this.options.reversedStacks,!0),c=a.length;if(!this.isXAxis){for(this.usePercentage=!1;c--;)a[b?c:a.length-c-1].setStackedPoints();if(this.usePercentage)for(c=0;c<a.length;c++)a[c].setPercentStacks()}};ha.prototype.renderStackTotals=function(){var a=this.chart,b=a.renderer,c=this.stacks,d,e,f=this.stackTotalGroup; | |
268 | + if(!f)this.stackTotalGroup=f=b.g("stack-labels").attr({visibility:"visible",zIndex:6}).add();f.translate(a.plotLeft,a.plotTop);for(d in c)for(e in a=c[d],a)a[e].render(f)};ha.prototype.resetStacks=function(){var a=this.stacks,b,c;if(!this.isXAxis)for(b in a)for(c in a[b])a[b][c].touched<this.stacksTouched?(a[b][c].destroy(),delete a[b][c]):(a[b][c].total=null,a[b][c].cum=0)};ha.prototype.cleanStacks=function(){var a,b,c;if(!this.isXAxis){if(this.oldStacks)a=this.stacks=this.oldStacks;for(b in a)for(c in a[b])a[b][c].cum= | |
269 | + a[b][c].total}};R.prototype.setStackedPoints=function(){if(this.options.stacking&&!(this.visible!==!0&&this.chart.options.chart.ignoreHiddenSeries!==!1)){var a=this.processedXData,b=this.processedYData,c=[],d=b.length,e=this.options,f=e.threshold,g=e.startFromThreshold?f:0,h=e.stack,e=e.stacking,i=this.stackKey,j="-"+i,k=this.negStacks,m=this.yAxis,n=m.stacks,l=m.oldStacks,o,r,q,t,v,w,x;m.stacksTouched+=1;for(v=0;v<d;v++){w=a[v];x=b[v];o=this.getStackIndicator(o,w,this.index);t=o.key;q=(r=k&&x<(g? | |
270 | + 0:f))?j:i;n[q]||(n[q]={});if(!n[q][w])l[q]&&l[q][w]?(n[q][w]=l[q][w],n[q][w].total=null):n[q][w]=new Hb(m,m.options.stackLabels,r,w,h);q=n[q][w];q.points[t]=[p(q.cum,g)];q.touched=m.stacksTouched;e==="percent"?(r=r?i:j,k&&n[r]&&n[r][w]?(r=n[r][w],q.total=r.total=s(r.total,q.total)+O(x)||0):q.total=ea(q.total+(O(x)||0))):q.total=ea(q.total+(x||0));q.cum=p(q.cum,g)+(x||0);q.points[t].push(q.cum);c[v]=q.cum}if(e==="percent")m.usePercentage=!0;this.stackedYData=c;m.oldStacks={}}};R.prototype.setPercentStacks= | |
271 | + function(){var a=this,b=a.stackKey,c=a.yAxis.stacks,d=a.processedXData,e;o([b,"-"+b],function(b){var f;for(var g=d.length,h,i;g--;)if(h=d[g],e=a.getStackIndicator(e,h,a.index),f=(i=c[b]&&c[b][h])&&i.points[e.key],h=f)i=i.total?100/i.total:0,h[0]=ea(h[0]*i),h[1]=ea(h[1]*i),a.stackedYData[g]=h[1]})};R.prototype.getStackIndicator=function(a,b,c){!q(a)||a.x!==b?a={x:b,index:0}:a.index++;a.key=[c,b,a.index].join(",");return a};t(E.prototype,{addSeries:function(a,b,c){var d,e=this;a&&(b=p(b,!0),J(e,"addSeries", | |
272 | + {options:a},function(){d=e.initSeries(a);e.isDirtyLegend=!0;e.linkSeries();b&&e.redraw(c)}));return d},addAxis:function(a,b,c,d){var e=b?"xAxis":"yAxis",f=this.options;new ha(this,D(a,{index:this[e].length,isX:b}));f[e]=ra(f[e]||{});f[e].push(a);p(c,!0)&&this.redraw(d)},showLoading:function(a){var b=this,c=b.options,d=b.loadingDiv,e=c.loading,f=function(){d&&M(d,{left:b.plotLeft+"px",top:b.plotTop+"px",width:b.plotWidth+"px",height:b.plotHeight+"px"})};if(!d)b.loadingDiv=d=$(Ja,{className:"highcharts-loading"}, | |
273 | + t(e.style,{zIndex:10,display:P}),b.container),b.loadingSpan=$("span",null,e.labelStyle,d),I(b,"redraw",f);b.loadingSpan.innerHTML=a||c.lang.loading;if(!b.loadingShown)M(d,{opacity:0,display:""}),lb(d,{opacity:e.style.opacity},{duration:e.showDuration||0}),b.loadingShown=!0;f()},hideLoading:function(){var a=this.options,b=this.loadingDiv;b&&lb(b,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){M(b,{display:P})}});this.loadingShown=!1}});t(Fa.prototype,{update:function(a,b,c,d){function e(){f.applyOptions(a); | |
274 | + if(f.y===null&&h)f.graphic=h.destroy();if(da(a)&&!Ga(a))f.redraw=function(){if(h&&h.element&&a&&a.marker&&a.marker.symbol)f.graphic=h.destroy();if(a&&a.dataLabels&&f.dataLabel)f.dataLabel=f.dataLabel.destroy();f.redraw=null};i=f.index;g.updateParallelArrays(f,i);if(m&&f.name)m[f.x]=f.name;k.data[i]=f.options;g.isDirty=g.isDirtyData=!0;if(!g.fixedBox&&g.hasCartesianSeries)j.isDirtyBox=!0;if(k.legendType==="point")j.isDirtyLegend=!0;b&&j.redraw(c)}var f=this,g=f.series,h=f.graphic,i,j=g.chart,k=g.options, | |
275 | + m=g.xAxis&&g.xAxis.names,b=p(b,!0);d===!1?e():f.firePointEvent("update",{options:a},e)},remove:function(a,b){this.series.removePoint(La(this,this.series.data),a,b)}});t(R.prototype,{addPoint:function(a,b,c,d){var e=this,f=e.options,g=e.data,h=e.graph,i=e.area,j=e.chart,k=e.xAxis&&e.xAxis.names,m=h&&h.shift||0,n=["graph","area"],h=f.data,l,u=e.xData;Ra(d,j);if(c){for(d=e.zones.length;d--;)n.push("zoneGraph"+d,"zoneArea"+d);o(n,function(a){if(e[a])e[a].shift=m+(f.step?2:1)})}if(i)i.isArea=!0;b=p(b, | |
276 | + !0);i={series:e};e.pointClass.prototype.applyOptions.apply(i,[a]);n=i.x;d=u.length;if(e.requireSorting&&n<u[d-1])for(l=!0;d&&u[d-1]>n;)d--;e.updateParallelArrays(i,"splice",d,0,0);e.updateParallelArrays(i,d);if(k&&i.name)k[n]=i.name;h.splice(d,0,a);l&&(e.data.splice(d,0,null),e.processData());f.legendType==="point"&&e.generatePoints();c&&(g[0]&&g[0].remove?g[0].remove(!1):(g.shift(),e.updateParallelArrays(i,"shift"),h.shift()));e.isDirty=!0;e.isDirtyData=!0;b&&(e.getAttribs(),j.redraw())},removePoint:function(a, | |
277 | + b,c){var d=this,e=d.data,f=e[a],g=d.points,h=d.chart,i=function(){e.length===g.length&&g.splice(a,1);e.splice(a,1);d.options.data.splice(a,1);d.updateParallelArrays(f||{series:d},"splice",a,1);f&&f.destroy();d.isDirty=!0;d.isDirtyData=!0;b&&h.redraw()};Ra(c,h);b=p(b,!0);f?f.firePointEvent("remove",null,i):i()},remove:function(a,b){var c=this,d=c.chart,a=p(a,!0);if(!c.isRemoving)c.isRemoving=!0,J(c,"remove",null,function(){c.destroy();d.isDirtyLegend=d.isDirtyBox=!0;d.linkSeries();a&&d.redraw(b)}); | |
278 | + c.isRemoving=!1},update:function(a,b){var c=this,d=this.chart,e=this.userOptions,f=this.type,g=N[f].prototype,h=["group","markerGroup","dataLabelsGroup"],i;if(a.type&&a.type!==f||a.zIndex!==void 0)h.length=0;o(h,function(a){h[a]=c[a];delete c[a]});a=D(e,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},a);this.remove(!1);for(i in g)this[i]=x;t(this,N[a.type||f].prototype);o(h,function(a){c[a]=h[a]});this.init(d,a);d.linkSeries();p(b,!0)&&d.redraw(!1)}});t(ha.prototype, | |
279 | + {update:function(a,b){var c=this.chart,a=c.options[this.coll][this.options.index]=D(this.userOptions,a);this.destroy(!0);this._addedPlotLB=this.chart._labelPanes=x;this.init(c,t(a,{events:x}));c.isDirtyBox=!0;p(b,!0)&&c.redraw()},remove:function(a){for(var b=this.chart,c=this.coll,d=this.series,e=d.length;e--;)d[e]&&d[e].remove(!1);ja(b.axes,this);ja(b[c],this);b.options[c].splice(this.options.index,1);o(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;p(a,!0)&&b.redraw()},setTitle:function(a, | |
280 | + b){this.update({title:a},b)},setCategories:function(a,b){this.update({categories:a},b)}});var xa=ka(R);N.line=xa;ba.area=D(U,{softThreshold:!1,threshold:0});var pa=ka(R,{type:"area",getSegments:function(){var a=this,b=[],c=[],d=[],e=this.xAxis,f=this.yAxis,g=f.stacks[this.stackKey],h={},i,j,k=this.points,m=this.options.connectNulls,n,l,p;if(this.options.stacking&&!this.cropped){for(l=0;l<k.length;l++)h[k[l].x]=k[l];for(p in g)g[p].total!==null&&d.push(+p);d.sort(function(a,b){return a-b});o(d,function(b){var d= | |
281 | + null,k;if(!m||h[b]&&h[b].y!==null)if(h[b])c.push(h[b]);else{for(l=a.index;l<=f.series.length;l++)if(n=a.getStackIndicator(null,b,l),k=g[b].points[n.key]){d=k[1];break}i=e.translate(b);j=f.getThreshold(d);c.push({y:null,plotX:i,clientX:i,plotY:j,yBottom:j,onMouseOver:ua})}});c.length&&b.push(c)}else R.prototype.getSegments.call(this),b=this.segments;this.segments=b},getSegmentPath:function(a){var b=R.prototype.getSegmentPath.call(this,a),c=[].concat(b),d,e=this.options;d=b.length;var f=this.yAxis.getThreshold(e.threshold), | |
282 | + g;d===3&&c.push("L",b[1],b[2]);if(e.stacking&&!this.closedStacks)for(d=a.length-1;d>=0;d--)g=p(a[d].yBottom,f),d<a.length-1&&e.step&&c.push(a[d+1].plotX,g),c.push(a[d].plotX,g);else this.closeSegment(c,a,f);this.areaPath=this.areaPath.concat(c);return b},closeSegment:function(a,b,c){a.push("L",b[b.length-1].plotX,c,"L",b[0].plotX,c)},drawGraph:function(){this.areaPath=[];R.prototype.drawGraph.apply(this);var a=this,b=this.areaPath,c=this.options,d=[["area",this.color,c.fillColor]];o(this.zones,function(b, | |
283 | + f){d.push(["zoneArea"+f,b.color||a.color,b.fillColor||c.fillColor])});o(d,function(d){var f=d[0],g=a[f];g?g.animate({d:b}):a[f]=a.chart.renderer.path(b).attr({fill:p(d[2],na(d[1]).setOpacity(p(c.fillOpacity,0.75)).get()),zIndex:0}).add(a.group)})},drawLegendSymbol:Ma.drawRectangle});N.area=pa;ba.spline=D(U);xa=ka(R,{type:"spline",getPointSpline:function(a,b,c){var d=b.plotX,e=b.plotY,f=a[c-1],g=a[c+1],h,i,j,k;if(f&&g){a=f.plotY;j=g.plotX;var g=g.plotY,m;h=(1.5*d+f.plotX)/2.5;i=(1.5*e+a)/2.5;j=(1.5* | |
284 | + d+j)/2.5;k=(1.5*e+g)/2.5;m=(k-i)*(j-d)/(j-h)+e-k;i+=m;k+=m;i>a&&i>e?(i=s(a,e),k=2*e-i):i<a&&i<e&&(i=z(a,e),k=2*e-i);k>g&&k>e?(k=s(g,e),i=2*e-k):k<g&&k<e&&(k=z(g,e),i=2*e-k);b.rightContX=j;b.rightContY=k}c?(b=["C",f.rightContX||f.plotX,f.rightContY||f.plotY,h||d,i||e,d,e],f.rightContX=f.rightContY=null):b=["M",d,e];return b}});N.spline=xa;ba.areaspline=D(ba.area);pa=pa.prototype;xa=ka(xa,{type:"areaspline",closedStacks:!0,getSegmentPath:pa.getSegmentPath,closeSegment:pa.closeSegment,drawGraph:pa.drawGraph, | |
285 | + drawLegendSymbol:Ma.drawRectangle});N.areaspline=xa;ba.column=D(U,{borderColor:"#FFFFFF",borderRadius:0,groupPadding:0.2,marker:null,pointPadding:0.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{brightness:0.1,shadow:!1,halo:!1},select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}},dataLabels:{align:null,verticalAlign:null,y:null},softThreshold:!1,startFromThreshold:!0,stickyTracking:!1,tooltip:{distance:6},threshold:0});xa=ka(R,{type:"column",pointAttrToOptions:{stroke:"borderColor", | |
286 | + fill:"color",r:"borderRadius"},cropShoulder:0,directTouch:!0,trackerGroups:["group","dataLabelsGroup"],negStacks:!0,init:function(){R.prototype.init.apply(this,arguments);var a=this,b=a.chart;b.hasRendered&&o(b.series,function(b){if(b.type===a.type)b.isDirty=!0})},getColumnMetrics:function(){var a=this,b=a.options,c=a.xAxis,d=a.yAxis,e=c.reversed,f,g={},h,i=0;b.grouping===!1?i=1:o(a.chart.series,function(b){var c=b.options,e=b.yAxis;if(b.type===a.type&&b.visible&&d.len===e.len&&d.pos===e.pos)c.stacking? | |
287 | + (f=b.stackKey,g[f]===x&&(g[f]=i++),h=g[f]):c.grouping!==!1&&(h=i++),b.columnIndex=h});var j=z(O(c.transA)*(c.ordinalSlope||b.pointRange||c.closestPointRange||c.tickInterval||1),c.len),k=j*b.groupPadding,m=(j-2*k)/i,b=z(b.maxPointWidth||c.len,p(b.pointWidth,m*(1-2*b.pointPadding)));return a.columnMetrics={width:b,offset:(m-b)/2+(k+((e?i-(a.columnIndex||0):a.columnIndex)||0)*m-j/2)*(e?-1:1)}},crispCol:function(a,b,c,d){var e=this.chart,f=this.borderWidth,g=-(f%2?0.5:0),f=f%2?0.5:1;e.inverted&&e.renderer.isVML&& | |
288 | +(f+=1);c=Math.round(a+c)+g;a=Math.round(a)+g;c-=a;g=O(b)<=0.5;d=Math.round(b+d)+f;b=Math.round(b)+f;d-=b;g&&(b-=1,d+=1);return{x:a,y:b,width:c,height:d}},translate:function(){var a=this,b=a.chart,c=a.options,d=a.borderWidth=p(c.borderWidth,a.closestPointRange*a.xAxis.transA<2?0:1),e=a.yAxis,f=a.translatedThreshold=e.getThreshold(c.threshold),g=p(c.minPointLength,5),h=a.getColumnMetrics(),i=h.width,j=a.barW=s(i,1+2*d),k=a.pointXOffset=h.offset;b.inverted&&(f-=0.5);c.pointPadding&&(j=ta(j));R.prototype.translate.apply(a); | |
289 | + o(a.points,function(c){var d=z(p(c.yBottom,f),9E4),h=999+O(d),h=z(s(-h,c.plotY),e.len+h),o=c.plotX+k,q=j,t=z(h,d),w,v=s(h,d)-t;O(v)<g&&g&&(v=g,w=!e.reversed&&!c.negative||e.reversed&&c.negative,t=O(t-f)>g?d-g:f-(w?g:0));c.barX=o;c.pointWidth=i;c.tooltipPos=b.inverted?[e.len+e.pos-b.plotLeft-h,a.xAxis.len-o-q/2,v]:[o+q/2,h+e.pos-b.plotTop,v];c.shapeType="rect";c.shapeArgs=a.crispCol(o,t,q,v)})},getSymbol:ua,drawLegendSymbol:Ma.drawRectangle,drawGraph:ua,drawPoints:function(){var a=this,b=this.chart, | |
290 | + c=a.options,d=b.renderer,e=c.animationLimit||250,f,g;o(a.points,function(h){var i=h.plotY,j=h.graphic;if(i!==x&&!isNaN(i)&&h.y!==null)f=h.shapeArgs,i=q(a.borderWidth)?{"stroke-width":a.borderWidth}:{},g=h.pointAttr[h.selected?"select":""]||a.pointAttr[""],j?(cb(j),j.attr(i)[b.pointCount<e?"animate":"attr"](D(f))):h.graphic=d[h.shapeType](f).attr(i).attr(g).add(h.group||a.group).shadow(c.shadow,null,c.stacking&&!c.borderRadius);else if(j)h.graphic=j.destroy()})},animate:function(a){var b=this.yAxis, | |
291 | + c=this.options,d=this.chart.inverted,e={};if(ca)a?(e.scaleY=0.001,a=z(b.pos+b.len,s(b.pos,b.toPixels(c.threshold))),d?e.translateX=a-b.len:e.translateY=a,this.group.attr(e)):(e.scaleY=1,e[d?"translateX":"translateY"]=b.pos,this.group.animate(e,this.options.animation),this.animate=null)},remove:function(){var a=this,b=a.chart;b.hasRendered&&o(b.series,function(b){if(b.type===a.type)b.isDirty=!0});R.prototype.remove.apply(a,arguments)}});N.column=xa;ba.bar=D(ba.column);pa=ka(xa,{type:"bar",inverted:!0}); | |
292 | + N.bar=pa;ba.scatter=D(U,{lineWidth:0,marker:{enabled:!0},tooltip:{headerFormat:'<span style="color:{point.color}">\u25cf</span> <span style="font-size: 10px;"> {series.name}</span><br/>',pointFormat:"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>"}});pa=ka(R,{type:"scatter",sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","markerGroup","dataLabelsGroup"],takeOrdinalPosition:!1,kdDimensions:2,drawGraph:function(){this.options.lineWidth&&R.prototype.drawGraph.call(this)}});N.scatter= | |
293 | + pa;ba.pie=D(U,{borderColor:"#FFFFFF",borderWidth:1,center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.y===null?void 0:this.point.name},x:0},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,states:{hover:{brightness:0.1,shadow:!1}},stickyTracking:!1,tooltip:{followPointer:!0}});U={type:"pie",isCartesian:!1,pointClass:ka(Fa,{init:function(){Fa.prototype.init.apply(this,arguments);var a=this,b;a.name= | |
294 | + p(a.name,"Slice");b=function(b){a.slice(b.type==="select")};I(a,"select",b);I(a,"unselect",b);return a},setVisible:function(a,b){var c=this,d=c.series,e=d.chart,f=d.options.ignoreHiddenPoint,b=p(b,f);if(a!==c.visible){c.visible=c.options.visible=a=a===x?!c.visible:a;d.options.data[La(c,d.data)]=c.options;o(["graphic","dataLabel","connector","shadowGroup"],function(b){if(c[b])c[b][a?"show":"hide"](!0)});c.legendItem&&e.legend.colorizeItem(c,a);!a&&c.state==="hover"&&c.setState("");if(f)d.isDirty=!0; | |
295 | + b&&e.redraw()}},slice:function(a,b,c){var d=this.series;Ra(c,d.chart);p(b,!0);this.sliced=this.options.sliced=a=q(a)?a:!this.sliced;d.options.data[La(this,d.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)},haloPath:function(a){var b=this.shapeArgs,c=this.series.chart;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(c.plotLeft+b.x,c.plotTop+b.y,b.r+a,b.r+a,{innerR:this.shapeArgs.r, | |
296 | + start:b.start,end:b.end})}}),requireSorting:!1,directTouch:!0,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},animate:function(a){var b=this,c=b.points,d=b.startAngleRad;if(!a)o(c,function(a){var c=a.graphic,g=a.shapeArgs;c&&(c.attr({r:a.startR||b.center[3]/2,start:d,end:d}),c.animate({r:g.r,start:g.start,end:g.end},b.options.animation))}),b.animate=null},updateTotals:function(){var a,b=0, | |
297 | + c=this.points,d=c.length,e,f=this.options.ignoreHiddenPoint;for(a=0;a<d;a++)e=c[a],b+=f&&!e.visible?0:e.y;this.total=b;for(a=0;a<d;a++)e=c[a],e.percentage=b>0&&(e.visible||!f)?e.y/b*100:0,e.total=b},generatePoints:function(){R.prototype.generatePoints.call(this);this.updateTotals()},translate:function(a){this.generatePoints();var b=0,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f,g,h,i=c.startAngle||0,j=this.startAngleRad=ma/180*(i-90),i=(this.endAngleRad=ma/180*(p(c.endAngle,i+360)-90))-j,k= | |
298 | + this.points,m=c.dataLabels.distance,c=c.ignoreHiddenPoint,n,l=k.length,o;if(!a)this.center=a=this.getCenter();this.getX=function(b,c){h=V.asin(z((b-a[1])/(a[2]/2+m),1));return a[0]+(c?-1:1)*W(h)*(a[2]/2+m)};for(n=0;n<l;n++){o=k[n];f=j+b*i;if(!c||o.visible)b+=o.percentage/100;g=j+b*i;o.shapeType="arc";o.shapeArgs={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:w(f*1E3)/1E3,end:w(g*1E3)/1E3};h=(g+f)/2;h>1.5*ma?h-=2*ma:h<-ma/2&&(h+=2*ma);o.slicedTranslation={translateX:w(W(h)*d),translateY:w(aa(h)*d)};f= | |
299 | + W(h)*a[2]/2;g=aa(h)*a[2]/2;o.tooltipPos=[a[0]+f*0.7,a[1]+g*0.7];o.half=h<-ma/2||h>ma/2?1:0;o.angle=h;e=z(e,m/2);o.labelPos=[a[0]+f+W(h)*m,a[1]+g+aa(h)*m,a[0]+f+W(h)*e,a[1]+g+aa(h)*e,a[0]+f,a[1]+g,m<0?"center":o.half?"right":"left",h]}},drawGraph:null,drawPoints:function(){var a=this,b=a.chart.renderer,c,d,e=a.options.shadow,f,g,h;if(e&&!a.shadowGroup)a.shadowGroup=b.g("shadow").add(a.group);o(a.points,function(i){if(i.y!==null){d=i.graphic;g=i.shapeArgs;f=i.shadowGroup;if(e&&!f)f=i.shadowGroup=b.g("shadow").add(a.shadowGroup); | |
300 | + c=i.sliced?i.slicedTranslation:{translateX:0,translateY:0};f&&f.attr(c);if(d)d.setRadialReference(a.center).animate(t(g,c));else{h={"stroke-linejoin":"round"};if(!i.visible)h.visibility="hidden";i.graphic=d=b[i.shapeType](g).setRadialReference(a.center).attr(i.pointAttr[i.selected?"select":""]).attr(h).attr(c).add(a.group).shadow(e,f)}}})},searchPoint:ua,sortByAngle:function(a,b){a.sort(function(a,d){return a.angle!==void 0&&(d.angle-a.angle)*b})},drawLegendSymbol:Ma.drawRectangle,getCenter:Xb.getCenter, | |
301 | + getSymbol:ua};U=ka(R,U);N.pie=U;R.prototype.drawDataLabels=function(){var a=this,b=a.options,c=b.cursor,d=b.dataLabels,e=a.points,f,g,h=a.hasRendered||0,i,j,k=a.chart.renderer;if(d.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(d),j=a.plotGroup("dataLabelsGroup","data-labels",d.defer?"hidden":"visible",d.zIndex||6),p(d.defer,!0)&&(j.attr({opacity:+h}),h||I(a,"afterAnimate",function(){a.visible&&j.show();j[b.animation?"animate":"attr"]({opacity:1},{duration:200})})),g=d,o(e,function(e){var h, | |
302 | + l=e.dataLabel,o,r,s=e.connector,w=!0,v,y={};f=e.dlOptions||e.options&&e.options.dataLabels;h=p(f&&f.enabled,g.enabled);if(l&&!h)e.dataLabel=l.destroy();else if(h){d=D(g,f);v=d.style;h=d.rotation;o=e.getLabelConfig();i=d.format?Ia(d.format,o):d.formatter.call(o,d);v.color=p(d.color,v.color,a.color,"black");if(l)if(q(i))l.attr({text:i}),w=!1;else{if(e.dataLabel=l=l.destroy(),s)e.connector=s.destroy()}else if(q(i)){l={fill:d.backgroundColor,stroke:d.borderColor,"stroke-width":d.borderWidth,r:d.borderRadius|| | |
303 | + 0,rotation:h,padding:d.padding,zIndex:1};if(v.color==="contrast")y.color=d.inside||d.distance<0||b.stacking?k.getContrast(e.color||a.color):"#000000";if(c)y.cursor=c;for(r in l)l[r]===x&&delete l[r];l=e.dataLabel=k[h?"text":"label"](i,0,-999,d.shape,null,null,d.useHTML).attr(l).css(t(v,y)).add(j).shadow(d.shadow)}l&&a.alignDataLabel(e,l,d,null,w)}})};R.prototype.alignDataLabel=function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=p(a.plotX,-999),i=p(a.plotY,-999),j=b.getBBox(),k=f.renderer.fontMetrics(c.style.fontSize).b, | |
304 | + m=this.visible&&(a.series.forceDL||f.isInsidePlot(h,w(i),g)||d&&f.isInsidePlot(h,g?d.x+1:d.y+d.height-1,g));if(m)d=t({x:g?f.plotWidth-i:h,y:w(g?f.plotHeight-h:i),width:0,height:0},d),t(c,{width:j.width,height:j.height}),c.rotation?(a=f.renderer.rotCorr(k,c.rotation),b[e?"attr":"animate"]({x:d.x+c.x+d.width/2+a.x,y:d.y+c.y+d.height/2}).attr({align:c.align})):(b.align(c,null,d),g=b.alignAttr,p(c.overflow,"justify")==="justify"?this.justifyDataLabel(b,c,g,j,d,e):p(c.crop,!0)&&(m=f.isInsidePlot(g.x,g.y)&& | |
305 | + f.isInsidePlot(g.x+j.width,g.y+j.height)),c.shape&&b.attr({anchorX:a.plotX,anchorY:a.plotY}));if(!m)cb(b),b.attr({y:-999}),b.placed=!1};R.prototype.justifyDataLabel=function(a,b,c,d,e,f){var g=this.chart,h=b.align,i=b.verticalAlign,j,k,m=a.box?0:a.padding||0;j=c.x+m;if(j<0)h==="right"?b.align="left":b.x=-j,k=!0;j=c.x+d.width-m;if(j>g.plotWidth)h==="left"?b.align="right":b.x=g.plotWidth-j,k=!0;j=c.y+m;if(j<0)i==="bottom"?b.verticalAlign="top":b.y=-j,k=!0;j=c.y+d.height-m;if(j>g.plotHeight)i==="top"? | |
306 | + b.verticalAlign="bottom":b.y=g.plotHeight-j,k=!0;if(k)a.placed=!f,a.align(b,null,e)};if(N.pie)N.pie.prototype.drawDataLabels=function(){var a=this,b=a.data,c,d=a.chart,e=a.options.dataLabels,f=p(e.connectorPadding,10),g=p(e.connectorWidth,1),h=d.plotWidth,i=d.plotHeight,j,k,m=p(e.softConnector,!0),n=e.distance,l=a.center,q=l[2]/2,r=l[1],t=n>0,x,v,y,D=[[],[]],C,B,E,G,H,F=[0,0,0,0],M=function(a,b){return b.y-a.y};if(a.visible&&(e.enabled||a._hasPointLabels)){R.prototype.drawDataLabels.apply(a);o(b, | |
307 | + function(a){a.dataLabel&&a.visible&&D[a.half].push(a)});for(G=2;G--;){var J=[],N=[],I=D[G],L=I.length,K;if(L){a.sortByAngle(I,G-0.5);for(H=b=0;!b&&I[H];)b=I[H]&&I[H].dataLabel&&(I[H].dataLabel.getBBox().height||21),H++;if(n>0){v=z(r+q+n,d.plotHeight);for(H=s(0,r-q-n);H<=v;H+=b)J.push(H);v=J.length;if(L>v){c=[].concat(I);c.sort(M);for(H=L;H--;)c[H].rank=H;for(H=L;H--;)I[H].rank>=v&&I.splice(H,1);L=I.length}for(H=0;H<L;H++){c=I[H];y=c.labelPos;c=9999;var Q,P;for(P=0;P<v;P++)Q=O(J[P]-y[1]),Q<c&&(c=Q, | |
308 | + K=P);if(K<H&&J[H]!==null)K=H;else for(v<L-H+K&&J[H]!==null&&(K=v-L+H);J[K]===null;)K++;N.push({i:K,y:J[K]});J[K]=null}N.sort(M)}for(H=0;H<L;H++){c=I[H];y=c.labelPos;x=c.dataLabel;E=c.visible===!1?"hidden":"inherit";c=y[1];if(n>0){if(v=N.pop(),K=v.i,B=v.y,c>B&&J[K+1]!==null||c<B&&J[K-1]!==null)B=z(s(0,c),d.plotHeight)}else B=c;C=e.justify?l[0]+(G?-1:1)*(q+n):a.getX(B===r-q-n||B===r+q+n?c:B,G);x._attr={visibility:E,align:y[6]};x._pos={x:C+e.x+({left:f,right:-f}[y[6]]||0),y:B+e.y-10};x.connX=C;x.connY= | |
309 | + B;if(this.options.size===null)v=x.width,C-v<f?F[3]=s(w(v-C+f),F[3]):C+v>h-f&&(F[1]=s(w(C+v-h+f),F[1])),B-b/2<0?F[0]=s(w(-B+b/2),F[0]):B+b/2>i&&(F[2]=s(w(B+b/2-i),F[2]))}}}if(Da(F)===0||this.verifyDataLabelOverflow(F))this.placeDataLabels(),t&&g&&o(this.points,function(b){j=b.connector;y=b.labelPos;if((x=b.dataLabel)&&x._pos&&b.visible)E=x._attr.visibility,C=x.connX,B=x.connY,k=m?["M",C+(y[6]==="left"?5:-5),B,"C",C,B,2*y[2]-y[4],2*y[3]-y[5],y[2],y[3],"L",y[4],y[5]]:["M",C+(y[6]==="left"?5:-5),B,"L", | |
310 | + y[2],y[3],"L",y[4],y[5]],j?(j.animate({d:k}),j.attr("visibility",E)):b.connector=j=a.chart.renderer.path(k).attr({"stroke-width":g,stroke:e.connectorColor||b.color||"#606060",visibility:E}).add(a.dataLabelsGroup);else if(j)b.connector=j.destroy()})}},N.pie.prototype.placeDataLabels=function(){o(this.points,function(a){var b=a.dataLabel;if(b&&a.visible)(a=b._pos)?(b.attr(b._attr),b[b.moved?"animate":"attr"](a),b.moved=!0):b&&b.attr({y:-999})})},N.pie.prototype.alignDataLabel=ua,N.pie.prototype.verifyDataLabelOverflow= | |
311 | + function(a){var b=this.center,c=this.options,d=c.center,e=c.minSize||80,f=e,g;d[0]!==null?f=s(b[2]-s(a[1],a[3]),e):(f=s(b[2]-a[1]-a[3],e),b[0]+=(a[3]-a[1])/2);d[1]!==null?f=s(z(f,b[2]-s(a[0],a[2])),e):(f=s(z(f,b[2]-a[0]-a[2]),e),b[1]+=(a[0]-a[2])/2);f<b[2]?(b[2]=f,b[3]=Math.min(/%$/.test(c.innerSize||0)?f*parseFloat(c.innerSize||0)/100:parseFloat(c.innerSize||0),f),this.translate(b),o(this.points,function(a){if(a.dataLabel)a.dataLabel._pos=null}),this.drawDataLabels&&this.drawDataLabels()):g=!0;return g}; | |
312 | + if(N.column)N.column.prototype.alignDataLabel=function(a,b,c,d,e){var f=this.chart.inverted,g=a.series,h=a.dlBox||a.shapeArgs,i=p(a.below,a.plotY>p(this.translatedThreshold,g.yAxis.len)),j=p(c.inside,!!this.options.stacking);if(h&&(d=D(h),f&&(d={x:g.yAxis.len-d.y-d.height,y:g.xAxis.len-d.x-d.width,width:d.height,height:d.width}),!j))f?(d.x+=i?0:d.width,d.width=0):(d.y+=i?d.height:0,d.height=0);c.align=p(c.align,!f||j?"center":i?"right":"left");c.verticalAlign=p(c.verticalAlign,f||j?"middle":i?"top": | |
313 | + "bottom");R.prototype.alignDataLabel.call(this,a,b,c,d,e)};(function(a){var b=a.Chart,c=a.each,d=a.pick,e=HighchartsAdapter.addEvent;b.prototype.callbacks.push(function(a){function b(){var e=[];c(a.series,function(a){var b=a.options.dataLabels,f=a.dataLabelCollections||["dataLabel"];(b.enabled||a._hasPointLabels)&&!b.allowOverlap&&a.visible&&c(f,function(b){c(a.points,function(a){if(a[b])a[b].labelrank=d(a.labelrank,a.shapeArgs&&a.shapeArgs.height),e.push(a[b])})})});a.hideOverlappingLabels(e)}b(); | |
314 | + e(a,"redraw",b)});b.prototype.hideOverlappingLabels=function(a){var b=a.length,d,e,j,k,m,n,l;for(e=0;e<b;e++)if(d=a[e])d.oldOpacity=d.opacity,d.newOpacity=1;a.sort(function(a,b){return(b.labelrank||0)-(a.labelrank||0)});for(e=0;e<b;e++){j=a[e];for(d=e+1;d<b;++d)if(k=a[d],j&&k&&j.placed&&k.placed&&j.newOpacity!==0&&k.newOpacity!==0&&(m=j.alignAttr,n=k.alignAttr,l=2*(j.box?0:j.padding),m=!(n.x>m.x+(j.width-l)||n.x+(k.width-l)<m.x||n.y>m.y+(j.height-l)||n.y+(k.height-l)<m.y)))(j.labelrank<k.labelrank? | |
315 | + j:k).newOpacity=0}c(a,function(a){var b,c;if(a){c=a.newOpacity;if(a.oldOpacity!==c&&a.placed)c?a.show(!0):b=function(){a.hide()},a.alignAttr.opacity=c,a[a.isOld?"animate":"attr"](a.alignAttr,null,b);a.isOld=!0}})}})(B);U=B.TrackerMixin={drawTrackerPoint:function(){var a=this,b=a.chart,c=b.pointer,d=a.options.cursor,e=d&&{cursor:d},f=function(a){for(var c=a.target,d;c&&!d;)d=c.point,c=c.parentNode;if(d!==x&&d!==b.hoverPoint)d.onMouseOver(a)};o(a.points,function(a){if(a.graphic)a.graphic.element.point= | |
316 | + a;if(a.dataLabel)a.dataLabel.element.point=a});if(!a._hasTracking)o(a.trackerGroups,function(b){if(a[b]&&(a[b].addClass("highcharts-tracker").on("mouseover",f).on("mouseout",function(a){c.onTrackerMouseOut(a)}).css(e),ab))a[b].on("touchstart",f)}),a._hasTracking=!0},drawTrackerGraph:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),e=d.length,f=a.chart,g=f.pointer,h=f.renderer,i=f.options.tooltip.snap,j=a.tracker,k=b.cursor,m=k&&{cursor:k},k=a.singlePoints,n, | |
317 | + l=function(){if(f.hoverSeries!==a)a.onMouseOver()},p="rgba(192,192,192,"+(ca?1.0E-4:0.002)+")";if(e&&!c)for(n=e+1;n--;)d[n]==="M"&&d.splice(n+1,0,d[n+1]-i,d[n+2],"L"),(n&&d[n]==="M"||n===e)&&d.splice(n,0,"L",d[n-2]+i,d[n-1]);for(n=0;n<k.length;n++)e=k[n],d.push("M",e.plotX-i,e.plotY,"L",e.plotX+i,e.plotY);j?j.attr({d:d}):(a.tracker=h.path(d).attr({"stroke-linejoin":"round",visibility:a.visible?"visible":"hidden",stroke:p,fill:c?p:P,"stroke-width":b.lineWidth+(c?0:2*i),zIndex:2}).add(a.group),o([a.tracker, | |
318 | + a.markerGroup],function(a){a.addClass("highcharts-tracker").on("mouseover",l).on("mouseout",function(a){g.onTrackerMouseOut(a)}).css(m);if(ab)a.on("touchstart",l)}))}};if(N.column)xa.prototype.drawTracker=U.drawTrackerPoint;if(N.pie)N.pie.prototype.drawTracker=U.drawTrackerPoint;if(N.scatter)pa.prototype.drawTracker=U.drawTrackerPoint;t(mb.prototype,{setItemEvents:function(a,b,c,d,e){var f=this;(c?b:a.legendGroup).on("mouseover",function(){a.setState("hover");b.css(f.options.itemHoverStyle)}).on("mouseout", | |
319 | + function(){b.css(a.visible?d:e);a.setState()}).on("click",function(b){var c=function(){a.setVisible&&a.setVisible()},b={browserEvent:b};a.firePointEvent?a.firePointEvent("legendItemClick",b,c):J(a,"legendItemClick",b,c)})},createCheckboxForItem:function(a){a.checkbox=$("input",{type:"checkbox",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,this.chart.container);I(a.checkbox,"click",function(b){J(a.series||a,"checkboxClick",{checked:b.target.checked,item:a},function(){a.select()})})}}); | |
320 | + S.legend.itemStyle.cursor="pointer";t(E.prototype,{showResetZoom:function(){var a=this,b=S.lang,c=a.options.chart.resetZoomButton,d=c.theme,e=d.states,f=c.relativeTo==="chart"?null:"plotBox";this.resetZoomButton=a.renderer.button(b.resetZoom,null,null,function(){a.zoomOut()},d,e&&e.hover).attr({align:c.position.align,title:b.resetZoomTitle}).add().align(c.position,!1,f)},zoomOut:function(){var a=this;J(a,"selection",{resetSelection:!0},function(){a.zoom()})},zoom:function(a){var b,c=this.pointer, | |
321 | + d=!1,e;!a||a.resetSelection?o(this.axes,function(a){b=a.zoom()}):o(a.xAxis.concat(a.yAxis),function(a){var e=a.axis,h=e.isXAxis;if(c[h?"zoomX":"zoomY"]||c[h?"pinchX":"pinchY"])b=e.zoom(a.min,a.max),e.displayBtn&&(d=!0)});e=this.resetZoomButton;if(d&&!e)this.showResetZoom();else if(!d&&da(e))this.resetZoomButton=e.destroy();b&&this.redraw(p(this.options.chart.animation,a&&a.animation,this.pointCount<100))},pan:function(a,b){var c=this,d=c.hoverPoints,e;d&&o(d,function(a){a.setState()});o(b==="xy"? | |
322 | + [1,0]:[1],function(b){var d=a[b?"chartX":"chartY"],h=c[b?"xAxis":"yAxis"][0],i=c[b?"mouseDownX":"mouseDownY"],j=(h.pointRange||0)/2,k=h.getExtremes(),m=h.toValue(i-d,!0)+j,j=h.toValue(i+c[b?"plotWidth":"plotHeight"]-d,!0)-j,i=i>d;if(h.series.length&&(i||m>z(k.dataMin,k.min))&&(!i||j<s(k.dataMax,k.max)))h.setExtremes(m,j,!1,!1,{trigger:"pan"}),e=!0;c[b?"mouseDownX":"mouseDownY"]=d});e&&c.redraw(!1);M(c.container,{cursor:"move"})}});t(Fa.prototype,{select:function(a,b){var c=this,d=c.series,e=d.chart, | |
323 | + a=p(a,!c.selected);c.firePointEvent(a?"select":"unselect",{accumulate:b},function(){c.selected=c.options.selected=a;d.options.data[La(c,d.data)]=c.options;c.setState(a&&"select");b||o(e.getSelectedPoints(),function(a){if(a.selected&&a!==c)a.selected=a.options.selected=!1,d.options.data[La(a,d.data)]=a.options,a.setState(""),a.firePointEvent("unselect")})})},onMouseOver:function(a,b){var c=this.series,d=c.chart,e=d.tooltip,f=d.hoverPoint;if(d.hoverSeries!==c)c.onMouseOver();if(f&&f!==this)f.onMouseOut(); | |
324 | + if(this.series&&(this.firePointEvent("mouseOver"),e&&(!e.shared||c.noSharedTooltip)&&e.refresh(this,a),this.setState("hover"),!b))d.hoverPoint=this},onMouseOut:function(){var a=this.series.chart,b=a.hoverPoints;this.firePointEvent("mouseOut");if(!b||La(this,b)===-1)this.setState(),a.hoverPoint=null},importEvents:function(){if(!this.hasImportedEvents){var a=D(this.series.options.point,this.options).events,b;this.events=a;for(b in a)I(this,b,a[b]);this.hasImportedEvents=!0}},setState:function(a,b){var c= | |
325 | + T(this.plotX),d=this.plotY,e=this.series,f=e.options.states,g=ba[e.type].marker&&e.options.marker,h=g&&!g.enabled,i=g&&g.states[a],j=i&&i.enabled===!1,k=e.stateMarkerGraphic,m=this.marker||{},n=e.chart,l=e.halo,o,a=a||"";o=this.pointAttr[a]||e.pointAttr[a];if(!(a===this.state&&!b||this.selected&&a!=="select"||f[a]&&f[a].enabled===!1||a&&(j||h&&i.enabled===!1)||a&&m.states&&m.states[a]&&m.states[a].enabled===!1)){if(this.graphic)g=g&&this.graphic.symbolName&&o.r,this.graphic.attr(D(o,g?{x:c-g,y:d- | |
326 | + g,width:2*g,height:2*g}:{})),k&&k.hide();else{if(a&&i)if(g=i.radius,m=m.symbol||e.symbol,k&&k.currentSymbol!==m&&(k=k.destroy()),k)k[b?"animate":"attr"]({x:c-g,y:d-g});else if(m)e.stateMarkerGraphic=k=n.renderer.symbol(m,c-g,d-g,2*g,2*g).attr(o).add(e.markerGroup),k.currentSymbol=m;if(k)k[a&&n.isInsidePlot(c,d,n.inverted)?"show":"hide"](),k.element.point=this}if((c=f[a]&&f[a].halo)&&c.size){if(!l)e.halo=l=n.renderer.path().add(n.seriesGroup);l.attr(t({fill:na(this.color||e.color).setOpacity(c.opacity).get()}, | |
327 | + c.attributes))[b?"animate":"attr"]({d:this.haloPath(c.size)})}else l&&l.attr({d:[]});this.state=a}},haloPath:function(a){var b=this.series,c=b.chart,d=b.getPlotBox(),e=c.inverted;return c.renderer.symbols.circle(d.translateX+(e?b.yAxis.len-this.plotY:this.plotX)-a,d.translateY+(e?b.xAxis.len-this.plotX:this.plotY)-a,a*2,a*2)}});t(R.prototype,{onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&J(this,"mouseOver");this.setState("hover"); | |
328 | + a.hoverSeries=this},onMouseOut:function(){var a=this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;b.hoverSeries=null;if(d)d.onMouseOut();this&&a.events.mouseOut&&J(this,"mouseOut");c&&!a.stickyTracking&&(!c.shared||this.noSharedTooltip)&&c.hide();this.setState()},setState:function(a){var b=this.options,c=this.graph,d=b.states,e=b.lineWidth,b=0,a=a||"";if(this.state!==a&&(this.state=a,!(d[a]&&d[a].enabled===!1)&&(a&&(e=d[a].lineWidth||e+(d[a].lineWidthPlus||0)),c&&!c.dashstyle))){a={"stroke-width":e}; | |
329 | + for(c.attr(a);this["zoneGraph"+b];)this["zoneGraph"+b].attr(a),b+=1}},setVisible:function(a,b){var c=this,d=c.chart,e=c.legendItem,f,g=d.options.chart.ignoreHiddenSeries,h=c.visible;f=(c.visible=a=c.userOptions.visible=a===x?!h:a)?"show":"hide";o(["group","dataLabelsGroup","markerGroup","tracker"],function(a){if(c[a])c[a][f]()});if(d.hoverSeries===c||(d.hoverPoint&&d.hoverPoint.series)===c)c.onMouseOut();e&&d.legend.colorizeItem(c,a);c.isDirty=!0;c.options.stacking&&o(d.series,function(a){if(a.options.stacking&& | |
330 | + a.visible)a.isDirty=!0});o(c.linkedSeries,function(b){b.setVisible(a,!1)});if(g)d.isDirtyBox=!0;b!==!1&&d.redraw();J(c,f)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=a===x?!this.selected:a;if(this.checkbox)this.checkbox.checked=a;J(this,a?"select":"unselect")},drawTracker:U.drawTrackerGraph});t(B,{Color:na,Point:Fa,Tick:Sa,Renderer:$a,SVGElement:Q,SVGRenderer:Aa,arrayMin:Oa,arrayMax:Da,charts:X,dateFormat:Na,error:la,format:Ia,pathAnim:yb, | |
331 | + getOptions:function(){return S},hasBidiBug:Nb,isTouchDevice:Jb,setOptions:function(a){S=D(!0,S,a);Cb();return S},addEvent:I,removeEvent:Y,createElement:$,discardElement:Qa,css:M,each:o,map:Ua,merge:D,splat:ra,extendClass:ka,pInt:G,svg:ca,canvas:fa,vml:!ca&&!fa,product:"Highcharts",version:"4.1.9"})})(); | |
0 | 332 | \ No newline at end of file | ... | ... |
datalets/leafletjs-datalet/demo/index.html
0 โ 100644
1 | +<!DOCTYPE html> | |
2 | +<html lang="en"> | |
3 | +<head> | |
4 | + <meta charset="UTF-8"> | |
5 | + <title></title> | |
6 | + | |
7 | + <script> | |
8 | + </script> | |
9 | + | |
10 | +</head> | |
11 | +<body> | |
12 | + | |
13 | +<script src="https://code.jquery.com/jquery-2.1.4.min.js" type="text/javascript"></script> | |
14 | +<link rel="import" href="../leafletjs-datalet.html" /> | |
15 | + | |
16 | +<leafletjs-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&limit=10000" | |
17 | + fields='["result,records,Lat","result,records,Lng", "result,records,Link"]'></leafletjs-datalet> | |
18 | + | |
19 | + | |
20 | +</body> | |
21 | +</html> | |
0 | 22 | \ No newline at end of file | ... | ... |
datalets/leafletjs-datalet/leafletjs-datalet.html
1 | 1 | <!-- |
2 | -The MIT License (MIT) | |
3 | - | |
4 | -Copyright (c) 2015 ROUTE-TO-PA CONSORTIUM | |
5 | - | |
6 | -Permission is hereby granted, free of charge, to any person obtaining a copy | |
7 | -of this software and associated documentation files (the "Software"), to deal | |
8 | -in the Software without restriction, including without limitation the rights | |
9 | -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
10 | -copies of the Software, and to permit persons to whom the Software is | |
11 | -furnished to do so, subject to the following conditions: | |
12 | - | |
13 | -The above copyright notice and this permission notice shall be included in | |
14 | -all copies or substantial portions of the Software. | |
15 | - | |
16 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
17 | -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
18 | -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
19 | -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
20 | -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
21 | -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
22 | -THE SOFTWARE. | |
2 | +@license | |
3 | + The MIT License (MIT) | |
4 | + | |
5 | + Copyright (c) 2015 Dipartimento di Informatica - Universitร di Salerno - Italy | |
6 | + | |
7 | + Permission is hereby granted, free of charge, to any person obtaining a copy | |
8 | + of this software and associated documentation files (the "Software"), to deal | |
9 | + in the Software without restriction, including without limitation the rights | |
10 | + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
11 | + copies of the Software, and to permit persons to whom the Software is | |
12 | + furnished to do so, subject to the following conditions: | |
13 | + | |
14 | + The above copyright notice and this permission notice shall be included in | |
15 | + all copies or substantial portions of the Software. | |
16 | + | |
17 | + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
20 | + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
21 | + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
22 | + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
23 | + THE SOFTWARE. | |
23 | 24 | --> |
24 | 25 | |
25 | 26 | <link rel="import" href="../base-ajax-json-jsonpath-datalet/base-ajax-json-jsonpath-datalet.html"> |
... | ... | @@ -30,10 +31,15 @@ THE SOFTWARE. |
30 | 31 | |
31 | 32 | Example: |
32 | 33 | |
33 | -<leafletjs-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&limit=10000" | |
34 | - query="$['result']['records'][*]['Lat']###$['result']['records'][*]['Lng']###$['result']['records'][*]['Link']"> | |
35 | - | |
34 | + <leafletjs-datalet | |
35 | + data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=#" | |
36 | + fields='["field1","field2"]'> | |
37 | + </leafletjs-datalet> | |
36 | 38 | |
39 | +@element leafletjs-datalet | |
40 | +@status v0.1 | |
41 | +@demo demo/index.html | |
42 | +@group datalets | |
37 | 43 | --> |
38 | 44 | |
39 | 45 | <dom-module name="leafletjs-datalet"> | ... | ... |
datalets/linechart-datalet/demo/index.html
0 โ 100644
1 | +<!DOCTYPE html> | |
2 | +<html lang="en"> | |
3 | +<head> | |
4 | + <meta charset="UTF-8"> | |
5 | + <title></title> | |
6 | + | |
7 | + <script> | |
8 | + </script> | |
9 | + | |
10 | +</head> | |
11 | +<body> | |
12 | + | |
13 | +<script src="https://code.jquery.com/jquery-2.1.4.min.js" type="text/javascript"></script> | |
14 | +<link rel="import" href="../linechart-datalet.html" /> | |
15 | + | |
16 | +<linechart-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&limit=10000" | |
17 | + fields='["result,records,Lat","result,records,Lng"]'></linechart-datalet> | |
18 | + | |
19 | +</body> | |
20 | +</html> | |
0 | 21 | \ No newline at end of file | ... | ... |
datalets/linechart-datalet/linechart-datalet.html
1 | 1 | <!-- |
2 | -The MIT License (MIT) | |
3 | - | |
4 | -Copyright (c) 2015 ROUTE-TO-PA CONSORTIUM | |
5 | - | |
6 | -Permission is hereby granted, free of charge, to any person obtaining a copy | |
7 | -of this software and associated documentation files (the "Software"), to deal | |
8 | -in the Software without restriction, including without limitation the rights | |
9 | -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
10 | -copies of the Software, and to permit persons to whom the Software is | |
11 | -furnished to do so, subject to the following conditions: | |
12 | - | |
13 | -The above copyright notice and this permission notice shall be included in | |
14 | -all copies or substantial portions of the Software. | |
15 | - | |
16 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
17 | -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
18 | -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
19 | -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
20 | -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
21 | -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
22 | -THE SOFTWARE. | |
2 | +@license | |
3 | + The MIT License (MIT) | |
4 | + | |
5 | + Copyright (c) 2015 Dipartimento di Informatica - Universitร di Salerno - Italy | |
6 | + | |
7 | + Permission is hereby granted, free of charge, to any person obtaining a copy | |
8 | + of this software and associated documentation files (the "Software"), to deal | |
9 | + in the Software without restriction, including without limitation the rights | |
10 | + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
11 | + copies of the Software, and to permit persons to whom the Software is | |
12 | + furnished to do so, subject to the following conditions: | |
13 | + | |
14 | + The above copyright notice and this permission notice shall be included in | |
15 | + all copies or substantial portions of the Software. | |
16 | + | |
17 | + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
20 | + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
21 | + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
22 | + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
23 | + THE SOFTWARE. | |
23 | 24 | --> |
24 | 25 | |
25 | 26 | <link rel="import" href="../highcharts-datalet/highcharts-datalet.html"> |
... | ... | @@ -30,10 +31,15 @@ THE SOFTWARE. |
30 | 31 | |
31 | 32 | Example: |
32 | 33 | |
33 | -<linechart-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=73e02092-85a1-434e-85fe-0c9a43aa9a52&limit=10000" | |
34 | - query="$['result']['records'][*]['Lat']###$['result']['records'][*]['Lng']"> | |
35 | - | |
34 | + <linechart-datalet | |
35 | + data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=#" | |
36 | + fields='["field1","field2"]'> | |
37 | + </linechart-datalet> | |
36 | 38 | |
39 | +@element linechart-datalet | |
40 | +@status v0.1 | |
41 | +@demo demo/index.html | |
42 | +@group datalets | |
37 | 43 | --> |
38 | 44 | |
39 | 45 | <dom-module id="linechart-datalet"> |
... | ... | @@ -41,13 +47,13 @@ Example: |
41 | 47 | <highcharts-datalet id="charts" data-url="{{dataUrl}}" fields="{{fields}}"></highcharts-datalet> |
42 | 48 | </template> |
43 | 49 | <script> |
44 | - var LinechartBehavior = { | |
45 | 50 | |
51 | + var LinechartBehavior = { | |
46 | 52 | |
47 | 53 | /** |
48 | 54 | * Bluid Highchart object |
49 | 55 | * |
50 | - * @method transformData | |
56 | + * @method presentData | |
51 | 57 | */ |
52 | 58 | presentData: function(){ |
53 | 59 | |
... | ... | @@ -56,7 +62,7 @@ Example: |
56 | 62 | text: 'Line chart' |
57 | 63 | }, |
58 | 64 | chart: { |
59 | - zoomType: 'xy' | |
65 | + zoomType: 'xy' | |
60 | 66 | }, |
61 | 67 | xAxis: { |
62 | 68 | categories: this.properties.categories.value,//this._component.categories, | ... | ... |
datalets/treemap-datalet/demo/index.html
0 โ 100644
1 | +<!DOCTYPE html> | |
2 | +<html lang="en"> | |
3 | +<head> | |
4 | + <meta charset="UTF-8"> | |
5 | + <title></title> | |
6 | + | |
7 | + <script> | |
8 | + </script> | |
9 | + | |
10 | +</head> | |
11 | +<body> | |
12 | + | |
13 | +<script src="https://code.jquery.com/jquery-2.1.4.min.js" type="text/javascript"></script> | |
14 | +<link rel="import" href="../treemap-datalet.html" /> | |
15 | + | |
16 | + | |
17 | +<treemap-datalet data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=0cb600fc-19ad-4aaf-9794-1e6ea851840a&limit=10000" | |
18 | + fields='["result,records,categoria","result,records,capitolo","result,records,movimento"]'></treemap-datalet> | |
19 | + | |
20 | +</body> | |
21 | +</html> | |
0 | 22 | \ No newline at end of file | ... | ... |
datalets/treemap-datalet/treemap-datalet.html
1 | 1 | <!-- |
2 | -The MIT License (MIT) | |
3 | - | |
4 | -Copyright (c) 2015 ROUTE-TO-PA CONSORTIUM | |
5 | - | |
6 | -Permission is hereby granted, free of charge, to any person obtaining a copy | |
7 | -of this software and associated documentation files (the "Software"), to deal | |
8 | -in the Software without restriction, including without limitation the rights | |
9 | -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
10 | -copies of the Software, and to permit persons to whom the Software is | |
11 | -furnished to do so, subject to the following conditions: | |
12 | - | |
13 | -The above copyright notice and this permission notice shall be included in | |
14 | -all copies or substantial portions of the Software. | |
15 | - | |
16 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
17 | -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
18 | -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
19 | -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
20 | -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
21 | -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
22 | -THE SOFTWARE. | |
2 | +@license | |
3 | + The MIT License (MIT) | |
4 | + | |
5 | + Copyright (c) 2015 Dipartimento di Informatica - Universitร di Salerno - Italy | |
6 | + | |
7 | + Permission is hereby granted, free of charge, to any person obtaining a copy | |
8 | + of this software and associated documentation files (the "Software"), to deal | |
9 | + in the Software without restriction, including without limitation the rights | |
10 | + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
11 | + copies of the Software, and to permit persons to whom the Software is | |
12 | + furnished to do so, subject to the following conditions: | |
13 | + | |
14 | + The above copyright notice and this permission notice shall be included in | |
15 | + all copies or substantial portions of the Software. | |
16 | + | |
17 | + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
18 | + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
19 | + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
20 | + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
21 | + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
22 | + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
23 | + THE SOFTWARE. | |
23 | 24 | --> |
24 | 25 | |
25 | 26 | <link rel="import" href="../base-ajax-json-jsonpath-datalet/base-ajax-json-jsonpath-datalet.html"> |
26 | 27 | |
28 | +<!-- | |
29 | + | |
30 | +`treemap-datalet` is a treemap datalet based on d3js treemap project http://bl.ocks.org/mbostock/4063582 | |
31 | +A treemap recursively subdivides area into rectangles; the area of any node in the tree corresponds to its value. | |
32 | + | |
33 | +Example: | |
34 | + | |
35 | + <treemap-datalet | |
36 | + data-url="http://ckan.routetopa.eu/api/action/datastore_search?resource_id=#" | |
37 | + fields='["field1","field2"]'> | |
38 | + </treemap-datalet> | |
39 | + | |
40 | +@element barchart-datalet | |
41 | +@status v0.1 | |
42 | +@demo demo/index.html | |
43 | +@group datalets | |
44 | +--> | |
45 | + | |
27 | 46 | <dom-module id="treemap-datalet"> |
28 | 47 | <template> |
29 | 48 | <style is="custom-style"> | ... | ... |
node_modules/grunt-bosonic/.npmignore deleted
node_modules/grunt-bosonic/AUTHORS deleted
node_modules/grunt-bosonic/Gruntfile.js deleted
1 | -/* | |
2 | - * grunt-bosonic | |
3 | - * https://github.com/bosonic/grunt-bosonic | |
4 | - * | |
5 | - * Copyright (c) 2013 Raphaรซl Rougeron | |
6 | - * Licensed under the MIT license. | |
7 | - */ | |
8 | - | |
9 | -'use strict'; | |
10 | - | |
11 | -module.exports = function(grunt) { | |
12 | - | |
13 | - grunt.initConfig({ | |
14 | - | |
15 | - clean: { | |
16 | - tests: ['tmp'], | |
17 | - }, | |
18 | - | |
19 | - bosonic: { | |
20 | - sample: { | |
21 | - src: ['samples/spec_sample.html'], | |
22 | - css: 'tmp/spec_sample.css', | |
23 | - js: 'tmp/spec_sample.js' | |
24 | - } | |
25 | - } | |
26 | - | |
27 | - }); | |
28 | - | |
29 | - grunt.loadTasks('tasks'); | |
30 | - | |
31 | - grunt.loadNpmTasks('grunt-contrib-clean'); | |
32 | - | |
33 | - grunt.registerTask('test', ['clean', 'bosonic']); | |
34 | - | |
35 | - grunt.registerTask('default', ['test']); | |
36 | - | |
37 | -}; | |
38 | 0 | \ No newline at end of file |
node_modules/grunt-bosonic/LICENSE deleted
1 | -The MIT License (MIT) | |
2 | - | |
3 | -Copyright (c) 2014 The Bosonic Authors | |
4 | - | |
5 | -Permission is hereby granted, free of charge, to any person obtaining a copy of | |
6 | -this software and associated documentation files (the "Software"), to deal in | |
7 | -the Software without restriction, including without limitation the rights to | |
8 | -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | |
9 | -the Software, and to permit persons to whom the Software is furnished to do so, | |
10 | -subject to the following conditions: | |
11 | - | |
12 | -The above copyright notice and this permission notice shall be included in all | |
13 | -copies or substantial portions of the Software. | |
14 | - | |
15 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
16 | -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | |
17 | -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | |
18 | -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | |
19 | -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
20 | -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
node_modules/grunt-bosonic/README.md deleted
1 | -# grunt-bosonic | |
2 | - | |
3 | -> A Grunt task that transpiles to-the-spec Web Components into polyfilled JavaScript | |
4 | - | |
5 | -## Getting Started | |
6 | -This plugin requires Grunt `~0.4.2` | |
7 | - | |
8 | -If you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command: | |
9 | - | |
10 | -```shell | |
11 | -npm install grunt-bosonic --save-dev | |
12 | -``` | |
13 | - | |
14 | -Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript: | |
15 | - | |
16 | -```js | |
17 | -grunt.loadNpmTasks('grunt-bosonic'); | |
18 | -``` | |
19 | - | |
20 | -## The "bosonic" task | |
21 | - | |
22 | -### Usage | |
23 | -In your project's Gruntfile, add a section named `bosonic` to the data object passed into `grunt.initConfig()`. | |
24 | - | |
25 | -```js | |
26 | -grunt.initConfig({ | |
27 | - bosonic: { | |
28 | - my_components: { | |
29 | - src: ['src/**/*.html'], | |
30 | - css: 'dist/components.css', | |
31 | - js: 'dist/components.js' | |
32 | - } | |
33 | -}); | |
34 | -``` | |
35 | - | |
36 | -## Contributing | |
37 | -In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/). | |
38 | - | |
39 | -## Release History | |
40 | -_(Nothing yet)_ | |
41 | 0 | \ No newline at end of file |
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/.npmignore deleted
1 | -node_modules/* |
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/AUTHORS deleted
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/LICENSE deleted
1 | -The MIT License (MIT) | |
2 | - | |
3 | -Copyright (c) 2014 The Bosonic Authors | |
4 | - | |
5 | -Permission is hereby granted, free of charge, to any person obtaining a copy of | |
6 | -this software and associated documentation files (the "Software"), to deal in | |
7 | -the Software without restriction, including without limitation the rights to | |
8 | -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | |
9 | -the Software, and to permit persons to whom the Software is furnished to do so, | |
10 | -subject to the following conditions: | |
11 | - | |
12 | -The above copyright notice and this permission notice shall be included in all | |
13 | -copies or substantial portions of the Software. | |
14 | - | |
15 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
16 | -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | |
17 | -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | |
18 | -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | |
19 | -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
20 | -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/README.md deleted
1 | -# Bosonic transpiler | |
2 | - | |
3 | -> A node.js library that transpiles to-the-spec Web Components into polyfilled JavaScript | |
4 | - | |
5 | -## Getting started | |
6 | - | |
7 | -If you use Grunt, you may want to use [grunt-bosonic](https://github.com/bosonic/grunt-bosonic) instead. | |
8 | - | |
9 | -## Development | |
10 | - | |
11 | -### Contributing | |
12 | -In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. | |
13 | - | |
14 | -### Running tests | |
15 | - | |
16 | -```shell | |
17 | -nodeunit test/transpiler.js | |
18 | -``` | |
19 | - | |
20 | -### Release History | |
21 | -_(Nothing yet)_ | |
22 | - | |
23 | - |
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/index.js deleted
1 | -module.exports = require('./lib/transpiler'); |
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/lib/macros/element.sjs deleted
1 | -macro def__property { | |
2 | - rule { | |
3 | - get $key:ident ($args1 (,) ...) { $body1 ... } , def__property set $key:ident ($args2 (,) ...) { $body2 ... } | |
4 | - } => { | |
5 | - $key : { | |
6 | - enumerable: true, | |
7 | - get : function() { | |
8 | - $body1 ... | |
9 | - }, | |
10 | - set : function($args2 (,) ...) { | |
11 | - $body2 ... | |
12 | - } | |
13 | - } | |
14 | - } | |
15 | - rule { | |
16 | - set $key:ident ($args2 (,) ...) { $body2 ... }, def__property get $key:ident ($args1 (,) ...) { $body1 ... } | |
17 | - } => { | |
18 | - $key : { | |
19 | - enumerable: true, | |
20 | - get : function() { | |
21 | - $body1 ... | |
22 | - }, | |
23 | - set : function($args2 (,) ...) { | |
24 | - $body2 ... | |
25 | - } | |
26 | - } | |
27 | - } | |
28 | - rule { get $key:ident ($args (,) ...) { $body ... } } => { | |
29 | - $key : { | |
30 | - enumerable: true, | |
31 | - get : function() { | |
32 | - $body ... | |
33 | - } | |
34 | - } | |
35 | - } | |
36 | - rule { set $key:ident ($args (,) ...) { $body ... } } => { | |
37 | - $key : { | |
38 | - enumerable: true, | |
39 | - set : function($args (,) ...) { | |
40 | - $body ... | |
41 | - } | |
42 | - } | |
43 | - } | |
44 | - rule { $key:ident : protected function($args (,) ...) { $body ... } } => { | |
45 | - $key : { | |
46 | - value : function($args (,) ...) { | |
47 | - $body ... | |
48 | - } | |
49 | - } | |
50 | - } | |
51 | - rule { $key:ident : function($args (,) ...) { $body ... } } => { | |
52 | - $key : { | |
53 | - enumerable: true, | |
54 | - value : function($args (,) ...) { | |
55 | - $body ... | |
56 | - } | |
57 | - } | |
58 | - } | |
59 | - rule { $key:ident : $value:expr } => { | |
60 | - $key : { value : $value } | |
61 | - } | |
62 | - rule { $key:ident : $value:lit } => { | |
63 | - $key : { value : $value } | |
64 | - } | |
65 | - rule { $key } => { | |
66 | - $key : { value : null } | |
67 | - } | |
68 | -} | |
69 | - | |
70 | -macro def__element { | |
71 | - case { _ $name:lit extends $extendee:ident { $properties:def__property (,) ... } } => { | |
72 | - var stx1 = #{$name}, | |
73 | - stx2 = #{$extendee}, | |
74 | - name = stx1[0].token.value, | |
75 | - extendee = stx2[0].token.value, | |
76 | - extendeeTag = extendee.decamelize(), | |
77 | - tagName = makeValue(name, #{$name}), | |
78 | - elementName = makeIdent(name.camelize(), #{$name}), | |
79 | - protoName = makeIdent(name.camelize() + 'Prototype', #{$name}); | |
80 | - | |
81 | - letstx $tagName = [tagName]; | |
82 | - letstx $elementName = [elementName]; | |
83 | - letstx $protoName = [protoName]; | |
84 | - | |
85 | - if (extendee === 'HTMLElement') { | |
86 | - return #{ | |
87 | - var $protoName = Object.create($extendee.prototype, { $properties (,) ... }); | |
88 | - window.$elementName = document.registerElement($tagName, { | |
89 | - prototype: $protoName | |
90 | - }); | |
91 | - } | |
92 | - } else if (extendeeTag.indexOf('-') === -1) { // We extend a native element | |
93 | - var htmlextendee = makeIdent('HTML'+extendee+'Element', #{$extendee}), | |
94 | - htmlextendeeTag = makeValue(extendeeTag, #{$extendee}); | |
95 | - letstx $htmlextendeeTag = [htmlextendeeTag]; | |
96 | - letstx $htmlextendee = [htmlextendee]; | |
97 | - return #{ | |
98 | - var $protoName = Object.create($htmlextendee.prototype, { $properties (,) ... }); | |
99 | - window.$elementName = document.registerElement($tagName, { | |
100 | - prototype: $protoName, | |
101 | - extends: $htmlextendeeTag | |
102 | - }); | |
103 | - Object.defineProperty($elementName.prototype, '_super', { | |
104 | - enumerable: false, | |
105 | - writable: false, | |
106 | - configurable: false, | |
107 | - value: $htmlextendee.prototype | |
108 | - }); | |
109 | - } | |
110 | - } else { | |
111 | - return #{ | |
112 | - var $protoName = Object.create($extendee.prototype, { $properties (,) ... }); | |
113 | - window.$elementName = document.registerElement($tagName, { | |
114 | - prototype: $protoName | |
115 | - }); | |
116 | - Object.defineProperty($elementName.prototype, '_super', { | |
117 | - enumerable: false, | |
118 | - writable: false, | |
119 | - configurable: false, | |
120 | - value: $extendee.prototype | |
121 | - }); | |
122 | - } | |
123 | - } | |
124 | - } | |
125 | - | |
126 | - case { $macro $name:lit extends $extendee:lit } => { | |
127 | - var stx = #{$extendee}, | |
128 | - extendee = stx[0].token.value, | |
129 | - extendeeName = makeIdent(extendee.camelize(), #{$extendee}); | |
130 | - | |
131 | - letstx $extendeeName = [extendeeName]; | |
132 | - | |
133 | - return #{ | |
134 | - $macro $name extends $extendeeName | |
135 | - } | |
136 | - } | |
137 | - | |
138 | - case { $macro $name:lit } => { | |
139 | - return #{ | |
140 | - $macro $name extends HTMLElement | |
141 | - } | |
142 | - } | |
143 | -} |
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/lib/macros/template.sjs deleted
1 | -macro def__template { | |
2 | - case { _ $name:lit $html:lit } => { | |
3 | - var stx = #{$name}, | |
4 | - tagName = stx[0].token.value, | |
5 | - protoName = makeIdent(tagName.camelize() + 'Prototype', #{$name}); | |
6 | - | |
7 | - letstx $protoName = [protoName]; | |
8 | - | |
9 | - return #{ | |
10 | - Object.defineProperty($protoName, 'template', { | |
11 | - get: function() { | |
12 | - var fragment = document.createDocumentFragment(); | |
13 | - var div = fragment.appendChild(document.createElement('div')); | |
14 | - div.innerHTML = $html; | |
15 | - while (child = div.firstChild) { | |
16 | - fragment.insertBefore(child, div); | |
17 | - } | |
18 | - fragment.removeChild(div); | |
19 | - return { content: fragment } | |
20 | - } | |
21 | - }); | |
22 | - } | |
23 | - } | |
24 | -} |
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/lib/transpiler.js deleted
1 | -/* | |
2 | - * Bosonic transpiler | |
3 | - * https://github.com/bosonic/transpiler | |
4 | - * | |
5 | - * Copyright (c) 2013 Raphaรซl Rougeron | |
6 | - * Licensed under the MIT license. | |
7 | - */ | |
8 | - | |
9 | -'use strict'; | |
10 | - | |
11 | -var _ = require('underscore'), | |
12 | - fs = require('fs'), | |
13 | - cheerio = require('cheerio'), | |
14 | - esprima = require('esprima'), | |
15 | - escodegen = require('escodegen'), | |
16 | - estraverse = require('estraverse'), | |
17 | - sweet = require('sweet.js'); | |
18 | - | |
19 | -function camelize(str) { | |
20 | - var camelized = str.replace(/(\-|_|\.|\s)+(.)?/g, function(match, separator, chr) { | |
21 | - return chr ? chr.toUpperCase() : ''; | |
22 | - }).replace(/^([A-Z])/, function(match, separator, chr) { | |
23 | - return match.toLowerCase(); | |
24 | - }); | |
25 | - return camelized.charAt(0).toUpperCase() + camelized.slice(1); | |
26 | -} | |
27 | -String.prototype.camelize = function() { | |
28 | - return camelize(this); | |
29 | -}; | |
30 | - | |
31 | -function decamelize(str) { | |
32 | - str = str.charAt(0).toLowerCase() + str.slice(1); | |
33 | - return str.replace(/([a-z\d])([A-Z])/g, '$1-$2').toLowerCase(); | |
34 | -} | |
35 | -String.prototype.decamelize = function() { | |
36 | - return decamelize(this); | |
37 | -}; | |
38 | - | |
39 | -function shimSelector(selector, elementName) { | |
40 | - var shimed = false, | |
41 | - selectorRegexes = [ | |
42 | - [/^:host\(([^:]+)\)$/, elementName+'$1'], | |
43 | - [/^:host(:hover|:active|:focus)$/, elementName+'$1'], | |
44 | - [/^:host(\[[^:]+\])$/, elementName+'$1'], | |
45 | - [/^:host$/, elementName], | |
46 | - [/^:ancestor\(([^:]+)\)$/, '$1 '+elementName], // deprecated; replaced by :host-context | |
47 | - [/^:host-context\(([^:]+)\)$/, '$1 '+elementName], | |
48 | - [/^::content/, elementName], | |
49 | - ]; | |
50 | - | |
51 | - for (var i = 0; i < selectorRegexes.length; i++) { | |
52 | - var re = selectorRegexes[i]; | |
53 | - if (selector.match(re[0])) { | |
54 | - shimed = true; | |
55 | - selector = selector.replace(re[0], re[1]); | |
56 | - break; | |
57 | - } | |
58 | - } | |
59 | - if (!shimed && !selector.match(new RegExp(elementName))) { | |
60 | - selector = elementName + ' ' + selector; | |
61 | - } | |
62 | - return selector; | |
63 | -} | |
64 | - | |
65 | -function shimStyles(styles, elementName) { | |
66 | - var css = require('css'), | |
67 | - parseTree = css.parse(styles); | |
68 | - | |
69 | - parseTree.stylesheet.rules.forEach(function(rule) { | |
70 | - rule.selectors.forEach(function(selector, i, selectorsRef) { | |
71 | - selectorsRef[i] = shimSelector(selector, elementName); | |
72 | - }); | |
73 | - }); | |
74 | - | |
75 | - return css.stringify(parseTree); | |
76 | -} | |
77 | - | |
78 | -function preCompile(elementName, script, template, extendee) { | |
79 | - var sourceAst = esprima.parse(script, { loc: true }), | |
80 | - fullElementName = extendee ? "'" + elementName + "' extends '" + extendee + "'" : "'" + elementName + "'"; | |
81 | - | |
82 | - // According to the spec, the last value of the <script> must be an object whose properties will define | |
83 | - // the new element's API. This object must therefore be wrapped in an ExpressionStatement | |
84 | - var exprStmt = sourceAst.body[sourceAst.body.length - 1]; | |
85 | - if (exprStmt.type !== 'ExpressionStatement') { | |
86 | - throw new Error('The last value of the <script> must be an ExpressionStatement'); | |
87 | - } | |
88 | - if (exprStmt.expression.type !== 'ObjectExpression') { | |
89 | - throw new Error('The last value of the <script> must be an ExpressionStatement whose expression must be an object literal'); | |
90 | - } | |
91 | - | |
92 | - // We grab all the code prior to the ExpressionStatement and prepend it to the code to output | |
93 | - var outerCode = []; | |
94 | - for (var i = 0; i <= sourceAst.body.length - 2; i++) { | |
95 | - outerCode.push(escodegen.generate(sourceAst.body[i])); | |
96 | - } | |
97 | - | |
98 | - var precompiledCode = outerCode.join("\n"); | |
99 | - precompiledCode+= '\ndef__element ' + fullElementName + ' ' + escodegen.generate(exprStmt.expression) + '\n'; | |
100 | - if (template) { | |
101 | - template = "'"+template.replace(/\r?\n/g, '')+"'"; | |
102 | - precompiledCode+= '\ndef__template "' + elementName + '" ' + template + '\n'; | |
103 | - } | |
104 | - | |
105 | - return precompiledCode; | |
106 | -} | |
107 | - | |
108 | -function compile(precompiledCode) { | |
109 | - var macros = fs.readFileSync(__dirname + '/macros/element.sjs', 'utf8') | |
110 | - + '\n' + fs.readFileSync(__dirname + '/macros/template.sjs', 'utf8'); | |
111 | - return sweet.compile(macros + '\n' + precompiledCode, { readableNames: true }).code; | |
112 | -} | |
113 | - | |
114 | -function transpile(htmlString) { | |
115 | - var mainScript, | |
116 | - sourceAst, | |
117 | - scriptDeps = [], | |
118 | - cssDeps = [], | |
119 | - $ = cheerio.load(htmlString), | |
120 | - element = $('element'), | |
121 | - template = $('template').html(), | |
122 | - style = $('style').html(), | |
123 | - scripts = $('script'), | |
124 | - stylesheets = $('link[rel=stylesheet]'), | |
125 | - elementName = element.attr('name'), | |
126 | - extendee = element.attr('extends'); | |
127 | - | |
128 | - scripts.each(function(i, script) { | |
129 | - if ($(this).attr('src')) { | |
130 | - scriptDeps.push($(this).attr('src')); | |
131 | - } else { | |
132 | - if (mainScript !== undefined) { | |
133 | - throw new Error('Only one <script> is permitted in a Web Component declaration'); | |
134 | - } | |
135 | - mainScript = $(this).html(); | |
136 | - } | |
137 | - }); | |
138 | - | |
139 | - stylesheets.each(function(i, link) { | |
140 | - cssDeps.push($(this).attr('href')); | |
141 | - }); | |
142 | - | |
143 | - if (style !== null) { | |
144 | - style = shimStyles(style, elementName); | |
145 | - } | |
146 | - | |
147 | - // We can't normalize whitespace during the first parse because it will normalize WS in the JS too | |
148 | - if (template !== null) { | |
149 | - $ = cheerio.load(htmlString, { | |
150 | - normalizeWhitespace: true | |
151 | - }); | |
152 | - template = $('template').html(); | |
153 | - } | |
154 | - | |
155 | - if (mainScript === undefined) { | |
156 | - throw new Error('A <script> is mandatory in a Web Component declaration'); | |
157 | - } | |
158 | - | |
159 | - var precompiledCode = preCompile(elementName, mainScript, template, extendee); | |
160 | - | |
161 | - var output = '(function () {\n' + compile(precompiledCode) + '\n}());\n'; | |
162 | - | |
163 | - // We do another pass with Esprima in order to indent JS code correctly | |
164 | - var outputAst = esprima.parse(output); | |
165 | - output = escodegen.generate(outputAst); | |
166 | - | |
167 | - return { | |
168 | - js: output, | |
169 | - css: style, | |
170 | - template: template, | |
171 | - scripts: scriptDeps, | |
172 | - stylesheets: cssDeps | |
173 | - }; | |
174 | -} | |
175 | - | |
176 | -exports = module.exports = { | |
177 | - transpile: transpile, | |
178 | - preCompile: preCompile, | |
179 | - compile: compile, | |
180 | - shimStyles: shimStyles, | |
181 | - shimSelector: shimSelector | |
182 | -} | |
183 | - |
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/package.json deleted
1 | -{ | |
2 | - "name": "bosonic-transpiler", | |
3 | - "version": "0.4.6", | |
4 | - "description": "A node.js library that transpiles to-the-spec Web Components into polyfilled JavaScript", | |
5 | - "main": "index.js", | |
6 | - "scripts": { | |
7 | - "test": "echo \"Error: no test specified\" && exit 1" | |
8 | - }, | |
9 | - "repository": { | |
10 | - "type": "git", | |
11 | - "url": "git://github.com/bosonic/transpiler.git" | |
12 | - }, | |
13 | - "author": { | |
14 | - "name": "Raphaรซl Rougeron", | |
15 | - "email": "goldoraf@gmail.com" | |
16 | - }, | |
17 | - "license": "MIT", | |
18 | - "bugs": { | |
19 | - "url": "https://github.com/bosonic/transpiler/issues" | |
20 | - }, | |
21 | - "dependencies": { | |
22 | - "underscore": "~1.6.0", | |
23 | - "cheerio": "~0.13.1", | |
24 | - "esprima": "~1.0.4", | |
25 | - "escodegen": "~1.2.0", | |
26 | - "estraverse": "~1.5.0", | |
27 | - "css": "^1.6.0", | |
28 | - "sweet.js": "^0.5.0" | |
29 | - }, | |
30 | - "devDependencies": { | |
31 | - "nodeunit": "~0.8.5" | |
32 | - }, | |
33 | - "contributors": [ | |
34 | - { | |
35 | - "name": "Raphaรซl Rougeron", | |
36 | - "email": "goldoraf@gmail.com" | |
37 | - } | |
38 | - ], | |
39 | - "readme": "# Bosonic transpiler\n\n> A node.js library that transpiles to-the-spec Web Components into polyfilled JavaScript\n\n## Getting started\n\nIf you use Grunt, you may want to use [grunt-bosonic](https://github.com/bosonic/grunt-bosonic) instead.\n\n## Development\n\n### Contributing\nIn lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality.\n\n### Running tests\n\n```shell\nnodeunit test/transpiler.js\n```\n\n### Release History\n_(Nothing yet)_\n\n\n", | |
40 | - "readmeFilename": "README.md", | |
41 | - "_id": "bosonic-transpiler@0.4.6", | |
42 | - "_from": "bosonic-transpiler@0.4.*" | |
43 | -} |
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/expected/compiled_spec_sample_script.js deleted
1 | -function start() { | |
2 | - this.tick(); | |
3 | - this._interval = window.setInterval(this.tick.bind(this), 1000); | |
4 | -} | |
5 | -function stop() { | |
6 | - window.clearInterval(this._interval); | |
7 | -} | |
8 | -function fmt(n) { | |
9 | - return (n < 10 ? '0' : '') + n; | |
10 | -} | |
11 | -var BTestPrototype = Object.create(HTMLElement.prototype, { | |
12 | - readyCallback: { | |
13 | - enumerable: true, | |
14 | - value: function () { | |
15 | - this._root = this.createShadowRoot(); | |
16 | - this._root.appendChild(this.template.content.cloneNode()); | |
17 | - if (this.parentElement) { | |
18 | - start.call(this); | |
19 | - } | |
20 | - } | |
21 | - }, | |
22 | - insertedCallback: { value: start }, | |
23 | - removedCallback: { value: stop }, | |
24 | - tick: { | |
25 | - enumerable: true, | |
26 | - value: function () { | |
27 | - var now = new Date(); | |
28 | - this._root.querySelector('hh').textContent = fmt(now.getHours()); | |
29 | - this._root.querySelector('sep').style.visibility = now.getSeconds() % 2 ? 'visible' : 'hidden'; | |
30 | - this._root.querySelector('mm').textContent = fmt(now.getMinutes()); | |
31 | - } | |
32 | - } | |
33 | - }); | |
34 | -window.BTest = document.registerElement('b-test', { prototype: BTestPrototype }); | |
35 | -Object.defineProperty(BTestPrototype, 'template', { | |
36 | - get: function () { | |
37 | - var fragment = document.createDocumentFragment(); | |
38 | - var div = fragment.appendChild(document.createElement('div')); | |
39 | - div.innerHTML = '<div><content></content></div>'; | |
40 | - while (child = div.firstChild) { | |
41 | - fragment.insertBefore(child, div); | |
42 | - } | |
43 | - fragment.removeChild(div); | |
44 | - return { content: fragment }; | |
45 | - } | |
46 | -}); | |
47 | 0 | \ No newline at end of file |
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/expected/extended_bosonic_element.js deleted
1 | -(function () { | |
2 | - var BModalPrototype = Object.create(BDialog.prototype, { | |
3 | - dummy: { | |
4 | - enumerable: true, | |
5 | - value: function () { | |
6 | - console.log('bar'); | |
7 | - } | |
8 | - } | |
9 | - }); | |
10 | - window.BModal = document.registerElement('b-modal', { prototype: BModalPrototype }); | |
11 | - Object.defineProperty(BModal.prototype, '_super', { | |
12 | - enumerable: false, | |
13 | - writable: false, | |
14 | - configurable: false, | |
15 | - value: BDialog.prototype | |
16 | - }); | |
17 | -}()); | |
18 | 0 | \ No newline at end of file |
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/expected/extended_native_element.js deleted
1 | -(function () { | |
2 | - var SuperButtonPrototype = Object.create(HTMLButtonElement.prototype, { | |
3 | - dummy: { | |
4 | - enumerable: true, | |
5 | - value: function () { | |
6 | - console.log('bar'); | |
7 | - } | |
8 | - } | |
9 | - }); | |
10 | - window.SuperButton = document.registerElement('super-button', { | |
11 | - prototype: SuperButtonPrototype, | |
12 | - extends: 'button' | |
13 | - }); | |
14 | - Object.defineProperty(SuperButton.prototype, '_super', { | |
15 | - enumerable: false, | |
16 | - writable: false, | |
17 | - configurable: false, | |
18 | - value: HTMLButtonElement.prototype | |
19 | - }); | |
20 | -}()); | |
21 | 0 | \ No newline at end of file |
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/expected/extended_spec_sample.js deleted
1 | -(function () { | |
2 | - var SuperTickTockClockPrototype = Object.create(TickTockClock.prototype, { | |
3 | - tick: { | |
4 | - enumerable: true, | |
5 | - value: function () { | |
6 | - this._super.tick.call(this); | |
7 | - console.log('tick'); | |
8 | - } | |
9 | - } | |
10 | - }); | |
11 | - window.SuperTickTockClock = document.registerElement('super-tick-tock-clock', { prototype: SuperTickTockClockPrototype }); | |
12 | - Object.defineProperty(SuperTickTockClock.prototype, '_super', { | |
13 | - enumerable: false, | |
14 | - writable: false, | |
15 | - configurable: false, | |
16 | - value: TickTockClock.prototype | |
17 | - }); | |
18 | -}()); | |
19 | 0 | \ No newline at end of file |
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/expected/getter_setter_bug.js deleted
1 | -var BTestPrototype = Object.create(HTMLElement.prototype, { | |
2 | - width: { | |
3 | - enumerable: true, | |
4 | - get: function () { | |
5 | - return 100; | |
6 | - } | |
7 | - }, | |
8 | - height: { | |
9 | - enumerable: true, | |
10 | - get: function () { | |
11 | - return 50; | |
12 | - } | |
13 | - }, | |
14 | - margin: { | |
15 | - enumerable: true, | |
16 | - set: function (val) { | |
17 | - this.val = val; | |
18 | - } | |
19 | - } | |
20 | - }); | |
21 | -window.BTest = document.registerElement('b-test', { prototype: BTestPrototype }); | |
22 | 0 | \ No newline at end of file |
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/expected/precompiled_spec_sample_script.js deleted
1 | -function start() { | |
2 | - this.tick(); | |
3 | - this._interval = window.setInterval(this.tick.bind(this), 1000); | |
4 | -} | |
5 | -function stop() { | |
6 | - window.clearInterval(this._interval); | |
7 | -} | |
8 | -function fmt(n) { | |
9 | - return (n < 10 ? '0' : '') + n; | |
10 | -} | |
11 | -def__element 'b-test' { | |
12 | - readyCallback: function () { | |
13 | - this._root = this.createShadowRoot(); | |
14 | - this._root.appendChild(this.template.content.cloneNode()); | |
15 | - if (this.parentElement) { | |
16 | - start.call(this); | |
17 | - } | |
18 | - }, | |
19 | - insertedCallback: start, | |
20 | - removedCallback: stop, | |
21 | - tick: function () { | |
22 | - var now = new Date(); | |
23 | - this._root.querySelector('hh').textContent = fmt(now.getHours()); | |
24 | - this._root.querySelector('sep').style.visibility = now.getSeconds() % 2 ? 'visible' : 'hidden'; | |
25 | - this._root.querySelector('mm').textContent = fmt(now.getMinutes()); | |
26 | - } | |
27 | -} | |
28 | - | |
29 | -def__template "b-test" '<div><content></content></div>' |
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/expected/shimed_shadowCSS_sample.css deleted
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/expected/spec_sample.css deleted
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/expected/spec_sample.js deleted
1 | -(function () { | |
2 | - function start() { | |
3 | - this.tick(); | |
4 | - this._interval = window.setInterval(this.tick.bind(this), 1000); | |
5 | - } | |
6 | - function stop() { | |
7 | - window.clearInterval(this._interval); | |
8 | - } | |
9 | - function fmt(n) { | |
10 | - return (n < 10 ? '0' : '') + n; | |
11 | - } | |
12 | - var TickTockClockPrototype = Object.create(HTMLElement.prototype, { | |
13 | - readyCallback: { | |
14 | - enumerable: true, | |
15 | - value: function () { | |
16 | - this._root = this.createShadowRoot(); | |
17 | - this._root.appendChild(this.template.content.cloneNode()); | |
18 | - if (this.parentElement) { | |
19 | - start.call(this); | |
20 | - } | |
21 | - } | |
22 | - }, | |
23 | - insertedCallback: { value: start }, | |
24 | - removedCallback: { value: stop }, | |
25 | - tick: { | |
26 | - enumerable: true, | |
27 | - value: function () { | |
28 | - var now = new Date(); | |
29 | - this._root.querySelector('hh').textContent = fmt(now.getHours()); | |
30 | - this._root.querySelector('sep').style.visibility = now.getSeconds() % 2 ? 'visible' : 'hidden'; | |
31 | - this._root.querySelector('mm').textContent = fmt(now.getMinutes()); | |
32 | - } | |
33 | - } | |
34 | - }); | |
35 | - window.TickTockClock = document.registerElement('tick-tock-clock', { prototype: TickTockClockPrototype }); | |
36 | - Object.defineProperty(TickTockClockPrototype, 'template', { | |
37 | - get: function () { | |
38 | - var fragment = document.createDocumentFragment(); | |
39 | - var div = fragment.appendChild(document.createElement('div')); | |
40 | - div.innerHTML = ' <span id="hh"></span> <span id="sep">:</span> <span id="mm"></span> '; | |
41 | - while (child = div.firstChild) { | |
42 | - fragment.insertBefore(child, div); | |
43 | - } | |
44 | - fragment.removeChild(div); | |
45 | - return { content: fragment }; | |
46 | - } | |
47 | - }); | |
48 | -}()); | |
49 | 0 | \ No newline at end of file |
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/fixtures/extended_bosonic_element.html deleted
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/fixtures/extended_native_element.html deleted
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/fixtures/extended_spec_sample.html deleted
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/fixtures/getter_setter_bug.js deleted
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/fixtures/protected_function.html deleted
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/fixtures/sample_with_deps.html deleted
1 | -<element name="sample-with-deps"> | |
2 | - <template> | |
3 | - <div></div> | |
4 | - </template> | |
5 | - <link href="../node_modules/pikaday/css/pikaday.css" rel="stylesheet"> | |
6 | - <script src="../node_modules/moment/moment.js"></script> | |
7 | - <script> | |
8 | - ({ | |
9 | - readyCallback: function () { | |
10 | - | |
11 | - } | |
12 | - }); | |
13 | - </script> | |
14 | - <script src="../node_modules/pikaday/pikaday.js"></script> | |
15 | -</element> | |
16 | 0 | \ No newline at end of file |
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/fixtures/shadowCSS_sample.css deleted
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/fixtures/spec_sample.html deleted
1 | -<element name="tick-tock-clock"> | |
2 | - <template> | |
3 | - <span id="hh"></span> | |
4 | - <span id="sep">:</span> | |
5 | - <span id="mm"></span> | |
6 | - </template> | |
7 | - <style> | |
8 | - :host { | |
9 | - border: 1px solid #ccc; | |
10 | - } | |
11 | - </style> | |
12 | - <script> | |
13 | - function start() { | |
14 | - this.tick(); | |
15 | - this._interval = window.setInterval(this.tick.bind(this), 1000); | |
16 | - } | |
17 | - function stop() { | |
18 | - window.clearInterval(this._interval); | |
19 | - } | |
20 | - function fmt(n) { | |
21 | - return (n < 10 ? '0' : '') + n; | |
22 | - } | |
23 | - | |
24 | - ({ | |
25 | - readyCallback: function () { | |
26 | - this._root = this.createShadowRoot(); | |
27 | - this._root.appendChild(this.template.content.cloneNode()); | |
28 | - if (this.parentElement) { | |
29 | - start.call(this); | |
30 | - } | |
31 | - }, | |
32 | - insertedCallback: start, | |
33 | - removedCallback: stop, | |
34 | - tick: function () { | |
35 | - var now = new Date(); | |
36 | - this._root.querySelector('hh').textContent = fmt(now.getHours()); | |
37 | - this._root.querySelector('sep').style.visibility = | |
38 | - now.getSeconds() % 2 ? 'visible' : 'hidden'; | |
39 | - this._root.querySelector('mm').textContent = fmt(now.getMinutes()); | |
40 | - } | |
41 | - }); | |
42 | - </script> | |
43 | -</element> | |
44 | 0 | \ No newline at end of file |
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/fixtures/spec_sample_script.js deleted
1 | -function start() { | |
2 | - this.tick(); | |
3 | - this._interval = window.setInterval(this.tick.bind(this), 1000); | |
4 | -} | |
5 | -function stop() { | |
6 | - window.clearInterval(this._interval); | |
7 | -} | |
8 | -function fmt(n) { | |
9 | - return (n < 10 ? '0' : '') + n; | |
10 | -} | |
11 | - | |
12 | -({ | |
13 | - readyCallback: function () { | |
14 | - this._root = this.createShadowRoot(); | |
15 | - this._root.appendChild(this.template.content.cloneNode()); | |
16 | - if (this.parentElement) { | |
17 | - start.call(this); | |
18 | - } | |
19 | - }, | |
20 | - insertedCallback: start, | |
21 | - removedCallback: stop, | |
22 | - tick: function () { | |
23 | - var now = new Date(); | |
24 | - this._root.querySelector('hh').textContent = fmt(now.getHours()); | |
25 | - this._root.querySelector('sep').style.visibility = | |
26 | - now.getSeconds() % 2 ? 'visible' : 'hidden'; | |
27 | - this._root.querySelector('mm').textContent = fmt(now.getMinutes()); | |
28 | - } | |
29 | -}); | |
30 | 0 | \ No newline at end of file |
node_modules/grunt-bosonic/node_modules/bosonic-transpiler/test/transpiler.js deleted
1 | -var fs = require('fs'), | |
2 | - transpiler = require('../'), | |
3 | - sweet = require('sweet.js'); | |
4 | - | |
5 | -exports.testSimpleTranspilation = function(test) { | |
6 | - test.expect(4); | |
7 | - var transpiled = transpiler.transpile(fs.readFileSync(__dirname + '/fixtures/spec_sample.html', 'utf8')), | |
8 | - expected = { | |
9 | - js: fs.readFileSync(__dirname + '/expected/spec_sample.js', 'utf8'), | |
10 | - css: fs.readFileSync(__dirname + '/expected/spec_sample.css', 'utf8') | |
11 | - }; | |
12 | - test.equal(transpiled.js, expected.js, "the JS should be transpiled"); | |
13 | - test.equal(transpiled.css, expected.css, "the CSS should be shimmed"); | |
14 | - test.equal(transpiled.scripts.length, 0); | |
15 | - test.equal(transpiled.stylesheets.length, 0); | |
16 | - test.done(); | |
17 | -} | |
18 | - | |
19 | -exports.testExtendsTranspilation = function(test) { | |
20 | - test.expect(1); | |
21 | - var transpiled = transpiler.transpile(fs.readFileSync(__dirname + '/fixtures/extended_spec_sample.html', 'utf8')), | |
22 | - expected = fs.readFileSync(__dirname + '/expected/extended_spec_sample.js', 'utf8'); | |
23 | - test.equal(transpiled.js, expected, "the JS should be transpiled"); | |
24 | - test.done(); | |
25 | -} | |
26 | - | |
27 | -exports.testExtendsNativeElementTranspilation = function(test) { | |
28 | - test.expect(1); | |
29 | - var transpiled = transpiler.transpile(fs.readFileSync(__dirname + '/fixtures/extended_native_element.html', 'utf8')), | |
30 | - expected = fs.readFileSync(__dirname + '/expected/extended_native_element.js', 'utf8'); | |
31 | - test.equal(transpiled.js, expected, "the JS should be transpiled"); | |
32 | - test.done(); | |
33 | -} | |
34 | - | |
35 | -exports.testExtendsBosonicElementTranspilation = function(test) { | |
36 | - test.expect(1); | |
37 | - var transpiled = transpiler.transpile(fs.readFileSync(__dirname + '/fixtures/extended_bosonic_element.html', 'utf8')), | |
38 | - expected = fs.readFileSync(__dirname + '/expected/extended_bosonic_element.js', 'utf8'); | |
39 | - test.equal(transpiled.js, expected, "the JS should be transpiled"); | |
40 | - test.done(); | |
41 | -} | |
42 | - | |
43 | -exports.testScriptDependency = function(test) { | |
44 | - test.expect(1); | |
45 | - var transpiled = transpiler.transpile(fs.readFileSync(__dirname + '/fixtures/sample_with_deps.html', 'utf8')), | |
46 | - expected = { | |
47 | - scripts: ["../node_modules/moment/moment.js", "../node_modules/pikaday/pikaday.js"] | |
48 | - }; | |
49 | - test.deepEqual(transpiled.scripts, expected.scripts, "the script dependencies should be found"); | |
50 | - test.done(); | |
51 | -} | |
52 | - | |
53 | -exports.testStylesheetDependency = function(test) { | |
54 | - test.expect(1); | |
55 | - var transpiled = transpiler.transpile(fs.readFileSync(__dirname + '/fixtures/sample_with_deps.html', 'utf8')), | |
56 | - expected = { | |
57 | - stylesheets: ["../node_modules/pikaday/css/pikaday.css"] | |
58 | - }; | |
59 | - test.deepEqual(transpiled.stylesheets, expected.stylesheets, "the stylesheets dependencies should be found"); | |
60 | - test.done(); | |
61 | -} | |
62 | - | |
63 | -exports.testStylesShiming = function(test) { | |
64 | - var tests = [ | |
65 | - [':host', 'b-dummy'], | |
66 | - [':host:hover', 'b-dummy:hover'], | |
67 | - [':host[visible]', 'b-dummy[visible]'], | |
68 | - [':host(.cssClass)', 'b-dummy.cssClass'], | |
69 | - [':ancestor(.cssClass)', '.cssClass b-dummy'], | |
70 | - [':host-context(.cssClass)', '.cssClass b-dummy'], | |
71 | - ['p', 'b-dummy p'], | |
72 | - ['b-dummy', 'b-dummy'], | |
73 | - ['b-dummy p', 'b-dummy p'], | |
74 | - ['::content p', 'b-dummy p'] | |
75 | - ]; | |
76 | - test.expect(tests.length); | |
77 | - tests.forEach(function(rule) { | |
78 | - test.equal(transpiler.shimSelector(rule[0], 'b-dummy'), rule[1]); | |
79 | - }); | |
80 | - test.done(); | |
81 | -} | |
82 | - | |
83 | -exports.testStylesheetShiming = function(test) { | |
84 | - var stylesheet = fs.readFileSync(__dirname + '/fixtures/shadowCSS_sample.css', 'utf8'), | |
85 | - shimmed = fs.readFileSync(__dirname + '/expected/shimed_shadowCSS_sample.css', 'utf8'); | |
86 | - | |
87 | - test.expect(1); | |
88 | - test.equal(transpiler.shimStyles(stylesheet, 'b-dummy'), shimmed); | |
89 | - test.done(); | |
90 | -} | |
91 | - | |
92 | -exports.testPreCompile = function(test) { | |
93 | - test.expect(1); | |
94 | - var script = fs.readFileSync(__dirname + '/fixtures/spec_sample_script.js', 'utf8'), | |
95 | - code = transpiler.preCompile('b-test', script, '<div><content></content></div>'), | |
96 | - expected = fs.readFileSync(__dirname + '/expected/precompiled_spec_sample_script.js', 'utf8'); | |
97 | - test.equal(code, expected); | |
98 | - test.done(); | |
99 | -} | |
100 | - | |
101 | -exports.testCompile = function(test) { | |
102 | - test.expect(1); | |
103 | - var code = transpiler.compile(fs.readFileSync(__dirname + '/expected/precompiled_spec_sample_script.js', 'utf8')), | |
104 | - expected = fs.readFileSync(__dirname + '/expected/compiled_spec_sample_script.js', 'utf8'); | |
105 | - test.equal(code, expected); | |
106 | - test.done(); | |
107 | -} | |
108 | - | |
109 | -exports.testGetterSetterBug = function(test) { | |
110 | - test.expect(1); | |
111 | - var code = transpiler.compile(fs.readFileSync(__dirname + '/fixtures/getter_setter_bug.js', 'utf8')), | |
112 | - expected = fs.readFileSync(__dirname + '/expected/getter_setter_bug.js', 'utf8'); | |
113 | - test.equal(code, expected); | |
114 | - test.done(); | |
115 | -} |
node_modules/grunt-bosonic/package.json deleted
1 | -{ | |
2 | - "name": "grunt-bosonic", | |
3 | - "version": "0.4.0", | |
4 | - "description": "> A Grunt task that transpiles to-the-spec Web Components into polyfilled JavaScript", | |
5 | - "main": "Gruntfile.js", | |
6 | - "scripts": { | |
7 | - "test": "grunt test" | |
8 | - }, | |
9 | - "repository": { | |
10 | - "type": "git", | |
11 | - "url": "git://github.com/bosonic/grunt-bosonic.git" | |
12 | - }, | |
13 | - "author": { | |
14 | - "name": "Raphaรซl Rougeron", | |
15 | - "email": "goldoraf@gmail.com" | |
16 | - }, | |
17 | - "license": "MIT", | |
18 | - "bugs": { | |
19 | - "url": "https://github.com/bosonic/grunt-bosonic/issues" | |
20 | - }, | |
21 | - "dependencies": { | |
22 | - "bosonic-transpiler": "0.4.*" | |
23 | - }, | |
24 | - "devDependencies": { | |
25 | - "grunt": "~0.4.2", | |
26 | - "grunt-contrib-clean": "~0.5.0" | |
27 | - }, | |
28 | - "peerDependencies": { | |
29 | - "grunt": "0.4.x" | |
30 | - }, | |
31 | - "contributors": [ | |
32 | - { | |
33 | - "name": "Raphaรซl Rougeron", | |
34 | - "email": "goldoraf@gmail.com" | |
35 | - } | |
36 | - ], | |
37 | - "readme": "# grunt-bosonic\n\n> A Grunt task that transpiles to-the-spec Web Components into polyfilled JavaScript\n\n## Getting Started\nThis plugin requires Grunt `~0.4.2`\n\nIf you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:\n\n```shell\nnpm install grunt-bosonic --save-dev\n```\n\nOnce the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:\n\n```js\ngrunt.loadNpmTasks('grunt-bosonic');\n```\n\n## The \"bosonic\" task\n\n### Usage\nIn your project's Gruntfile, add a section named `bosonic` to the data object passed into `grunt.initConfig()`.\n\n```js\ngrunt.initConfig({\n bosonic: {\n my_components: {\n src: ['src/**/*.html'],\n css: 'dist/components.css',\n js: 'dist/components.js'\n }\n});\n```\n\n## Contributing\nIn lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).\n\n## Release History\n_(Nothing yet)_", | |
38 | - "readmeFilename": "README.md", | |
39 | - "_id": "grunt-bosonic@0.4.0", | |
40 | - "_from": "grunt-bosonic@" | |
41 | -} |
node_modules/grunt-bosonic/samples/spec_sample.html deleted
1 | -<element name="tick-tock-clock"> | |
2 | - <template> | |
3 | - <span id="hh"></span> | |
4 | - <span id="sep">:</span> | |
5 | - <span id="mm"></span> | |
6 | - </template> | |
7 | - <script> | |
8 | - function start() { | |
9 | - this.tick(); | |
10 | - this._interval = window.setInterval(this.tick.bind(this), 1000); | |
11 | - } | |
12 | - function stop() { | |
13 | - window.clearInterval(this._interval); | |
14 | - } | |
15 | - function fmt(n) { | |
16 | - return (n < 10 ? '0' : '') + n; | |
17 | - } | |
18 | - | |
19 | - ({ | |
20 | - readyCallback: function () { | |
21 | - this._root = this.createShadowRoot(); | |
22 | - this._root.appendChild(this.template.content.cloneNode()); | |
23 | - if (this.parentElement) { | |
24 | - start.call(this); | |
25 | - } | |
26 | - }, | |
27 | - insertedCallback: start, | |
28 | - removedCallback: stop, | |
29 | - tick: function () { | |
30 | - var now = new Date(); | |
31 | - this._root.querySelector('hh').textContent = fmt(now.getHours()); | |
32 | - this._root.querySelector('sep').style.visibility = | |
33 | - now.getSeconds() % 2 ? 'visible' : 'hidden'; | |
34 | - this._root.querySelector('mm').textContent = fmt(now.getMinutes()); | |
35 | - } | |
36 | - }); | |
37 | - </script> | |
38 | -</element> | |
39 | 0 | \ No newline at end of file |
node_modules/grunt-bosonic/tasks/bosonic.js deleted
1 | -/* | |
2 | - * grunt-bosonic | |
3 | - * https://github.com/bosonic/grunt-bosonic | |
4 | - * | |
5 | - * Copyright (c) 2013 Raphaรซl Rougeron | |
6 | - * Licensed under the MIT license. | |
7 | - */ | |
8 | - | |
9 | -'use strict'; | |
10 | - | |
11 | -var path = require('path'), | |
12 | - transpiler = require('bosonic-transpiler'); | |
13 | - | |
14 | -module.exports = function(grunt) { | |
15 | - | |
16 | - grunt.registerMultiTask('bosonic', 'A Grunt task that transpiles to-the-spec Web Components into polyfilled JavaScript', function() { | |
17 | - var css = [], js = []; | |
18 | - | |
19 | - this.filesSrc.forEach(function(filepath) { | |
20 | - var fileDir = path.dirname(filepath), | |
21 | - transpiled = transpiler.transpile(grunt.file.read(filepath)); | |
22 | - transpiled.stylesheets.forEach(function(href) { | |
23 | - css.push(grunt.file.read(fileDir + '/' + href)); | |
24 | - }); | |
25 | - css.push(transpiled.css); | |
26 | - transpiled.scripts.forEach(function(src) { | |
27 | - js.push(grunt.file.read(fileDir + '/' + src)); | |
28 | - }); | |
29 | - js.push(transpiled.js); | |
30 | - }); | |
31 | - | |
32 | - var jsFile = this.data.js, | |
33 | - cssFile = this.data.css; | |
34 | - | |
35 | - grunt.file.write(jsFile, js.join("\n")); | |
36 | - grunt.file.write(cssFile, css.join("\n")); | |
37 | - }); | |
38 | - | |
39 | -} | |
40 | - |
node_modules/grunt/.npmignore deleted
node_modules/grunt/CONTRIBUTING.md deleted
1 | -Please see the [Contributing to grunt](http://gruntjs.com/contributing) guide for information on contributing to this project. |
node_modules/grunt/LICENSE-MIT deleted
1 | -Copyright (c) 2014 "Cowboy" Ben Alman | |
2 | - | |
3 | -Permission is hereby granted, free of charge, to any person | |
4 | -obtaining a copy of this software and associated documentation | |
5 | -files (the "Software"), to deal in the Software without | |
6 | -restriction, including without limitation the rights to use, | |
7 | -copy, modify, merge, publish, distribute, sublicense, and/or sell | |
8 | -copies of the Software, and to permit persons to whom the | |
9 | -Software is furnished to do so, subject to the following | |
10 | -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 | |
17 | -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
18 | -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | |
19 | -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |
20 | -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
21 | -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | |
22 | -OTHER DEALINGS IN THE SOFTWARE. |
node_modules/grunt/README.md deleted
1 | -# Grunt: The JavaScript Task Runner | |
2 | - | |
3 | -[](http://travis-ci.org/gruntjs/grunt) | |
4 | -<a href="https://ci.appveyor.com/project/gruntjs/grunt"><img src="https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva/branch/master" alt="Build Status: Windows" height="18" /></a> | |
5 | -[](http://gruntjs.com/) | |
6 | - | |
7 | -<img align="right" height="260" src="http://gruntjs.com/img/grunt-logo-no-wordmark.svg"> | |
8 | - | |
9 | - | |
10 | -### Documentation | |
11 | - | |
12 | -Visit the [gruntjs.com](http://gruntjs.com/) website for all the things. | |
13 | - | |
14 | -### Support / Contributing | |
15 | -Before you make an issue, please read our [Contributing](http://gruntjs.com/contributing) guide. | |
16 | - | |
17 | -You can find the grunt team in [#grunt on irc.freenode.net](http://webchat.freenode.net/?channels=grunt). | |
18 | - | |
19 | -### Release History | |
20 | -See the [CHANGELOG](CHANGELOG). |
node_modules/grunt/appveyor.yml deleted
1 | -# http://www.appveyor.com/docs/appveyor-yml | |
2 | - | |
3 | -# Fix line endings in Windows. (runs before repo cloning) | |
4 | -init: | |
5 | - - git config --global core.autocrlf input | |
6 | - | |
7 | -# Test against these versions of Node.js. | |
8 | -environment: | |
9 | - matrix: | |
10 | - - nodejs_version: "0.10" | |
11 | - - nodejs_version: "0.8" | |
12 | - - nodejs_version: "0.11" | |
13 | - | |
14 | -# Allow failing jobs for bleeding-edge Node.js versions. | |
15 | -matrix: | |
16 | - allow_failures: | |
17 | - - nodejs_version: "0.11" | |
18 | - | |
19 | -# Install scripts. (runs after repo cloning) | |
20 | -install: | |
21 | - # Get the latest stable version of Node 0.STABLE.latest | |
22 | - - ps: Update-NodeJsInstallation (Get-NodeJsLatestBuild $env:nodejs_version) | |
23 | - # Typical npm stuff. | |
24 | - - npm install | |
25 | - # Grunt-specific stuff. | |
26 | - - npm install -g grunt-cli | |
27 | - - npm uninstall grunt # https://github.com/npm/npm/issues/3958 | |
28 | - | |
29 | -# Post-install test scripts. | |
30 | -test_script: | |
31 | - # Output useful info for debugging. | |
32 | - - node --version | |
33 | - - npm --version | |
34 | - # We test multiple Windows shells because of prior stdout buffering issues | |
35 | - # filed against Grunt. https://github.com/joyent/node/issues/3584 | |
36 | - - ps: "npm test # PowerShell" # Pass comment to PS for easier debugging | |
37 | - - cmd: npm test | |
38 | - | |
39 | -# Don't actually build. | |
40 | -build: off | |
41 | - | |
42 | -# Set build version format here instead of in the admin panel. | |
43 | -version: "{build}" |
node_modules/grunt/internal-tasks/bump.js deleted
1 | -/* | |
2 | - * grunt-contrib-bump | |
3 | - * http://gruntjs.com/ | |
4 | - * | |
5 | - * Copyright (c) 2014 "Cowboy" Ben Alman, contributors | |
6 | - * Licensed under the MIT license. | |
7 | - */ | |
8 | - | |
9 | -'use strict'; | |
10 | - | |
11 | -var semver = require('semver'); | |
12 | -var shell = require('shelljs'); | |
13 | - | |
14 | -module.exports = function(grunt) { | |
15 | - | |
16 | - grunt.registerTask('bump', 'Bump the version property of a JSON file.', function() { | |
17 | - // Validate specified semver increment modes. | |
18 | - var valids = ['major', 'minor', 'patch', 'prerelease']; | |
19 | - var modes = []; | |
20 | - this.args.forEach(function(mode) { | |
21 | - var matches = []; | |
22 | - valids.forEach(function(valid) { | |
23 | - if (valid.indexOf(mode) === 0) { matches.push(valid); } | |
24 | - }); | |
25 | - if (matches.length === 0) { | |
26 | - grunt.log.error('Error: mode "' + mode + '" does not match any known modes.'); | |
27 | - } else if (matches.length > 1) { | |
28 | - grunt.log.error('Error: mode "' + mode + '" is ambiguous (possibly: ' + matches.join(', ') + ').'); | |
29 | - } else { | |
30 | - modes.push(matches[0]); | |
31 | - } | |
32 | - }); | |
33 | - if (this.errorCount === 0 && modes.length === 0) { | |
34 | - grunt.log.error('Error: no modes specified.'); | |
35 | - } | |
36 | - if (this.errorCount > 0) { | |
37 | - grunt.log.error('Valid modes are: ' + valids.join(', ') + '.'); | |
38 | - throw new Error('Use valid modes (or unambiguous mode abbreviations).'); | |
39 | - } | |
40 | - // Options. | |
41 | - var options = this.options({ | |
42 | - filepaths: ['package.json'], | |
43 | - syncVersions: false, | |
44 | - commit: true, | |
45 | - commitMessage: 'Bumping version to {%= version %}.', | |
46 | - tag: true, | |
47 | - tagName: 'v{%= version %}', | |
48 | - tagMessage: 'Version {%= version %}', | |
49 | - tagPrerelease: false, | |
50 | - }); | |
51 | - // Normalize filepaths to array. | |
52 | - var filepaths = Array.isArray(options.filepaths) ? options.filepaths : [options.filepaths]; | |
53 | - // Process JSON files, in-order. | |
54 | - var versions = {}; | |
55 | - filepaths.forEach(function(filepath) { | |
56 | - var o = grunt.file.readJSON(filepath); | |
57 | - var origVersion = o.version; | |
58 | - // If syncVersions is enabled, only grab version from the first file, | |
59 | - // guaranteeing new versions will always be in sync. | |
60 | - var firstVersion = Object.keys(versions)[0]; | |
61 | - if (options.syncVersions && firstVersion) { | |
62 | - o.version = firstVersion; | |
63 | - } | |
64 | - modes.forEach(function(mode) { | |
65 | - var orig = o.version; | |
66 | - var s = semver.parse(o.version); | |
67 | - s.inc(mode); | |
68 | - o.version = String(s); | |
69 | - // Workaround for https://github.com/isaacs/node-semver/issues/50 | |
70 | - if (/-/.test(orig) && mode === 'patch') { | |
71 | - o.version = o.version.replace(/\d+$/, function(n) { return n - 1; }); | |
72 | - } | |
73 | - // If prerelease on an un-prerelease version, bump patch version first | |
74 | - if (!/-/.test(orig) && mode === 'prerelease') { | |
75 | - s.inc('patch'); | |
76 | - s.inc('prerelease'); | |
77 | - o.version = String(s); | |
78 | - } | |
79 | - }); | |
80 | - if (versions[origVersion]) { | |
81 | - versions[origVersion].filepaths.push(filepath); | |
82 | - } else { | |
83 | - versions[origVersion] = {version: o.version, filepaths: [filepath]}; | |
84 | - } | |
85 | - // Actually *do* something. | |
86 | - grunt.log.write('Bumping version in ' + filepath + ' from ' + origVersion + ' to ' + o.version + '...'); | |
87 | - grunt.file.write(filepath, JSON.stringify(o, null, 2)); | |
88 | - grunt.log.ok(); | |
89 | - }); | |
90 | - // Commit changed files? | |
91 | - if (options.commit) { | |
92 | - Object.keys(versions).forEach(function(origVersion) { | |
93 | - var o = versions[origVersion]; | |
94 | - commit(o.filepaths, processTemplate(options.commitMessage, { | |
95 | - version: o.version, | |
96 | - origVersion: origVersion | |
97 | - })); | |
98 | - }); | |
99 | - } | |
100 | - // We're only going to create one tag. And it's going to be the new | |
101 | - // version of the first bumped file. Because, sanity. | |
102 | - var newVersion = versions[Object.keys(versions)[0]].version; | |
103 | - if (options.tag) { | |
104 | - if (options.tagPrerelease || modes.indexOf('prerelease') === -1) { | |
105 | - tag( | |
106 | - processTemplate(options.tagName, {version: newVersion}), | |
107 | - processTemplate(options.tagMessage, {version: newVersion}) | |
108 | - ); | |
109 | - } else { | |
110 | - grunt.log.writeln('Not tagging (prerelease version).'); | |
111 | - } | |
112 | - } | |
113 | - if (this.errorCount > 0) { | |
114 | - grunt.warn('There were errors.'); | |
115 | - } | |
116 | - }); | |
117 | - | |
118 | - // Using custom delimiters keeps templates from being auto-processed. | |
119 | - grunt.template.addDelimiters('bump', '{%', '%}'); | |
120 | - | |
121 | - function processTemplate(message, data) { | |
122 | - return grunt.template.process(message, { | |
123 | - delimiters: 'bump', | |
124 | - data: data, | |
125 | - }); | |
126 | - } | |
127 | - | |
128 | - // Kinda borrowed from https://github.com/geddski/grunt-release | |
129 | - function commit(filepaths, message) { | |
130 | - grunt.log.writeln('Committing ' + filepaths.join(', ') + ' with message: ' + message); | |
131 | - run("git commit -m '" + message + "' '" + filepaths.join("' '") + "'"); | |
132 | - } | |
133 | - | |
134 | - function tag(name, message) { | |
135 | - grunt.log.writeln('Tagging ' + name + ' with message: ' + message); | |
136 | - run("git tag '" + name + "' -m '" + message + "'"); | |
137 | - } | |
138 | - | |
139 | - function run(cmd) { | |
140 | - if (grunt.option('no-write')) { | |
141 | - grunt.verbose.writeln('Not actually running: ' + cmd); | |
142 | - } else { | |
143 | - grunt.verbose.writeln('Running: ' + cmd); | |
144 | - var result = shell.exec(cmd, {silent:true}); | |
145 | - if (result.code !== 0) { | |
146 | - grunt.log.error('Error (' + result.code + ') ' + result.output); | |
147 | - } | |
148 | - } | |
149 | - } | |
150 | - | |
151 | -}; | |
152 | 0 | \ No newline at end of file |
node_modules/grunt/internal-tasks/subgrunt.js deleted
1 | -/* | |
2 | - * grunt | |
3 | - * http://gruntjs.com/ | |
4 | - * | |
5 | - * Copyright (c) 2014 "Cowboy" Ben Alman | |
6 | - * Licensed under the MIT license. | |
7 | - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT | |
8 | - */ | |
9 | - | |
10 | -'use strict'; | |
11 | - | |
12 | -module.exports = function(grunt) { | |
13 | - | |
14 | - // Run sub-grunt files, because right now, testing tasks is a pain. | |
15 | - grunt.registerMultiTask('subgrunt', 'Run a sub-gruntfile.', function() { | |
16 | - var path = require('path'); | |
17 | - grunt.util.async.forEachSeries(this.filesSrc, function(gruntfile, next) { | |
18 | - grunt.log.write('Loading ' + gruntfile + '...'); | |
19 | - grunt.util.spawn({ | |
20 | - grunt: true, | |
21 | - args: ['--gruntfile', path.resolve(gruntfile)], | |
22 | - }, function(error, result) { | |
23 | - if (error) { | |
24 | - grunt.log.error().error(result.stdout).writeln(); | |
25 | - next(new Error('Error running sub-gruntfile "' + gruntfile + '".')); | |
26 | - } else { | |
27 | - grunt.log.ok().verbose.ok(result.stdout); | |
28 | - next(); | |
29 | - } | |
30 | - }); | |
31 | - }, this.async()); | |
32 | - }); | |
33 | - | |
34 | -}; |
node_modules/grunt/lib/grunt.js deleted
1 | -/* | |
2 | - * grunt | |
3 | - * http://gruntjs.com/ | |
4 | - * | |
5 | - * Copyright (c) 2014 "Cowboy" Ben Alman | |
6 | - * Licensed under the MIT license. | |
7 | - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT | |
8 | - */ | |
9 | - | |
10 | -'use strict'; | |
11 | - | |
12 | -// Nodejs libs. | |
13 | -var path = require('path'); | |
14 | - | |
15 | -// This allows grunt to require() .coffee files. | |
16 | -require('coffee-script'); | |
17 | - | |
18 | -// The module to be exported. | |
19 | -var grunt = module.exports = {}; | |
20 | - | |
21 | -// Expose internal grunt libs. | |
22 | -function gRequire(name) { | |
23 | - return grunt[name] = require('./grunt/' + name); | |
24 | -} | |
25 | - | |
26 | -var util = require('grunt-legacy-util'); | |
27 | -grunt.util = util; | |
28 | -grunt.util.task = require('./util/task'); | |
29 | - | |
30 | -var Log = require('grunt-legacy-log').Log; | |
31 | -var log = new Log({grunt: grunt}); | |
32 | -grunt.log = log; | |
33 | - | |
34 | -gRequire('template'); | |
35 | -gRequire('event'); | |
36 | -var fail = gRequire('fail'); | |
37 | -gRequire('file'); | |
38 | -var option = gRequire('option'); | |
39 | -var config = gRequire('config'); | |
40 | -var task = gRequire('task'); | |
41 | -var help = gRequire('help'); | |
42 | -gRequire('cli'); | |
43 | -var verbose = grunt.verbose = log.verbose; | |
44 | - | |
45 | -// Expose some grunt metadata. | |
46 | -grunt.package = require('../package.json'); | |
47 | -grunt.version = grunt.package.version; | |
48 | - | |
49 | -// Expose specific grunt lib methods on grunt. | |
50 | -function gExpose(obj, methodName, newMethodName) { | |
51 | - grunt[newMethodName || methodName] = obj[methodName].bind(obj); | |
52 | -} | |
53 | -gExpose(task, 'registerTask'); | |
54 | -gExpose(task, 'registerMultiTask'); | |
55 | -gExpose(task, 'registerInitTask'); | |
56 | -gExpose(task, 'renameTask'); | |
57 | -gExpose(task, 'loadTasks'); | |
58 | -gExpose(task, 'loadNpmTasks'); | |
59 | -gExpose(config, 'init', 'initConfig'); | |
60 | -gExpose(fail, 'warn'); | |
61 | -gExpose(fail, 'fatal'); | |
62 | - | |
63 | -// Expose the task interface. I've never called this manually, and have no idea | |
64 | -// how it will work. But it might. | |
65 | -grunt.tasks = function(tasks, options, done) { | |
66 | - // Update options with passed-in options. | |
67 | - option.init(options); | |
68 | - | |
69 | - // Display the grunt version and quit if the user did --version. | |
70 | - var _tasks, _options; | |
71 | - if (option('version')) { | |
72 | - // Not --verbose. | |
73 | - log.writeln('grunt v' + grunt.version); | |
74 | - | |
75 | - if (option('verbose')) { | |
76 | - // --verbose | |
77 | - verbose.writeln('Install path: ' + path.resolve(__dirname, '..')); | |
78 | - // Yes, this is a total hack, but we don't want to log all that verbose | |
79 | - // task initialization stuff here. | |
80 | - grunt.log.muted = true; | |
81 | - // Initialize task system so that available tasks can be listed. | |
82 | - grunt.task.init([], {help: true}); | |
83 | - // Re-enable logging. | |
84 | - grunt.log.muted = false; | |
85 | - | |
86 | - // Display available tasks (for shell completion, etc). | |
87 | - _tasks = Object.keys(grunt.task._tasks).sort(); | |
88 | - verbose.writeln('Available tasks: ' + _tasks.join(' ')); | |
89 | - | |
90 | - // Display available options (for shell completion, etc). | |
91 | - _options = []; | |
92 | - Object.keys(grunt.cli.optlist).forEach(function(long) { | |
93 | - var o = grunt.cli.optlist[long]; | |
94 | - _options.push('--' + (o.negate ? 'no-' : '') + long); | |
95 | - if (o.short) { _options.push('-' + o.short); } | |
96 | - }); | |
97 | - verbose.writeln('Available options: ' + _options.join(' ')); | |
98 | - } | |
99 | - | |
100 | - return; | |
101 | - } | |
102 | - | |
103 | - // Init colors. | |
104 | - log.initColors(); | |
105 | - | |
106 | - // Display help and quit if the user did --help. | |
107 | - if (option('help')) { | |
108 | - help.display(); | |
109 | - return; | |
110 | - } | |
111 | - | |
112 | - // A little header stuff. | |
113 | - verbose.header('Initializing').writeflags(option.flags(), 'Command-line options'); | |
114 | - | |
115 | - // Determine and output which tasks will be run. | |
116 | - var tasksSpecified = tasks && tasks.length > 0; | |
117 | - tasks = task.parseArgs([tasksSpecified ? tasks : 'default']); | |
118 | - | |
119 | - // Initialize tasks. | |
120 | - task.init(tasks); | |
121 | - | |
122 | - verbose.writeln(); | |
123 | - if (!tasksSpecified) { | |
124 | - verbose.writeln('No tasks specified, running default tasks.'); | |
125 | - } | |
126 | - verbose.writeflags(tasks, 'Running tasks'); | |
127 | - | |
128 | - // Handle otherwise unhandleable (probably asynchronous) exceptions. | |
129 | - var uncaughtHandler = function(e) { | |
130 | - fail.fatal(e, fail.code.TASK_FAILURE); | |
131 | - }; | |
132 | - process.on('uncaughtException', uncaughtHandler); | |
133 | - | |
134 | - // Report, etc when all tasks have completed. | |
135 | - task.options({ | |
136 | - error: function(e) { | |
137 | - fail.warn(e, fail.code.TASK_FAILURE); | |
138 | - }, | |
139 | - done: function() { | |
140 | - // Stop handling uncaught exceptions so that we don't leave any | |
141 | - // unwanted process-level side effects behind. There is no need to do | |
142 | - // this in the error callback, because fail.warn() will either kill | |
143 | - // the process, or with --force keep on going all the way here. | |
144 | - process.removeListener('uncaughtException', uncaughtHandler); | |
145 | - | |
146 | - // Output a final fail / success report. | |
147 | - fail.report(); | |
148 | - | |
149 | - if (done) { | |
150 | - // Execute "done" function when done (only if passed, of course). | |
151 | - done(); | |
152 | - } else { | |
153 | - // Otherwise, explicitly exit. | |
154 | - util.exit(0); | |
155 | - } | |
156 | - } | |
157 | - }); | |
158 | - | |
159 | - // Execute all tasks, in order. Passing each task individually in a forEach | |
160 | - // allows the error callback to execute multiple times. | |
161 | - tasks.forEach(function(name) { task.run(name); }); | |
162 | - // Run tasks async internally to reduce call-stack, per: | |
163 | - // https://github.com/gruntjs/grunt/pull/1026 | |
164 | - task.start({asyncDone:true}); | |
165 | -}; |
node_modules/grunt/lib/grunt/cli.js deleted
1 | -/* | |
2 | - * grunt | |
3 | - * http://gruntjs.com/ | |
4 | - * | |
5 | - * Copyright (c) 2014 "Cowboy" Ben Alman | |
6 | - * Licensed under the MIT license. | |
7 | - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT | |
8 | - */ | |
9 | - | |
10 | -'use strict'; | |
11 | - | |
12 | -var grunt = require('../grunt'); | |
13 | - | |
14 | -// Nodejs libs. | |
15 | -var path = require('path'); | |
16 | - | |
17 | -// External libs. | |
18 | -var nopt = require('nopt'); | |
19 | - | |
20 | -// This is only executed when run via command line. | |
21 | -var cli = module.exports = function(options, done) { | |
22 | - // CLI-parsed options override any passed-in "default" options. | |
23 | - if (options) { | |
24 | - // For each default option... | |
25 | - Object.keys(options).forEach(function(key) { | |
26 | - if (!(key in cli.options)) { | |
27 | - // If this option doesn't exist in the parsed cli.options, add it in. | |
28 | - cli.options[key] = options[key]; | |
29 | - } else if (cli.optlist[key].type === Array) { | |
30 | - // If this option's type is Array, append it to any existing array | |
31 | - // (or create a new array). | |
32 | - [].push.apply(cli.options[key], options[key]); | |
33 | - } | |
34 | - }); | |
35 | - } | |
36 | - | |
37 | - // Run tasks. | |
38 | - grunt.tasks(cli.tasks, cli.options, done); | |
39 | -}; | |
40 | - | |
41 | -// Default options. | |
42 | -var optlist = cli.optlist = { | |
43 | - help: { | |
44 | - short: 'h', | |
45 | - info: 'Display this help text.', | |
46 | - type: Boolean | |
47 | - }, | |
48 | - base: { | |
49 | - info: 'Specify an alternate base path. By default, all file paths are relative to the Gruntfile. (grunt.file.setBase) *', | |
50 | - type: path | |
51 | - }, | |
52 | - color: { | |
53 | - info: 'Disable colored output.', | |
54 | - type: Boolean, | |
55 | - negate: true | |
56 | - }, | |
57 | - gruntfile: { | |
58 | - info: 'Specify an alternate Gruntfile. By default, grunt looks in the current or parent directories for the nearest Gruntfile.js or Gruntfile.coffee file.', | |
59 | - type: path | |
60 | - }, | |
61 | - debug: { | |
62 | - short: 'd', | |
63 | - info: 'Enable debugging mode for tasks that support it.', | |
64 | - type: [Number, Boolean] | |
65 | - }, | |
66 | - stack: { | |
67 | - info: 'Print a stack trace when exiting with a warning or fatal error.', | |
68 | - type: Boolean | |
69 | - }, | |
70 | - force: { | |
71 | - short: 'f', | |
72 | - info: 'A way to force your way past warnings. Want a suggestion? Don\'t use this option, fix your code.', | |
73 | - type: Boolean | |
74 | - }, | |
75 | - tasks: { | |
76 | - info: 'Additional directory paths to scan for task and "extra" files. (grunt.loadTasks) *', | |
77 | - type: Array | |
78 | - }, | |
79 | - npm: { | |
80 | - info: 'Npm-installed grunt plugins to scan for task and "extra" files. (grunt.loadNpmTasks) *', | |
81 | - type: Array | |
82 | - }, | |
83 | - write: { | |
84 | - info: 'Disable writing files (dry run).', | |
85 | - type: Boolean, | |
86 | - negate: true | |
87 | - }, | |
88 | - verbose: { | |
89 | - short: 'v', | |
90 | - info: 'Verbose mode. A lot more information output.', | |
91 | - type: Boolean | |
92 | - }, | |
93 | - version: { | |
94 | - short: 'V', | |
95 | - info: 'Print the grunt version. Combine with --verbose for more info.', | |
96 | - type: Boolean | |
97 | - }, | |
98 | - // Even though shell auto-completion is now handled by grunt-cli, leave this | |
99 | - // option here for display in the --help screen. | |
100 | - completion: { | |
101 | - info: 'Output shell auto-completion rules. See the grunt-cli documentation for more information.', | |
102 | - type: String | |
103 | - }, | |
104 | -}; | |
105 | - | |
106 | -// Parse `optlist` into a form that nopt can handle. | |
107 | -var aliases = {}; | |
108 | -var known = {}; | |
109 | - | |
110 | -Object.keys(optlist).forEach(function(key) { | |
111 | - var short = optlist[key].short; | |
112 | - if (short) { | |
113 | - aliases[short] = '--' + key; | |
114 | - } | |
115 | - known[key] = optlist[key].type; | |
116 | -}); | |
117 | - | |
118 | -var parsed = nopt(known, aliases, process.argv, 2); | |
119 | -cli.tasks = parsed.argv.remain; | |
120 | -cli.options = parsed; | |
121 | -delete parsed.argv; | |
122 | - | |
123 | -// Initialize any Array options that weren't initialized. | |
124 | -Object.keys(optlist).forEach(function(key) { | |
125 | - if (optlist[key].type === Array && !(key in cli.options)) { | |
126 | - cli.options[key] = []; | |
127 | - } | |
128 | -}); |
node_modules/grunt/lib/grunt/config.js deleted
1 | -/* | |
2 | - * grunt | |
3 | - * http://gruntjs.com/ | |
4 | - * | |
5 | - * Copyright (c) 2014 "Cowboy" Ben Alman | |
6 | - * Licensed under the MIT license. | |
7 | - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT | |
8 | - */ | |
9 | - | |
10 | -'use strict'; | |
11 | - | |
12 | -var grunt = require('../grunt'); | |
13 | - | |
14 | -// Get/set config data. If value was passed, set. Otherwise, get. | |
15 | -var config = module.exports = function(prop, value) { | |
16 | - if (arguments.length === 2) { | |
17 | - // Two arguments were passed, set the property's value. | |
18 | - return config.set(prop, value); | |
19 | - } else { | |
20 | - // Get the property's value (or the entire data object). | |
21 | - return config.get(prop); | |
22 | - } | |
23 | -}; | |
24 | - | |
25 | -// The actual config data. | |
26 | -config.data = {}; | |
27 | - | |
28 | -// Escape any . in name with \. so dot-based namespacing works properly. | |
29 | -config.escape = function(str) { | |
30 | - return str.replace(/\./g, '\\.'); | |
31 | -}; | |
32 | - | |
33 | -// Return prop as a string. | |
34 | -config.getPropString = function(prop) { | |
35 | - return Array.isArray(prop) ? prop.map(config.escape).join('.') : prop; | |
36 | -}; | |
37 | - | |
38 | -// Get raw, unprocessed config data. | |
39 | -config.getRaw = function(prop) { | |
40 | - if (prop) { | |
41 | - // Prop was passed, get that specific property's value. | |
42 | - return grunt.util.namespace.get(config.data, config.getPropString(prop)); | |
43 | - } else { | |
44 | - // No prop was passed, return the entire config.data object. | |
45 | - return config.data; | |
46 | - } | |
47 | -}; | |
48 | - | |
49 | -// Match '<%= FOO %>' where FOO is a propString, eg. foo or foo.bar but not | |
50 | -// a method call like foo() or foo.bar(). | |
51 | -var propStringTmplRe = /^<%=\s*([a-z0-9_$]+(?:\.[a-z0-9_$]+)*)\s*%>$/i; | |
52 | - | |
53 | -// Get config data, recursively processing templates. | |
54 | -config.get = function(prop) { | |
55 | - return config.process(config.getRaw(prop)); | |
56 | -}; | |
57 | - | |
58 | -// Expand a config value recursively. Used for post-processing raw values | |
59 | -// already retrieved from the config. | |
60 | -config.process = function(raw) { | |
61 | - return grunt.util.recurse(raw, function(value) { | |
62 | - // If the value is not a string, return it. | |
63 | - if (typeof value !== 'string') { return value; } | |
64 | - // If possible, access the specified property via config.get, in case it | |
65 | - // doesn't refer to a string, but instead refers to an object or array. | |
66 | - var matches = value.match(propStringTmplRe); | |
67 | - var result; | |
68 | - if (matches) { | |
69 | - result = config.get(matches[1]); | |
70 | - // If the result retrieved from the config data wasn't null or undefined, | |
71 | - // return it. | |
72 | - if (result != null) { return result; } | |
73 | - } | |
74 | - // Process the string as a template. | |
75 | - return grunt.template.process(value, {data: config.data}); | |
76 | - }); | |
77 | -}; | |
78 | - | |
79 | -// Set config data. | |
80 | -config.set = function(prop, value) { | |
81 | - return grunt.util.namespace.set(config.data, config.getPropString(prop), value); | |
82 | -}; | |
83 | - | |
84 | -// Deep merge config data. | |
85 | -config.merge = function(obj) { | |
86 | - grunt.util._.merge(config.data, obj); | |
87 | - return config.data; | |
88 | -}; | |
89 | - | |
90 | -// Initialize config data. | |
91 | -config.init = function(obj) { | |
92 | - grunt.verbose.write('Initializing config...').ok(); | |
93 | - // Initialize and return data. | |
94 | - return (config.data = obj || {}); | |
95 | -}; | |
96 | - | |
97 | -// Test to see if required config params have been defined. If not, throw an | |
98 | -// exception (use this inside of a task). | |
99 | -config.requires = function() { | |
100 | - var p = grunt.util.pluralize; | |
101 | - var props = grunt.util.toArray(arguments).map(config.getPropString); | |
102 | - var msg = 'Verifying propert' + p(props.length, 'y/ies') + | |
103 | - ' ' + grunt.log.wordlist(props) + ' exist' + p(props.length, 's') + | |
104 | - ' in config...'; | |
105 | - grunt.verbose.write(msg); | |
106 | - var failProps = config.data && props.filter(function(prop) { | |
107 | - return config.get(prop) == null; | |
108 | - }).map(function(prop) { | |
109 | - return '"' + prop + '"'; | |
110 | - }); | |
111 | - if (config.data && failProps.length === 0) { | |
112 | - grunt.verbose.ok(); | |
113 | - return true; | |
114 | - } else { | |
115 | - grunt.verbose.or.write(msg); | |
116 | - grunt.log.error().error('Unable to process task.'); | |
117 | - if (!config.data) { | |
118 | - throw grunt.util.error('Unable to load config.'); | |
119 | - } else { | |
120 | - throw grunt.util.error('Required config propert' + | |
121 | - p(failProps.length, 'y/ies') + ' ' + failProps.join(', ') + ' missing.'); | |
122 | - } | |
123 | - } | |
124 | -}; |
node_modules/grunt/lib/grunt/event.js deleted
1 | -/* | |
2 | - * grunt | |
3 | - * http://gruntjs.com/ | |
4 | - * | |
5 | - * Copyright (c) 2014 "Cowboy" Ben Alman | |
6 | - * Licensed under the MIT license. | |
7 | - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT | |
8 | - */ | |
9 | - | |
10 | -'use strict'; | |
11 | - | |
12 | -// External lib. | |
13 | -var EventEmitter2 = require('eventemitter2').EventEmitter2; | |
14 | - | |
15 | -// Awesome. | |
16 | -module.exports = new EventEmitter2({wildcard: true}); |
node_modules/grunt/lib/grunt/fail.js deleted
1 | -/* | |
2 | - * grunt | |
3 | - * http://gruntjs.com/ | |
4 | - * | |
5 | - * Copyright (c) 2014 "Cowboy" Ben Alman | |
6 | - * Licensed under the MIT license. | |
7 | - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT | |
8 | - */ | |
9 | - | |
10 | -'use strict'; | |
11 | - | |
12 | -var grunt = require('../grunt'); | |
13 | - | |
14 | -// The module to be exported. | |
15 | -var fail = module.exports = {}; | |
16 | - | |
17 | -// Error codes. | |
18 | -fail.code = { | |
19 | - FATAL_ERROR: 1, | |
20 | - MISSING_GRUNTFILE: 2, | |
21 | - TASK_FAILURE: 3, | |
22 | - TEMPLATE_ERROR: 4, | |
23 | - INVALID_AUTOCOMPLETE: 5, | |
24 | - WARNING: 6, | |
25 | -}; | |
26 | - | |
27 | -// DRY it up! | |
28 | -function writeln(e, mode) { | |
29 | - grunt.log.muted = false; | |
30 | - var msg = String(e.message || e); | |
31 | - if (!grunt.option('no-color')) { msg += '\x07'; } // Beep! | |
32 | - if (mode === 'warn') { | |
33 | - msg = 'Warning: ' + msg + ' '; | |
34 | - msg += (grunt.option('force') ? 'Used --force, continuing.'.underline : 'Use --force to continue.'); | |
35 | - msg = msg.yellow; | |
36 | - } else { | |
37 | - msg = ('Fatal error: ' + msg).red; | |
38 | - } | |
39 | - grunt.log.writeln(msg); | |
40 | -} | |
41 | - | |
42 | -// If --stack is enabled, log the appropriate error stack (if it exists). | |
43 | -function dumpStack(e) { | |
44 | - if (grunt.option('stack')) { | |
45 | - if (e.origError && e.origError.stack) { | |
46 | - console.log(e.origError.stack); | |
47 | - } else if (e.stack) { | |
48 | - console.log(e.stack); | |
49 | - } | |
50 | - } | |
51 | -} | |
52 | - | |
53 | -// A fatal error occurred. Abort immediately. | |
54 | -fail.fatal = function(e, errcode) { | |
55 | - writeln(e, 'fatal'); | |
56 | - dumpStack(e); | |
57 | - grunt.util.exit(typeof errcode === 'number' ? errcode : fail.code.FATAL_ERROR); | |
58 | -}; | |
59 | - | |
60 | -// Keep track of error and warning counts. | |
61 | -fail.errorcount = 0; | |
62 | -fail.warncount = 0; | |
63 | - | |
64 | -// A warning occurred. Abort immediately unless -f or --force was used. | |
65 | -fail.warn = function(e, errcode) { | |
66 | - var message = typeof e === 'string' ? e : e.message; | |
67 | - fail.warncount++; | |
68 | - writeln(message, 'warn'); | |
69 | - // If -f or --force aren't used, stop script processing. | |
70 | - if (!grunt.option('force')) { | |
71 | - dumpStack(e); | |
72 | - grunt.log.writeln().fail('Aborted due to warnings.'); | |
73 | - grunt.util.exit(typeof errcode === 'number' ? errcode : fail.code.WARNING); | |
74 | - } | |
75 | -}; | |
76 | - | |
77 | -// This gets called at the very end. | |
78 | -fail.report = function() { | |
79 | - if (fail.warncount > 0) { | |
80 | - grunt.log.writeln().fail('Done, but with warnings.'); | |
81 | - } else { | |
82 | - grunt.log.writeln().success('Done, without errors.'); | |
83 | - } | |
84 | -}; |
node_modules/grunt/lib/grunt/file.js deleted
1 | -/* | |
2 | - * grunt | |
3 | - * http://gruntjs.com/ | |
4 | - * | |
5 | - * Copyright (c) 2014 "Cowboy" Ben Alman | |
6 | - * Licensed under the MIT license. | |
7 | - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT | |
8 | - */ | |
9 | - | |
10 | -'use strict'; | |
11 | - | |
12 | -var grunt = require('../grunt'); | |
13 | - | |
14 | -// Nodejs libs. | |
15 | -var fs = require('fs'); | |
16 | -var path = require('path'); | |
17 | - | |
18 | -// The module to be exported. | |
19 | -var file = module.exports = {}; | |
20 | - | |
21 | -// External libs. | |
22 | -file.glob = require('glob'); | |
23 | -file.minimatch = require('minimatch'); | |
24 | -file.findup = require('findup-sync'); | |
25 | -var YAML = require('js-yaml'); | |
26 | -var rimraf = require('rimraf'); | |
27 | -var iconv = require('iconv-lite'); | |
28 | - | |
29 | -// Windows? | |
30 | -var win32 = process.platform === 'win32'; | |
31 | - | |
32 | -// Normalize \\ paths to / paths. | |
33 | -var unixifyPath = function(filepath) { | |
34 | - if (win32) { | |
35 | - return filepath.replace(/\\/g, '/'); | |
36 | - } else { | |
37 | - return filepath; | |
38 | - } | |
39 | -}; | |
40 | - | |
41 | -// Change the current base path (ie, CWD) to the specified path. | |
42 | -file.setBase = function() { | |
43 | - var dirpath = path.join.apply(path, arguments); | |
44 | - process.chdir(dirpath); | |
45 | -}; | |
46 | - | |
47 | -// Process specified wildcard glob patterns or filenames against a | |
48 | -// callback, excluding and uniquing files in the result set. | |
49 | -var processPatterns = function(patterns, fn) { | |
50 | - // Filepaths to return. | |
51 | - var result = []; | |
52 | - // Iterate over flattened patterns array. | |
53 | - grunt.util._.flatten(patterns).forEach(function(pattern) { | |
54 | - // If the first character is ! it should be omitted | |
55 | - var exclusion = pattern.indexOf('!') === 0; | |
56 | - // If the pattern is an exclusion, remove the ! | |
57 | - if (exclusion) { pattern = pattern.slice(1); } | |
58 | - // Find all matching files for this pattern. | |
59 | - var matches = fn(pattern); | |
60 | - if (exclusion) { | |
61 | - // If an exclusion, remove matching files. | |
62 | - result = grunt.util._.difference(result, matches); | |
63 | - } else { | |
64 | - // Otherwise add matching files. | |
65 | - result = grunt.util._.union(result, matches); | |
66 | - } | |
67 | - }); | |
68 | - return result; | |
69 | -}; | |
70 | - | |
71 | -// Match a filepath or filepaths against one or more wildcard patterns. Returns | |
72 | -// all matching filepaths. | |
73 | -file.match = function(options, patterns, filepaths) { | |
74 | - if (grunt.util.kindOf(options) !== 'object') { | |
75 | - filepaths = patterns; | |
76 | - patterns = options; | |
77 | - options = {}; | |
78 | - } | |
79 | - // Return empty set if either patterns or filepaths was omitted. | |
80 | - if (patterns == null || filepaths == null) { return []; } | |
81 | - // Normalize patterns and filepaths to arrays. | |
82 | - if (!Array.isArray(patterns)) { patterns = [patterns]; } | |
83 | - if (!Array.isArray(filepaths)) { filepaths = [filepaths]; } | |
84 | - // Return empty set if there are no patterns or filepaths. | |
85 | - if (patterns.length === 0 || filepaths.length === 0) { return []; } | |
86 | - // Return all matching filepaths. | |
87 | - return processPatterns(patterns, function(pattern) { | |
88 | - return file.minimatch.match(filepaths, pattern, options); | |
89 | - }); | |
90 | -}; | |
91 | - | |
92 | -// Match a filepath or filepaths against one or more wildcard patterns. Returns | |
93 | -// true if any of the patterns match. | |
94 | -file.isMatch = function() { | |
95 | - return file.match.apply(file, arguments).length > 0; | |
96 | -}; | |
97 | - | |
98 | -// Return an array of all file paths that match the given wildcard patterns. | |
99 | -file.expand = function() { | |
100 | - var args = grunt.util.toArray(arguments); | |
101 | - // If the first argument is an options object, save those options to pass | |
102 | - // into the file.glob.sync method. | |
103 | - var options = grunt.util.kindOf(args[0]) === 'object' ? args.shift() : {}; | |
104 | - // Use the first argument if it's an Array, otherwise convert the arguments | |
105 | - // object to an array and use that. | |
106 | - var patterns = Array.isArray(args[0]) ? args[0] : args; | |
107 | - // Return empty set if there are no patterns or filepaths. | |
108 | - if (patterns.length === 0) { return []; } | |
109 | - // Return all matching filepaths. | |
110 | - var matches = processPatterns(patterns, function(pattern) { | |
111 | - // Find all matching files for this pattern. | |
112 | - return file.glob.sync(pattern, options); | |
113 | - }); | |
114 | - // Filter result set? | |
115 | - if (options.filter) { | |
116 | - matches = matches.filter(function(filepath) { | |
117 | - filepath = path.join(options.cwd || '', filepath); | |
118 | - try { | |
119 | - if (typeof options.filter === 'function') { | |
120 | - return options.filter(filepath); | |
121 | - } else { | |
122 | - // If the file is of the right type and exists, this should work. | |
123 | - return fs.statSync(filepath)[options.filter](); | |
124 | - } | |
125 | - } catch(e) { | |
126 | - // Otherwise, it's probably not the right type. | |
127 | - return false; | |
128 | - } | |
129 | - }); | |
130 | - } | |
131 | - return matches; | |
132 | -}; | |
133 | - | |
134 | -var pathSeparatorRe = /[\/\\]/g; | |
135 | - | |
136 | -// The "ext" option refers to either everything after the first dot (default) | |
137 | -// or everything after the last dot. | |
138 | -var extDotRe = { | |
139 | - first: /(\.[^\/]*)?$/, | |
140 | - last: /(\.[^\/\.]*)?$/, | |
141 | -}; | |
142 | - | |
143 | -// Build a multi task "files" object dynamically. | |
144 | -file.expandMapping = function(patterns, destBase, options) { | |
145 | - options = grunt.util._.defaults({}, options, { | |
146 | - extDot: 'first', | |
147 | - rename: function(destBase, destPath) { | |
148 | - return path.join(destBase || '', destPath); | |
149 | - } | |
150 | - }); | |
151 | - var files = []; | |
152 | - var fileByDest = {}; | |
153 | - // Find all files matching pattern, using passed-in options. | |
154 | - file.expand(options, patterns).forEach(function(src) { | |
155 | - var destPath = src; | |
156 | - // Flatten? | |
157 | - if (options.flatten) { | |
158 | - destPath = path.basename(destPath); | |
159 | - } | |
160 | - // Change the extension? | |
161 | - if ('ext' in options) { | |
162 | - destPath = destPath.replace(extDotRe[options.extDot], options.ext); | |
163 | - } | |
164 | - // Generate destination filename. | |
165 | - var dest = options.rename(destBase, destPath, options); | |
166 | - // Prepend cwd to src path if necessary. | |
167 | - if (options.cwd) { src = path.join(options.cwd, src); } | |
168 | - // Normalize filepaths to be unix-style. | |
169 | - dest = dest.replace(pathSeparatorRe, '/'); | |
170 | - src = src.replace(pathSeparatorRe, '/'); | |
171 | - // Map correct src path to dest path. | |
172 | - if (fileByDest[dest]) { | |
173 | - // If dest already exists, push this src onto that dest's src array. | |
174 | - fileByDest[dest].src.push(src); | |
175 | - } else { | |
176 | - // Otherwise create a new src-dest file mapping object. | |
177 | - files.push({ | |
178 | - src: [src], | |
179 | - dest: dest, | |
180 | - }); | |
181 | - // And store a reference for later use. | |
182 | - fileByDest[dest] = files[files.length - 1]; | |
183 | - } | |
184 | - }); | |
185 | - return files; | |
186 | -}; | |
187 | - | |
188 | -// Like mkdir -p. Create a directory and any intermediary directories. | |
189 | -file.mkdir = function(dirpath, mode) { | |
190 | - if (grunt.option('no-write')) { return; } | |
191 | - // Set directory mode in a strict-mode-friendly way. | |
192 | - if (mode == null) { | |
193 | - mode = parseInt('0777', 8) & (~process.umask()); | |
194 | - } | |
195 | - dirpath.split(pathSeparatorRe).reduce(function(parts, part) { | |
196 | - parts += part + '/'; | |
197 | - var subpath = path.resolve(parts); | |
198 | - if (!file.exists(subpath)) { | |
199 | - try { | |
200 | - fs.mkdirSync(subpath, mode); | |
201 | - } catch(e) { | |
202 | - throw grunt.util.error('Unable to create directory "' + subpath + '" (Error code: ' + e.code + ').', e); | |
203 | - } | |
204 | - } | |
205 | - return parts; | |
206 | - }, ''); | |
207 | -}; | |
208 | - | |
209 | -// Recurse into a directory, executing callback for each file. | |
210 | -file.recurse = function recurse(rootdir, callback, subdir) { | |
211 | - var abspath = subdir ? path.join(rootdir, subdir) : rootdir; | |
212 | - fs.readdirSync(abspath).forEach(function(filename) { | |
213 | - var filepath = path.join(abspath, filename); | |
214 | - if (fs.statSync(filepath).isDirectory()) { | |
215 | - recurse(rootdir, callback, unixifyPath(path.join(subdir || '', filename || ''))); | |
216 | - } else { | |
217 | - callback(unixifyPath(filepath), rootdir, subdir, filename); | |
218 | - } | |
219 | - }); | |
220 | -}; | |
221 | - | |
222 | -// The default file encoding to use. | |
223 | -file.defaultEncoding = 'utf8'; | |
224 | -// Whether to preserve the BOM on file.read rather than strip it. | |
225 | -file.preserveBOM = false; | |
226 | - | |
227 | -// Read a file, return its contents. | |
228 | -file.read = function(filepath, options) { | |
229 | - if (!options) { options = {}; } | |
230 | - var contents; | |
231 | - grunt.verbose.write('Reading ' + filepath + '...'); | |
232 | - try { | |
233 | - contents = fs.readFileSync(String(filepath)); | |
234 | - // If encoding is not explicitly null, convert from encoded buffer to a | |
235 | - // string. If no encoding was specified, use the default. | |
236 | - if (options.encoding !== null) { | |
237 | - contents = iconv.decode(contents, options.encoding || file.defaultEncoding); | |
238 | - // Strip any BOM that might exist. | |
239 | - if (!file.preserveBOM && contents.charCodeAt(0) === 0xFEFF) { | |
240 | - contents = contents.substring(1); | |
241 | - } | |
242 | - } | |
243 | - grunt.verbose.ok(); | |
244 | - return contents; | |
245 | - } catch(e) { | |
246 | - grunt.verbose.error(); | |
247 | - throw grunt.util.error('Unable to read "' + filepath + '" file (Error code: ' + e.code + ').', e); | |
248 | - } | |
249 | -}; | |
250 | - | |
251 | -// Read a file, parse its contents, return an object. | |
252 | -file.readJSON = function(filepath, options) { | |
253 | - var src = file.read(filepath, options); | |
254 | - var result; | |
255 | - grunt.verbose.write('Parsing ' + filepath + '...'); | |
256 | - try { | |
257 | - result = JSON.parse(src); | |
258 | - grunt.verbose.ok(); | |
259 | - return result; | |
260 | - } catch(e) { | |
261 | - grunt.verbose.error(); | |
262 | - throw grunt.util.error('Unable to parse "' + filepath + '" file (' + e.message + ').', e); | |
263 | - } | |
264 | -}; | |
265 | - | |
266 | -// Read a YAML file, parse its contents, return an object. | |
267 | -file.readYAML = function(filepath, options) { | |
268 | - var src = file.read(filepath, options); | |
269 | - var result; | |
270 | - grunt.verbose.write('Parsing ' + filepath + '...'); | |
271 | - try { | |
272 | - result = YAML.load(src); | |
273 | - grunt.verbose.ok(); | |
274 | - return result; | |
275 | - } catch(e) { | |
276 | - grunt.verbose.error(); | |
277 | - throw grunt.util.error('Unable to parse "' + filepath + '" file (' + e.problem + ').', e); | |
278 | - } | |
279 | -}; | |
280 | - | |
281 | -// Write a file. | |
282 | -file.write = function(filepath, contents, options) { | |
283 | - if (!options) { options = {}; } | |
284 | - var nowrite = grunt.option('no-write'); | |
285 | - grunt.verbose.write((nowrite ? 'Not actually writing ' : 'Writing ') + filepath + '...'); | |
286 | - // Create path, if necessary. | |
287 | - file.mkdir(path.dirname(filepath)); | |
288 | - try { | |
289 | - // If contents is already a Buffer, don't try to encode it. If no encoding | |
290 | - // was specified, use the default. | |
291 | - if (!Buffer.isBuffer(contents)) { | |
292 | - contents = iconv.encode(contents, options.encoding || file.defaultEncoding); | |
293 | - } | |
294 | - // Actually write file. | |
295 | - if (!nowrite) { | |
296 | - fs.writeFileSync(filepath, contents); | |
297 | - } | |
298 | - grunt.verbose.ok(); | |
299 | - return true; | |
300 | - } catch(e) { | |
301 | - grunt.verbose.error(); | |
302 | - throw grunt.util.error('Unable to write "' + filepath + '" file (Error code: ' + e.code + ').', e); | |
303 | - } | |
304 | -}; | |
305 | - | |
306 | -// Read a file, optionally processing its content, then write the output. | |
307 | -file.copy = function(srcpath, destpath, options) { | |
308 | - if (!options) { options = {}; } | |
309 | - // If a process function was specified, and noProcess isn't true or doesn't | |
310 | - // match the srcpath, process the file's source. | |
311 | - var process = options.process && options.noProcess !== true && | |
312 | - !(options.noProcess && file.isMatch(options.noProcess, srcpath)); | |
313 | - // If the file will be processed, use the encoding as-specified. Otherwise, | |
314 | - // use an encoding of null to force the file to be read/written as a Buffer. | |
315 | - var readWriteOptions = process ? options : {encoding: null}; | |
316 | - // Actually read the file. | |
317 | - var contents = file.read(srcpath, readWriteOptions); | |
318 | - if (process) { | |
319 | - grunt.verbose.write('Processing source...'); | |
320 | - try { | |
321 | - contents = options.process(contents, srcpath); | |
322 | - grunt.verbose.ok(); | |
323 | - } catch(e) { | |
324 | - grunt.verbose.error(); | |
325 | - throw grunt.util.error('Error while processing "' + srcpath + '" file.', e); | |
326 | - } | |
327 | - } | |
328 | - // Abort copy if the process function returns false. | |
329 | - if (contents === false) { | |
330 | - grunt.verbose.writeln('Write aborted.'); | |
331 | - } else { | |
332 | - file.write(destpath, contents, readWriteOptions); | |
333 | - } | |
334 | -}; | |
335 | - | |
336 | -// Delete folders and files recursively | |
337 | -file.delete = function(filepath, options) { | |
338 | - filepath = String(filepath); | |
339 | - | |
340 | - var nowrite = grunt.option('no-write'); | |
341 | - if (!options) { | |
342 | - options = {force: grunt.option('force') || false}; | |
343 | - } | |
344 | - | |
345 | - grunt.verbose.write((nowrite ? 'Not actually deleting ' : 'Deleting ') + filepath + '...'); | |
346 | - | |
347 | - if (!file.exists(filepath)) { | |
348 | - grunt.verbose.error(); | |
349 | - grunt.log.warn('Cannot delete nonexistent file.'); | |
350 | - return false; | |
351 | - } | |
352 | - | |
353 | - // Only delete cwd or outside cwd if --force enabled. Be careful, people! | |
354 | - if (!options.force) { | |
355 | - if (file.isPathCwd(filepath)) { | |
356 | - grunt.verbose.error(); | |
357 | - grunt.fail.warn('Cannot delete the current working directory.'); | |
358 | - return false; | |
359 | - } else if (!file.isPathInCwd(filepath)) { | |
360 | - grunt.verbose.error(); | |
361 | - grunt.fail.warn('Cannot delete files outside the current working directory.'); | |
362 | - return false; | |
363 | - } | |
364 | - } | |
365 | - | |
366 | - try { | |
367 | - // Actually delete. Or not. | |
368 | - if (!nowrite) { | |
369 | - rimraf.sync(filepath); | |
370 | - } | |
371 | - grunt.verbose.ok(); | |
372 | - return true; | |
373 | - } catch(e) { | |
374 | - grunt.verbose.error(); | |
375 | - throw grunt.util.error('Unable to delete "' + filepath + '" file (' + e.message + ').', e); | |
376 | - } | |
377 | -}; | |
378 | - | |
379 | -// True if the file path exists. | |
380 | -file.exists = function() { | |
381 | - var filepath = path.join.apply(path, arguments); | |
382 | - return fs.existsSync(filepath); | |
383 | -}; | |
384 | - | |
385 | -// True if the file is a symbolic link. | |
386 | -file.isLink = function() { | |
387 | - var filepath = path.join.apply(path, arguments); | |
388 | - return file.exists(filepath) && fs.lstatSync(filepath).isSymbolicLink(); | |
389 | -}; | |
390 | - | |
391 | -// True if the path is a directory. | |
392 | -file.isDir = function() { | |
393 | - var filepath = path.join.apply(path, arguments); | |
394 | - return file.exists(filepath) && fs.statSync(filepath).isDirectory(); | |
395 | -}; | |
396 | - | |
397 | -// True if the path is a file. | |
398 | -file.isFile = function() { | |
399 | - var filepath = path.join.apply(path, arguments); | |
400 | - return file.exists(filepath) && fs.statSync(filepath).isFile(); | |
401 | -}; | |
402 | - | |
403 | -// Is a given file path absolute? | |
404 | -file.isPathAbsolute = function() { | |
405 | - var filepath = path.join.apply(path, arguments); | |
406 | - return path.resolve(filepath) === filepath.replace(/[\/\\]+$/, ''); | |
407 | -}; | |
408 | - | |
409 | -// Do all the specified paths refer to the same path? | |
410 | -file.arePathsEquivalent = function(first) { | |
411 | - first = path.resolve(first); | |
412 | - for (var i = 1; i < arguments.length; i++) { | |
413 | - if (first !== path.resolve(arguments[i])) { return false; } | |
414 | - } | |
415 | - return true; | |
416 | -}; | |
417 | - | |
418 | -// Are descendant path(s) contained within ancestor path? Note: does not test | |
419 | -// if paths actually exist. | |
420 | -file.doesPathContain = function(ancestor) { | |
421 | - ancestor = path.resolve(ancestor); | |
422 | - var relative; | |
423 | - for (var i = 1; i < arguments.length; i++) { | |
424 | - relative = path.relative(path.resolve(arguments[i]), ancestor); | |
425 | - if (relative === '' || /\w+/.test(relative)) { return false; } | |
426 | - } | |
427 | - return true; | |
428 | -}; | |
429 | - | |
430 | -// Test to see if a filepath is the CWD. | |
431 | -file.isPathCwd = function() { | |
432 | - var filepath = path.join.apply(path, arguments); | |
433 | - try { | |
434 | - return file.arePathsEquivalent(fs.realpathSync(process.cwd()), fs.realpathSync(filepath)); | |
435 | - } catch(e) { | |
436 | - return false; | |
437 | - } | |
438 | -}; | |
439 | - | |
440 | -// Test to see if a filepath is contained within the CWD. | |
441 | -file.isPathInCwd = function() { | |
442 | - var filepath = path.join.apply(path, arguments); | |
443 | - try { | |
444 | - return file.doesPathContain(fs.realpathSync(process.cwd()), fs.realpathSync(filepath)); | |
445 | - } catch(e) { | |
446 | - return false; | |
447 | - } | |
448 | -}; |
node_modules/grunt/lib/grunt/help.js deleted
1 | -/* | |
2 | - * grunt | |
3 | - * http://gruntjs.com/ | |
4 | - * | |
5 | - * Copyright (c) 2014 "Cowboy" Ben Alman | |
6 | - * Licensed under the MIT license. | |
7 | - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT | |
8 | - */ | |
9 | - | |
10 | -'use strict'; | |
11 | - | |
12 | -var grunt = require('../grunt'); | |
13 | - | |
14 | -// Nodejs libs. | |
15 | -var path = require('path'); | |
16 | - | |
17 | -// Set column widths. | |
18 | -var col1len = 0; | |
19 | -exports.initCol1 = function(str) { | |
20 | - col1len = Math.max(col1len, str.length); | |
21 | -}; | |
22 | -exports.initWidths = function() { | |
23 | - // Widths for options/tasks table output. | |
24 | - exports.widths = [1, col1len, 2, 76 - col1len]; | |
25 | -}; | |
26 | - | |
27 | -// Render an array in table form. | |
28 | -exports.table = function(arr) { | |
29 | - arr.forEach(function(item) { | |
30 | - grunt.log.writetableln(exports.widths, ['', grunt.util._.pad(item[0], col1len), '', item[1]]); | |
31 | - }); | |
32 | -}; | |
33 | - | |
34 | -// Methods to run, in-order. | |
35 | -exports.queue = [ | |
36 | - 'initOptions', | |
37 | - 'initTasks', | |
38 | - 'initWidths', | |
39 | - 'header', | |
40 | - 'usage', | |
41 | - 'options', | |
42 | - 'optionsFooter', | |
43 | - 'tasks', | |
44 | - 'footer', | |
45 | -]; | |
46 | - | |
47 | -// Actually display stuff. | |
48 | -exports.display = function() { | |
49 | - exports.queue.forEach(function(name) { exports[name](); }); | |
50 | -}; | |
51 | - | |
52 | - | |
53 | -// Header. | |
54 | -exports.header = function() { | |
55 | - grunt.log.writeln('Grunt: The JavaScript Task Runner (v' + grunt.version + ')'); | |
56 | -}; | |
57 | - | |
58 | -// Usage info. | |
59 | -exports.usage = function() { | |
60 | - grunt.log.header('Usage'); | |
61 | - grunt.log.writeln(' ' + path.basename(process.argv[1]) + ' [options] [task [task ...]]'); | |
62 | -}; | |
63 | - | |
64 | -// Options. | |
65 | -exports.initOptions = function() { | |
66 | - // Build 2-column array for table view. | |
67 | - exports._options = Object.keys(grunt.cli.optlist).map(function(long) { | |
68 | - var o = grunt.cli.optlist[long]; | |
69 | - var col1 = '--' + (o.negate ? 'no-' : '') + long + (o.short ? ', -' + o.short : ''); | |
70 | - exports.initCol1(col1); | |
71 | - return [col1, o.info]; | |
72 | - }); | |
73 | -}; | |
74 | - | |
75 | -exports.options = function() { | |
76 | - grunt.log.header('Options'); | |
77 | - exports.table(exports._options); | |
78 | -}; | |
79 | - | |
80 | -exports.optionsFooter = function() { | |
81 | - grunt.log.writeln().writelns( | |
82 | - 'Options marked with * have methods exposed via the grunt API and should ' + | |
83 | - 'instead be specified inside the Gruntfile wherever possible.' | |
84 | - ); | |
85 | -}; | |
86 | - | |
87 | -// Tasks. | |
88 | -exports.initTasks = function() { | |
89 | - // Initialize task system so that the tasks can be listed. | |
90 | - grunt.task.init([], {help: true}); | |
91 | - | |
92 | - // Build object of tasks by info (where they were loaded from). | |
93 | - exports._tasks = []; | |
94 | - Object.keys(grunt.task._tasks).forEach(function(name) { | |
95 | - exports.initCol1(name); | |
96 | - var task = grunt.task._tasks[name]; | |
97 | - exports._tasks.push(task); | |
98 | - }); | |
99 | -}; | |
100 | - | |
101 | -exports.tasks = function() { | |
102 | - grunt.log.header('Available tasks'); | |
103 | - if (exports._tasks.length === 0) { | |
104 | - grunt.log.writeln('(no tasks found)'); | |
105 | - } else { | |
106 | - exports.table(exports._tasks.map(function(task) { | |
107 | - var info = task.info; | |
108 | - if (task.multi) { info += ' *'; } | |
109 | - return [task.name, info]; | |
110 | - })); | |
111 | - | |
112 | - grunt.log.writeln().writelns( | |
113 | - 'Tasks run in the order specified. Arguments may be passed to tasks that ' + | |
114 | - 'accept them by using colons, like "lint:files". Tasks marked with * are ' + | |
115 | - '"multi tasks" and will iterate over all sub-targets if no argument is ' + | |
116 | - 'specified.' | |
117 | - ); | |
118 | - } | |
119 | - | |
120 | - grunt.log.writeln().writelns( | |
121 | - 'The list of available tasks may change based on tasks directories or ' + | |
122 | - 'grunt plugins specified in the Gruntfile or via command-line options.' | |
123 | - ); | |
124 | -}; | |
125 | - | |
126 | -// Footer. | |
127 | -exports.footer = function() { | |
128 | - grunt.log.writeln().writeln('For more information, see http://gruntjs.com/'); | |
129 | -}; |
node_modules/grunt/lib/grunt/option.js deleted
1 | -/* | |
2 | - * grunt | |
3 | - * http://gruntjs.com/ | |
4 | - * | |
5 | - * Copyright (c) 2014 "Cowboy" Ben Alman | |
6 | - * Licensed under the MIT license. | |
7 | - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT | |
8 | - */ | |
9 | - | |
10 | -'use strict'; | |
11 | - | |
12 | -// The actual option data. | |
13 | -var data = {}; | |
14 | - | |
15 | -// Get or set an option value. | |
16 | -var option = module.exports = function(key, value) { | |
17 | - var no = key.match(/^no-(.+)$/); | |
18 | - if (arguments.length === 2) { | |
19 | - return (data[key] = value); | |
20 | - } else if (no) { | |
21 | - return data[no[1]] === false; | |
22 | - } else { | |
23 | - return data[key]; | |
24 | - } | |
25 | -}; | |
26 | - | |
27 | -// Initialize option data. | |
28 | -option.init = function(obj) { | |
29 | - return (data = obj || {}); | |
30 | -}; | |
31 | - | |
32 | -// List of options as flags. | |
33 | -option.flags = function() { | |
34 | - return Object.keys(data).filter(function(key) { | |
35 | - // Don't display empty arrays. | |
36 | - return !(Array.isArray(data[key]) && data[key].length === 0); | |
37 | - }).map(function(key) { | |
38 | - var val = data[key]; | |
39 | - return '--' + (val === false ? 'no-' : '') + key + | |
40 | - (typeof val === 'boolean' ? '' : '=' + val); | |
41 | - }); | |
42 | -}; |
node_modules/grunt/lib/grunt/task.js deleted
1 | -/* | |
2 | - * grunt | |
3 | - * http://gruntjs.com/ | |
4 | - * | |
5 | - * Copyright (c) 2014 "Cowboy" Ben Alman | |
6 | - * Licensed under the MIT license. | |
7 | - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT | |
8 | - */ | |
9 | - | |
10 | -'use strict'; | |
11 | - | |
12 | -var grunt = require('../grunt'); | |
13 | - | |
14 | -// Nodejs libs. | |
15 | -var path = require('path'); | |
16 | - | |
17 | -// Extend generic "task" util lib. | |
18 | -var parent = grunt.util.task.create(); | |
19 | - | |
20 | -// The module to be exported. | |
21 | -var task = module.exports = Object.create(parent); | |
22 | - | |
23 | -// A temporary registry of tasks and metadata. | |
24 | -var registry = {tasks: [], untasks: [], meta: {}}; | |
25 | - | |
26 | -// The last specified tasks message. | |
27 | -var lastInfo; | |
28 | - | |
29 | -// Number of levels of recursion when loading tasks in collections. | |
30 | -var loadTaskDepth = 0; | |
31 | - | |
32 | -// Keep track of the number of log.error() calls. | |
33 | -var errorcount; | |
34 | - | |
35 | -// Override built-in registerTask. | |
36 | -task.registerTask = function(name) { | |
37 | - // Add task to registry. | |
38 | - registry.tasks.push(name); | |
39 | - // Register task. | |
40 | - parent.registerTask.apply(task, arguments); | |
41 | - // This task, now that it's been registered. | |
42 | - var thisTask = task._tasks[name]; | |
43 | - // Metadata about the current task. | |
44 | - thisTask.meta = grunt.util._.clone(registry.meta); | |
45 | - // Override task function. | |
46 | - var _fn = thisTask.fn; | |
47 | - thisTask.fn = function(arg) { | |
48 | - // Guaranteed to always be the actual task name. | |
49 | - var name = thisTask.name; | |
50 | - // Initialize the errorcount for this task. | |
51 | - errorcount = grunt.fail.errorcount; | |
52 | - // Return the number of errors logged during this task. | |
53 | - Object.defineProperty(this, 'errorCount', { | |
54 | - enumerable: true, | |
55 | - get: function() { | |
56 | - return grunt.fail.errorcount - errorcount; | |
57 | - } | |
58 | - }); | |
59 | - // Expose task.requires on `this`. | |
60 | - this.requires = task.requires.bind(task); | |
61 | - // Expose config.requires on `this`. | |
62 | - this.requiresConfig = grunt.config.requires; | |
63 | - // Return an options object with the specified defaults overwritten by task- | |
64 | - // specific overrides, via the "options" property. | |
65 | - this.options = function() { | |
66 | - var args = [{}].concat(grunt.util.toArray(arguments)).concat([ | |
67 | - grunt.config([name, 'options']) | |
68 | - ]); | |
69 | - var options = grunt.util._.extend.apply(null, args); | |
70 | - grunt.verbose.writeflags(options, 'Options'); | |
71 | - return options; | |
72 | - }; | |
73 | - // If this task was an alias or a multi task called without a target, | |
74 | - // only log if in verbose mode. | |
75 | - var logger = _fn.alias || (thisTask.multi && (!arg || arg === '*')) ? 'verbose' : 'log'; | |
76 | - // Actually log. | |
77 | - grunt[logger].header('Running "' + this.nameArgs + '"' + | |
78 | - (this.name !== this.nameArgs ? ' (' + this.name + ')' : '') + ' task'); | |
79 | - // If --debug was specified, log the path to this task's source file. | |
80 | - grunt[logger].debug('Task source: ' + thisTask.meta.filepath); | |
81 | - // Actually run the task. | |
82 | - return _fn.apply(this, arguments); | |
83 | - }; | |
84 | - return task; | |
85 | -}; | |
86 | - | |
87 | -// Multi task targets can't start with _ or be a reserved property (options). | |
88 | -function isValidMultiTaskTarget(target) { | |
89 | - return !/^_|^options$/.test(target); | |
90 | -} | |
91 | - | |
92 | -// Normalize multi task files. | |
93 | -task.normalizeMultiTaskFiles = function(data, target) { | |
94 | - var prop, obj; | |
95 | - var files = []; | |
96 | - if (grunt.util.kindOf(data) === 'object') { | |
97 | - if ('src' in data || 'dest' in data) { | |
98 | - obj = {}; | |
99 | - for (prop in data) { | |
100 | - if (prop !== 'options') { | |
101 | - obj[prop] = data[prop]; | |
102 | - } | |
103 | - } | |
104 | - files.push(obj); | |
105 | - } else if (grunt.util.kindOf(data.files) === 'object') { | |
106 | - for (prop in data.files) { | |
107 | - files.push({src: data.files[prop], dest: grunt.config.process(prop)}); | |
108 | - } | |
109 | - } else if (Array.isArray(data.files)) { | |
110 | - grunt.util._.flatten(data.files).forEach(function(obj) { | |
111 | - var prop; | |
112 | - if ('src' in obj || 'dest' in obj) { | |
113 | - files.push(obj); | |
114 | - } else { | |
115 | - for (prop in obj) { | |
116 | - files.push({src: obj[prop], dest: grunt.config.process(prop)}); | |
117 | - } | |
118 | - } | |
119 | - }); | |
120 | - } | |
121 | - } else { | |
122 | - files.push({src: data, dest: grunt.config.process(target)}); | |
123 | - } | |
124 | - | |
125 | - // If no src/dest or files were specified, return an empty files array. | |
126 | - if (files.length === 0) { | |
127 | - grunt.verbose.writeln('File: ' + '[no files]'.yellow); | |
128 | - return []; | |
129 | - } | |
130 | - | |
131 | - // Process all normalized file objects. | |
132 | - files = grunt.util._(files).chain().forEach(function(obj) { | |
133 | - if (!('src' in obj) || !obj.src) { return; } | |
134 | - // Normalize .src properties to flattened array. | |
135 | - if (Array.isArray(obj.src)) { | |
136 | - obj.src = grunt.util._.flatten(obj.src); | |
137 | - } else { | |
138 | - obj.src = [obj.src]; | |
139 | - } | |
140 | - }).map(function(obj) { | |
141 | - // Build options object, removing unwanted properties. | |
142 | - var expandOptions = grunt.util._.extend({}, obj); | |
143 | - delete expandOptions.src; | |
144 | - delete expandOptions.dest; | |
145 | - | |
146 | - // Expand file mappings. | |
147 | - if (obj.expand) { | |
148 | - return grunt.file.expandMapping(obj.src, obj.dest, expandOptions).map(function(mapObj) { | |
149 | - // Copy obj properties to result. | |
150 | - var result = grunt.util._.extend({}, obj); | |
151 | - // Make a clone of the orig obj available. | |
152 | - result.orig = grunt.util._.extend({}, obj); | |
153 | - // Set .src and .dest, processing both as templates. | |
154 | - result.src = grunt.config.process(mapObj.src); | |
155 | - result.dest = grunt.config.process(mapObj.dest); | |
156 | - // Remove unwanted properties. | |
157 | - ['expand', 'cwd', 'flatten', 'rename', 'ext'].forEach(function(prop) { | |
158 | - delete result[prop]; | |
159 | - }); | |
160 | - return result; | |
161 | - }); | |
162 | - } | |
163 | - | |
164 | - // Copy obj properties to result, adding an .orig property. | |
165 | - var result = grunt.util._.extend({}, obj); | |
166 | - // Make a clone of the orig obj available. | |
167 | - result.orig = grunt.util._.extend({}, obj); | |
168 | - | |
169 | - if ('src' in result) { | |
170 | - // Expose an expand-on-demand getter method as .src. | |
171 | - Object.defineProperty(result, 'src', { | |
172 | - enumerable: true, | |
173 | - get: function fn() { | |
174 | - var src; | |
175 | - if (!('result' in fn)) { | |
176 | - src = obj.src; | |
177 | - // If src is an array, flatten it. Otherwise, make it into an array. | |
178 | - src = Array.isArray(src) ? grunt.util._.flatten(src) : [src]; | |
179 | - // Expand src files, memoizing result. | |
180 | - fn.result = grunt.file.expand(expandOptions, src); | |
181 | - } | |
182 | - return fn.result; | |
183 | - } | |
184 | - }); | |
185 | - } | |
186 | - | |
187 | - if ('dest' in result) { | |
188 | - result.dest = obj.dest; | |
189 | - } | |
190 | - | |
191 | - return result; | |
192 | - }).flatten().value(); | |
193 | - | |
194 | - // Log this.file src and dest properties when --verbose is specified. | |
195 | - if (grunt.option('verbose')) { | |
196 | - files.forEach(function(obj) { | |
197 | - var output = []; | |
198 | - if ('src' in obj) { | |
199 | - output.push(obj.src.length > 0 ? grunt.log.wordlist(obj.src) : '[no src]'.yellow); | |
200 | - } | |
201 | - if ('dest' in obj) { | |
202 | - output.push('-> ' + (obj.dest ? String(obj.dest).cyan : '[no dest]'.yellow)); | |
203 | - } | |
204 | - if (output.length > 0) { | |
205 | - grunt.verbose.writeln('Files: ' + output.join(' ')); | |
206 | - } | |
207 | - }); | |
208 | - } | |
209 | - | |
210 | - return files; | |
211 | -}; | |
212 | - | |
213 | -// This is the most common "multi task" pattern. | |
214 | -task.registerMultiTask = function(name, info, fn) { | |
215 | - // If optional "info" string is omitted, shuffle arguments a bit. | |
216 | - if (fn == null) { | |
217 | - fn = info; | |
218 | - info = 'Custom multi task.'; | |
219 | - } | |
220 | - // Store a reference to the task object, in case the task gets renamed. | |
221 | - var thisTask; | |
222 | - task.registerTask(name, info, function(target) { | |
223 | - // Guaranteed to always be the actual task name. | |
224 | - var name = thisTask.name; | |
225 | - // Arguments (sans target) as an array. | |
226 | - this.args = grunt.util.toArray(arguments).slice(1); | |
227 | - // If a target wasn't specified, run this task once for each target. | |
228 | - if (!target || target === '*') { | |
229 | - return task.runAllTargets(name, this.args); | |
230 | - } else if (!isValidMultiTaskTarget(target)) { | |
231 | - throw new Error('Invalid target "' + target + '" specified.'); | |
232 | - } | |
233 | - // Fail if any required config properties have been omitted. | |
234 | - this.requiresConfig([name, target]); | |
235 | - // Return an options object with the specified defaults overwritten by task- | |
236 | - // and/or target-specific overrides, via the "options" property. | |
237 | - this.options = function() { | |
238 | - var targetObj = grunt.config([name, target]); | |
239 | - var args = [{}].concat(grunt.util.toArray(arguments)).concat([ | |
240 | - grunt.config([name, 'options']), | |
241 | - grunt.util.kindOf(targetObj) === 'object' ? targetObj.options : {} | |
242 | - ]); | |
243 | - var options = grunt.util._.extend.apply(null, args); | |
244 | - grunt.verbose.writeflags(options, 'Options'); | |
245 | - return options; | |
246 | - }; | |
247 | - // Expose the current target. | |
248 | - this.target = target; | |
249 | - // Recreate flags object so that the target isn't set as a flag. | |
250 | - this.flags = {}; | |
251 | - this.args.forEach(function(arg) { this.flags[arg] = true; }, this); | |
252 | - // Expose data on `this` (as well as task.current). | |
253 | - this.data = grunt.config([name, target]); | |
254 | - // Expose normalized files object. | |
255 | - this.files = task.normalizeMultiTaskFiles(this.data, target); | |
256 | - // Expose normalized, flattened, uniqued array of src files. | |
257 | - Object.defineProperty(this, 'filesSrc', { | |
258 | - enumerable: true, | |
259 | - get: function() { | |
260 | - return grunt.util._(this.files).chain().pluck('src').flatten().uniq().value(); | |
261 | - }.bind(this) | |
262 | - }); | |
263 | - // Call original task function, passing in the target and any other args. | |
264 | - return fn.apply(this, this.args); | |
265 | - }); | |
266 | - | |
267 | - thisTask = task._tasks[name]; | |
268 | - thisTask.multi = true; | |
269 | -}; | |
270 | - | |
271 | -// Init tasks don't require properties in config, and as such will preempt | |
272 | -// config loading errors. | |
273 | -task.registerInitTask = function(name, info, fn) { | |
274 | - task.registerTask(name, info, fn); | |
275 | - task._tasks[name].init = true; | |
276 | -}; | |
277 | - | |
278 | -// Override built-in renameTask to use the registry. | |
279 | -task.renameTask = function(oldname, newname) { | |
280 | - var result; | |
281 | - try { | |
282 | - // Actually rename task. | |
283 | - result = parent.renameTask.apply(task, arguments); | |
284 | - // Add and remove task. | |
285 | - registry.untasks.push(oldname); | |
286 | - registry.tasks.push(newname); | |
287 | - // Return result. | |
288 | - return result; | |
289 | - } catch(e) { | |
290 | - grunt.log.error(e.message); | |
291 | - } | |
292 | -}; | |
293 | - | |
294 | -// If a property wasn't passed, run all task targets in turn. | |
295 | -task.runAllTargets = function(taskname, args) { | |
296 | - // Get an array of sub-property keys under the given config object. | |
297 | - var targets = Object.keys(grunt.config.getRaw(taskname) || {}); | |
298 | - // Fail if there are no actual properties to iterate over. | |
299 | - if (targets.length === 0) { | |
300 | - grunt.log.error('No "' + taskname + '" targets found.'); | |
301 | - return false; | |
302 | - } | |
303 | - // Iterate over all valid target properties, running a task for each. | |
304 | - targets.filter(isValidMultiTaskTarget).forEach(function(target) { | |
305 | - // Be sure to pass in any additionally specified args. | |
306 | - task.run([taskname, target].concat(args || []).join(':')); | |
307 | - }); | |
308 | -}; | |
309 | - | |
310 | -// Load tasks and handlers from a given tasks file. | |
311 | -var loadTaskStack = []; | |
312 | -function loadTask(filepath) { | |
313 | - // In case this was called recursively, save registry for later. | |
314 | - loadTaskStack.push(registry); | |
315 | - // Reset registry. | |
316 | - registry = {tasks: [], untasks: [], meta: {info: lastInfo, filepath: filepath}}; | |
317 | - var filename = path.basename(filepath); | |
318 | - var msg = 'Loading "' + filename + '" tasks...'; | |
319 | - var regCount = 0; | |
320 | - var fn; | |
321 | - try { | |
322 | - // Load taskfile. | |
323 | - fn = require(path.resolve(filepath)); | |
324 | - if (typeof fn === 'function') { | |
325 | - fn.call(grunt, grunt); | |
326 | - } | |
327 | - grunt.verbose.write(msg).ok(); | |
328 | - // Log registered/renamed/unregistered tasks. | |
329 | - ['un', ''].forEach(function(prefix) { | |
330 | - var list = grunt.util._.chain(registry[prefix + 'tasks']).uniq().sort().value(); | |
331 | - if (list.length > 0) { | |
332 | - regCount++; | |
333 | - grunt.verbose.writeln((prefix ? '- ' : '+ ') + grunt.log.wordlist(list)); | |
334 | - } | |
335 | - }); | |
336 | - if (regCount === 0) { | |
337 | - grunt.verbose.warn('No tasks were registered or unregistered.'); | |
338 | - } | |
339 | - } catch(e) { | |
340 | - // Something went wrong. | |
341 | - grunt.log.write(msg).error().verbose.error(e.stack).or.error(e); | |
342 | - } | |
343 | - // Restore registry. | |
344 | - registry = loadTaskStack.pop() || {}; | |
345 | -} | |
346 | - | |
347 | -// Log a message when loading tasks. | |
348 | -function loadTasksMessage(info) { | |
349 | - // Only keep track of names of top-level loaded tasks and collections, | |
350 | - // not sub-tasks. | |
351 | - if (loadTaskDepth === 0) { lastInfo = info; } | |
352 | - grunt.verbose.subhead('Registering ' + info + ' tasks.'); | |
353 | -} | |
354 | - | |
355 | -// Load tasks and handlers from a given directory. | |
356 | -function loadTasks(tasksdir) { | |
357 | - try { | |
358 | - var files = grunt.file.glob.sync('*.{js,coffee}', {cwd: tasksdir, maxDepth: 1}); | |
359 | - // Load tasks from files. | |
360 | - files.forEach(function(filename) { | |
361 | - loadTask(path.join(tasksdir, filename)); | |
362 | - }); | |
363 | - } catch(e) { | |
364 | - grunt.log.verbose.error(e.stack).or.error(e); | |
365 | - } | |
366 | -} | |
367 | - | |
368 | -// Load tasks and handlers from a given directory. | |
369 | -task.loadTasks = function(tasksdir) { | |
370 | - loadTasksMessage('"' + tasksdir + '"'); | |
371 | - if (grunt.file.exists(tasksdir)) { | |
372 | - loadTasks(tasksdir); | |
373 | - } else { | |
374 | - grunt.log.error('Tasks directory "' + tasksdir + '" not found.'); | |
375 | - } | |
376 | -}; | |
377 | - | |
378 | -// Load tasks and handlers from a given locally-installed Npm module (installed | |
379 | -// relative to the base dir). | |
380 | -task.loadNpmTasks = function(name) { | |
381 | - loadTasksMessage('"' + name + '" local Npm module'); | |
382 | - var root = path.resolve('node_modules'); | |
383 | - var pkgfile = path.join(root, name, 'package.json'); | |
384 | - var pkg = grunt.file.exists(pkgfile) ? grunt.file.readJSON(pkgfile) : {keywords: []}; | |
385 | - | |
386 | - // Process collection plugins. | |
387 | - if (pkg.keywords && pkg.keywords.indexOf('gruntcollection') !== -1) { | |
388 | - loadTaskDepth++; | |
389 | - Object.keys(pkg.dependencies).forEach(function(depName) { | |
390 | - // Npm sometimes pulls dependencies out if they're shared, so find | |
391 | - // upwards if not found locally. | |
392 | - var filepath = grunt.file.findup('node_modules/' + depName, { | |
393 | - cwd: path.resolve('node_modules', name), | |
394 | - nocase: true | |
395 | - }); | |
396 | - if (filepath) { | |
397 | - // Load this task plugin recursively. | |
398 | - task.loadNpmTasks(path.relative(root, filepath)); | |
399 | - } | |
400 | - }); | |
401 | - loadTaskDepth--; | |
402 | - return; | |
403 | - } | |
404 | - | |
405 | - // Process task plugins. | |
406 | - var tasksdir = path.join(root, name, 'tasks'); | |
407 | - if (grunt.file.exists(tasksdir)) { | |
408 | - loadTasks(tasksdir); | |
409 | - } else { | |
410 | - grunt.log.error('Local Npm module "' + name + '" not found. Is it installed?'); | |
411 | - } | |
412 | -}; | |
413 | - | |
414 | -// Initialize tasks. | |
415 | -task.init = function(tasks, options) { | |
416 | - if (!options) { options = {}; } | |
417 | - | |
418 | - // Were only init tasks specified? | |
419 | - var allInit = tasks.length > 0 && tasks.every(function(name) { | |
420 | - var obj = task._taskPlusArgs(name).task; | |
421 | - return obj && obj.init; | |
422 | - }); | |
423 | - | |
424 | - // Get any local Gruntfile or tasks that might exist. Use --gruntfile override | |
425 | - // if specified, otherwise search the current directory or any parent. | |
426 | - var gruntfile = allInit ? null : grunt.option('gruntfile') || | |
427 | - grunt.file.findup('Gruntfile.{js,coffee}', {nocase: true}); | |
428 | - | |
429 | - var msg = 'Reading "' + (gruntfile ? path.basename(gruntfile) : '???') + '" Gruntfile...'; | |
430 | - if (gruntfile && grunt.file.exists(gruntfile)) { | |
431 | - grunt.verbose.writeln().write(msg).ok(); | |
432 | - // Change working directory so that all paths are relative to the | |
433 | - // Gruntfile's location (or the --base option, if specified). | |
434 | - process.chdir(grunt.option('base') || path.dirname(gruntfile)); | |
435 | - // Load local tasks, if the file exists. | |
436 | - loadTasksMessage('Gruntfile'); | |
437 | - loadTask(gruntfile); | |
438 | - } else if (options.help || allInit) { | |
439 | - // Don't complain about missing Gruntfile. | |
440 | - } else if (grunt.option('gruntfile')) { | |
441 | - // If --config override was specified and it doesn't exist, complain. | |
442 | - grunt.log.writeln().write(msg).error(); | |
443 | - grunt.fatal('Unable to find "' + gruntfile + '" Gruntfile.', grunt.fail.code.MISSING_GRUNTFILE); | |
444 | - } else if (!grunt.option('help')) { | |
445 | - grunt.verbose.writeln().write(msg).error(); | |
446 | - grunt.log.writelns( | |
447 | - 'A valid Gruntfile could not be found. Please see the getting ' + | |
448 | - 'started guide for more information on how to configure grunt: ' + | |
449 | - 'http://gruntjs.com/getting-started' | |
450 | - ); | |
451 | - grunt.fatal('Unable to find Gruntfile.', grunt.fail.code.MISSING_GRUNTFILE); | |
452 | - } | |
453 | - | |
454 | - // Load all user-specified --npm tasks. | |
455 | - (grunt.option('npm') || []).forEach(task.loadNpmTasks); | |
456 | - // Load all user-specified --tasks. | |
457 | - (grunt.option('tasks') || []).forEach(task.loadTasks); | |
458 | -}; |
node_modules/grunt/lib/grunt/template.js deleted
1 | -/* | |
2 | - * grunt | |
3 | - * http://gruntjs.com/ | |
4 | - * | |
5 | - * Copyright (c) 2014 "Cowboy" Ben Alman | |
6 | - * Licensed under the MIT license. | |
7 | - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT | |
8 | - */ | |
9 | - | |
10 | -'use strict'; | |
11 | - | |
12 | -var grunt = require('../grunt'); | |
13 | - | |
14 | -// The module to be exported. | |
15 | -var template = module.exports = {}; | |
16 | - | |
17 | -// External libs. | |
18 | -template.date = require('dateformat'); | |
19 | - | |
20 | -// Format today's date. | |
21 | -template.today = function(format) { | |
22 | - return template.date(new Date(), format); | |
23 | -}; | |
24 | - | |
25 | -// Template delimiters. | |
26 | -var allDelimiters = {}; | |
27 | - | |
28 | -// Initialize template delimiters. | |
29 | -template.addDelimiters = function(name, opener, closer) { | |
30 | - var delimiters = allDelimiters[name] = {}; | |
31 | - // Used by grunt. | |
32 | - delimiters.opener = opener; | |
33 | - delimiters.closer = closer; | |
34 | - // Generate RegExp patterns dynamically. | |
35 | - var a = delimiters.opener.replace(/(.)/g, '\\$1'); | |
36 | - var b = '([\\s\\S]+?)' + delimiters.closer.replace(/(.)/g, '\\$1'); | |
37 | - // Used by Lo-Dash. | |
38 | - delimiters.lodash = { | |
39 | - evaluate: new RegExp(a + b, 'g'), | |
40 | - interpolate: new RegExp(a + '=' + b, 'g'), | |
41 | - escape: new RegExp(a + '-' + b, 'g') | |
42 | - }; | |
43 | -}; | |
44 | - | |
45 | -// The underscore default template syntax should be a pretty sane default for | |
46 | -// the config system. | |
47 | -template.addDelimiters('config', '<%', '%>'); | |
48 | - | |
49 | -// Set Lo-Dash template delimiters. | |
50 | -template.setDelimiters = function(name) { | |
51 | - // Get the appropriate delimiters. | |
52 | - var delimiters = allDelimiters[name in allDelimiters ? name : 'config']; | |
53 | - // Tell Lo-Dash which delimiters to use. | |
54 | - grunt.util._.templateSettings = delimiters.lodash; | |
55 | - // Return the delimiters. | |
56 | - return delimiters; | |
57 | -}; | |
58 | - | |
59 | -// Process template + data with Lo-Dash. | |
60 | -template.process = function(tmpl, options) { | |
61 | - if (!options) { options = {}; } | |
62 | - // Set delimiters, and get a opening match character. | |
63 | - var delimiters = template.setDelimiters(options.delimiters); | |
64 | - // Clone data, initializing to config data or empty object if omitted. | |
65 | - var data = Object.create(options.data || grunt.config.data || {}); | |
66 | - // Expose grunt so that grunt utilities can be accessed, but only if it | |
67 | - // doesn't conflict with an existing .grunt property. | |
68 | - if (!('grunt' in data)) { data.grunt = grunt; } | |
69 | - // Keep track of last change. | |
70 | - var last = tmpl; | |
71 | - try { | |
72 | - // As long as tmpl contains template tags, render it and get the result, | |
73 | - // otherwise just use the template string. | |
74 | - while (tmpl.indexOf(delimiters.opener) >= 0) { | |
75 | - tmpl = grunt.util._.template(tmpl, data); | |
76 | - // Abort if template didn't change - nothing left to process! | |
77 | - if (tmpl === last) { break; } | |
78 | - last = tmpl; | |
79 | - } | |
80 | - } catch (e) { | |
81 | - // In upgrading to Lo-Dash (or Underscore.js 1.3.3), \n and \r in template | |
82 | - // tags now causes an exception to be thrown. Warn the user why this is | |
83 | - // happening. https://github.com/documentcloud/underscore/issues/553 | |
84 | - if (String(e) === 'SyntaxError: Unexpected token ILLEGAL' && /\n|\r/.test(tmpl)) { | |
85 | - grunt.log.errorlns('A special character was detected in this template. ' + | |
86 | - 'Inside template tags, the \\n and \\r special characters must be ' + | |
87 | - 'escaped as \\\\n and \\\\r. (grunt 0.4.0+)'); | |
88 | - } | |
89 | - // Slightly better error message. | |
90 | - e.message = 'An error occurred while processing a template (' + e.message + ').'; | |
91 | - grunt.warn(e, grunt.fail.code.TEMPLATE_ERROR); | |
92 | - } | |
93 | - // Normalize linefeeds and return. | |
94 | - return grunt.util.normalizelf(tmpl); | |
95 | -}; |
node_modules/grunt/lib/util/task.js deleted
1 | -/* | |
2 | - * grunt | |
3 | - * http://gruntjs.com/ | |
4 | - * | |
5 | - * Copyright (c) 2014 "Cowboy" Ben Alman | |
6 | - * Licensed under the MIT license. | |
7 | - * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT | |
8 | - */ | |
9 | - | |
10 | -(function(exports) { | |
11 | - | |
12 | - 'use strict'; | |
13 | - | |
14 | - // Construct-o-rama. | |
15 | - function Task() { | |
16 | - // Information about the currently-running task. | |
17 | - this.current = {}; | |
18 | - // Tasks. | |
19 | - this._tasks = {}; | |
20 | - // Task queue. | |
21 | - this._queue = []; | |
22 | - // Queue placeholder (for dealing with nested tasks). | |
23 | - this._placeholder = {placeholder: true}; | |
24 | - // Queue marker (for clearing the queue programmatically). | |
25 | - this._marker = {marker: true}; | |
26 | - // Options. | |
27 | - this._options = {}; | |
28 | - // Is the queue running? | |
29 | - this._running = false; | |
30 | - // Success status of completed tasks. | |
31 | - this._success = {}; | |
32 | - } | |
33 | - | |
34 | - // Expose the constructor function. | |
35 | - exports.Task = Task; | |
36 | - | |
37 | - // Create a new Task instance. | |
38 | - exports.create = function() { | |
39 | - return new Task(); | |
40 | - }; | |
41 | - | |
42 | - // If the task runner is running or an error handler is not defined, throw | |
43 | - // an exception. Otherwise, call the error handler directly. | |
44 | - Task.prototype._throwIfRunning = function(obj) { | |
45 | - if (this._running || !this._options.error) { | |
46 | - // Throw an exception that the task runner will catch. | |
47 | - throw obj; | |
48 | - } else { | |
49 | - // Not inside the task runner. Call the error handler and abort. | |
50 | - this._options.error.call({name: null}, obj); | |
51 | - } | |
52 | - }; | |
53 | - | |
54 | - // Register a new task. | |
55 | - Task.prototype.registerTask = function(name, info, fn) { | |
56 | - // If optional "info" string is omitted, shuffle arguments a bit. | |
57 | - if (fn == null) { | |
58 | - fn = info; | |
59 | - info = null; | |
60 | - } | |
61 | - // String or array of strings was passed instead of fn. | |
62 | - var tasks; | |
63 | - if (typeof fn !== 'function') { | |
64 | - // Array of task names. | |
65 | - tasks = this.parseArgs([fn]); | |
66 | - // This task function just runs the specified tasks. | |
67 | - fn = this.run.bind(this, fn); | |
68 | - fn.alias = true; | |
69 | - // Generate an info string if one wasn't explicitly passed. | |
70 | - if (!info) { | |
71 | - info = 'Alias for "' + tasks.join('", "') + '" task' + | |
72 | - (tasks.length === 1 ? '' : 's') + '.'; | |
73 | - } | |
74 | - } else if (!info) { | |
75 | - info = 'Custom task.'; | |
76 | - } | |
77 | - // Add task into cache. | |
78 | - this._tasks[name] = {name: name, info: info, fn: fn}; | |
79 | - // Make chainable! | |
80 | - return this; | |
81 | - }; | |
82 | - | |
83 | - // Is the specified task an alias? | |
84 | - Task.prototype.isTaskAlias = function(name) { | |
85 | - return !!this._tasks[name].fn.alias; | |
86 | - }; | |
87 | - | |
88 | - // Has the specified task been registered? | |
89 | - Task.prototype.exists = function(name) { | |
90 | - return name in this._tasks; | |
91 | - }; | |
92 | - | |
93 | - // Rename a task. This might be useful if you want to override the default | |
94 | - // behavior of a task, while retaining the old name. This is a billion times | |
95 | - // easier to implement than some kind of in-task "super" functionality. | |
96 | - Task.prototype.renameTask = function(oldname, newname) { | |
97 | - if (!this._tasks[oldname]) { | |
98 | - throw new Error('Cannot rename missing "' + oldname + '" task.'); | |
99 | - } | |
100 | - // Rename task. | |
101 | - this._tasks[newname] = this._tasks[oldname]; | |
102 | - // Update name property of task. | |
103 | - this._tasks[newname].name = newname; | |
104 | - // Remove old name. | |
105 | - delete this._tasks[oldname]; | |
106 | - // Make chainable! | |
107 | - return this; | |
108 | - }; | |
109 | - | |
110 | - // Argument parsing helper. Supports these signatures: | |
111 | - // fn('foo') // ['foo'] | |
112 | - // fn('foo', 'bar', 'baz') // ['foo', 'bar', 'baz'] | |
113 | - // fn(['foo', 'bar', 'baz']) // ['foo', 'bar', 'baz'] | |
114 | - Task.prototype.parseArgs = function(args) { | |
115 | - // Return the first argument if it's an array, otherwise return an array | |
116 | - // of all arguments. | |
117 | - return Array.isArray(args[0]) ? args[0] : [].slice.call(args); | |
118 | - }; | |
119 | - | |
120 | - // Split a colon-delimited string into an array, unescaping (but not | |
121 | - // splitting on) any \: escaped colons. | |
122 | - Task.prototype.splitArgs = function(str) { | |
123 | - if (!str) { return []; } | |
124 | - // Store placeholder for \\ followed by \: | |
125 | - str = str.replace(/\\\\/g, '\uFFFF').replace(/\\:/g, '\uFFFE'); | |
126 | - // Split on : | |
127 | - return str.split(':').map(function(s) { | |
128 | - // Restore place-held : followed by \\ | |
129 | - return s.replace(/\uFFFE/g, ':').replace(/\uFFFF/g, '\\'); | |
130 | - }); | |
131 | - }; | |
132 | - | |
133 | - // Given a task name, determine which actual task will be called, and what | |
134 | - // arguments will be passed into the task callback. "foo" -> task "foo", no | |
135 | - // args. "foo:bar:baz" -> task "foo:bar:baz" with no args (if "foo:bar:baz" | |
136 | - // task exists), otherwise task "foo:bar" with arg "baz" (if "foo:bar" task | |
137 | - // exists), otherwise task "foo" with args "bar" and "baz". | |
138 | - Task.prototype._taskPlusArgs = function(name) { | |
139 | - // Get task name / argument parts. | |
140 | - var parts = this.splitArgs(name); | |
141 | - // Start from the end, not the beginning! | |
142 | - var i = parts.length; | |
143 | - var task; | |
144 | - do { | |
145 | - // Get a task. | |
146 | - task = this._tasks[parts.slice(0, i).join(':')]; | |
147 | - // If the task doesn't exist, decrement `i`, and if `i` is greater than | |
148 | - // 0, repeat. | |
149 | - } while (!task && --i > 0); | |
150 | - // Just the args. | |
151 | - var args = parts.slice(i); | |
152 | - // Maybe you want to use them as flags instead of as positional args? | |
153 | - var flags = {}; | |
154 | - args.forEach(function(arg) { flags[arg] = true; }); | |
155 | - // The task to run and the args to run it with. | |
156 | - return {task: task, nameArgs: name, args: args, flags: flags}; | |
157 | - }; | |
158 | - | |
159 | - // Append things to queue in the correct spot. | |
160 | - Task.prototype._push = function(things) { | |
161 | - // Get current placeholder index. | |
162 | - var index = this._queue.indexOf(this._placeholder); | |
163 | - if (index === -1) { | |
164 | - // No placeholder, add task+args objects to end of queue. | |
165 | - this._queue = this._queue.concat(things); | |
166 | - } else { | |
167 | - // Placeholder exists, add task+args objects just before placeholder. | |
168 | - [].splice.apply(this._queue, [index, 0].concat(things)); | |
169 | - } | |
170 | - }; | |
171 | - | |
172 | - // Enqueue a task. | |
173 | - Task.prototype.run = function() { | |
174 | - // Parse arguments into an array, returning an array of task+args objects. | |
175 | - var things = this.parseArgs(arguments).map(this._taskPlusArgs, this); | |
176 | - // Throw an exception if any tasks weren't found. | |
177 | - var fails = things.filter(function(thing) { return !thing.task; }); | |
178 | - if (fails.length > 0) { | |
179 | - this._throwIfRunning(new Error('Task "' + fails[0].nameArgs + '" not found.')); | |
180 | - return this; | |
181 | - } | |
182 | - // Append things to queue in the correct spot. | |
183 | - this._push(things); | |
184 | - // Make chainable! | |
185 | - return this; | |
186 | - }; | |
187 | - | |
188 | - // Add a marker to the queue to facilitate clearing it programmatically. | |
189 | - Task.prototype.mark = function() { | |
190 | - this._push(this._marker); | |
191 | - // Make chainable! | |
192 | - return this; | |
193 | - }; | |
194 | - | |
195 | - // Run a task function, handling this.async / return value. | |
196 | - Task.prototype.runTaskFn = function(context, fn, done, asyncDone) { | |
197 | - // Async flag. | |
198 | - var async = false; | |
199 | - | |
200 | - // Update the internal status object and run the next task. | |
201 | - var complete = function(success) { | |
202 | - var err = null; | |
203 | - if (success === false) { | |
204 | - // Since false was passed, the task failed generically. | |
205 | - err = new Error('Task "' + context.nameArgs + '" failed.'); | |
206 | - } else if (success instanceof Error || {}.toString.call(success) === '[object Error]') { | |
207 | - // An error object was passed, so the task failed specifically. | |
208 | - err = success; | |
209 | - success = false; | |
210 | - } else { | |
211 | - // The task succeeded. | |
212 | - success = true; | |
213 | - } | |
214 | - // The task has ended, reset the current task object. | |
215 | - this.current = {}; | |
216 | - // A task has "failed" only if it returns false (async) or if the | |
217 | - // function returned by .async is passed false. | |
218 | - this._success[context.nameArgs] = success; | |
219 | - // If task failed, call error handler. | |
220 | - if (!success && this._options.error) { | |
221 | - this._options.error.call({name: context.name, nameArgs: context.nameArgs}, err); | |
222 | - } | |
223 | - // only call done async if explicitly requested to | |
224 | - // see: https://github.com/gruntjs/grunt/pull/1026 | |
225 | - if (asyncDone) { | |
226 | - process.nextTick(function () { | |
227 | - done(err, success); | |
228 | - }); | |
229 | - } else { | |
230 | - done(err, success); | |
231 | - } | |
232 | - }.bind(this); | |
233 | - | |
234 | - // When called, sets the async flag and returns a function that can | |
235 | - // be used to continue processing the queue. | |
236 | - context.async = function() { | |
237 | - async = true; | |
238 | - // The returned function should execute asynchronously in case | |
239 | - // someone tries to do this.async()(); inside a task (WTF). | |
240 | - return function(success) { | |
241 | - setTimeout(function() { complete(success); }, 1); | |
242 | - }; | |
243 | - }; | |
244 | - | |
245 | - // Expose some information about the currently-running task. | |
246 | - this.current = context; | |
247 | - | |
248 | - try { | |
249 | - // Get the current task and run it, setting `this` inside the task | |
250 | - // function to be something useful. | |
251 | - var success = fn.call(context); | |
252 | - // If the async flag wasn't set, process the next task in the queue. | |
253 | - if (!async) { | |
254 | - complete(success); | |
255 | - } | |
256 | - } catch (err) { | |
257 | - complete(err); | |
258 | - } | |
259 | - }; | |
260 | - | |
261 | - // Begin task queue processing. Ie. run all tasks. | |
262 | - Task.prototype.start = function(opts) { | |
263 | - if (!opts) { | |
264 | - opts = {}; | |
265 | - } | |
266 | - // Abort if already running. | |
267 | - if (this._running) { return false; } | |
268 | - // Actually process the next task. | |
269 | - var nextTask = function() { | |
270 | - // Get next task+args object from queue. | |
271 | - var thing; | |
272 | - // Skip any placeholders or markers. | |
273 | - do { | |
274 | - thing = this._queue.shift(); | |
275 | - } while (thing === this._placeholder || thing === this._marker); | |
276 | - // If queue was empty, we're all done. | |
277 | - if (!thing) { | |
278 | - this._running = false; | |
279 | - if (this._options.done) { | |
280 | - this._options.done(); | |
281 | - } | |
282 | - return; | |
283 | - } | |
284 | - // Add a placeholder to the front of the queue. | |
285 | - this._queue.unshift(this._placeholder); | |
286 | - | |
287 | - // Expose some information about the currently-running task. | |
288 | - var context = { | |
289 | - // The current task name plus args, as-passed. | |
290 | - nameArgs: thing.nameArgs, | |
291 | - // The current task name. | |
292 | - name: thing.task.name, | |
293 | - // The current task arguments. | |
294 | - args: thing.args, | |
295 | - // The current arguments, available as named flags. | |
296 | - flags: thing.flags | |
297 | - }; | |
298 | - | |
299 | - // Actually run the task function (handling this.async, etc) | |
300 | - this.runTaskFn(context, function() { | |
301 | - return thing.task.fn.apply(this, this.args); | |
302 | - }, nextTask, !!opts.asyncDone); | |
303 | - | |
304 | - }.bind(this); | |
305 | - | |
306 | - // Update flag. | |
307 | - this._running = true; | |
308 | - // Process the next task. | |
309 | - nextTask(); | |
310 | - }; | |
311 | - | |
312 | - // Clear remaining tasks from the queue. | |
313 | - Task.prototype.clearQueue = function(options) { | |
314 | - if (!options) { options = {}; } | |
315 | - if (options.untilMarker) { | |
316 | - this._queue.splice(0, this._queue.indexOf(this._marker) + 1); | |
317 | - } else { | |
318 | - this._queue = []; | |
319 | - } | |
320 | - // Make chainable! | |
321 | - return this; | |
322 | - }; | |
323 | - | |
324 | - // Test to see if all of the given tasks have succeeded. | |
325 | - Task.prototype.requires = function() { | |
326 | - this.parseArgs(arguments).forEach(function(name) { | |
327 | - var success = this._success[name]; | |
328 | - if (!success) { | |
329 | - throw new Error('Required task "' + name + | |
330 | - '" ' + (success === false ? 'failed' : 'must be run first') + '.'); | |
331 | - } | |
332 | - }.bind(this)); | |
333 | - }; | |
334 | - | |
335 | - // Override default options. | |
336 | - Task.prototype.options = function(options) { | |
337 | - Object.keys(options).forEach(function(name) { | |
338 | - this._options[name] = options[name]; | |
339 | - }.bind(this)); | |
340 | - }; | |
341 | - | |
342 | -}(typeof exports === 'object' && exports || this)); |
node_modules/grunt/node_modules/.bin/cake deleted
node_modules/grunt/node_modules/.bin/coffee deleted
node_modules/grunt/node_modules/.bin/js-yaml deleted
node_modules/grunt/node_modules/.bin/nopt deleted
node_modules/grunt/node_modules/.bin/rimraf deleted
node_modules/grunt/node_modules/.bin/which deleted
node_modules/grunt/node_modules/async/.gitmodules deleted
1 | -[submodule "deps/nodeunit"] | |
2 | - path = deps/nodeunit | |
3 | - url = git://github.com/caolan/nodeunit.git | |
4 | -[submodule "deps/UglifyJS"] | |
5 | - path = deps/UglifyJS | |
6 | - url = https://github.com/mishoo/UglifyJS.git | |
7 | -[submodule "deps/nodelint"] | |
8 | - path = deps/nodelint | |
9 | - url = https://github.com/tav/nodelint.git |
node_modules/grunt/node_modules/async/.npmignore deleted
node_modules/grunt/node_modules/async/LICENSE deleted
1 | -Copyright (c) 2010 Caolan McMahon | |
2 | - | |
3 | -Permission is hereby granted, free of charge, to any person obtaining a copy | |
4 | -of this software and associated documentation files (the "Software"), to deal | |
5 | -in the Software without restriction, including without limitation the rights | |
6 | -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
7 | -copies of the Software, and to permit persons to whom the Software is | |
8 | -furnished to do so, subject to the following conditions: | |
9 | - | |
10 | -The above copyright notice and this permission notice shall be included in | |
11 | -all copies or substantial portions of the Software. | |
12 | - | |
13 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
14 | -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
15 | -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
16 | -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
17 | -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
18 | -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
19 | -THE SOFTWARE. |
node_modules/grunt/node_modules/async/Makefile deleted
1 | -PACKAGE = asyncjs | |
2 | -NODEJS = $(if $(shell test -f /usr/bin/nodejs && echo "true"),nodejs,node) | |
3 | -CWD := $(shell pwd) | |
4 | -NODEUNIT = $(CWD)/node_modules/nodeunit/bin/nodeunit | |
5 | -UGLIFY = $(CWD)/node_modules/uglify-js/bin/uglifyjs | |
6 | -NODELINT = $(CWD)/node_modules/nodelint/nodelint | |
7 | - | |
8 | -BUILDDIR = dist | |
9 | - | |
10 | -all: clean test build | |
11 | - | |
12 | -build: $(wildcard lib/*.js) | |
13 | - mkdir -p $(BUILDDIR) | |
14 | - $(UGLIFY) lib/async.js > $(BUILDDIR)/async.min.js | |
15 | - | |
16 | -test: | |
17 | - $(NODEUNIT) test | |
18 | - | |
19 | -clean: | |
20 | - rm -rf $(BUILDDIR) | |
21 | - | |
22 | -lint: | |
23 | - $(NODELINT) --config nodelint.cfg lib/async.js | |
24 | - | |
25 | -.PHONY: test build all |
node_modules/grunt/node_modules/async/README.md deleted
1 | -# Async.js | |
2 | - | |
3 | -Async is a utility module which provides straight-forward, powerful functions | |
4 | -for working with asynchronous JavaScript. Although originally designed for | |
5 | -use with [node.js](http://nodejs.org), it can also be used directly in the | |
6 | -browser. | |
7 | - | |
8 | -Async provides around 20 functions that include the usual 'functional' | |
9 | -suspects (map, reduce, filter, forEachโฆ) as well as some common patterns | |
10 | -for asynchronous control flow (parallel, series, waterfallโฆ). All these | |
11 | -functions assume you follow the node.js convention of providing a single | |
12 | -callback as the last argument of your async function. | |
13 | - | |
14 | - | |
15 | -## Quick Examples | |
16 | - | |
17 | - async.map(['file1','file2','file3'], fs.stat, function(err, results){ | |
18 | - // results is now an array of stats for each file | |
19 | - }); | |
20 | - | |
21 | - async.filter(['file1','file2','file3'], path.exists, function(results){ | |
22 | - // results now equals an array of the existing files | |
23 | - }); | |
24 | - | |
25 | - async.parallel([ | |
26 | - function(){ ... }, | |
27 | - function(){ ... } | |
28 | - ], callback); | |
29 | - | |
30 | - async.series([ | |
31 | - function(){ ... }, | |
32 | - function(){ ... } | |
33 | - ]); | |
34 | - | |
35 | -There are many more functions available so take a look at the docs below for a | |
36 | -full list. This module aims to be comprehensive, so if you feel anything is | |
37 | -missing please create a GitHub issue for it. | |
38 | - | |
39 | - | |
40 | -## Download | |
41 | - | |
42 | -Releases are available for download from | |
43 | -[GitHub](http://github.com/caolan/async/downloads). | |
44 | -Alternatively, you can install using Node Package Manager (npm): | |
45 | - | |
46 | - npm install async | |
47 | - | |
48 | - | |
49 | -__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 17.5kb Uncompressed | |
50 | - | |
51 | -__Production:__ [async.min.js](https://github.com/caolan/async/raw/master/dist/async.min.js) - 1.7kb Packed and Gzipped | |
52 | - | |
53 | - | |
54 | -## In the Browser | |
55 | - | |
56 | -So far its been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage: | |
57 | - | |
58 | - <script type="text/javascript" src="async.js"></script> | |
59 | - <script type="text/javascript"> | |
60 | - | |
61 | - async.map(data, asyncProcess, function(err, results){ | |
62 | - alert(results); | |
63 | - }); | |
64 | - | |
65 | - </script> | |
66 | - | |
67 | - | |
68 | -## Documentation | |
69 | - | |
70 | -### Collections | |
71 | - | |
72 | -* [forEach](#forEach) | |
73 | -* [map](#map) | |
74 | -* [filter](#filter) | |
75 | -* [reject](#reject) | |
76 | -* [reduce](#reduce) | |
77 | -* [detect](#detect) | |
78 | -* [sortBy](#sortBy) | |
79 | -* [some](#some) | |
80 | -* [every](#every) | |
81 | -* [concat](#concat) | |
82 | - | |
83 | -### Control Flow | |
84 | - | |
85 | -* [series](#series) | |
86 | -* [parallel](#parallel) | |
87 | -* [whilst](#whilst) | |
88 | -* [until](#until) | |
89 | -* [waterfall](#waterfall) | |
90 | -* [queue](#queue) | |
91 | -* [auto](#auto) | |
92 | -* [iterator](#iterator) | |
93 | -* [apply](#apply) | |
94 | -* [nextTick](#nextTick) | |
95 | - | |
96 | -### Utils | |
97 | - | |
98 | -* [memoize](#memoize) | |
99 | -* [unmemoize](#unmemoize) | |
100 | -* [log](#log) | |
101 | -* [dir](#dir) | |
102 | -* [noConflict](#noConflict) | |
103 | - | |
104 | - | |
105 | -## Collections | |
106 | - | |
107 | -<a name="forEach" /> | |
108 | -### forEach(arr, iterator, callback) | |
109 | - | |
110 | -Applies an iterator function to each item in an array, in parallel. | |
111 | -The iterator is called with an item from the list and a callback for when it | |
112 | -has finished. If the iterator passes an error to this callback, the main | |
113 | -callback for the forEach function is immediately called with the error. | |
114 | - | |
115 | -Note, that since this function applies the iterator to each item in parallel | |
116 | -there is no guarantee that the iterator functions will complete in order. | |
117 | - | |
118 | -__Arguments__ | |
119 | - | |
120 | -* arr - An array to iterate over. | |
121 | -* iterator(item, callback) - A function to apply to each item in the array. | |
122 | - The iterator is passed a callback which must be called once it has completed. | |
123 | -* callback(err) - A callback which is called after all the iterator functions | |
124 | - have finished, or an error has occurred. | |
125 | - | |
126 | -__Example__ | |
127 | - | |
128 | - // assuming openFiles is an array of file names and saveFile is a function | |
129 | - // to save the modified contents of that file: | |
130 | - | |
131 | - async.forEach(openFiles, saveFile, function(err){ | |
132 | - // if any of the saves produced an error, err would equal that error | |
133 | - }); | |
134 | - | |
135 | ---------------------------------------- | |
136 | - | |
137 | -<a name="forEachSeries" /> | |
138 | -### forEachSeries(arr, iterator, callback) | |
139 | - | |
140 | -The same as forEach only the iterator is applied to each item in the array in | |
141 | -series. The next iterator is only called once the current one has completed | |
142 | -processing. This means the iterator functions will complete in order. | |
143 | - | |
144 | - | |
145 | ---------------------------------------- | |
146 | - | |
147 | -<a name="forEachLimit" /> | |
148 | -### forEachLimit(arr, limit, iterator, callback) | |
149 | - | |
150 | -The same as forEach only the iterator is applied to batches of items in the | |
151 | -array, in series. The next batch of iterators is only called once the current | |
152 | -one has completed processing. | |
153 | - | |
154 | -__Arguments__ | |
155 | - | |
156 | -* arr - An array to iterate over. | |
157 | -* limit - How many items should be in each batch. | |
158 | -* iterator(item, callback) - A function to apply to each item in the array. | |
159 | - The iterator is passed a callback which must be called once it has completed. | |
160 | -* callback(err) - A callback which is called after all the iterator functions | |
161 | - have finished, or an error has occurred. | |
162 | - | |
163 | -__Example__ | |
164 | - | |
165 | - // Assume documents is an array of JSON objects and requestApi is a | |
166 | - // function that interacts with a rate-limited REST api. | |
167 | - | |
168 | - async.forEachLimit(documents, 20, requestApi, function(err){ | |
169 | - // if any of the saves produced an error, err would equal that error | |
170 | - }); | |
171 | ---------------------------------------- | |
172 | - | |
173 | -<a name="map" /> | |
174 | -### map(arr, iterator, callback) | |
175 | - | |
176 | -Produces a new array of values by mapping each value in the given array through | |
177 | -the iterator function. The iterator is called with an item from the array and a | |
178 | -callback for when it has finished processing. The callback takes 2 arguments, | |
179 | -an error and the transformed item from the array. If the iterator passes an | |
180 | -error to this callback, the main callback for the map function is immediately | |
181 | -called with the error. | |
182 | - | |
183 | -Note, that since this function applies the iterator to each item in parallel | |
184 | -there is no guarantee that the iterator functions will complete in order, however | |
185 | -the results array will be in the same order as the original array. | |
186 | - | |
187 | -__Arguments__ | |
188 | - | |
189 | -* arr - An array to iterate over. | |
190 | -* iterator(item, callback) - A function to apply to each item in the array. | |
191 | - The iterator is passed a callback which must be called once it has completed | |
192 | - with an error (which can be null) and a transformed item. | |
193 | -* callback(err, results) - A callback which is called after all the iterator | |
194 | - functions have finished, or an error has occurred. Results is an array of the | |
195 | - transformed items from the original array. | |
196 | - | |
197 | -__Example__ | |
198 | - | |
199 | - async.map(['file1','file2','file3'], fs.stat, function(err, results){ | |
200 | - // results is now an array of stats for each file | |
201 | - }); | |
202 | - | |
203 | ---------------------------------------- | |
204 | - | |
205 | -<a name="mapSeries" /> | |
206 | -### mapSeries(arr, iterator, callback) | |
207 | - | |
208 | -The same as map only the iterator is applied to each item in the array in | |
209 | -series. The next iterator is only called once the current one has completed | |
210 | -processing. The results array will be in the same order as the original. | |
211 | - | |
212 | - | |
213 | ---------------------------------------- | |
214 | - | |
215 | -<a name="filter" /> | |
216 | -### filter(arr, iterator, callback) | |
217 | - | |
218 | -__Alias:__ select | |
219 | - | |
220 | -Returns a new array of all the values which pass an async truth test. | |
221 | -_The callback for each iterator call only accepts a single argument of true or | |
222 | -false, it does not accept an error argument first!_ This is in-line with the | |
223 | -way node libraries work with truth tests like path.exists. This operation is | |
224 | -performed in parallel, but the results array will be in the same order as the | |
225 | -original. | |
226 | - | |
227 | -__Arguments__ | |
228 | - | |
229 | -* arr - An array to iterate over. | |
230 | -* iterator(item, callback) - A truth test to apply to each item in the array. | |
231 | - The iterator is passed a callback which must be called once it has completed. | |
232 | -* callback(results) - A callback which is called after all the iterator | |
233 | - functions have finished. | |
234 | - | |
235 | -__Example__ | |
236 | - | |
237 | - async.filter(['file1','file2','file3'], path.exists, function(results){ | |
238 | - // results now equals an array of the existing files | |
239 | - }); | |
240 | - | |
241 | ---------------------------------------- | |
242 | - | |
243 | -<a name="filterSeries" /> | |
244 | -### filterSeries(arr, iterator, callback) | |
245 | - | |
246 | -__alias:__ selectSeries | |
247 | - | |
248 | -The same as filter only the iterator is applied to each item in the array in | |
249 | -series. The next iterator is only called once the current one has completed | |
250 | -processing. The results array will be in the same order as the original. | |
251 | - | |
252 | ---------------------------------------- | |
253 | - | |
254 | -<a name="reject" /> | |
255 | -### reject(arr, iterator, callback) | |
256 | - | |
257 | -The opposite of filter. Removes values that pass an async truth test. | |
258 | - | |
259 | ---------------------------------------- | |
260 | - | |
261 | -<a name="rejectSeries" /> | |
262 | -### rejectSeries(arr, iterator, callback) | |
263 | - | |
264 | -The same as filter, only the iterator is applied to each item in the array | |
265 | -in series. | |
266 | - | |
267 | - | |
268 | ---------------------------------------- | |
269 | - | |
270 | -<a name="reduce" /> | |
271 | -### reduce(arr, memo, iterator, callback) | |
272 | - | |
273 | -__aliases:__ inject, foldl | |
274 | - | |
275 | -Reduces a list of values into a single value using an async iterator to return | |
276 | -each successive step. Memo is the initial state of the reduction. This | |
277 | -function only operates in series. For performance reasons, it may make sense to | |
278 | -split a call to this function into a parallel map, then use the normal | |
279 | -Array.prototype.reduce on the results. This function is for situations where | |
280 | -each step in the reduction needs to be async, if you can get the data before | |
281 | -reducing it then its probably a good idea to do so. | |
282 | - | |
283 | -__Arguments__ | |
284 | - | |
285 | -* arr - An array to iterate over. | |
286 | -* memo - The initial state of the reduction. | |
287 | -* iterator(memo, item, callback) - A function applied to each item in the | |
288 | - array to produce the next step in the reduction. The iterator is passed a | |
289 | - callback which accepts an optional error as its first argument, and the state | |
290 | - of the reduction as the second. If an error is passed to the callback, the | |
291 | - reduction is stopped and the main callback is immediately called with the | |
292 | - error. | |
293 | -* callback(err, result) - A callback which is called after all the iterator | |
294 | - functions have finished. Result is the reduced value. | |
295 | - | |
296 | -__Example__ | |
297 | - | |
298 | - async.reduce([1,2,3], 0, function(memo, item, callback){ | |
299 | - // pointless async: | |
300 | - process.nextTick(function(){ | |
301 | - callback(null, memo + item) | |
302 | - }); | |
303 | - }, function(err, result){ | |
304 | - // result is now equal to the last value of memo, which is 6 | |
305 | - }); | |
306 | - | |
307 | ---------------------------------------- | |
308 | - | |
309 | -<a name="reduceRight" /> | |
310 | -### reduceRight(arr, memo, iterator, callback) | |
311 | - | |
312 | -__Alias:__ foldr | |
313 | - | |
314 | -Same as reduce, only operates on the items in the array in reverse order. | |
315 | - | |
316 | - | |
317 | ---------------------------------------- | |
318 | - | |
319 | -<a name="detect" /> | |
320 | -### detect(arr, iterator, callback) | |
321 | - | |
322 | -Returns the first value in a list that passes an async truth test. The | |
323 | -iterator is applied in parallel, meaning the first iterator to return true will | |
324 | -fire the detect callback with that result. That means the result might not be | |
325 | -the first item in the original array (in terms of order) that passes the test. | |
326 | - | |
327 | -If order within the original array is important then look at detectSeries. | |
328 | - | |
329 | -__Arguments__ | |
330 | - | |
331 | -* arr - An array to iterate over. | |
332 | -* iterator(item, callback) - A truth test to apply to each item in the array. | |
333 | - The iterator is passed a callback which must be called once it has completed. | |
334 | -* callback(result) - A callback which is called as soon as any iterator returns | |
335 | - true, or after all the iterator functions have finished. Result will be | |
336 | - the first item in the array that passes the truth test (iterator) or the | |
337 | - value undefined if none passed. | |
338 | - | |
339 | -__Example__ | |
340 | - | |
341 | - async.detect(['file1','file2','file3'], path.exists, function(result){ | |
342 | - // result now equals the first file in the list that exists | |
343 | - }); | |
344 | - | |
345 | ---------------------------------------- | |
346 | - | |
347 | -<a name="detectSeries" /> | |
348 | -### detectSeries(arr, iterator, callback) | |
349 | - | |
350 | -The same as detect, only the iterator is applied to each item in the array | |
351 | -in series. This means the result is always the first in the original array (in | |
352 | -terms of array order) that passes the truth test. | |
353 | - | |
354 | - | |
355 | ---------------------------------------- | |
356 | - | |
357 | -<a name="sortBy" /> | |
358 | -### sortBy(arr, iterator, callback) | |
359 | - | |
360 | -Sorts a list by the results of running each value through an async iterator. | |
361 | - | |
362 | -__Arguments__ | |
363 | - | |
364 | -* arr - An array to iterate over. | |
365 | -* iterator(item, callback) - A function to apply to each item in the array. | |
366 | - The iterator is passed a callback which must be called once it has completed | |
367 | - with an error (which can be null) and a value to use as the sort criteria. | |
368 | -* callback(err, results) - A callback which is called after all the iterator | |
369 | - functions have finished, or an error has occurred. Results is the items from | |
370 | - the original array sorted by the values returned by the iterator calls. | |
371 | - | |
372 | -__Example__ | |
373 | - | |
374 | - async.sortBy(['file1','file2','file3'], function(file, callback){ | |
375 | - fs.stat(file, function(err, stats){ | |
376 | - callback(err, stats.mtime); | |
377 | - }); | |
378 | - }, function(err, results){ | |
379 | - // results is now the original array of files sorted by | |
380 | - // modified date | |
381 | - }); | |
382 | - | |
383 | - | |
384 | ---------------------------------------- | |
385 | - | |
386 | -<a name="some" /> | |
387 | -### some(arr, iterator, callback) | |
388 | - | |
389 | -__Alias:__ any | |
390 | - | |
391 | -Returns true if at least one element in the array satisfies an async test. | |
392 | -_The callback for each iterator call only accepts a single argument of true or | |
393 | -false, it does not accept an error argument first!_ This is in-line with the | |
394 | -way node libraries work with truth tests like path.exists. Once any iterator | |
395 | -call returns true, the main callback is immediately called. | |
396 | - | |
397 | -__Arguments__ | |
398 | - | |
399 | -* arr - An array to iterate over. | |
400 | -* iterator(item, callback) - A truth test to apply to each item in the array. | |
401 | - The iterator is passed a callback which must be called once it has completed. | |
402 | -* callback(result) - A callback which is called as soon as any iterator returns | |
403 | - true, or after all the iterator functions have finished. Result will be | |
404 | - either true or false depending on the values of the async tests. | |
405 | - | |
406 | -__Example__ | |
407 | - | |
408 | - async.some(['file1','file2','file3'], path.exists, function(result){ | |
409 | - // if result is true then at least one of the files exists | |
410 | - }); | |
411 | - | |
412 | ---------------------------------------- | |
413 | - | |
414 | -<a name="every" /> | |
415 | -### every(arr, iterator, callback) | |
416 | - | |
417 | -__Alias:__ all | |
418 | - | |
419 | -Returns true if every element in the array satisfies an async test. | |
420 | -_The callback for each iterator call only accepts a single argument of true or | |
421 | -false, it does not accept an error argument first!_ This is in-line with the | |
422 | -way node libraries work with truth tests like path.exists. | |
423 | - | |
424 | -__Arguments__ | |
425 | - | |
426 | -* arr - An array to iterate over. | |
427 | -* iterator(item, callback) - A truth test to apply to each item in the array. | |
428 | - The iterator is passed a callback which must be called once it has completed. | |
429 | -* callback(result) - A callback which is called after all the iterator | |
430 | - functions have finished. Result will be either true or false depending on | |
431 | - the values of the async tests. | |
432 | - | |
433 | -__Example__ | |
434 | - | |
435 | - async.every(['file1','file2','file3'], path.exists, function(result){ | |
436 | - // if result is true then every file exists | |
437 | - }); | |
438 | - | |
439 | ---------------------------------------- | |
440 | - | |
441 | -<a name="concat" /> | |
442 | -### concat(arr, iterator, callback) | |
443 | - | |
444 | -Applies an iterator to each item in a list, concatenating the results. Returns the | |
445 | -concatenated list. The iterators are called in parallel, and the results are | |
446 | -concatenated as they return. There is no guarantee that the results array will | |
447 | -be returned in the original order of the arguments passed to the iterator function. | |
448 | - | |
449 | -__Arguments__ | |
450 | - | |
451 | -* arr - An array to iterate over | |
452 | -* iterator(item, callback) - A function to apply to each item in the array. | |
453 | - The iterator is passed a callback which must be called once it has completed | |
454 | - with an error (which can be null) and an array of results. | |
455 | -* callback(err, results) - A callback which is called after all the iterator | |
456 | - functions have finished, or an error has occurred. Results is an array containing | |
457 | - the concatenated results of the iterator function. | |
458 | - | |
459 | -__Example__ | |
460 | - | |
461 | - async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){ | |
462 | - // files is now a list of filenames that exist in the 3 directories | |
463 | - }); | |
464 | - | |
465 | ---------------------------------------- | |
466 | - | |
467 | -<a name="concatSeries" /> | |
468 | -### concatSeries(arr, iterator, callback) | |
469 | - | |
470 | -Same as async.concat, but executes in series instead of parallel. | |
471 | - | |
472 | - | |
473 | -## Control Flow | |
474 | - | |
475 | -<a name="series" /> | |
476 | -### series(tasks, [callback]) | |
477 | - | |
478 | -Run an array of functions in series, each one running once the previous | |
479 | -function has completed. If any functions in the series pass an error to its | |
480 | -callback, no more functions are run and the callback for the series is | |
481 | -immediately called with the value of the error. Once the tasks have completed, | |
482 | -the results are passed to the final callback as an array. | |
483 | - | |
484 | -It is also possible to use an object instead of an array. Each property will be | |
485 | -run as a function and the results will be passed to the final callback as an object | |
486 | -instead of an array. This can be a more readable way of handling results from | |
487 | -async.series. | |
488 | - | |
489 | - | |
490 | -__Arguments__ | |
491 | - | |
492 | -* tasks - An array or object containing functions to run, each function is passed | |
493 | - a callback it must call on completion. | |
494 | -* callback(err, results) - An optional callback to run once all the functions | |
495 | - have completed. This function gets an array of all the arguments passed to | |
496 | - the callbacks used in the array. | |
497 | - | |
498 | -__Example__ | |
499 | - | |
500 | - async.series([ | |
501 | - function(callback){ | |
502 | - // do some stuff ... | |
503 | - callback(null, 'one'); | |
504 | - }, | |
505 | - function(callback){ | |
506 | - // do some more stuff ... | |
507 | - callback(null, 'two'); | |
508 | - }, | |
509 | - ], | |
510 | - // optional callback | |
511 | - function(err, results){ | |
512 | - // results is now equal to ['one', 'two'] | |
513 | - }); | |
514 | - | |
515 | - | |
516 | - // an example using an object instead of an array | |
517 | - async.series({ | |
518 | - one: function(callback){ | |
519 | - setTimeout(function(){ | |
520 | - callback(null, 1); | |
521 | - }, 200); | |
522 | - }, | |
523 | - two: function(callback){ | |
524 | - setTimeout(function(){ | |
525 | - callback(null, 2); | |
526 | - }, 100); | |
527 | - }, | |
528 | - }, | |
529 | - function(err, results) { | |
530 | - // results is now equal to: {one: 1, two: 2} | |
531 | - }); | |
532 | - | |
533 | - | |
534 | ---------------------------------------- | |
535 | - | |
536 | -<a name="parallel" /> | |
537 | -### parallel(tasks, [callback]) | |
538 | - | |
539 | -Run an array of functions in parallel, without waiting until the previous | |
540 | -function has completed. If any of the functions pass an error to its | |
541 | -callback, the main callback is immediately called with the value of the error. | |
542 | -Once the tasks have completed, the results are passed to the final callback as an | |
543 | -array. | |
544 | - | |
545 | -It is also possible to use an object instead of an array. Each property will be | |
546 | -run as a function and the results will be passed to the final callback as an object | |
547 | -instead of an array. This can be a more readable way of handling results from | |
548 | -async.parallel. | |
549 | - | |
550 | - | |
551 | -__Arguments__ | |
552 | - | |
553 | -* tasks - An array or object containing functions to run, each function is passed a | |
554 | - callback it must call on completion. | |
555 | -* callback(err, results) - An optional callback to run once all the functions | |
556 | - have completed. This function gets an array of all the arguments passed to | |
557 | - the callbacks used in the array. | |
558 | - | |
559 | -__Example__ | |
560 | - | |
561 | - async.parallel([ | |
562 | - function(callback){ | |
563 | - setTimeout(function(){ | |
564 | - callback(null, 'one'); | |
565 | - }, 200); | |
566 | - }, | |
567 | - function(callback){ | |
568 | - setTimeout(function(){ | |
569 | - callback(null, 'two'); | |
570 | - }, 100); | |
571 | - }, | |
572 | - ], | |
573 | - // optional callback | |
574 | - function(err, results){ | |
575 | - // the results array will equal ['one','two'] even though | |
576 | - // the second function had a shorter timeout. | |
577 | - }); | |
578 | - | |
579 | - | |
580 | - // an example using an object instead of an array | |
581 | - async.parallel({ | |
582 | - one: function(callback){ | |
583 | - setTimeout(function(){ | |
584 | - callback(null, 1); | |
585 | - }, 200); | |
586 | - }, | |
587 | - two: function(callback){ | |
588 | - setTimeout(function(){ | |
589 | - callback(null, 2); | |
590 | - }, 100); | |
591 | - }, | |
592 | - }, | |
593 | - function(err, results) { | |
594 | - // results is now equals to: {one: 1, two: 2} | |
595 | - }); | |
596 | - | |
597 | - | |
598 | ---------------------------------------- | |
599 | - | |
600 | -<a name="whilst" /> | |
601 | -### whilst(test, fn, callback) | |
602 | - | |
603 | -Repeatedly call fn, while test returns true. Calls the callback when stopped, | |
604 | -or an error occurs. | |
605 | - | |
606 | -__Arguments__ | |
607 | - | |
608 | -* test() - synchronous truth test to perform before each execution of fn. | |
609 | -* fn(callback) - A function to call each time the test passes. The function is | |
610 | - passed a callback which must be called once it has completed with an optional | |
611 | - error as the first argument. | |
612 | -* callback(err) - A callback which is called after the test fails and repeated | |
613 | - execution of fn has stopped. | |
614 | - | |
615 | -__Example__ | |
616 | - | |
617 | - var count = 0; | |
618 | - | |
619 | - async.whilst( | |
620 | - function () { return count < 5; }, | |
621 | - function (callback) { | |
622 | - count++; | |
623 | - setTimeout(callback, 1000); | |
624 | - }, | |
625 | - function (err) { | |
626 | - // 5 seconds have passed | |
627 | - } | |
628 | - ); | |
629 | - | |
630 | - | |
631 | ---------------------------------------- | |
632 | - | |
633 | -<a name="until" /> | |
634 | -### until(test, fn, callback) | |
635 | - | |
636 | -Repeatedly call fn, until test returns true. Calls the callback when stopped, | |
637 | -or an error occurs. | |
638 | - | |
639 | -The inverse of async.whilst. | |
640 | - | |
641 | - | |
642 | ---------------------------------------- | |
643 | - | |
644 | -<a name="waterfall" /> | |
645 | -### waterfall(tasks, [callback]) | |
646 | - | |
647 | -Runs an array of functions in series, each passing their results to the next in | |
648 | -the array. However, if any of the functions pass an error to the callback, the | |
649 | -next function is not executed and the main callback is immediately called with | |
650 | -the error. | |
651 | - | |
652 | -__Arguments__ | |
653 | - | |
654 | -* tasks - An array of functions to run, each function is passed a callback it | |
655 | - must call on completion. | |
656 | -* callback(err, [results]) - An optional callback to run once all the functions | |
657 | - have completed. This will be passed the results of the last task's callback. | |
658 | - | |
659 | - | |
660 | - | |
661 | -__Example__ | |
662 | - | |
663 | - async.waterfall([ | |
664 | - function(callback){ | |
665 | - callback(null, 'one', 'two'); | |
666 | - }, | |
667 | - function(arg1, arg2, callback){ | |
668 | - callback(null, 'three'); | |
669 | - }, | |
670 | - function(arg1, callback){ | |
671 | - // arg1 now equals 'three' | |
672 | - callback(null, 'done'); | |
673 | - } | |
674 | - ], function (err, result) { | |
675 | - // result now equals 'done' | |
676 | - }); | |
677 | - | |
678 | - | |
679 | ---------------------------------------- | |
680 | - | |
681 | -<a name="queue" /> | |
682 | -### queue(worker, concurrency) | |
683 | - | |
684 | -Creates a queue object with the specified concurrency. Tasks added to the | |
685 | -queue will be processed in parallel (up to the concurrency limit). If all | |
686 | -workers are in progress, the task is queued until one is available. Once | |
687 | -a worker has completed a task, the task's callback is called. | |
688 | - | |
689 | -__Arguments__ | |
690 | - | |
691 | -* worker(task, callback) - An asynchronous function for processing a queued | |
692 | - task. | |
693 | -* concurrency - An integer for determining how many worker functions should be | |
694 | - run in parallel. | |
695 | - | |
696 | -__Queue objects__ | |
697 | - | |
698 | -The queue object returned by this function has the following properties and | |
699 | -methods: | |
700 | - | |
701 | -* length() - a function returning the number of items waiting to be processed. | |
702 | -* concurrency - an integer for determining how many worker functions should be | |
703 | - run in parallel. This property can be changed after a queue is created to | |
704 | - alter the concurrency on-the-fly. | |
705 | -* push(task, [callback]) - add a new task to the queue, the callback is called | |
706 | - once the worker has finished processing the task. | |
707 | - instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list. | |
708 | -* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued | |
709 | -* empty - a callback that is called when the last item from the queue is given to a worker | |
710 | -* drain - a callback that is called when the last item from the queue has returned from the worker | |
711 | - | |
712 | -__Example__ | |
713 | - | |
714 | - // create a queue object with concurrency 2 | |
715 | - | |
716 | - var q = async.queue(function (task, callback) { | |
717 | - console.log('hello ' + task.name); | |
718 | - callback(); | |
719 | - }, 2); | |
720 | - | |
721 | - | |
722 | - // assign a callback | |
723 | - q.drain = function() { | |
724 | - console.log('all items have been processed'); | |
725 | - } | |
726 | - | |
727 | - // add some items to the queue | |
728 | - | |
729 | - q.push({name: 'foo'}, function (err) { | |
730 | - console.log('finished processing foo'); | |
731 | - }); | |
732 | - q.push({name: 'bar'}, function (err) { | |
733 | - console.log('finished processing bar'); | |
734 | - }); | |
735 | - | |
736 | - // add some items to the queue (batch-wise) | |
737 | - | |
738 | - q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) { | |
739 | - console.log('finished processing bar'); | |
740 | - }); | |
741 | - | |
742 | - | |
743 | ---------------------------------------- | |
744 | - | |
745 | -<a name="auto" /> | |
746 | -### auto(tasks, [callback]) | |
747 | - | |
748 | -Determines the best order for running functions based on their requirements. | |
749 | -Each function can optionally depend on other functions being completed first, | |
750 | -and each function is run as soon as its requirements are satisfied. If any of | |
751 | -the functions pass an error to their callback, that function will not complete | |
752 | -(so any other functions depending on it will not run) and the main callback | |
753 | -will be called immediately with the error. Functions also receive an object | |
754 | -containing the results of functions which have completed so far. | |
755 | - | |
756 | -__Arguments__ | |
757 | - | |
758 | -* tasks - An object literal containing named functions or an array of | |
759 | - requirements, with the function itself the last item in the array. The key | |
760 | - used for each function or array is used when specifying requirements. The | |
761 | - syntax is easier to understand by looking at the example. | |
762 | -* callback(err, results) - An optional callback which is called when all the | |
763 | - tasks have been completed. The callback will receive an error as an argument | |
764 | - if any tasks pass an error to their callback. If all tasks complete | |
765 | - successfully, it will receive an object containing their results. | |
766 | - | |
767 | -__Example__ | |
768 | - | |
769 | - async.auto({ | |
770 | - get_data: function(callback){ | |
771 | - // async code to get some data | |
772 | - }, | |
773 | - make_folder: function(callback){ | |
774 | - // async code to create a directory to store a file in | |
775 | - // this is run at the same time as getting the data | |
776 | - }, | |
777 | - write_file: ['get_data', 'make_folder', function(callback){ | |
778 | - // once there is some data and the directory exists, | |
779 | - // write the data to a file in the directory | |
780 | - callback(null, filename); | |
781 | - }], | |
782 | - email_link: ['write_file', function(callback, results){ | |
783 | - // once the file is written let's email a link to it... | |
784 | - // results.write_file contains the filename returned by write_file. | |
785 | - }] | |
786 | - }); | |
787 | - | |
788 | -This is a fairly trivial example, but to do this using the basic parallel and | |
789 | -series functions would look like this: | |
790 | - | |
791 | - async.parallel([ | |
792 | - function(callback){ | |
793 | - // async code to get some data | |
794 | - }, | |
795 | - function(callback){ | |
796 | - // async code to create a directory to store a file in | |
797 | - // this is run at the same time as getting the data | |
798 | - } | |
799 | - ], | |
800 | - function(results){ | |
801 | - async.series([ | |
802 | - function(callback){ | |
803 | - // once there is some data and the directory exists, | |
804 | - // write the data to a file in the directory | |
805 | - }, | |
806 | - email_link: function(callback){ | |
807 | - // once the file is written let's email a link to it... | |
808 | - } | |
809 | - ]); | |
810 | - }); | |
811 | - | |
812 | -For a complicated series of async tasks using the auto function makes adding | |
813 | -new tasks much easier and makes the code more readable. | |
814 | - | |
815 | - | |
816 | ---------------------------------------- | |
817 | - | |
818 | -<a name="iterator" /> | |
819 | -### iterator(tasks) | |
820 | - | |
821 | -Creates an iterator function which calls the next function in the array, | |
822 | -returning a continuation to call the next one after that. Its also possible to | |
823 | -'peek' the next iterator by doing iterator.next(). | |
824 | - | |
825 | -This function is used internally by the async module but can be useful when | |
826 | -you want to manually control the flow of functions in series. | |
827 | - | |
828 | -__Arguments__ | |
829 | - | |
830 | -* tasks - An array of functions to run, each function is passed a callback it | |
831 | - must call on completion. | |
832 | - | |
833 | -__Example__ | |
834 | - | |
835 | - var iterator = async.iterator([ | |
836 | - function(){ sys.p('one'); }, | |
837 | - function(){ sys.p('two'); }, | |
838 | - function(){ sys.p('three'); } | |
839 | - ]); | |
840 | - | |
841 | - node> var iterator2 = iterator(); | |
842 | - 'one' | |
843 | - node> var iterator3 = iterator2(); | |
844 | - 'two' | |
845 | - node> iterator3(); | |
846 | - 'three' | |
847 | - node> var nextfn = iterator2.next(); | |
848 | - node> nextfn(); | |
849 | - 'three' | |
850 | - | |
851 | - | |
852 | ---------------------------------------- | |
853 | - | |
854 | -<a name="apply" /> | |
855 | -### apply(function, arguments..) | |
856 | - | |
857 | -Creates a continuation function with some arguments already applied, a useful | |
858 | -shorthand when combined with other control flow functions. Any arguments | |
859 | -passed to the returned function are added to the arguments originally passed | |
860 | -to apply. | |
861 | - | |
862 | -__Arguments__ | |
863 | - | |
864 | -* function - The function you want to eventually apply all arguments to. | |
865 | -* arguments... - Any number of arguments to automatically apply when the | |
866 | - continuation is called. | |
867 | - | |
868 | -__Example__ | |
869 | - | |
870 | - // using apply | |
871 | - | |
872 | - async.parallel([ | |
873 | - async.apply(fs.writeFile, 'testfile1', 'test1'), | |
874 | - async.apply(fs.writeFile, 'testfile2', 'test2'), | |
875 | - ]); | |
876 | - | |
877 | - | |
878 | - // the same process without using apply | |
879 | - | |
880 | - async.parallel([ | |
881 | - function(callback){ | |
882 | - fs.writeFile('testfile1', 'test1', callback); | |
883 | - }, | |
884 | - function(callback){ | |
885 | - fs.writeFile('testfile2', 'test2', callback); | |
886 | - }, | |
887 | - ]); | |
888 | - | |
889 | -It's possible to pass any number of additional arguments when calling the | |
890 | -continuation: | |
891 | - | |
892 | - node> var fn = async.apply(sys.puts, 'one'); | |
893 | - node> fn('two', 'three'); | |
894 | - one | |
895 | - two | |
896 | - three | |
897 | - | |
898 | ---------------------------------------- | |
899 | - | |
900 | -<a name="nextTick" /> | |
901 | -### nextTick(callback) | |
902 | - | |
903 | -Calls the callback on a later loop around the event loop. In node.js this just | |
904 | -calls process.nextTick, in the browser it falls back to setTimeout(callback, 0), | |
905 | -which means other higher priority events may precede the execution of the callback. | |
906 | - | |
907 | -This is used internally for browser-compatibility purposes. | |
908 | - | |
909 | -__Arguments__ | |
910 | - | |
911 | -* callback - The function to call on a later loop around the event loop. | |
912 | - | |
913 | -__Example__ | |
914 | - | |
915 | - var call_order = []; | |
916 | - async.nextTick(function(){ | |
917 | - call_order.push('two'); | |
918 | - // call_order now equals ['one','two] | |
919 | - }); | |
920 | - call_order.push('one') | |
921 | - | |
922 | - | |
923 | -## Utils | |
924 | - | |
925 | -<a name="memoize" /> | |
926 | -### memoize(fn, [hasher]) | |
927 | - | |
928 | -Caches the results of an async function. When creating a hash to store function | |
929 | -results against, the callback is omitted from the hash and an optional hash | |
930 | -function can be used. | |
931 | - | |
932 | -__Arguments__ | |
933 | - | |
934 | -* fn - the function you to proxy and cache results from. | |
935 | -* hasher - an optional function for generating a custom hash for storing | |
936 | - results, it has all the arguments applied to it apart from the callback, and | |
937 | - must be synchronous. | |
938 | - | |
939 | -__Example__ | |
940 | - | |
941 | - var slow_fn = function (name, callback) { | |
942 | - // do something | |
943 | - callback(null, result); | |
944 | - }; | |
945 | - var fn = async.memoize(slow_fn); | |
946 | - | |
947 | - // fn can now be used as if it were slow_fn | |
948 | - fn('some name', function () { | |
949 | - // callback | |
950 | - }); | |
951 | - | |
952 | -<a name="unmemoize" /> | |
953 | -### unmemoize(fn) | |
954 | - | |
955 | -Undoes a memoized function, reverting it to the original, unmemoized | |
956 | -form. Comes handy in tests. | |
957 | - | |
958 | -__Arguments__ | |
959 | - | |
960 | -* fn - the memoized function | |
961 | - | |
962 | -<a name="log" /> | |
963 | -### log(function, arguments) | |
964 | - | |
965 | -Logs the result of an async function to the console. Only works in node.js or | |
966 | -in browsers that support console.log and console.error (such as FF and Chrome). | |
967 | -If multiple arguments are returned from the async function, console.log is | |
968 | -called on each argument in order. | |
969 | - | |
970 | -__Arguments__ | |
971 | - | |
972 | -* function - The function you want to eventually apply all arguments to. | |
973 | -* arguments... - Any number of arguments to apply to the function. | |
974 | - | |
975 | -__Example__ | |
976 | - | |
977 | - var hello = function(name, callback){ | |
978 | - setTimeout(function(){ | |
979 | - callback(null, 'hello ' + name); | |
980 | - }, 1000); | |
981 | - }; | |
982 | - | |
983 | - node> async.log(hello, 'world'); | |
984 | - 'hello world' | |
985 | - | |
986 | - | |
987 | ---------------------------------------- | |
988 | - | |
989 | -<a name="dir" /> | |
990 | -### dir(function, arguments) | |
991 | - | |
992 | -Logs the result of an async function to the console using console.dir to | |
993 | -display the properties of the resulting object. Only works in node.js or | |
994 | -in browsers that support console.dir and console.error (such as FF and Chrome). | |
995 | -If multiple arguments are returned from the async function, console.dir is | |
996 | -called on each argument in order. | |
997 | - | |
998 | -__Arguments__ | |
999 | - | |
1000 | -* function - The function you want to eventually apply all arguments to. | |
1001 | -* arguments... - Any number of arguments to apply to the function. | |
1002 | - | |
1003 | -__Example__ | |
1004 | - | |
1005 | - var hello = function(name, callback){ | |
1006 | - setTimeout(function(){ | |
1007 | - callback(null, {hello: name}); | |
1008 | - }, 1000); | |
1009 | - }; | |
1010 | - | |
1011 | - node> async.dir(hello, 'world'); | |
1012 | - {hello: 'world'} | |
1013 | - | |
1014 | - | |
1015 | ---------------------------------------- | |
1016 | - | |
1017 | -<a name="noConflict" /> | |
1018 | -### noConflict() | |
1019 | - | |
1020 | -Changes the value of async back to its original value, returning a reference to the | |
1021 | -async object. |
node_modules/grunt/node_modules/async/index.js deleted
node_modules/grunt/node_modules/async/lib/async.js deleted
1 | -/*global setTimeout: false, console: false */ | |
2 | -(function () { | |
3 | - | |
4 | - var async = {}; | |
5 | - | |
6 | - // global on the server, window in the browser | |
7 | - var root = this, | |
8 | - previous_async = root.async; | |
9 | - | |
10 | - if (typeof module !== 'undefined' && module.exports) { | |
11 | - module.exports = async; | |
12 | - } | |
13 | - else { | |
14 | - root.async = async; | |
15 | - } | |
16 | - | |
17 | - async.noConflict = function () { | |
18 | - root.async = previous_async; | |
19 | - return async; | |
20 | - }; | |
21 | - | |
22 | - //// cross-browser compatiblity functions //// | |
23 | - | |
24 | - var _forEach = function (arr, iterator) { | |
25 | - if (arr.forEach) { | |
26 | - return arr.forEach(iterator); | |
27 | - } | |
28 | - for (var i = 0; i < arr.length; i += 1) { | |
29 | - iterator(arr[i], i, arr); | |
30 | - } | |
31 | - }; | |
32 | - | |
33 | - var _map = function (arr, iterator) { | |
34 | - if (arr.map) { | |
35 | - return arr.map(iterator); | |
36 | - } | |
37 | - var results = []; | |
38 | - _forEach(arr, function (x, i, a) { | |
39 | - results.push(iterator(x, i, a)); | |
40 | - }); | |
41 | - return results; | |
42 | - }; | |
43 | - | |
44 | - var _reduce = function (arr, iterator, memo) { | |
45 | - if (arr.reduce) { | |
46 | - return arr.reduce(iterator, memo); | |
47 | - } | |
48 | - _forEach(arr, function (x, i, a) { | |
49 | - memo = iterator(memo, x, i, a); | |
50 | - }); | |
51 | - return memo; | |
52 | - }; | |
53 | - | |
54 | - var _keys = function (obj) { | |
55 | - if (Object.keys) { | |
56 | - return Object.keys(obj); | |
57 | - } | |
58 | - var keys = []; | |
59 | - for (var k in obj) { | |
60 | - if (obj.hasOwnProperty(k)) { | |
61 | - keys.push(k); | |
62 | - } | |
63 | - } | |
64 | - return keys; | |
65 | - }; | |
66 | - | |
67 | - //// exported async module functions //// | |
68 | - | |
69 | - //// nextTick implementation with browser-compatible fallback //// | |
70 | - if (typeof process === 'undefined' || !(process.nextTick)) { | |
71 | - async.nextTick = function (fn) { | |
72 | - setTimeout(fn, 0); | |
73 | - }; | |
74 | - } | |
75 | - else { | |
76 | - async.nextTick = process.nextTick; | |
77 | - } | |
78 | - | |
79 | - async.forEach = function (arr, iterator, callback) { | |
80 | - callback = callback || function () {}; | |
81 | - if (!arr.length) { | |
82 | - return callback(); | |
83 | - } | |
84 | - var completed = 0; | |
85 | - _forEach(arr, function (x) { | |
86 | - iterator(x, function (err) { | |
87 | - if (err) { | |
88 | - callback(err); | |
89 | - callback = function () {}; | |
90 | - } | |
91 | - else { | |
92 | - completed += 1; | |
93 | - if (completed === arr.length) { | |
94 | - callback(null); | |
95 | - } | |
96 | - } | |
97 | - }); | |
98 | - }); | |
99 | - }; | |
100 | - | |
101 | - async.forEachSeries = function (arr, iterator, callback) { | |
102 | - callback = callback || function () {}; | |
103 | - if (!arr.length) { | |
104 | - return callback(); | |
105 | - } | |
106 | - var completed = 0; | |
107 | - var iterate = function () { | |
108 | - iterator(arr[completed], function (err) { | |
109 | - if (err) { | |
110 | - callback(err); | |
111 | - callback = function () {}; | |
112 | - } | |
113 | - else { | |
114 | - completed += 1; | |
115 | - if (completed === arr.length) { | |
116 | - callback(null); | |
117 | - } | |
118 | - else { | |
119 | - iterate(); | |
120 | - } | |
121 | - } | |
122 | - }); | |
123 | - }; | |
124 | - iterate(); | |
125 | - }; | |
126 | - | |
127 | - async.forEachLimit = function (arr, limit, iterator, callback) { | |
128 | - callback = callback || function () {}; | |
129 | - if (!arr.length || limit <= 0) { | |
130 | - return callback(); | |
131 | - } | |
132 | - var completed = 0; | |
133 | - var started = 0; | |
134 | - var running = 0; | |
135 | - | |
136 | - (function replenish () { | |
137 | - if (completed === arr.length) { | |
138 | - return callback(); | |
139 | - } | |
140 | - | |
141 | - while (running < limit && started < arr.length) { | |
142 | - started += 1; | |
143 | - running += 1; | |
144 | - iterator(arr[started - 1], function (err) { | |
145 | - if (err) { | |
146 | - callback(err); | |
147 | - callback = function () {}; | |
148 | - } | |
149 | - else { | |
150 | - completed += 1; | |
151 | - running -= 1; | |
152 | - if (completed === arr.length) { | |
153 | - callback(); | |
154 | - } | |
155 | - else { | |
156 | - replenish(); | |
157 | - } | |
158 | - } | |
159 | - }); | |
160 | - } | |
161 | - })(); | |
162 | - }; | |
163 | - | |
164 | - | |
165 | - var doParallel = function (fn) { | |
166 | - return function () { | |
167 | - var args = Array.prototype.slice.call(arguments); | |
168 | - return fn.apply(null, [async.forEach].concat(args)); | |
169 | - }; | |
170 | - }; | |
171 | - var doSeries = function (fn) { | |
172 | - return function () { | |
173 | - var args = Array.prototype.slice.call(arguments); | |
174 | - return fn.apply(null, [async.forEachSeries].concat(args)); | |
175 | - }; | |
176 | - }; | |
177 | - | |
178 | - | |
179 | - var _asyncMap = function (eachfn, arr, iterator, callback) { | |
180 | - var results = []; | |
181 | - arr = _map(arr, function (x, i) { | |
182 | - return {index: i, value: x}; | |
183 | - }); | |
184 | - eachfn(arr, function (x, callback) { | |
185 | - iterator(x.value, function (err, v) { | |
186 | - results[x.index] = v; | |
187 | - callback(err); | |
188 | - }); | |
189 | - }, function (err) { | |
190 | - callback(err, results); | |
191 | - }); | |
192 | - }; | |
193 | - async.map = doParallel(_asyncMap); | |
194 | - async.mapSeries = doSeries(_asyncMap); | |
195 | - | |
196 | - | |
197 | - // reduce only has a series version, as doing reduce in parallel won't | |
198 | - // work in many situations. | |
199 | - async.reduce = function (arr, memo, iterator, callback) { | |
200 | - async.forEachSeries(arr, function (x, callback) { | |
201 | - iterator(memo, x, function (err, v) { | |
202 | - memo = v; | |
203 | - callback(err); | |
204 | - }); | |
205 | - }, function (err) { | |
206 | - callback(err, memo); | |
207 | - }); | |
208 | - }; | |
209 | - // inject alias | |
210 | - async.inject = async.reduce; | |
211 | - // foldl alias | |
212 | - async.foldl = async.reduce; | |
213 | - | |
214 | - async.reduceRight = function (arr, memo, iterator, callback) { | |
215 | - var reversed = _map(arr, function (x) { | |
216 | - return x; | |
217 | - }).reverse(); | |
218 | - async.reduce(reversed, memo, iterator, callback); | |
219 | - }; | |
220 | - // foldr alias | |
221 | - async.foldr = async.reduceRight; | |
222 | - | |
223 | - var _filter = function (eachfn, arr, iterator, callback) { | |
224 | - var results = []; | |
225 | - arr = _map(arr, function (x, i) { | |
226 | - return {index: i, value: x}; | |
227 | - }); | |
228 | - eachfn(arr, function (x, callback) { | |
229 | - iterator(x.value, function (v) { | |
230 | - if (v) { | |
231 | - results.push(x); | |
232 | - } | |
233 | - callback(); | |
234 | - }); | |
235 | - }, function (err) { | |
236 | - callback(_map(results.sort(function (a, b) { | |
237 | - return a.index - b.index; | |
238 | - }), function (x) { | |
239 | - return x.value; | |
240 | - })); | |
241 | - }); | |
242 | - }; | |
243 | - async.filter = doParallel(_filter); | |
244 | - async.filterSeries = doSeries(_filter); | |
245 | - // select alias | |
246 | - async.select = async.filter; | |
247 | - async.selectSeries = async.filterSeries; | |
248 | - | |
249 | - var _reject = function (eachfn, arr, iterator, callback) { | |
250 | - var results = []; | |
251 | - arr = _map(arr, function (x, i) { | |
252 | - return {index: i, value: x}; | |
253 | - }); | |
254 | - eachfn(arr, function (x, callback) { | |
255 | - iterator(x.value, function (v) { | |
256 | - if (!v) { | |
257 | - results.push(x); | |
258 | - } | |
259 | - callback(); | |
260 | - }); | |
261 | - }, function (err) { | |
262 | - callback(_map(results.sort(function (a, b) { | |
263 | - return a.index - b.index; | |
264 | - }), function (x) { | |
265 | - return x.value; | |
266 | - })); | |
267 | - }); | |
268 | - }; | |
269 | - async.reject = doParallel(_reject); | |
270 | - async.rejectSeries = doSeries(_reject); | |
271 | - | |
272 | - var _detect = function (eachfn, arr, iterator, main_callback) { | |
273 | - eachfn(arr, function (x, callback) { | |
274 | - iterator(x, function (result) { | |
275 | - if (result) { | |
276 | - main_callback(x); | |
277 | - main_callback = function () {}; | |
278 | - } | |
279 | - else { | |
280 | - callback(); | |
281 | - } | |
282 | - }); | |
283 | - }, function (err) { | |
284 | - main_callback(); | |
285 | - }); | |
286 | - }; | |
287 | - async.detect = doParallel(_detect); | |
288 | - async.detectSeries = doSeries(_detect); | |
289 | - | |
290 | - async.some = function (arr, iterator, main_callback) { | |
291 | - async.forEach(arr, function (x, callback) { | |
292 | - iterator(x, function (v) { | |
293 | - if (v) { | |
294 | - main_callback(true); | |
295 | - main_callback = function () {}; | |
296 | - } | |
297 | - callback(); | |
298 | - }); | |
299 | - }, function (err) { | |
300 | - main_callback(false); | |
301 | - }); | |
302 | - }; | |
303 | - // any alias | |
304 | - async.any = async.some; | |
305 | - | |
306 | - async.every = function (arr, iterator, main_callback) { | |
307 | - async.forEach(arr, function (x, callback) { | |
308 | - iterator(x, function (v) { | |
309 | - if (!v) { | |
310 | - main_callback(false); | |
311 | - main_callback = function () {}; | |
312 | - } | |
313 | - callback(); | |
314 | - }); | |
315 | - }, function (err) { | |
316 | - main_callback(true); | |
317 | - }); | |
318 | - }; | |
319 | - // all alias | |
320 | - async.all = async.every; | |
321 | - | |
322 | - async.sortBy = function (arr, iterator, callback) { | |
323 | - async.map(arr, function (x, callback) { | |
324 | - iterator(x, function (err, criteria) { | |
325 | - if (err) { | |
326 | - callback(err); | |
327 | - } | |
328 | - else { | |
329 | - callback(null, {value: x, criteria: criteria}); | |
330 | - } | |
331 | - }); | |
332 | - }, function (err, results) { | |
333 | - if (err) { | |
334 | - return callback(err); | |
335 | - } | |
336 | - else { | |
337 | - var fn = function (left, right) { | |
338 | - var a = left.criteria, b = right.criteria; | |
339 | - return a < b ? -1 : a > b ? 1 : 0; | |
340 | - }; | |
341 | - callback(null, _map(results.sort(fn), function (x) { | |
342 | - return x.value; | |
343 | - })); | |
344 | - } | |
345 | - }); | |
346 | - }; | |
347 | - | |
348 | - async.auto = function (tasks, callback) { | |
349 | - callback = callback || function () {}; | |
350 | - var keys = _keys(tasks); | |
351 | - if (!keys.length) { | |
352 | - return callback(null); | |
353 | - } | |
354 | - | |
355 | - var results = {}; | |
356 | - | |
357 | - var listeners = []; | |
358 | - var addListener = function (fn) { | |
359 | - listeners.unshift(fn); | |
360 | - }; | |
361 | - var removeListener = function (fn) { | |
362 | - for (var i = 0; i < listeners.length; i += 1) { | |
363 | - if (listeners[i] === fn) { | |
364 | - listeners.splice(i, 1); | |
365 | - return; | |
366 | - } | |
367 | - } | |
368 | - }; | |
369 | - var taskComplete = function () { | |
370 | - _forEach(listeners.slice(0), function (fn) { | |
371 | - fn(); | |
372 | - }); | |
373 | - }; | |
374 | - | |
375 | - addListener(function () { | |
376 | - if (_keys(results).length === keys.length) { | |
377 | - callback(null, results); | |
378 | - callback = function () {}; | |
379 | - } | |
380 | - }); | |
381 | - | |
382 | - _forEach(keys, function (k) { | |
383 | - var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k]; | |
384 | - var taskCallback = function (err) { | |
385 | - if (err) { | |
386 | - callback(err); | |
387 | - // stop subsequent errors hitting callback multiple times | |
388 | - callback = function () {}; | |
389 | - } | |
390 | - else { | |
391 | - var args = Array.prototype.slice.call(arguments, 1); | |
392 | - if (args.length <= 1) { | |
393 | - args = args[0]; | |
394 | - } | |
395 | - results[k] = args; | |
396 | - taskComplete(); | |
397 | - } | |
398 | - }; | |
399 | - var requires = task.slice(0, Math.abs(task.length - 1)) || []; | |
400 | - var ready = function () { | |
401 | - return _reduce(requires, function (a, x) { | |
402 | - return (a && results.hasOwnProperty(x)); | |
403 | - }, true) && !results.hasOwnProperty(k); | |
404 | - }; | |
405 | - if (ready()) { | |
406 | - task[task.length - 1](taskCallback, results); | |
407 | - } | |
408 | - else { | |
409 | - var listener = function () { | |
410 | - if (ready()) { | |
411 | - removeListener(listener); | |
412 | - task[task.length - 1](taskCallback, results); | |
413 | - } | |
414 | - }; | |
415 | - addListener(listener); | |
416 | - } | |
417 | - }); | |
418 | - }; | |
419 | - | |
420 | - async.waterfall = function (tasks, callback) { | |
421 | - callback = callback || function () {}; | |
422 | - if (!tasks.length) { | |
423 | - return callback(); | |
424 | - } | |
425 | - var wrapIterator = function (iterator) { | |
426 | - return function (err) { | |
427 | - if (err) { | |
428 | - callback(err); | |
429 | - callback = function () {}; | |
430 | - } | |
431 | - else { | |
432 | - var args = Array.prototype.slice.call(arguments, 1); | |
433 | - var next = iterator.next(); | |
434 | - if (next) { | |
435 | - args.push(wrapIterator(next)); | |
436 | - } | |
437 | - else { | |
438 | - args.push(callback); | |
439 | - } | |
440 | - async.nextTick(function () { | |
441 | - iterator.apply(null, args); | |
442 | - }); | |
443 | - } | |
444 | - }; | |
445 | - }; | |
446 | - wrapIterator(async.iterator(tasks))(); | |
447 | - }; | |
448 | - | |
449 | - async.parallel = function (tasks, callback) { | |
450 | - callback = callback || function () {}; | |
451 | - if (tasks.constructor === Array) { | |
452 | - async.map(tasks, function (fn, callback) { | |
453 | - if (fn) { | |
454 | - fn(function (err) { | |
455 | - var args = Array.prototype.slice.call(arguments, 1); | |
456 | - if (args.length <= 1) { | |
457 | - args = args[0]; | |
458 | - } | |
459 | - callback.call(null, err, args); | |
460 | - }); | |
461 | - } | |
462 | - }, callback); | |
463 | - } | |
464 | - else { | |
465 | - var results = {}; | |
466 | - async.forEach(_keys(tasks), function (k, callback) { | |
467 | - tasks[k](function (err) { | |
468 | - var args = Array.prototype.slice.call(arguments, 1); | |
469 | - if (args.length <= 1) { | |
470 | - args = args[0]; | |
471 | - } | |
472 | - results[k] = args; | |
473 | - callback(err); | |
474 | - }); | |
475 | - }, function (err) { | |
476 | - callback(err, results); | |
477 | - }); | |
478 | - } | |
479 | - }; | |
480 | - | |
481 | - async.series = function (tasks, callback) { | |
482 | - callback = callback || function () {}; | |
483 | - if (tasks.constructor === Array) { | |
484 | - async.mapSeries(tasks, function (fn, callback) { | |
485 | - if (fn) { | |
486 | - fn(function (err) { | |
487 | - var args = Array.prototype.slice.call(arguments, 1); | |
488 | - if (args.length <= 1) { | |
489 | - args = args[0]; | |
490 | - } | |
491 | - callback.call(null, err, args); | |
492 | - }); | |
493 | - } | |
494 | - }, callback); | |
495 | - } | |
496 | - else { | |
497 | - var results = {}; | |
498 | - async.forEachSeries(_keys(tasks), function (k, callback) { | |
499 | - tasks[k](function (err) { | |
500 | - var args = Array.prototype.slice.call(arguments, 1); | |
501 | - if (args.length <= 1) { | |
502 | - args = args[0]; | |
503 | - } | |
504 | - results[k] = args; | |
505 | - callback(err); | |
506 | - }); | |
507 | - }, function (err) { | |
508 | - callback(err, results); | |
509 | - }); | |
510 | - } | |
511 | - }; | |
512 | - | |
513 | - async.iterator = function (tasks) { | |
514 | - var makeCallback = function (index) { | |
515 | - var fn = function () { | |
516 | - if (tasks.length) { | |
517 | - tasks[index].apply(null, arguments); | |
518 | - } | |
519 | - return fn.next(); | |
520 | - }; | |
521 | - fn.next = function () { | |
522 | - return (index < tasks.length - 1) ? makeCallback(index + 1): null; | |
523 | - }; | |
524 | - return fn; | |
525 | - }; | |
526 | - return makeCallback(0); | |
527 | - }; | |
528 | - | |
529 | - async.apply = function (fn) { | |
530 | - var args = Array.prototype.slice.call(arguments, 1); | |
531 | - return function () { | |
532 | - return fn.apply( | |
533 | - null, args.concat(Array.prototype.slice.call(arguments)) | |
534 | - ); | |
535 | - }; | |
536 | - }; | |
537 | - | |
538 | - var _concat = function (eachfn, arr, fn, callback) { | |
539 | - var r = []; | |
540 | - eachfn(arr, function (x, cb) { | |
541 | - fn(x, function (err, y) { | |
542 | - r = r.concat(y || []); | |
543 | - cb(err); | |
544 | - }); | |
545 | - }, function (err) { | |
546 | - callback(err, r); | |
547 | - }); | |
548 | - }; | |
549 | - async.concat = doParallel(_concat); | |
550 | - async.concatSeries = doSeries(_concat); | |
551 | - | |
552 | - async.whilst = function (test, iterator, callback) { | |
553 | - if (test()) { | |
554 | - iterator(function (err) { | |
555 | - if (err) { | |
556 | - return callback(err); | |
557 | - } | |
558 | - async.whilst(test, iterator, callback); | |
559 | - }); | |
560 | - } | |
561 | - else { | |
562 | - callback(); | |
563 | - } | |
564 | - }; | |
565 | - | |
566 | - async.until = function (test, iterator, callback) { | |
567 | - if (!test()) { | |
568 | - iterator(function (err) { | |
569 | - if (err) { | |
570 | - return callback(err); | |
571 | - } | |
572 | - async.until(test, iterator, callback); | |
573 | - }); | |
574 | - } | |
575 | - else { | |
576 | - callback(); | |
577 | - } | |
578 | - }; | |
579 | - | |
580 | - async.queue = function (worker, concurrency) { | |
581 | - var workers = 0; | |
582 | - var q = { | |
583 | - tasks: [], | |
584 | - concurrency: concurrency, | |
585 | - saturated: null, | |
586 | - empty: null, | |
587 | - drain: null, | |
588 | - push: function (data, callback) { | |
589 | - if(data.constructor !== Array) { | |
590 | - data = [data]; | |
591 | - } | |
592 | - _forEach(data, function(task) { | |
593 | - q.tasks.push({ | |
594 | - data: task, | |
595 | - callback: typeof callback === 'function' ? callback : null | |
596 | - }); | |
597 | - if (q.saturated && q.tasks.length == concurrency) { | |
598 | - q.saturated(); | |
599 | - } | |
600 | - async.nextTick(q.process); | |
601 | - }); | |
602 | - }, | |
603 | - process: function () { | |
604 | - if (workers < q.concurrency && q.tasks.length) { | |
605 | - var task = q.tasks.shift(); | |
606 | - if(q.empty && q.tasks.length == 0) q.empty(); | |
607 | - workers += 1; | |
608 | - worker(task.data, function () { | |
609 | - workers -= 1; | |
610 | - if (task.callback) { | |
611 | - task.callback.apply(task, arguments); | |
612 | - } | |
613 | - if(q.drain && q.tasks.length + workers == 0) q.drain(); | |
614 | - q.process(); | |
615 | - }); | |
616 | - } | |
617 | - }, | |
618 | - length: function () { | |
619 | - return q.tasks.length; | |
620 | - }, | |
621 | - running: function () { | |
622 | - return workers; | |
623 | - } | |
624 | - }; | |
625 | - return q; | |
626 | - }; | |
627 | - | |
628 | - var _console_fn = function (name) { | |
629 | - return function (fn) { | |
630 | - var args = Array.prototype.slice.call(arguments, 1); | |
631 | - fn.apply(null, args.concat([function (err) { | |
632 | - var args = Array.prototype.slice.call(arguments, 1); | |
633 | - if (typeof console !== 'undefined') { | |
634 | - if (err) { | |
635 | - if (console.error) { | |
636 | - console.error(err); | |
637 | - } | |
638 | - } | |
639 | - else if (console[name]) { | |
640 | - _forEach(args, function (x) { | |
641 | - console[name](x); | |
642 | - }); | |
643 | - } | |
644 | - } | |
645 | - }])); | |
646 | - }; | |
647 | - }; | |
648 | - async.log = _console_fn('log'); | |
649 | - async.dir = _console_fn('dir'); | |
650 | - /*async.info = _console_fn('info'); | |
651 | - async.warn = _console_fn('warn'); | |
652 | - async.error = _console_fn('error');*/ | |
653 | - | |
654 | - async.memoize = function (fn, hasher) { | |
655 | - var memo = {}; | |
656 | - var queues = {}; | |
657 | - hasher = hasher || function (x) { | |
658 | - return x; | |
659 | - }; | |
660 | - var memoized = function () { | |
661 | - var args = Array.prototype.slice.call(arguments); | |
662 | - var callback = args.pop(); | |
663 | - var key = hasher.apply(null, args); | |
664 | - if (key in memo) { | |
665 | - callback.apply(null, memo[key]); | |
666 | - } | |
667 | - else if (key in queues) { | |
668 | - queues[key].push(callback); | |
669 | - } | |
670 | - else { | |
671 | - queues[key] = [callback]; | |
672 | - fn.apply(null, args.concat([function () { | |
673 | - memo[key] = arguments; | |
674 | - var q = queues[key]; | |
675 | - delete queues[key]; | |
676 | - for (var i = 0, l = q.length; i < l; i++) { | |
677 | - q[i].apply(null, arguments); | |
678 | - } | |
679 | - }])); | |
680 | - } | |
681 | - }; | |
682 | - memoized.unmemoized = fn; | |
683 | - return memoized; | |
684 | - }; | |
685 | - | |
686 | - async.unmemoize = function (fn) { | |
687 | - return function () { | |
688 | - return (fn.unmemoized || fn).apply(null, arguments); | |
689 | - }; | |
690 | - }; | |
691 | - | |
692 | -}()); |
node_modules/grunt/node_modules/async/package.json deleted
1 | -{ | |
2 | - "name": "async", | |
3 | - "description": "Higher-order functions and common patterns for asynchronous code", | |
4 | - "main": "./index", | |
5 | - "author": { | |
6 | - "name": "Caolan McMahon" | |
7 | - }, | |
8 | - "version": "0.1.22", | |
9 | - "repository": { | |
10 | - "type": "git", | |
11 | - "url": "http://github.com/caolan/async.git" | |
12 | - }, | |
13 | - "bugs": { | |
14 | - "url": "http://github.com/caolan/async/issues" | |
15 | - }, | |
16 | - "licenses": [ | |
17 | - { | |
18 | - "type": "MIT", | |
19 | - "url": "http://github.com/caolan/async/raw/master/LICENSE" | |
20 | - } | |
21 | - ], | |
22 | - "devDependencies": { | |
23 | - "nodeunit": ">0.0.0", | |
24 | - "uglify-js": "1.2.x", | |
25 | - "nodelint": ">0.0.0" | |
26 | - }, | |
27 | - "readme": "# Async.js\n\nAsync is a utility module which provides straight-forward, powerful functions\nfor working with asynchronous JavaScript. Although originally designed for\nuse with [node.js](http://nodejs.org), it can also be used directly in the\nbrowser.\n\nAsync provides around 20 functions that include the usual 'functional'\nsuspects (map, reduce, filter, forEachโฆ) as well as some common patterns\nfor asynchronous control flow (parallel, series, waterfallโฆ). All these\nfunctions assume you follow the node.js convention of providing a single\ncallback as the last argument of your async function.\n\n\n## Quick Examples\n\n async.map(['file1','file2','file3'], fs.stat, function(err, results){\n // results is now an array of stats for each file\n });\n\n async.filter(['file1','file2','file3'], path.exists, function(results){\n // results now equals an array of the existing files\n });\n\n async.parallel([\n function(){ ... },\n function(){ ... }\n ], callback);\n\n async.series([\n function(){ ... },\n function(){ ... }\n ]);\n\nThere are many more functions available so take a look at the docs below for a\nfull list. This module aims to be comprehensive, so if you feel anything is\nmissing please create a GitHub issue for it.\n\n\n## Download\n\nReleases are available for download from\n[GitHub](http://github.com/caolan/async/downloads).\nAlternatively, you can install using Node Package Manager (npm):\n\n npm install async\n\n\n__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 17.5kb Uncompressed\n\n__Production:__ [async.min.js](https://github.com/caolan/async/raw/master/dist/async.min.js) - 1.7kb Packed and Gzipped\n\n\n## In the Browser\n\nSo far its been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:\n\n <script type=\"text/javascript\" src=\"async.js\"></script>\n <script type=\"text/javascript\">\n\n async.map(data, asyncProcess, function(err, results){\n alert(results);\n });\n\n </script>\n\n\n## Documentation\n\n### Collections\n\n* [forEach](#forEach)\n* [map](#map)\n* [filter](#filter)\n* [reject](#reject)\n* [reduce](#reduce)\n* [detect](#detect)\n* [sortBy](#sortBy)\n* [some](#some)\n* [every](#every)\n* [concat](#concat)\n\n### Control Flow\n\n* [series](#series)\n* [parallel](#parallel)\n* [whilst](#whilst)\n* [until](#until)\n* [waterfall](#waterfall)\n* [queue](#queue)\n* [auto](#auto)\n* [iterator](#iterator)\n* [apply](#apply)\n* [nextTick](#nextTick)\n\n### Utils\n\n* [memoize](#memoize)\n* [unmemoize](#unmemoize)\n* [log](#log)\n* [dir](#dir)\n* [noConflict](#noConflict)\n\n\n## Collections\n\n<a name=\"forEach\" />\n### forEach(arr, iterator, callback)\n\nApplies an iterator function to each item in an array, in parallel.\nThe iterator is called with an item from the list and a callback for when it\nhas finished. If the iterator passes an error to this callback, the main\ncallback for the forEach function is immediately called with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n have finished, or an error has occurred.\n\n__Example__\n\n // assuming openFiles is an array of file names and saveFile is a function\n // to save the modified contents of that file:\n\n async.forEach(openFiles, saveFile, function(err){\n // if any of the saves produced an error, err would equal that error\n });\n\n---------------------------------------\n\n<a name=\"forEachSeries\" />\n### forEachSeries(arr, iterator, callback)\n\nThe same as forEach only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. This means the iterator functions will complete in order.\n\n\n---------------------------------------\n\n<a name=\"forEachLimit\" />\n### forEachLimit(arr, limit, iterator, callback)\n\nThe same as forEach only the iterator is applied to batches of items in the\narray, in series. The next batch of iterators is only called once the current\none has completed processing.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - How many items should be in each batch.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n have finished, or an error has occurred.\n\n__Example__\n\n // Assume documents is an array of JSON objects and requestApi is a\n // function that interacts with a rate-limited REST api.\n\n async.forEachLimit(documents, 20, requestApi, function(err){\n // if any of the saves produced an error, err would equal that error\n });\n---------------------------------------\n\n<a name=\"map\" />\n### map(arr, iterator, callback)\n\nProduces a new array of values by mapping each value in the given array through\nthe iterator function. The iterator is called with an item from the array and a\ncallback for when it has finished processing. The callback takes 2 arguments, \nan error and the transformed item from the array. If the iterator passes an\nerror to this callback, the main callback for the map function is immediately\ncalled with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order, however\nthe results array will be in the same order as the original array.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed\n with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array of the\n transformed items from the original array.\n\n__Example__\n\n async.map(['file1','file2','file3'], fs.stat, function(err, results){\n // results is now an array of stats for each file\n });\n\n---------------------------------------\n\n<a name=\"mapSeries\" />\n### mapSeries(arr, iterator, callback)\n\nThe same as map only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n---------------------------------------\n\n<a name=\"filter\" />\n### filter(arr, iterator, callback)\n\n__Alias:__ select\n\nReturns a new array of all the values which pass an async truth test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. This operation is\nperformed in parallel, but the results array will be in the same order as the\noriginal.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed.\n* callback(results) - A callback which is called after all the iterator\n functions have finished.\n\n__Example__\n\n async.filter(['file1','file2','file3'], path.exists, function(results){\n // results now equals an array of the existing files\n });\n\n---------------------------------------\n\n<a name=\"filterSeries\" />\n### filterSeries(arr, iterator, callback)\n\n__alias:__ selectSeries\n\nThe same as filter only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n---------------------------------------\n\n<a name=\"reject\" />\n### reject(arr, iterator, callback)\n\nThe opposite of filter. Removes values that pass an async truth test.\n\n---------------------------------------\n\n<a name=\"rejectSeries\" />\n### rejectSeries(arr, iterator, callback)\n\nThe same as filter, only the iterator is applied to each item in the array\nin series.\n\n\n---------------------------------------\n\n<a name=\"reduce\" />\n### reduce(arr, memo, iterator, callback)\n\n__aliases:__ inject, foldl\n\nReduces a list of values into a single value using an async iterator to return\neach successive step. Memo is the initial state of the reduction. This\nfunction only operates in series. For performance reasons, it may make sense to\nsplit a call to this function into a parallel map, then use the normal\nArray.prototype.reduce on the results. This function is for situations where\neach step in the reduction needs to be async, if you can get the data before\nreducing it then its probably a good idea to do so.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* memo - The initial state of the reduction.\n* iterator(memo, item, callback) - A function applied to each item in the\n array to produce the next step in the reduction. The iterator is passed a\n callback which accepts an optional error as its first argument, and the state\n of the reduction as the second. If an error is passed to the callback, the\n reduction is stopped and the main callback is immediately called with the\n error.\n* callback(err, result) - A callback which is called after all the iterator\n functions have finished. Result is the reduced value.\n\n__Example__\n\n async.reduce([1,2,3], 0, function(memo, item, callback){\n // pointless async:\n process.nextTick(function(){\n callback(null, memo + item)\n });\n }, function(err, result){\n // result is now equal to the last value of memo, which is 6\n });\n\n---------------------------------------\n\n<a name=\"reduceRight\" />\n### reduceRight(arr, memo, iterator, callback)\n\n__Alias:__ foldr\n\nSame as reduce, only operates on the items in the array in reverse order.\n\n\n---------------------------------------\n\n<a name=\"detect\" />\n### detect(arr, iterator, callback)\n\nReturns the first value in a list that passes an async truth test. The\niterator is applied in parallel, meaning the first iterator to return true will\nfire the detect callback with that result. That means the result might not be\nthe first item in the original array (in terms of order) that passes the test.\n\nIf order within the original array is important then look at detectSeries.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n true, or after all the iterator functions have finished. Result will be\n the first item in the array that passes the truth test (iterator) or the\n value undefined if none passed.\n\n__Example__\n\n async.detect(['file1','file2','file3'], path.exists, function(result){\n // result now equals the first file in the list that exists\n });\n\n---------------------------------------\n\n<a name=\"detectSeries\" />\n### detectSeries(arr, iterator, callback)\n\nThe same as detect, only the iterator is applied to each item in the array\nin series. This means the result is always the first in the original array (in\nterms of array order) that passes the truth test.\n\n\n---------------------------------------\n\n<a name=\"sortBy\" />\n### sortBy(arr, iterator, callback)\n\nSorts a list by the results of running each value through an async iterator.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed\n with an error (which can be null) and a value to use as the sort criteria.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is the items from\n the original array sorted by the values returned by the iterator calls.\n\n__Example__\n\n async.sortBy(['file1','file2','file3'], function(file, callback){\n fs.stat(file, function(err, stats){\n callback(err, stats.mtime);\n });\n }, function(err, results){\n // results is now the original array of files sorted by\n // modified date\n });\n\n\n---------------------------------------\n\n<a name=\"some\" />\n### some(arr, iterator, callback)\n\n__Alias:__ any\n\nReturns true if at least one element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. Once any iterator\ncall returns true, the main callback is immediately called.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n true, or after all the iterator functions have finished. Result will be\n either true or false depending on the values of the async tests.\n\n__Example__\n\n async.some(['file1','file2','file3'], path.exists, function(result){\n // if result is true then at least one of the files exists\n });\n\n---------------------------------------\n\n<a name=\"every\" />\n### every(arr, iterator, callback)\n\n__Alias:__ all\n\nReturns true if every element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called after all the iterator\n functions have finished. Result will be either true or false depending on\n the values of the async tests.\n\n__Example__\n\n async.every(['file1','file2','file3'], path.exists, function(result){\n // if result is true then every file exists\n });\n\n---------------------------------------\n\n<a name=\"concat\" />\n### concat(arr, iterator, callback)\n\nApplies an iterator to each item in a list, concatenating the results. Returns the\nconcatenated list. The iterators are called in parallel, and the results are\nconcatenated as they return. There is no guarantee that the results array will\nbe returned in the original order of the arguments passed to the iterator function.\n\n__Arguments__\n\n* arr - An array to iterate over\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed\n with an error (which can be null) and an array of results.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array containing\n the concatenated results of the iterator function.\n\n__Example__\n\n async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){\n // files is now a list of filenames that exist in the 3 directories\n });\n\n---------------------------------------\n\n<a name=\"concatSeries\" />\n### concatSeries(arr, iterator, callback)\n\nSame as async.concat, but executes in series instead of parallel.\n\n\n## Control Flow\n\n<a name=\"series\" />\n### series(tasks, [callback])\n\nRun an array of functions in series, each one running once the previous\nfunction has completed. If any functions in the series pass an error to its\ncallback, no more functions are run and the callback for the series is\nimmediately called with the value of the error. Once the tasks have completed,\nthe results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.series.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed\n a callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets an array of all the arguments passed to\n the callbacks used in the array.\n\n__Example__\n\n async.series([\n function(callback){\n // do some stuff ...\n callback(null, 'one');\n },\n function(callback){\n // do some more stuff ...\n callback(null, 'two');\n },\n ],\n // optional callback\n function(err, results){\n // results is now equal to ['one', 'two']\n });\n\n\n // an example using an object instead of an array\n async.series({\n one: function(callback){\n setTimeout(function(){\n callback(null, 1);\n }, 200);\n },\n two: function(callback){\n setTimeout(function(){\n callback(null, 2);\n }, 100);\n },\n },\n function(err, results) {\n // results is now equal to: {one: 1, two: 2}\n });\n\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallel(tasks, [callback])\n\nRun an array of functions in parallel, without waiting until the previous\nfunction has completed. If any of the functions pass an error to its\ncallback, the main callback is immediately called with the value of the error.\nOnce the tasks have completed, the results are passed to the final callback as an\narray.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.parallel.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed a\n callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets an array of all the arguments passed to\n the callbacks used in the array.\n\n__Example__\n\n async.parallel([\n function(callback){\n setTimeout(function(){\n callback(null, 'one');\n }, 200);\n },\n function(callback){\n setTimeout(function(){\n callback(null, 'two');\n }, 100);\n },\n ],\n // optional callback\n function(err, results){\n // the results array will equal ['one','two'] even though\n // the second function had a shorter timeout.\n });\n\n\n // an example using an object instead of an array\n async.parallel({\n one: function(callback){\n setTimeout(function(){\n callback(null, 1);\n }, 200);\n },\n two: function(callback){\n setTimeout(function(){\n callback(null, 2);\n }, 100);\n },\n },\n function(err, results) {\n // results is now equals to: {one: 1, two: 2}\n });\n\n\n---------------------------------------\n\n<a name=\"whilst\" />\n### whilst(test, fn, callback)\n\nRepeatedly call fn, while test returns true. Calls the callback when stopped,\nor an error occurs.\n\n__Arguments__\n\n* test() - synchronous truth test to perform before each execution of fn.\n* fn(callback) - A function to call each time the test passes. The function is\n passed a callback which must be called once it has completed with an optional\n error as the first argument.\n* callback(err) - A callback which is called after the test fails and repeated\n execution of fn has stopped.\n\n__Example__\n\n var count = 0;\n\n async.whilst(\n function () { return count < 5; },\n function (callback) {\n count++;\n setTimeout(callback, 1000);\n },\n function (err) {\n // 5 seconds have passed\n }\n );\n\n\n---------------------------------------\n\n<a name=\"until\" />\n### until(test, fn, callback)\n\nRepeatedly call fn, until test returns true. Calls the callback when stopped,\nor an error occurs.\n\nThe inverse of async.whilst.\n\n\n---------------------------------------\n\n<a name=\"waterfall\" />\n### waterfall(tasks, [callback])\n\nRuns an array of functions in series, each passing their results to the next in\nthe array. However, if any of the functions pass an error to the callback, the\nnext function is not executed and the main callback is immediately called with\nthe error.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n must call on completion.\n* callback(err, [results]) - An optional callback to run once all the functions\n have completed. This will be passed the results of the last task's callback.\n\n\n\n__Example__\n\n async.waterfall([\n function(callback){\n callback(null, 'one', 'two');\n },\n function(arg1, arg2, callback){\n callback(null, 'three');\n },\n function(arg1, callback){\n // arg1 now equals 'three'\n callback(null, 'done');\n }\n ], function (err, result) {\n // result now equals 'done' \n });\n\n\n---------------------------------------\n\n<a name=\"queue\" />\n### queue(worker, concurrency)\n\nCreates a queue object with the specified concurrency. Tasks added to the\nqueue will be processed in parallel (up to the concurrency limit). If all\nworkers are in progress, the task is queued until one is available. Once\na worker has completed a task, the task's callback is called.\n\n__Arguments__\n\n* worker(task, callback) - An asynchronous function for processing a queued\n task.\n* concurrency - An integer for determining how many worker functions should be\n run in parallel.\n\n__Queue objects__\n\nThe queue object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* concurrency - an integer for determining how many worker functions should be\n run in parallel. This property can be changed after a queue is created to\n alter the concurrency on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n once the worker has finished processing the task.\n instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n // create a queue object with concurrency 2\n\n var q = async.queue(function (task, callback) {\n console.log('hello ' + task.name);\n callback();\n }, 2);\n\n\n // assign a callback\n q.drain = function() {\n console.log('all items have been processed');\n }\n\n // add some items to the queue\n\n q.push({name: 'foo'}, function (err) {\n console.log('finished processing foo');\n });\n q.push({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n });\n\n // add some items to the queue (batch-wise)\n\n q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {\n console.log('finished processing bar');\n });\n\n\n---------------------------------------\n\n<a name=\"auto\" />\n### auto(tasks, [callback])\n\nDetermines the best order for running functions based on their requirements.\nEach function can optionally depend on other functions being completed first,\nand each function is run as soon as its requirements are satisfied. If any of\nthe functions pass an error to their callback, that function will not complete\n(so any other functions depending on it will not run) and the main callback\nwill be called immediately with the error. Functions also receive an object\ncontaining the results of functions which have completed so far.\n\n__Arguments__\n\n* tasks - An object literal containing named functions or an array of\n requirements, with the function itself the last item in the array. The key\n used for each function or array is used when specifying requirements. The\n syntax is easier to understand by looking at the example.\n* callback(err, results) - An optional callback which is called when all the\n tasks have been completed. The callback will receive an error as an argument\n if any tasks pass an error to their callback. If all tasks complete\n successfully, it will receive an object containing their results.\n\n__Example__\n\n async.auto({\n get_data: function(callback){\n // async code to get some data\n },\n make_folder: function(callback){\n // async code to create a directory to store a file in\n // this is run at the same time as getting the data\n },\n write_file: ['get_data', 'make_folder', function(callback){\n // once there is some data and the directory exists,\n // write the data to a file in the directory\n callback(null, filename);\n }],\n email_link: ['write_file', function(callback, results){\n // once the file is written let's email a link to it...\n // results.write_file contains the filename returned by write_file.\n }]\n });\n\nThis is a fairly trivial example, but to do this using the basic parallel and\nseries functions would look like this:\n\n async.parallel([\n function(callback){\n // async code to get some data\n },\n function(callback){\n // async code to create a directory to store a file in\n // this is run at the same time as getting the data\n }\n ],\n function(results){\n async.series([\n function(callback){\n // once there is some data and the directory exists,\n // write the data to a file in the directory\n },\n email_link: function(callback){\n // once the file is written let's email a link to it...\n }\n ]);\n });\n\nFor a complicated series of async tasks using the auto function makes adding\nnew tasks much easier and makes the code more readable.\n\n\n---------------------------------------\n\n<a name=\"iterator\" />\n### iterator(tasks)\n\nCreates an iterator function which calls the next function in the array,\nreturning a continuation to call the next one after that. Its also possible to\n'peek' the next iterator by doing iterator.next().\n\nThis function is used internally by the async module but can be useful when\nyou want to manually control the flow of functions in series.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n must call on completion.\n\n__Example__\n\n var iterator = async.iterator([\n function(){ sys.p('one'); },\n function(){ sys.p('two'); },\n function(){ sys.p('three'); }\n ]);\n\n node> var iterator2 = iterator();\n 'one'\n node> var iterator3 = iterator2();\n 'two'\n node> iterator3();\n 'three'\n node> var nextfn = iterator2.next();\n node> nextfn();\n 'three'\n\n\n---------------------------------------\n\n<a name=\"apply\" />\n### apply(function, arguments..)\n\nCreates a continuation function with some arguments already applied, a useful\nshorthand when combined with other control flow functions. Any arguments\npassed to the returned function are added to the arguments originally passed\nto apply.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to automatically apply when the\n continuation is called.\n\n__Example__\n\n // using apply\n\n async.parallel([\n async.apply(fs.writeFile, 'testfile1', 'test1'),\n async.apply(fs.writeFile, 'testfile2', 'test2'),\n ]);\n\n\n // the same process without using apply\n\n async.parallel([\n function(callback){\n fs.writeFile('testfile1', 'test1', callback);\n },\n function(callback){\n fs.writeFile('testfile2', 'test2', callback);\n },\n ]);\n\nIt's possible to pass any number of additional arguments when calling the\ncontinuation:\n\n node> var fn = async.apply(sys.puts, 'one');\n node> fn('two', 'three');\n one\n two\n three\n\n---------------------------------------\n\n<a name=\"nextTick\" />\n### nextTick(callback)\n\nCalls the callback on a later loop around the event loop. In node.js this just\ncalls process.nextTick, in the browser it falls back to setTimeout(callback, 0),\nwhich means other higher priority events may precede the execution of the callback.\n\nThis is used internally for browser-compatibility purposes.\n\n__Arguments__\n\n* callback - The function to call on a later loop around the event loop.\n\n__Example__\n\n var call_order = [];\n async.nextTick(function(){\n call_order.push('two');\n // call_order now equals ['one','two]\n });\n call_order.push('one')\n\n\n## Utils\n\n<a name=\"memoize\" />\n### memoize(fn, [hasher])\n\nCaches the results of an async function. When creating a hash to store function\nresults against, the callback is omitted from the hash and an optional hash\nfunction can be used.\n\n__Arguments__\n\n* fn - the function you to proxy and cache results from.\n* hasher - an optional function for generating a custom hash for storing\n results, it has all the arguments applied to it apart from the callback, and\n must be synchronous.\n\n__Example__\n\n var slow_fn = function (name, callback) {\n // do something\n callback(null, result);\n };\n var fn = async.memoize(slow_fn);\n\n // fn can now be used as if it were slow_fn\n fn('some name', function () {\n // callback\n });\n\n<a name=\"unmemoize\" />\n### unmemoize(fn)\n\nUndoes a memoized function, reverting it to the original, unmemoized\nform. Comes handy in tests.\n\n__Arguments__\n\n* fn - the memoized function\n\n<a name=\"log\" />\n### log(function, arguments)\n\nLogs the result of an async function to the console. Only works in node.js or\nin browsers that support console.log and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.log is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n var hello = function(name, callback){\n setTimeout(function(){\n callback(null, 'hello ' + name);\n }, 1000);\n };\n\n node> async.log(hello, 'world');\n 'hello world'\n\n\n---------------------------------------\n\n<a name=\"dir\" />\n### dir(function, arguments)\n\nLogs the result of an async function to the console using console.dir to\ndisplay the properties of the resulting object. Only works in node.js or\nin browsers that support console.dir and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.dir is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n var hello = function(name, callback){\n setTimeout(function(){\n callback(null, {hello: name});\n }, 1000);\n };\n\n node> async.dir(hello, 'world');\n {hello: 'world'}\n\n\n---------------------------------------\n\n<a name=\"noConflict\" />\n### noConflict()\n\nChanges the value of async back to its original value, returning a reference to the\nasync object.\n", | |
28 | - "readmeFilename": "README.md", | |
29 | - "_id": "async@0.1.22", | |
30 | - "dist": { | |
31 | - "shasum": "16e128d886add7ca553a871f9fcb0cc189befa58" | |
32 | - }, | |
33 | - "_from": "async@~0.1.22", | |
34 | - "_resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz" | |
35 | -} |
node_modules/grunt/node_modules/coffee-script/.npmignore deleted
node_modules/grunt/node_modules/coffee-script/CNAME deleted
node_modules/grunt/node_modules/coffee-script/LICENSE deleted
1 | -Copyright (c) 2009-2012 Jeremy Ashkenas | |
2 | - | |
3 | -Permission is hereby granted, free of charge, to any person | |
4 | -obtaining a copy of this software and associated documentation | |
5 | -files (the "Software"), to deal in the Software without | |
6 | -restriction, including without limitation the rights to use, | |
7 | -copy, modify, merge, publish, distribute, sublicense, and/or sell | |
8 | -copies of the Software, and to permit persons to whom the | |
9 | -Software is furnished to do so, subject to the following | |
10 | -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 | |
17 | -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
18 | -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | |
19 | -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |
20 | -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
21 | -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | |
22 | -OTHER DEALINGS IN THE SOFTWARE. | |
23 | 0 | \ No newline at end of file |
node_modules/grunt/node_modules/coffee-script/README deleted
1 | - | |
2 | - { | |
3 | - } } { | |
4 | - { { } } | |
5 | - } }{ { | |
6 | - { }{ } } _____ __ __ | |
7 | - ( }{ }{ { ) / ____| / _|/ _| | |
8 | - .- { { } { }} -. | | ___ | |_| |_ ___ ___ | |
9 | - ( ( } { } { } } ) | | / _ \| _| _/ _ \/ _ \ | |
10 | - |`-..________ ..-'| | |___| (_) | | | || __/ __/ | |
11 | - | | \_____\___/|_| |_| \___|\___| | |
12 | - | ;--. | |
13 | - | (__ \ _____ _ _ | |
14 | - | | ) ) / ____| (_) | | | |
15 | - | |/ / | (___ ___ _ __ _ _ __ | |_ | |
16 | - | ( / \___ \ / __| '__| | '_ \| __| | |
17 | - | |/ ____) | (__| | | | |_) | |_ | |
18 | - | | |_____/ \___|_| |_| .__/ \__| | |
19 | - `-.._________..-' | | | |
20 | - |_| | |
21 | - | |
22 | - | |
23 | - CoffeeScript is a little language that compiles into JavaScript. | |
24 | - | |
25 | - Install Node.js, and then the CoffeeScript compiler: | |
26 | - sudo bin/cake install | |
27 | - | |
28 | - Or, if you have the Node Package Manager installed: | |
29 | - npm install -g coffee-script | |
30 | - (Leave off the -g if you don't wish to install globally.) | |
31 | - | |
32 | - Execute a script: | |
33 | - coffee /path/to/script.coffee | |
34 | - | |
35 | - Compile a script: | |
36 | - coffee -c /path/to/script.coffee | |
37 | - | |
38 | - For documentation, usage, and examples, see: | |
39 | - http://coffeescript.org/ | |
40 | - | |
41 | - To suggest a feature, report a bug, or general discussion: | |
42 | - http://github.com/jashkenas/coffee-script/issues/ | |
43 | - | |
44 | - If you'd like to chat, drop by #coffeescript on Freenode IRC, | |
45 | - or on webchat.freenode.net. | |
46 | - | |
47 | - The source repository: | |
48 | - git://github.com/jashkenas/coffee-script.git | |
49 | - | |
50 | - All contributors are listed here: | |
51 | - http://github.com/jashkenas/coffee-script/contributors |
node_modules/grunt/node_modules/coffee-script/Rakefile deleted
1 | -require 'rubygems' | |
2 | -require 'erb' | |
3 | -require 'fileutils' | |
4 | -require 'rake/testtask' | |
5 | -require 'json' | |
6 | - | |
7 | -desc "Build the documentation page" | |
8 | -task :doc do | |
9 | - source = 'documentation/index.html.erb' | |
10 | - child = fork { exec "bin/coffee -bcw -o documentation/js documentation/coffee/*.coffee" } | |
11 | - at_exit { Process.kill("INT", child) } | |
12 | - Signal.trap("INT") { exit } | |
13 | - loop do | |
14 | - mtime = File.stat(source).mtime | |
15 | - if !@mtime || mtime > @mtime | |
16 | - rendered = ERB.new(File.read(source)).result(binding) | |
17 | - File.open('index.html', 'w+') {|f| f.write(rendered) } | |
18 | - end | |
19 | - @mtime = mtime | |
20 | - sleep 1 | |
21 | - end | |
22 | -end | |
23 | - | |
24 | -desc "Build coffee-script-source gem" | |
25 | -task :gem do | |
26 | - require 'rubygems' | |
27 | - require 'rubygems/package' | |
28 | - | |
29 | - gemspec = Gem::Specification.new do |s| | |
30 | - s.name = 'coffee-script-source' | |
31 | - s.version = JSON.parse(File.read('package.json'))["version"] | |
32 | - s.date = Time.now.strftime("%Y-%m-%d") | |
33 | - | |
34 | - s.homepage = "http://jashkenas.github.com/coffee-script/" | |
35 | - s.summary = "The CoffeeScript Compiler" | |
36 | - s.description = <<-EOS | |
37 | - CoffeeScript is a little language that compiles into JavaScript. | |
38 | - Underneath all of those embarrassing braces and semicolons, | |
39 | - JavaScript has always had a gorgeous object model at its heart. | |
40 | - CoffeeScript is an attempt to expose the good parts of JavaScript | |
41 | - in a simple way. | |
42 | - EOS | |
43 | - | |
44 | - s.files = [ | |
45 | - 'lib/coffee_script/coffee-script.js', | |
46 | - 'lib/coffee_script/source.rb' | |
47 | - ] | |
48 | - | |
49 | - s.authors = ['Jeremy Ashkenas'] | |
50 | - s.email = 'jashkenas@gmail.com' | |
51 | - s.rubyforge_project = 'coffee-script-source' | |
52 | - end | |
53 | - | |
54 | - file = File.open("coffee-script-source.gem", "w") | |
55 | - Gem::Package.open(file, 'w') do |pkg| | |
56 | - pkg.metadata = gemspec.to_yaml | |
57 | - | |
58 | - path = "lib/coffee_script/source.rb" | |
59 | - contents = <<-ERUBY | |
60 | -module CoffeeScript | |
61 | - module Source | |
62 | - def self.bundled_path | |
63 | - File.expand_path("../coffee-script.js", __FILE__) | |
64 | - end | |
65 | - end | |
66 | -end | |
67 | - ERUBY | |
68 | - pkg.add_file_simple(path, 0644, contents.size) do |tar_io| | |
69 | - tar_io.write(contents) | |
70 | - end | |
71 | - | |
72 | - contents = File.read("extras/coffee-script.js") | |
73 | - path = "lib/coffee_script/coffee-script.js" | |
74 | - pkg.add_file_simple(path, 0644, contents.size) do |tar_io| | |
75 | - tar_io.write(contents) | |
76 | - end | |
77 | - end | |
78 | -end |
node_modules/grunt/node_modules/coffee-script/bin/cake deleted
node_modules/grunt/node_modules/coffee-script/bin/coffee deleted
node_modules/grunt/node_modules/coffee-script/extras/jsl.conf deleted
1 | -# JavaScriptLint configuration file for CoffeeScript. | |
2 | - | |
3 | -+no_return_value # function {0} does not always return a value | |
4 | -+duplicate_formal # duplicate formal argument {0} | |
5 | --equal_as_assign # test for equality (==) mistyped as assignment (=)?{0} | |
6 | -+var_hides_arg # variable {0} hides argument | |
7 | -+redeclared_var # redeclaration of {0} {1} | |
8 | --anon_no_return_value # anonymous function does not always return a value | |
9 | -+missing_semicolon # missing semicolon | |
10 | -+meaningless_block # meaningless block; curly braces have no impact | |
11 | --comma_separated_stmts # multiple statements separated by commas (use semicolons?) | |
12 | -+unreachable_code # unreachable code | |
13 | -+missing_break # missing break statement | |
14 | --missing_break_for_last_case # missing break statement for last case in switch | |
15 | --comparison_type_conv # comparisons against null, 0, true, false, or an empty string allowing implicit type conversion (use === or !==) | |
16 | --inc_dec_within_stmt # increment (++) and decrement (--) operators used as part of greater statement | |
17 | --useless_void # use of the void type may be unnecessary (void is always undefined) | |
18 | -+multiple_plus_minus # unknown order of operations for successive plus (e.g. x+++y) or minus (e.g. x---y) signs | |
19 | -+use_of_label # use of label | |
20 | --block_without_braces # block statement without curly braces | |
21 | -+leading_decimal_point # leading decimal point may indicate a number or an object member | |
22 | -+trailing_decimal_point # trailing decimal point may indicate a number or an object member | |
23 | -+octal_number # leading zeros make an octal number | |
24 | -+nested_comment # nested comment | |
25 | -+misplaced_regex # regular expressions should be preceded by a left parenthesis, assignment, colon, or comma | |
26 | -+ambiguous_newline # unexpected end of line; it is ambiguous whether these lines are part of the same statement | |
27 | -+empty_statement # empty statement or extra semicolon | |
28 | --missing_option_explicit # the "option explicit" control comment is missing | |
29 | -+partial_option_explicit # the "option explicit" control comment, if used, must be in the first script tag | |
30 | -+dup_option_explicit # duplicate "option explicit" control comment | |
31 | -+useless_assign # useless assignment | |
32 | -+ambiguous_nested_stmt # block statements containing block statements should use curly braces to resolve ambiguity | |
33 | -+ambiguous_else_stmt # the else statement could be matched with one of multiple if statements (use curly braces to indicate intent) | |
34 | --missing_default_case # missing default case in switch statement | |
35 | -+duplicate_case_in_switch # duplicate case in switch statements | |
36 | -+default_not_at_end # the default case is not at the end of the switch statement | |
37 | -+legacy_cc_not_understood # couldn't understand control comment using /*@keyword@*/ syntax | |
38 | -+jsl_cc_not_understood # couldn't understand control comment using /*jsl:keyword*/ syntax | |
39 | -+useless_comparison # useless comparison; comparing identical expressions | |
40 | -+with_statement # with statement hides undeclared variables; use temporary variable instead | |
41 | -+trailing_comma_in_array # extra comma is not recommended in array initializers | |
42 | -+assign_to_function_call # assignment to a function call | |
43 | -+parseint_missing_radix # parseInt missing radix parameter | |
44 | -+lambda_assign_requires_semicolon |