├── .gitignore
├── LICENSE
├── README.md
├── assets
├── icons
│ ├── Read Me.txt
│ ├── demo-files
│ │ ├── demo.css
│ │ └── demo.js
│ ├── demo.html
│ ├── fonts
│ │ ├── icomoon-video-tagging.eot
│ │ ├── icomoon-video-tagging.svg
│ │ ├── icomoon-video-tagging.ttf
│ │ └── icomoon-video-tagging.woff
│ ├── ie7
│ │ ├── ie7.css
│ │ └── ie7.js
│ ├── selection.json
│ └── style.css
└── images
│ ├── area.png
│ ├── area2shapes.png
│ ├── areatagged.png
│ ├── chrome.png
│ ├── edge.jpg
│ ├── empty.png
│ ├── emptyframe.png
│ ├── ff.png
│ ├── frames1.png
│ ├── frames2.png
│ ├── frames3.png
│ ├── frames4.png
│ ├── loaded.png
│ ├── lock.png
│ ├── multipoints.png
│ ├── nextuntagged.png
│ ├── playback.png
│ ├── playcontrols.png
│ ├── singlepoint.png
│ ├── taggingcontrols.png
│ ├── tags.png
│ ├── time.png
│ ├── videocontrols.png
│ └── volume.png
├── bower.json
├── css
├── border-anim-h.gif
├── border-anim-v.gif
├── border-h.gif
├── border-v.gif
├── imgareaselect-animated.css
└── sliders.css
├── demo
├── bower.json
├── index.html
├── mov1.mp4
├── mov2.mp4
└── test_images
│ ├── 1.jpg
│ ├── 2.jpg
│ ├── 3.jpg
│ └── 4.jpg
├── index.html
├── js
├── jquery.imgareaselect.js
├── jquery.imgareaselect.min.js
└── jquery.imgareaselect.pack.js
├── optional-tags.html
├── package.json
├── playback-control.html
├── test
├── basic-test.html
└── index.html
├── video-tagging.html
└── video-taggingstyles.html
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 |
5 | # Runtime data
6 | pids
7 | *.pid
8 | *.seed
9 |
10 | # Directory for instrumented libs generated by jscoverage/JSCover
11 | lib-cov
12 |
13 | # Coverage directory used by tools like istanbul
14 | coverage
15 |
16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
17 | .grunt
18 |
19 | # node-waf configuration
20 | .lock-wscript
21 |
22 | # Compiled binary addons (http://nodejs.org/api/addons.html)
23 | build/Release
24 |
25 | # Dependency directory
26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
27 | node_modules
28 |
29 |
30 | server.js
31 | bower_components
32 |
33 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Catalyst Code
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, 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,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # VideoTagging Web Element
2 | This web element can be used to tag videos, frame by frame. It is useful for video-processing applications, where computer vision algorithms are used on video input. For example, drones and robot applications are used to track a specific persn, to detect oil pipes leaks, etc.
3 |
4 | Using the video-tagging web wlement, users can mark regions in each frame and associate text tags to these regions.
5 |
6 | ## Overview
7 | The video-tagging web element is built using HTML5, CSS3 based on [Polymer](https://www.polymer-project.org/1.0/).
8 | Here's an example of marking rectangualr regions in a frame and tagging them with textual labels, representing the objects within the region.
9 | More details on the functionality apear below.
10 |
11 | 
12 |
13 | The area selection is credited to [ImageAreaSelect](http://odyniec.net/projects/imgareaselect/)
14 |
15 | ## Demo
16 | Follow the next steps to run the demo locally.
17 |
18 | * You will need the following installations to be able to run the demo:
19 | [node.js](https://nodejs.org/en/)
20 | [Bower](http://bower.io/)
21 | [Git client](http://www.git-scm.com/) or [GitHub app](https://desktop.github.com/)
22 | * Clone the repository and install required packages
23 |
24 | ```
25 | // clone the repository
26 | git clone https://github.com/CatalystCode/video-tagging.git
27 | ```
28 | ```
29 | // change dir to the 'demo'
30 | cd video-tagging
31 | ```
32 |
33 | ```
34 | // install required node.js packages
35 | npm install
36 | ```
37 |
38 | ```
39 | // install http-server to be able to host the demo
40 | npm install -g http-server
41 | ```
42 | ```
43 | // install bower components
44 | cd demo
45 | bower install
46 | ```
47 | ```
48 | // run a local http-server to host the demo
49 | http-server
50 | ```
51 | * Open your browser: [http://localhost:8080/index.html](http://localhost:8080/index.html)
52 | * Select a tagging job from the list
53 | * Use the mouse to mark a frame point/rectangle and use the tags toggles to select the relevant tags
54 |
55 |
56 | ## Using the element in your app
57 | In order to use the element in your app, you need to install the video-tagging Bower component as follows:
58 |
59 | ```
60 | bower install CatalystCode/video-tagging
61 | ```
62 |
63 | In your HTML page, add the element as follows:
64 |
65 | * Add a reference to the element:
66 |
67 | ```
68 |
69 | ```
70 |
71 | * Add the element tag inline:
72 |
73 | ```
74 |
75 |
76 |
77 | ```
78 |
79 |
80 | **A video-tagging web app, using this web element, is available here: [VideoTaggingTool](https://github.com/CatalystCode/VideoTaggingTool.git)**
81 |
82 | ##API & Usage
83 |
84 | The video-tagging element is based on a video player, with additional functionality for tagging the frames.
85 | The **_tags_** are text labels associated to **_regions or points_** designated in each frame.
86 | The regions that are currently supported are of type "Rectangle".
87 |
88 | A **_video-tagging job_** is an input video and a configuration object which defines the tagging job.
89 | Here's an example of a job configuration:
90 | ```
91 | { "id": 5,
92 | "src": "sample-video.mp4",
93 | "Description = "human tracking job",
94 | "regiontype":"Point",
95 | "regionsize":"25",
96 | "multiregions":"1", // allow multiple regions per frame
97 | "tags" : ["text-1","text-2","text-3"],
98 | "DurationSeconds" = 21.8,
99 | "FramesPerSecond = 25,
100 | "Height" = 480,
101 | "Width" = 640
102 | }
103 | ```
104 | A **_video-tagging job_** can also support image tagging with the following configuration object which defines the tagging job.
105 | Here's an example of a job configuration:
106 | ```
107 | { "id": 5,
108 | "imagelist": "['image_path1.jpg','image_path2.jpg', 'image_path3.jpg']",
109 | "Description = "human tracking job",
110 | "regiontype":"Point",
111 | "regionsize":"25",
112 | "multiregions":"1", // allow multiple regions per frame
113 | "tags" : ["text-1","text-2","text-3"],
114 | "DurationSeconds" = 21.8,
115 | "FramesPerSecond = 25,
116 | "Height" = 480,
117 | "Width" = 640
118 | }
119 | ```
120 |
121 | Each frame may have multiple region/point markers, each labeled with text tags.
122 |
123 | **Example #1: Point markers**
124 | ```
125 | { region: { name: 1, type: 'Point', x1: 123, y1: 54, tags: [ 'horse', 'brown'], ... }}
126 | ```
127 |
128 | **Example #2: rectangle markers**
129 | ```
130 | { region: { name: 1, type: 'Rectangle', x1: 123, y1: 54, x2: 35, y2: 78, tags: [ 'horse', 'brown'], ... }}
131 | ```
132 |
133 |
134 | ###Video Controls:
135 |
136 | 
137 |
138 | 1. Video timebar
139 | 2. Previous frame
140 | 3. Play/Pause
141 | 4. Next frame
142 | 5. Skip to the furst untagged frame
143 | 6. Frame index
144 | 7. Play speed
145 | 8. Timer
146 | 9. Volume/Mute
147 |
148 | ###Tagging controls
149 |
150 | 
151 |
152 | 1. Tags - click on the relevant buttons to tag the selected region/point in the frame.
153 | 2. Mark as empty frame - designates a frame with no relevant tags.
154 | 3. Lock tags - automatically adds selected tags to new regions. Toggle to enable/disable.
155 |
156 |
157 | ###Tag the video
158 |
159 | **Point marker**
160 | click on the frame and associate tags to the clicked **point/position** in the frame.
161 | 
162 |
163 | **Rectangle marker**
164 | Click on the frame, drag mouse to create a rectangle and release the mouse. Add tags using the tag toggles.
165 | 
166 |
167 | To edit tags, select a marker (Point or Rectangle), and add/remove tags.
168 |
169 | **Lock tags**
170 | When enabled, the selected tags will remain selected after tagging the current frame and moving to the next frame.
171 | When only single marker can be tagged in a frame ("multitags="0") and the tags are locked, the frame will advance automatically after the marker was created.
172 | In tsuch case, the tagging workflow is as follows:
173 | 1. Create a new region - Click or drag
174 | 2. Select tags
175 | 3. Click on the Lock Icon
176 | 4. Create a region
177 | 5. Repeat
178 | 6. Click the icon again to exit this mode.
179 |
180 |
181 | ####Input Data
182 | The following properties must be populated:
183 |
184 | * `videoduration` - number, for example 30.07
185 | * `videowidth` - number, for example 420
186 | * `videoheight` - number, for example 240
187 | * `framerate` - number, for example 29.97
188 | * `regiontype` - string, can be "point" or "rectangle"
189 | * `regionsize` - number, for example 20 (in pixels) for point regions.
190 | * `multitags` - string, can be "0" or "1"
191 | * `inputtagsarray` - a string array of the possible tags
192 | * `inputFrames` - an object containing all the tagged frames of this video (That have been created at an earlier time).
193 | The object is a dictionary, the frame number is the key. Each frame has a collection of regions
194 | and each region has a collection of tags.
195 | In this example we see data for frames 434, 442 and 628.
196 | 
197 | Expanded- each region is an object with coordinates and a tags array.
198 | 
199 |
200 | Example:
201 | ```
202 | var videotagging = document.getElementById('video-tagging');
203 |
204 | videotagging.videoduration = data.video.DurationSeconds;
205 | videotagging.videowidth = data.video.Width;
206 | videotagging.videoheight = data.video.Height;
207 | videotagging.framerate = data.video.FramesPerSecond;
208 | ```
209 |
210 | Finally, to load the control, set the src property to the URL of the video:
211 | ```
212 | videotagging.src = data.video.Url;
213 | ```
214 |
215 | ####Output Data
216 | When a region is created or updated and when tags are added/removed, the element fires an event called "onregionchanged". Register to this event to get the
217 | data:
218 | ```
219 | document.getElementById('video-tegging').addEventListener('onregionchanged', function (e) {...
220 | ```
221 |
222 | The control returns **all** the regions and their tags in the current frame. The parameter e holds this data in e.detail:
223 |
224 | 
225 |
226 | ####Browser Support
227 |
228 |  Chrome 47
229 |  Firefox 43
230 |
231 | It is recommended to use the same browser consistently as there are differences between them regarding video time calculations.
232 | Better precision was observed in Firefox.
233 |
234 | # License
235 | [MIT](LICENSE)
236 |
--------------------------------------------------------------------------------
/assets/icons/Read Me.txt:
--------------------------------------------------------------------------------
1 | Open *demo.html* to see a list of all the glyphs in your font along with their codes/ligatures.
2 |
3 | To use the generated font in desktop programs, you can install the TTF font. In order to copy the character associated with each icon, refer to the text box at the bottom right corner of each glyph in demo.html. The character inside this text box may be invisible; but it can still be copied. See this guide for more info: https://icomoon.io/#docs/local-fonts
4 |
5 | You won't need any of the files located under the *demo-files* directory when including the generated font in your own projects.
6 |
7 | You can import *selection.json* back to the IcoMoon app using the *Import Icons* button (or via Main Menu → Manage Projects) to retrieve your icon selection.
8 |
--------------------------------------------------------------------------------
/assets/icons/demo-files/demo.css:
--------------------------------------------------------------------------------
1 | body {
2 | padding: 0;
3 | margin: 0;
4 | font-family: sans-serif;
5 | font-size: 1em;
6 | line-height: 1.5;
7 | color: #555;
8 | background: #fff;
9 | }
10 | h1 {
11 | font-size: 1.5em;
12 | font-weight: normal;
13 | }
14 | small {
15 | font-size: .66666667em;
16 | }
17 | a {
18 | color: #e74c3c;
19 | text-decoration: none;
20 | }
21 | a:hover, a:focus {
22 | box-shadow: 0 1px #e74c3c;
23 | }
24 | .bshadow0, input {
25 | box-shadow: inset 0 -2px #e7e7e7;
26 | }
27 | input:hover {
28 | box-shadow: inset 0 -2px #ccc;
29 | }
30 | input, fieldset {
31 | font-size: 1em;
32 | margin: 0;
33 | padding: 0;
34 | border: 0;
35 | }
36 | input {
37 | color: inherit;
38 | line-height: 1.5;
39 | height: 1.5em;
40 | padding: .25em 0;
41 | }
42 | input:focus {
43 | outline: none;
44 | box-shadow: inset 0 -2px #449fdb;
45 | }
46 | .glyph {
47 | font-size: 16px;
48 | width: 15em;
49 | padding-bottom: 1em;
50 | margin-right: 4em;
51 | margin-bottom: 1em;
52 | float: left;
53 | overflow: hidden;
54 | }
55 | .liga {
56 | width: 80%;
57 | width: calc(100% - 2.5em);
58 | }
59 | .talign-right {
60 | text-align: right;
61 | }
62 | .talign-center {
63 | text-align: center;
64 | }
65 | .bgc1 {
66 | background: #f1f1f1;
67 | }
68 | .fgc1 {
69 | color: #999;
70 | }
71 | .fgc0 {
72 | color: #000;
73 | }
74 | p {
75 | margin-top: 1em;
76 | margin-bottom: 1em;
77 | }
78 | .mvm {
79 | margin-top: .75em;
80 | margin-bottom: .75em;
81 | }
82 | .mtn {
83 | margin-top: 0;
84 | }
85 | .mtl, .mal {
86 | margin-top: 1.5em;
87 | }
88 | .mbl, .mal {
89 | margin-bottom: 1.5em;
90 | }
91 | .mal, .mhl {
92 | margin-left: 1.5em;
93 | margin-right: 1.5em;
94 | }
95 | .mhmm {
96 | margin-left: 1em;
97 | margin-right: 1em;
98 | }
99 | .mls {
100 | margin-left: .25em;
101 | }
102 | .ptl {
103 | padding-top: 1.5em;
104 | }
105 | .pbs, .pvs {
106 | padding-bottom: .25em;
107 | }
108 | .pvs, .pts {
109 | padding-top: .25em;
110 | }
111 | .unit {
112 | float: left;
113 | }
114 | .unitRight {
115 | float: right;
116 | }
117 | .size1of2 {
118 | width: 50%;
119 | }
120 | .size1of1 {
121 | width: 100%;
122 | }
123 | .clearfix:before, .clearfix:after {
124 | content: " ";
125 | display: table;
126 | }
127 | .clearfix:after {
128 | clear: both;
129 | }
130 | .hidden-true {
131 | display: none;
132 | }
133 | .textbox0 {
134 | width: 3em;
135 | background: #f1f1f1;
136 | padding: .25em .5em;
137 | line-height: 1.5;
138 | height: 1.5em;
139 | }
140 | #testDrive {
141 | display: block;
142 | padding-top: 24px;
143 | line-height: 1.5;
144 | }
145 | .fs0 {
146 | font-size: 16px;
147 | }
148 | .fs1 {
149 | font-size: 32px;
150 | }
151 |
152 |
--------------------------------------------------------------------------------
/assets/icons/demo-files/demo.js:
--------------------------------------------------------------------------------
1 | if (!('boxShadow' in document.body.style)) {
2 | document.body.setAttribute('class', 'noBoxShadow');
3 | }
4 |
5 | document.body.addEventListener("click", function(e) {
6 | var target = e.target;
7 | if (target.tagName === "INPUT" &&
8 | target.getAttribute('class').indexOf('liga') === -1) {
9 | target.select();
10 | }
11 | });
12 |
13 | (function() {
14 | var fontSize = document.getElementById('fontSize'),
15 | testDrive = document.getElementById('testDrive'),
16 | testText = document.getElementById('testText');
17 | function updateTest() {
18 | testDrive.innerHTML = testText.value || String.fromCharCode(160);
19 | if (window.icomoonLiga) {
20 | window.icomoonLiga(testDrive);
21 | }
22 | }
23 | function updateSize() {
24 | testDrive.style.fontSize = fontSize.value + 'px';
25 | }
26 | fontSize.addEventListener('change', updateSize, false);
27 | testText.addEventListener('input', updateTest, false);
28 | testText.addEventListener('change', updateTest, false);
29 | updateSize();
30 | }());
31 |
--------------------------------------------------------------------------------
/assets/icons/demo.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IcoMoon Demo
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
Font Name: icomoon-video-tagging (Glyphs: 27)
17 |
18 |
19 |
Grid Size: 16
20 |
36 |
52 |
68 |
84 |
100 |
116 |
132 |
148 |
164 |
180 |
196 |
212 |
228 |
244 |
260 |
276 |
292 |
308 |
324 |
340 |
356 |
372 |
388 |
404 |
420 |
436 |
452 |
453 |
454 |
455 |
456 |
Font Test Drive
457 |
458 | Font Size:
460 | px
461 |
462 |
464 |
465 |
466 |
467 |
468 |
469 |
472 |
473 |
474 |
475 |
476 |
--------------------------------------------------------------------------------
/assets/icons/fonts/icomoon-video-tagging.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/icons/fonts/icomoon-video-tagging.eot
--------------------------------------------------------------------------------
/assets/icons/fonts/icomoon-video-tagging.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/assets/icons/fonts/icomoon-video-tagging.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/icons/fonts/icomoon-video-tagging.ttf
--------------------------------------------------------------------------------
/assets/icons/fonts/icomoon-video-tagging.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/icons/fonts/icomoon-video-tagging.woff
--------------------------------------------------------------------------------
/assets/icons/ie7/ie7.css:
--------------------------------------------------------------------------------
1 | .icon-file-picture {
2 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
3 | }
4 | .icon-file-play {
5 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
6 | }
7 | .icon-price-tag {
8 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
9 | }
10 | .icon-price-tags {
11 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
12 | }
13 | .icon-pushpin {
14 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
15 | }
16 | .icon-floppy-disk {
17 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
18 | }
19 | .icon-cross {
20 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
21 | }
22 | .icon-play3 {
23 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
24 | }
25 | .icon-pause2 {
26 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
27 | }
28 | .icon-stop2 {
29 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
30 | }
31 | .icon-backward2 {
32 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
33 | }
34 | .icon-forward3 {
35 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
36 | }
37 | .icon-first {
38 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
39 | }
40 | .icon-last {
41 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
42 | }
43 | .icon-previous2 {
44 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
45 | }
46 | .icon-next2 {
47 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
48 | }
49 | .icon-eject {
50 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
51 | }
52 | .icon-volume-medium {
53 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
54 | }
55 | .icon-volume-mute2 {
56 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
57 | }
58 | .icon-arrow-right {
59 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
60 | }
61 | .icon-arrow-left {
62 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
63 | }
64 | .icon-arrow-right2 {
65 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
66 | }
67 | .icon-arrow-left2 {
68 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
69 | }
70 | .icon-circle-right {
71 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
72 | }
73 | .icon-circle-left {
74 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
75 | }
76 | .icon-checkbox-unchecked {
77 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
78 | }
79 | .icon-share {
80 | *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '');
81 | }
82 |
83 |
--------------------------------------------------------------------------------
/assets/icons/ie7/ie7.js:
--------------------------------------------------------------------------------
1 | /* To avoid CSS expressions while still supporting IE 7 and IE 6, use this script */
2 | /* The script tag referencing this file must be placed before the ending body tag. */
3 |
4 | /* Use conditional comments in order to target IE 7 and older:
5 |
6 |
7 |
8 | */
9 |
10 | (function() {
11 | function addIcon(el, entity) {
12 | var html = el.innerHTML;
13 | el.innerHTML = '' + entity + ' ' + html;
14 | }
15 | var icons = {
16 | 'icon-file-picture': '',
17 | 'icon-file-play': '',
18 | 'icon-price-tag': '',
19 | 'icon-price-tags': '',
20 | 'icon-pushpin': '',
21 | 'icon-floppy-disk': '',
22 | 'icon-cross': '',
23 | 'icon-play3': '',
24 | 'icon-pause2': '',
25 | 'icon-stop2': '',
26 | 'icon-backward2': '',
27 | 'icon-forward3': '',
28 | 'icon-first': '',
29 | 'icon-last': '',
30 | 'icon-previous2': '',
31 | 'icon-next2': '',
32 | 'icon-eject': '',
33 | 'icon-volume-medium': '',
34 | 'icon-volume-mute2': '',
35 | 'icon-arrow-right': '',
36 | 'icon-arrow-left': '',
37 | 'icon-arrow-right2': '',
38 | 'icon-arrow-left2': '',
39 | 'icon-circle-right': '',
40 | 'icon-circle-left': '',
41 | 'icon-checkbox-unchecked': '',
42 | 'icon-share': '',
43 | '0': 0
44 | },
45 | els = document.getElementsByTagName('*'),
46 | i, c, el;
47 | for (i = 0; ; i += 1) {
48 | el = els[i];
49 | if(!el) {
50 | break;
51 | }
52 | c = el.className;
53 | c = c.match(/icon-[^\s'"]+/);
54 | if (c && icons[c[0]]) {
55 | addIcon(el, icons[c[0]]);
56 | }
57 | }
58 | }());
59 |
--------------------------------------------------------------------------------
/assets/icons/selection.json:
--------------------------------------------------------------------------------
1 | {
2 | "IcoMoonType": "selection",
3 | "icons": [
4 | {
5 | "icon": {
6 | "paths": [
7 | "M832 896h-640v-128l192-320 263 320 185-128v256z",
8 | "M832 480c0 53.020-42.98 96-96 96-53.022 0-96-42.98-96-96s42.978-96 96-96c53.020 0 96 42.98 96 96z",
9 | "M917.806 229.076c-22.212-30.292-53.174-65.7-87.178-99.704s-69.412-64.964-99.704-87.178c-51.574-37.82-76.592-42.194-90.924-42.194h-496c-44.112 0-80 35.888-80 80v864c0 44.112 35.888 80 80 80h736c44.112 0 80-35.888 80-80v-624c0-14.332-4.372-39.35-42.194-90.924zM785.374 174.626c30.7 30.7 54.8 58.398 72.58 81.374h-153.954v-153.946c22.984 17.78 50.678 41.878 81.374 72.572zM896 944c0 8.672-7.328 16-16 16h-736c-8.672 0-16-7.328-16-16v-864c0-8.672 7.328-16 16-16 0 0 495.956-0.002 496 0v224c0 17.672 14.326 32 32 32h224v624z"
10 | ],
11 | "attrs": [],
12 | "isMulticolor": false,
13 | "tags": [
14 | "file-picture",
15 | "file",
16 | "document",
17 | "file-image"
18 | ],
19 | "grid": 16
20 | },
21 | "attrs": [],
22 | "properties": {
23 | "order": 23,
24 | "prevSize": 32,
25 | "ligatures": "file-picture, file5",
26 | "name": "file-picture",
27 | "id": 40,
28 | "code": 59648
29 | },
30 | "setIdx": 5,
31 | "setId": 0,
32 | "iconIdx": 39
33 | },
34 | {
35 | "icon": {
36 | "paths": [
37 | "M384 384l320 224-320 224v-448z",
38 | "M917.806 229.076c-22.212-30.292-53.174-65.7-87.178-99.704s-69.412-64.964-99.704-87.178c-51.574-37.82-76.592-42.194-90.924-42.194h-496c-44.112 0-80 35.888-80 80v864c0 44.112 35.888 80 80 80h736c44.112 0 80-35.888 80-80v-624c0-14.332-4.372-39.35-42.194-90.924zM785.374 174.626c30.7 30.7 54.8 58.398 72.58 81.374h-153.954v-153.946c22.984 17.78 50.678 41.878 81.374 72.572zM896 944c0 8.672-7.328 16-16 16h-736c-8.672 0-16-7.328-16-16v-864c0-8.672 7.328-16 16-16 0 0 495.956-0.002 496 0v224c0 17.672 14.326 32 32 32h224v624z"
39 | ],
40 | "attrs": [],
41 | "isMulticolor": false,
42 | "tags": [
43 | "file-play",
44 | "file",
45 | "document",
46 | "file-media",
47 | "file-video"
48 | ],
49 | "grid": 16
50 | },
51 | "attrs": [],
52 | "properties": {
53 | "order": 34,
54 | "prevSize": 32,
55 | "ligatures": "file-play, file7",
56 | "name": "file-play",
57 | "id": 42,
58 | "code": 59673
59 | },
60 | "setIdx": 5,
61 | "setId": 0,
62 | "iconIdx": 41
63 | },
64 | {
65 | "icon": {
66 | "paths": [
67 | "M976 0h-384c-26.4 0-63.274 15.274-81.942 33.942l-476.116 476.116c-18.668 18.668-18.668 49.214 0 67.882l412.118 412.118c18.668 18.668 49.214 18.668 67.882 0l476.118-476.118c18.666-18.666 33.94-55.54 33.94-81.94v-384c0-26.4-21.6-48-48-48zM736 384c-53.020 0-96-42.98-96-96s42.98-96 96-96 96 42.98 96 96-42.98 96-96 96z"
68 | ],
69 | "attrs": [],
70 | "isMulticolor": false,
71 | "tags": [
72 | "price-tag"
73 | ],
74 | "grid": 16
75 | },
76 | "attrs": [],
77 | "properties": {
78 | "order": 21,
79 | "prevSize": 32,
80 | "ligatures": "price-tag",
81 | "name": "price-tag",
82 | "id": 54,
83 | "code": 59649
84 | },
85 | "setIdx": 5,
86 | "setId": 0,
87 | "iconIdx": 53
88 | },
89 | {
90 | "icon": {
91 | "paths": [
92 | "M1232 0h-384c-26.4 0-63.274 15.274-81.942 33.942l-476.116 476.116c-18.668 18.668-18.668 49.214 0 67.882l412.118 412.118c18.668 18.668 49.214 18.668 67.882 0l476.118-476.118c18.666-18.666 33.94-55.54 33.94-81.94v-384c0-26.4-21.6-48-48-48zM992 384c-53.020 0-96-42.98-96-96s42.98-96 96-96 96 42.98 96 96-42.98 96-96 96z",
93 | "M128 544l544-544h-80c-26.4 0-63.274 15.274-81.942 33.942l-476.116 476.116c-18.668 18.668-18.668 49.214 0 67.882l412.118 412.118c18.668 18.668 49.214 18.668 67.882 0l30.058-30.058-416-416z"
94 | ],
95 | "width": 1280,
96 | "attrs": [],
97 | "isMulticolor": false,
98 | "tags": [
99 | "price-tags"
100 | ],
101 | "grid": 16
102 | },
103 | "attrs": [],
104 | "properties": {
105 | "order": 22,
106 | "prevSize": 32,
107 | "ligatures": "price-tags",
108 | "name": "price-tags",
109 | "id": 55,
110 | "code": 59650
111 | },
112 | "setIdx": 5,
113 | "setId": 0,
114 | "iconIdx": 54
115 | },
116 | {
117 | "icon": {
118 | "paths": [
119 | "M544 0l-96 96 96 96-224 256h-224l176 176-272 360.616v39.384h39.384l360.616-272 176 176v-224l256-224 96 96 96-96-480-480zM448 544l-64-64 224-224 64 64-224 224z"
120 | ],
121 | "attrs": [],
122 | "isMulticolor": false,
123 | "tags": [
124 | "pushpin",
125 | "pin"
126 | ],
127 | "grid": 16
128 | },
129 | "attrs": [],
130 | "properties": {
131 | "order": 24,
132 | "prevSize": 32,
133 | "ligatures": "pushpin, pin",
134 | "name": "pushpin",
135 | "id": 71,
136 | "code": 59651
137 | },
138 | "setIdx": 5,
139 | "setId": 0,
140 | "iconIdx": 70
141 | },
142 | {
143 | "icon": {
144 | "paths": [
145 | "M896 0h-896v1024h1024v-896l-128-128zM512 128h128v256h-128v-256zM896 896h-768v-768h64v320h576v-320h74.978l53.022 53.018v714.982z"
146 | ],
147 | "attrs": [],
148 | "isMulticolor": false,
149 | "tags": [
150 | "floppy-disk",
151 | "save"
152 | ],
153 | "grid": 16
154 | },
155 | "attrs": [],
156 | "properties": {
157 | "order": 35,
158 | "prevSize": 32,
159 | "ligatures": "floppy-disk, save2",
160 | "name": "floppy-disk",
161 | "id": 99,
162 | "code": 59674
163 | },
164 | "setIdx": 5,
165 | "setId": 0,
166 | "iconIdx": 98
167 | },
168 | {
169 | "icon": {
170 | "paths": [
171 | "M1014.662 822.66c-0.004-0.004-0.008-0.008-0.012-0.010l-310.644-310.65 310.644-310.65c0.004-0.004 0.008-0.006 0.012-0.010 3.344-3.346 5.762-7.254 7.312-11.416 4.246-11.376 1.824-24.682-7.324-33.83l-146.746-146.746c-9.148-9.146-22.45-11.566-33.828-7.32-4.16 1.55-8.070 3.968-11.418 7.31 0 0.004-0.004 0.006-0.008 0.010l-310.648 310.652-310.648-310.65c-0.004-0.004-0.006-0.006-0.010-0.010-3.346-3.342-7.254-5.76-11.414-7.31-11.38-4.248-24.682-1.826-33.83 7.32l-146.748 146.748c-9.148 9.148-11.568 22.452-7.322 33.828 1.552 4.16 3.97 8.072 7.312 11.416 0.004 0.002 0.006 0.006 0.010 0.010l310.65 310.648-310.65 310.652c-0.002 0.004-0.006 0.006-0.008 0.010-3.342 3.346-5.76 7.254-7.314 11.414-4.248 11.376-1.826 24.682 7.322 33.83l146.748 146.746c9.15 9.148 22.452 11.568 33.83 7.322 4.16-1.552 8.070-3.97 11.416-7.312 0.002-0.004 0.006-0.006 0.010-0.010l310.648-310.65 310.648 310.65c0.004 0.002 0.008 0.006 0.012 0.008 3.348 3.344 7.254 5.762 11.414 7.314 11.378 4.246 24.684 1.826 33.828-7.322l146.746-146.748c9.148-9.148 11.57-22.454 7.324-33.83-1.552-4.16-3.97-8.068-7.314-11.414z"
172 | ],
173 | "attrs": [],
174 | "isMulticolor": false,
175 | "tags": [
176 | "cross",
177 | "cancel",
178 | "close",
179 | "quit",
180 | "remove"
181 | ],
182 | "grid": 16
183 | },
184 | "attrs": [],
185 | "properties": {
186 | "order": 7,
187 | "prevSize": 32,
188 | "ligatures": "cross, cancel",
189 | "name": "cross",
190 | "id": 272,
191 | "code": 59652
192 | },
193 | "setIdx": 5,
194 | "setId": 0,
195 | "iconIdx": 271
196 | },
197 | {
198 | "icon": {
199 | "paths": [
200 | "M192 128l640 384-640 384z"
201 | ],
202 | "attrs": [],
203 | "isMulticolor": false,
204 | "tags": [
205 | "play",
206 | "player"
207 | ],
208 | "grid": 16
209 | },
210 | "attrs": [],
211 | "properties": {
212 | "order": 8,
213 | "prevSize": 32,
214 | "ligatures": "play3, player8",
215 | "name": "play3",
216 | "id": 285,
217 | "code": 59653
218 | },
219 | "setIdx": 5,
220 | "setId": 0,
221 | "iconIdx": 284
222 | },
223 | {
224 | "icon": {
225 | "paths": [
226 | "M128 128h320v768h-320zM576 128h320v768h-320z"
227 | ],
228 | "attrs": [],
229 | "isMulticolor": false,
230 | "tags": [
231 | "pause",
232 | "player"
233 | ],
234 | "grid": 16
235 | },
236 | "attrs": [],
237 | "properties": {
238 | "order": 9,
239 | "prevSize": 32,
240 | "ligatures": "pause2, player9",
241 | "name": "pause2",
242 | "id": 286,
243 | "code": 59654
244 | },
245 | "setIdx": 5,
246 | "setId": 0,
247 | "iconIdx": 285
248 | },
249 | {
250 | "icon": {
251 | "paths": [
252 | "M128 128h768v768h-768z"
253 | ],
254 | "attrs": [],
255 | "isMulticolor": false,
256 | "tags": [
257 | "stop",
258 | "player",
259 | "square"
260 | ],
261 | "grid": 16
262 | },
263 | "attrs": [],
264 | "properties": {
265 | "order": 10,
266 | "prevSize": 32,
267 | "ligatures": "stop2, player10",
268 | "name": "stop2",
269 | "id": 287,
270 | "code": 59655
271 | },
272 | "setIdx": 5,
273 | "setId": 0,
274 | "iconIdx": 286
275 | },
276 | {
277 | "icon": {
278 | "paths": [
279 | "M576 160v320l320-320v704l-320-320v320l-352-352z"
280 | ],
281 | "attrs": [],
282 | "isMulticolor": false,
283 | "tags": [
284 | "backward",
285 | "player"
286 | ],
287 | "grid": 16
288 | },
289 | "attrs": [],
290 | "properties": {
291 | "order": 18,
292 | "prevSize": 32,
293 | "ligatures": "backward2, player11",
294 | "name": "backward2",
295 | "id": 288,
296 | "code": 59656
297 | },
298 | "setIdx": 5,
299 | "setId": 0,
300 | "iconIdx": 287
301 | },
302 | {
303 | "icon": {
304 | "paths": [
305 | "M512 864v-320l-320 320v-704l320 320v-320l352 352z"
306 | ],
307 | "attrs": [],
308 | "isMulticolor": false,
309 | "tags": [
310 | "forward",
311 | "player"
312 | ],
313 | "grid": 16
314 | },
315 | "attrs": [],
316 | "properties": {
317 | "order": 11,
318 | "prevSize": 32,
319 | "ligatures": "forward3, player12",
320 | "name": "forward3",
321 | "id": 289,
322 | "code": 59657
323 | },
324 | "setIdx": 5,
325 | "setId": 0,
326 | "iconIdx": 288
327 | },
328 | {
329 | "icon": {
330 | "paths": [
331 | "M128 896v-768h128v352l320-320v320l320-320v704l-320-320v320l-320-320v352z"
332 | ],
333 | "attrs": [],
334 | "isMulticolor": false,
335 | "tags": [
336 | "first",
337 | "player"
338 | ],
339 | "grid": 16
340 | },
341 | "attrs": [],
342 | "properties": {
343 | "order": 12,
344 | "prevSize": 32,
345 | "ligatures": "first, player13",
346 | "name": "first",
347 | "id": 290,
348 | "code": 59658
349 | },
350 | "setIdx": 5,
351 | "setId": 0,
352 | "iconIdx": 289
353 | },
354 | {
355 | "icon": {
356 | "paths": [
357 | "M896 128v768h-128v-352l-320 320v-320l-320 320v-704l320 320v-320l320 320v-352z"
358 | ],
359 | "attrs": [],
360 | "isMulticolor": false,
361 | "tags": [
362 | "last",
363 | "player"
364 | ],
365 | "grid": 16
366 | },
367 | "attrs": [],
368 | "properties": {
369 | "order": 13,
370 | "prevSize": 32,
371 | "ligatures": "last, player14",
372 | "name": "last",
373 | "id": 291,
374 | "code": 59659
375 | },
376 | "setIdx": 5,
377 | "setId": 0,
378 | "iconIdx": 290
379 | },
380 | {
381 | "icon": {
382 | "paths": [
383 | "M256 896v-768h128v352l320-320v704l-320-320v352z"
384 | ],
385 | "attrs": [],
386 | "isMulticolor": false,
387 | "tags": [
388 | "previous",
389 | "player"
390 | ],
391 | "grid": 16
392 | },
393 | "attrs": [],
394 | "properties": {
395 | "order": 14,
396 | "prevSize": 32,
397 | "ligatures": "previous2, player15",
398 | "name": "previous2",
399 | "id": 292,
400 | "code": 59660
401 | },
402 | "setIdx": 5,
403 | "setId": 0,
404 | "iconIdx": 291
405 | },
406 | {
407 | "icon": {
408 | "paths": [
409 | "M768 128v768h-128v-352l-320 320v-704l320 320v-352z"
410 | ],
411 | "attrs": [],
412 | "isMulticolor": false,
413 | "tags": [
414 | "next",
415 | "player"
416 | ],
417 | "grid": 16
418 | },
419 | "attrs": [],
420 | "properties": {
421 | "order": 15,
422 | "prevSize": 32,
423 | "ligatures": "next2, player16",
424 | "name": "next2",
425 | "id": 293,
426 | "code": 59661
427 | },
428 | "setIdx": 5,
429 | "setId": 0,
430 | "iconIdx": 292
431 | },
432 | {
433 | "icon": {
434 | "paths": [
435 | "M0 768h1024v128h-1024zM512 128l512 512h-1024z"
436 | ],
437 | "attrs": [],
438 | "isMulticolor": false,
439 | "tags": [
440 | "eject",
441 | "player"
442 | ],
443 | "grid": 16
444 | },
445 | "attrs": [],
446 | "properties": {
447 | "order": 19,
448 | "prevSize": 32,
449 | "ligatures": "eject, player17",
450 | "name": "eject",
451 | "id": 294,
452 | "code": 59662
453 | },
454 | "setIdx": 5,
455 | "setId": 0,
456 | "iconIdx": 293
457 | },
458 | {
459 | "icon": {
460 | "paths": [
461 | "M719.53 831.53c-12.286 0-24.566-4.686-33.942-14.056-18.744-18.744-18.744-49.136 0-67.882 131.006-131.006 131.006-344.17 0-475.176-18.744-18.746-18.744-49.138 0-67.882 18.744-18.742 49.138-18.744 67.882 0 81.594 81.59 126.53 190.074 126.53 305.466 0 115.39-44.936 223.876-126.53 305.47-9.372 9.374-21.656 14.060-33.94 14.060v0zM549.020 741.020c-12.286 0-24.566-4.686-33.942-14.058-18.746-18.746-18.746-49.134 0-67.88 81.1-81.1 81.1-213.058 0-294.156-18.746-18.746-18.746-49.138 0-67.882s49.136-18.744 67.882 0c118.53 118.53 118.53 311.392 0 429.922-9.372 9.368-21.656 14.054-33.94 14.054z",
462 | "M416.006 960c-8.328 0-16.512-3.25-22.634-9.374l-246.626-246.626h-114.746c-17.672 0-32-14.326-32-32v-320c0-17.672 14.328-32 32-32h114.746l246.626-246.628c9.154-9.154 22.916-11.89 34.874-6.936 11.958 4.952 19.754 16.622 19.754 29.564v832c0 12.944-7.796 24.612-19.754 29.564-3.958 1.64-8.118 2.436-12.24 2.436z"
463 | ],
464 | "attrs": [],
465 | "isMulticolor": false,
466 | "tags": [
467 | "volume-medium",
468 | "volume",
469 | "audio",
470 | "speaker",
471 | "player"
472 | ],
473 | "grid": 16
474 | },
475 | "attrs": [],
476 | "properties": {
477 | "order": 16,
478 | "prevSize": 32,
479 | "ligatures": "volume-medium, volume2",
480 | "name": "volume-medium",
481 | "id": 296,
482 | "code": 59663
483 | },
484 | "setIdx": 5,
485 | "setId": 0,
486 | "iconIdx": 295
487 | },
488 | {
489 | "icon": {
490 | "paths": [
491 | "M960 619.148v84.852h-84.852l-107.148-107.148-107.148 107.148h-84.852v-84.852l107.148-107.148-107.148-107.148v-84.852h84.852l107.148 107.148 107.148-107.148h84.852v84.852l-107.148 107.148 107.148 107.148z",
492 | "M416.006 960c-8.328 0-16.512-3.25-22.634-9.374l-246.626-246.626h-114.746c-17.672 0-32-14.326-32-32v-320c0-17.672 14.328-32 32-32h114.746l246.626-246.628c9.154-9.154 22.916-11.89 34.874-6.936 11.958 4.952 19.754 16.622 19.754 29.564v832c0 12.944-7.796 24.612-19.754 29.564-3.958 1.64-8.118 2.436-12.24 2.436z"
493 | ],
494 | "attrs": [],
495 | "isMulticolor": false,
496 | "tags": [
497 | "volume-mute",
498 | "volume",
499 | "audio",
500 | "player"
501 | ],
502 | "grid": 16
503 | },
504 | "attrs": [],
505 | "properties": {
506 | "order": 17,
507 | "prevSize": 32,
508 | "ligatures": "volume-mute2, volume5",
509 | "name": "volume-mute2",
510 | "id": 299,
511 | "code": 59664
512 | },
513 | "setIdx": 5,
514 | "setId": 0,
515 | "iconIdx": 298
516 | },
517 | {
518 | "icon": {
519 | "paths": [
520 | "M992 512l-480-480v288h-512v384h512v288z"
521 | ],
522 | "attrs": [],
523 | "isMulticolor": false,
524 | "tags": [
525 | "arrow-right",
526 | "right",
527 | "next"
528 | ],
529 | "grid": 16
530 | },
531 | "attrs": [],
532 | "properties": {
533 | "order": 27,
534 | "prevSize": 32,
535 | "ligatures": "arrow-right, right3",
536 | "name": "arrow-right",
537 | "id": 309,
538 | "code": 59665
539 | },
540 | "setIdx": 5,
541 | "setId": 0,
542 | "iconIdx": 308
543 | },
544 | {
545 | "icon": {
546 | "paths": [
547 | "M32 512l480 480v-288h512v-384h-512v-288z"
548 | ],
549 | "attrs": [],
550 | "isMulticolor": false,
551 | "tags": [
552 | "arrow-left",
553 | "left",
554 | "previous"
555 | ],
556 | "grid": 16
557 | },
558 | "attrs": [],
559 | "properties": {
560 | "order": 28,
561 | "prevSize": 32,
562 | "ligatures": "arrow-left, left3",
563 | "name": "arrow-left",
564 | "id": 313,
565 | "code": 59666
566 | },
567 | "setIdx": 5,
568 | "setId": 0,
569 | "iconIdx": 312
570 | },
571 | {
572 | "icon": {
573 | "paths": [
574 | "M621.254 877.254l320-320c24.994-24.992 24.994-65.516 0-90.51l-320-320c-24.994-24.992-65.516-24.992-90.51 0-24.994 24.994-24.994 65.516 0 90.51l210.746 210.746h-613.49c-35.346 0-64 28.654-64 64s28.654 64 64 64h613.49l-210.746 210.746c-12.496 12.496-18.744 28.876-18.744 45.254s6.248 32.758 18.744 45.254c24.994 24.994 65.516 24.994 90.51 0z"
575 | ],
576 | "attrs": [],
577 | "isMulticolor": false,
578 | "tags": [
579 | "arrow-right",
580 | "right",
581 | "next"
582 | ],
583 | "grid": 16
584 | },
585 | "attrs": [],
586 | "properties": {
587 | "order": 31,
588 | "prevSize": 32,
589 | "ligatures": "arrow-right2, right4",
590 | "name": "arrow-right2",
591 | "id": 317,
592 | "code": 59667
593 | },
594 | "setIdx": 5,
595 | "setId": 0,
596 | "iconIdx": 316
597 | },
598 | {
599 | "icon": {
600 | "paths": [
601 | "M402.746 877.254l-320-320c-24.994-24.992-24.994-65.516 0-90.51l320-320c24.994-24.992 65.516-24.992 90.51 0 24.994 24.994 24.994 65.516 0 90.51l-210.746 210.746h613.49c35.346 0 64 28.654 64 64s-28.654 64-64 64h-613.49l210.746 210.746c12.496 12.496 18.744 28.876 18.744 45.254s-6.248 32.758-18.744 45.254c-24.994 24.994-65.516 24.994-90.51 0z"
602 | ],
603 | "attrs": [],
604 | "isMulticolor": false,
605 | "tags": [
606 | "arrow-left",
607 | "left",
608 | "previous"
609 | ],
610 | "grid": 16
611 | },
612 | "attrs": [],
613 | "properties": {
614 | "order": 32,
615 | "prevSize": 32,
616 | "ligatures": "arrow-left2, left4",
617 | "name": "arrow-left2",
618 | "id": 321,
619 | "code": 59668
620 | },
621 | "setIdx": 5,
622 | "setId": 0,
623 | "iconIdx": 320
624 | },
625 | {
626 | "icon": {
627 | "paths": [
628 | "M512 0c-282.77 0-512 229.23-512 512s229.23 512 512 512 512-229.23 512-512-229.23-512-512-512zM512 928c-229.75 0-416-186.25-416-416s186.25-416 416-416 416 186.25 416 416-186.25 416-416 416z",
629 | "M354.744 706.744l90.512 90.512 285.254-285.256-285.256-285.254-90.508 90.508 194.744 194.746z"
630 | ],
631 | "attrs": [],
632 | "isMulticolor": false,
633 | "tags": [
634 | "circle-right",
635 | "right",
636 | "circle-next",
637 | "arrow"
638 | ],
639 | "grid": 16
640 | },
641 | "attrs": [],
642 | "properties": {
643 | "order": 29,
644 | "prevSize": 32,
645 | "ligatures": "circle-right, right5",
646 | "name": "circle-right",
647 | "id": 323,
648 | "code": 59669
649 | },
650 | "setIdx": 5,
651 | "setId": 0,
652 | "iconIdx": 322
653 | },
654 | {
655 | "icon": {
656 | "paths": [
657 | "M512 1024c282.77 0 512-229.23 512-512s-229.23-512-512-512-512 229.23-512 512 229.23 512 512 512zM512 96c229.75 0 416 186.25 416 416s-186.25 416-416 416-416-186.25-416-416 186.25-416 416-416z",
658 | "M669.256 317.256l-90.512-90.512-285.254 285.256 285.256 285.254 90.508-90.508-194.744-194.746z"
659 | ],
660 | "attrs": [],
661 | "isMulticolor": false,
662 | "tags": [
663 | "circle-left",
664 | "left",
665 | "circle-previous",
666 | "arrow"
667 | ],
668 | "grid": 16
669 | },
670 | "attrs": [],
671 | "properties": {
672 | "order": 30,
673 | "prevSize": 32,
674 | "ligatures": "circle-left, left5",
675 | "name": "circle-left",
676 | "id": 325,
677 | "code": 59670
678 | },
679 | "setIdx": 5,
680 | "setId": 0,
681 | "iconIdx": 324
682 | },
683 | {
684 | "icon": {
685 | "paths": [
686 | "M896 0h-768c-70.4 0-128 57.6-128 128v768c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128v-768c0-70.4-57.6-128-128-128zM896 896h-768v-768h768v768z"
687 | ],
688 | "attrs": [],
689 | "isMulticolor": false,
690 | "tags": [
691 | "checkbox-unchecked",
692 | "checkbox",
693 | "unchecked",
694 | "square"
695 | ],
696 | "grid": 16
697 | },
698 | "attrs": [],
699 | "properties": {
700 | "order": 33,
701 | "prevSize": 32,
702 | "ligatures": "checkbox-unchecked, checkbox2",
703 | "name": "checkbox-unchecked",
704 | "id": 340,
705 | "code": 59672
706 | },
707 | "setIdx": 5,
708 | "setId": 0,
709 | "iconIdx": 339
710 | },
711 | {
712 | "icon": {
713 | "paths": [
714 | "M256 640c0 0 58.824-192 384-192v192l384-256-384-256v192c-256 0-384 159.672-384 320zM704 768h-576v-384h125.876c10.094-11.918 20.912-23.334 32.488-34.18 43.964-41.19 96.562-72.652 156.114-93.82h-442.478v640h832v-268.624l-128 85.334v55.29z"
715 | ],
716 | "attrs": [],
717 | "isMulticolor": false,
718 | "tags": [
719 | "share",
720 | "out",
721 | "external",
722 | "outside"
723 | ],
724 | "grid": 16
725 | },
726 | "attrs": [],
727 | "properties": {
728 | "order": 20,
729 | "prevSize": 32,
730 | "ligatures": "share, out",
731 | "name": "share",
732 | "id": 382,
733 | "code": 59671
734 | },
735 | "setIdx": 5,
736 | "setId": 0,
737 | "iconIdx": 381
738 | }
739 | ],
740 | "height": 1024,
741 | "metadata": {
742 | "name": "icomoon-video-tagging"
743 | },
744 | "preferences": {
745 | "showGlyphs": true,
746 | "showQuickUse": true,
747 | "showQuickUse2": true,
748 | "showSVGs": true,
749 | "fontPref": {
750 | "prefix": "icon-",
751 | "metadata": {
752 | "fontFamily": "icomoon-video-tagging",
753 | "majorVersion": 1,
754 | "minorVersion": 0
755 | },
756 | "metrics": {
757 | "emSize": 1024,
758 | "baseline": 6.25,
759 | "whitespace": 50
760 | },
761 | "embed": false,
762 | "ie7": true,
763 | "includeMetadata": true,
764 | "showSelector": false,
765 | "showMetrics": false,
766 | "showMetadata": false,
767 | "showVersion": false,
768 | "noie8": false
769 | },
770 | "imagePref": {
771 | "prefix": "icon-",
772 | "png": true,
773 | "useClassSelector": true,
774 | "color": 12237498,
775 | "bgColor": 16777215,
776 | "classSelector": ".icon",
777 | "height": 32,
778 | "columns": 16,
779 | "margin": 16,
780 | "pdf": false
781 | },
782 | "historySize": 100,
783 | "showCodes": false
784 | }
785 | }
--------------------------------------------------------------------------------
/assets/icons/style.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 'icomoon-video-tagging';
3 | src: url('fonts/icomoon-video-tagging.eot?q45xxg');
4 | src: url('fonts/icomoon-video-tagging.eot?q45xxg#iefix') format('embedded-opentype'),
5 | url('fonts/icomoon-video-tagging.ttf?q45xxg') format('truetype'),
6 | url('fonts/icomoon-video-tagging.woff?q45xxg') format('woff'),
7 | url('fonts/icomoon-video-tagging.svg?q45xxg#icomoon-video-tagging') format('svg');
8 | font-weight: normal;
9 | font-style: normal;
10 | }
11 |
12 | [class^="icon-"], [class*=" icon-"] {
13 | /* use !important to prevent issues with browser extensions that change fonts */
14 | font-family: 'icomoon-video-tagging' !important;
15 | speak: none;
16 | font-style: normal;
17 | font-weight: normal;
18 | font-variant: normal;
19 | text-transform: none;
20 | line-height: 1;
21 |
22 | /* Better Font Rendering =========== */
23 | -webkit-font-smoothing: antialiased;
24 | -moz-osx-font-smoothing: grayscale;
25 | }
26 |
27 | .icon-file-picture:before {
28 | content: "\e900";
29 | }
30 | .icon-file-play:before {
31 | content: "\e919";
32 | }
33 | .icon-price-tag:before {
34 | content: "\e901";
35 | }
36 | .icon-price-tags:before {
37 | content: "\e902";
38 | }
39 | .icon-pushpin:before {
40 | content: "\e903";
41 | }
42 | .icon-floppy-disk:before {
43 | content: "\e91a";
44 | }
45 | .icon-cross:before {
46 | content: "\e904";
47 | }
48 | .icon-play3:before {
49 | content: "\e905";
50 | }
51 | .icon-pause2:before {
52 | content: "\e906";
53 | }
54 | .icon-stop2:before {
55 | content: "\e907";
56 | }
57 | .icon-backward2:before {
58 | content: "\e908";
59 | }
60 | .icon-forward3:before {
61 | content: "\e909";
62 | }
63 | .icon-first:before {
64 | content: "\e90a";
65 | }
66 | .icon-last:before {
67 | content: "\e90b";
68 | }
69 | .icon-previous2:before {
70 | content: "\e90c";
71 | }
72 | .icon-next2:before {
73 | content: "\e90d";
74 | }
75 | .icon-eject:before {
76 | content: "\e90e";
77 | }
78 | .icon-volume-medium:before {
79 | content: "\e90f";
80 | }
81 | .icon-volume-mute2:before {
82 | content: "\e910";
83 | }
84 | .icon-arrow-right:before {
85 | content: "\e911";
86 | }
87 | .icon-arrow-left:before {
88 | content: "\e912";
89 | }
90 | .icon-arrow-right2:before {
91 | content: "\e913";
92 | }
93 | .icon-arrow-left2:before {
94 | content: "\e914";
95 | }
96 | .icon-circle-right:before {
97 | content: "\e915";
98 | }
99 | .icon-circle-left:before {
100 | content: "\e916";
101 | }
102 | .icon-checkbox-unchecked:before {
103 | content: "\e918";
104 | }
105 | .icon-share:before {
106 | content: "\e917";
107 | }
108 |
109 |
--------------------------------------------------------------------------------
/assets/images/area.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/area.png
--------------------------------------------------------------------------------
/assets/images/area2shapes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/area2shapes.png
--------------------------------------------------------------------------------
/assets/images/areatagged.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/areatagged.png
--------------------------------------------------------------------------------
/assets/images/chrome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/chrome.png
--------------------------------------------------------------------------------
/assets/images/edge.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/edge.jpg
--------------------------------------------------------------------------------
/assets/images/empty.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/empty.png
--------------------------------------------------------------------------------
/assets/images/emptyframe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/emptyframe.png
--------------------------------------------------------------------------------
/assets/images/ff.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/ff.png
--------------------------------------------------------------------------------
/assets/images/frames1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/frames1.png
--------------------------------------------------------------------------------
/assets/images/frames2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/frames2.png
--------------------------------------------------------------------------------
/assets/images/frames3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/frames3.png
--------------------------------------------------------------------------------
/assets/images/frames4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/frames4.png
--------------------------------------------------------------------------------
/assets/images/loaded.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/loaded.png
--------------------------------------------------------------------------------
/assets/images/lock.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/lock.png
--------------------------------------------------------------------------------
/assets/images/multipoints.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/multipoints.png
--------------------------------------------------------------------------------
/assets/images/nextuntagged.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/nextuntagged.png
--------------------------------------------------------------------------------
/assets/images/playback.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/playback.png
--------------------------------------------------------------------------------
/assets/images/playcontrols.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/playcontrols.png
--------------------------------------------------------------------------------
/assets/images/singlepoint.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/singlepoint.png
--------------------------------------------------------------------------------
/assets/images/taggingcontrols.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/taggingcontrols.png
--------------------------------------------------------------------------------
/assets/images/tags.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/tags.png
--------------------------------------------------------------------------------
/assets/images/time.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/time.png
--------------------------------------------------------------------------------
/assets/images/videocontrols.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/videocontrols.png
--------------------------------------------------------------------------------
/assets/images/volume.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/assets/images/volume.png
--------------------------------------------------------------------------------
/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "video-tagging",
3 | "version": "1.0.3",
4 | "authors": [
5 | "OzGitele",
6 | "aribornstein"
7 | ],
8 | "description": "A conrol for tagging videos.",
9 | "keywords": [
10 | "web-component",
11 | "web-components",
12 | "momemt",
13 | "polymer",
14 | "video",
15 | "tagging"
16 | ],
17 | "main": "video-tagging.html",
18 | "license": "MIT",
19 | "homepage": "https://github.com/CatalystCode/video-tagging.git",
20 | "ignore": [
21 | "/.*",
22 | "node_modules",
23 | "bower_components",
24 | "/test/",
25 | "/demo/"
26 | ],
27 | "dependencies": {
28 | "moment": "~2.10.6",
29 | "polymer": "Polymer/polymer#^1.0.0",
30 | "jquery": "~2.0.3"
31 | },
32 | "devDependencies": {
33 | "iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
34 | "web-component-tester": "*"
35 | },
36 | "resolutions": {
37 | "jquery": "~2.2.0"
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/css/border-anim-h.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/css/border-anim-h.gif
--------------------------------------------------------------------------------
/css/border-anim-v.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/css/border-anim-v.gif
--------------------------------------------------------------------------------
/css/border-h.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/css/border-h.gif
--------------------------------------------------------------------------------
/css/border-v.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/css/border-v.gif
--------------------------------------------------------------------------------
/css/imgareaselect-animated.css:
--------------------------------------------------------------------------------
1 | /*
2 | * imgAreaSelect animated border style
3 | */
4 |
5 | .imgareaselect-border1 {
6 | background: url(border-anim-v.gif) repeat-y left top;
7 | }
8 |
9 | .imgareaselect-border2 {
10 | background: url(border-anim-h.gif) repeat-x left top;
11 | }
12 |
13 | .imgareaselect-border3 {
14 | background: url(border-anim-v.gif) repeat-y right top;
15 | }
16 |
17 | .imgareaselect-border4 {
18 | background: url(border-anim-h.gif) repeat-x left bottom;
19 | }
20 |
21 | .imgareaselect-border1, .imgareaselect-border2,
22 | .imgareaselect-border3, .imgareaselect-border4 {
23 | filter: alpha(opacity=50);
24 | opacity: 0.5;
25 | }
26 |
27 | .imgareaselect-handle {
28 | background-color: #fff;
29 | border: solid 1px #000;
30 | filter: alpha(opacity=50);
31 | opacity: 0.5;
32 | }
33 |
34 | .imgareaselect-outer {
35 | background-color: #000;
36 | filter: alpha(opacity=50);
37 | opacity: 0.5;
38 | }
39 |
40 | .imgareaselect-selection {
41 | }
--------------------------------------------------------------------------------
/css/sliders.css:
--------------------------------------------------------------------------------
1 |
2 |
3 | /*sliders*/
4 | input[type='range']:focus {
5 | outline: none;
6 | }
7 |
8 | /*Video slider*/
9 | /*Webkit*/
10 | .seek {
11 | display: block;
12 | width:93%;
13 | padding-left: 25px;
14 | padding-right: 25px;
15 | padding-top: 10px;
16 | border-radius: .25em;
17 | background-color: transparent;
18 | }
19 |
20 | .seek,
21 | .seek::-webkit-slider-runnable-track,
22 | .seek::-webkit-slider-thumb,
23 | .volume,
24 | .volume::-webkit-slider-runnable-track,
25 | .volume::-webkit-slider-thumb {
26 | -webkit-appearance: none;
27 | }
28 |
29 | .seek::-webkit-slider-runnable-track,
30 | .volume::-webkit-slider-runnable-track {
31 | background: linear-gradient(#C00000, #C00000) no-repeat rgb(89,89,89);
32 | height: 3px;
33 | }
34 |
35 | .seek::-webkit-slider-thumb,
36 | .volume::-webkit-slider-thumb{
37 |
38 | margin-top: -0.125em;
39 | width: 0.6em;
40 | height: 0.6em;
41 | border-radius: 50%;
42 | box-shadow: 0 0 0.125em #333;
43 | background: #fff;
44 | }
45 |
46 | /*Volume slider*/
47 | .volume {
48 | display: inline-block;
49 | border-radius: .25em;
50 | background: transparent;
51 | width: 70%;
52 | padding-right: 25px;
53 | }
54 |
55 | .seek::-webkit-slider-runnable-track {
56 | background-size: 0% 100%;
57 | }
58 |
59 | .volume::-webkit-slider-runnable-track {
60 | background-size: 50% 100%;
61 | }
62 |
63 |
64 |
65 | /*MS*/
66 | .seek::-ms-track {
67 | background: linear-gradient(rgb(89,89,89), rgb(89,89,89)) no-repeat #C00000;
68 | height: 3px;
69 | }
70 | .seek::-ms-fill-lower {
71 | border-radius: 0.25em;
72 | background: #C00000;
73 | height: 3px;
74 | }
75 | .seek::-ms-fill-upper {
76 | border-radius: 0.25em;
77 | background: rgb(89,89,89);
78 | height: 3px;
79 | }
80 |
81 | .seek::--ms-track {
82 | background-size: 0% 100%;
83 | }
84 |
85 | .volume::-ms-track {
86 | background: linear-gradient(#595959, #595959) no-repeat rgb(89,89,89);
87 | height: 3px;
88 | color: transparent;
89 | }
90 | .volume::-ms-fill-lower {
91 | border-radius: 0.25em;
92 | background: #C00000;
93 | height: 3px;
94 | }
95 |
96 | .volume::-ms-thumb {
97 | border: none;
98 | width: 0.6em;
99 | height: 0.6em;
100 | border-radius: 50%;
101 | display: block;
102 | background: #FFFFFF;
103 | }
104 |
105 | input[type='range']::-ms-tooltip {
106 | display: block;
107 | }
108 |
109 |
110 | /*Mozilla*/
111 |
112 | .seek::--moz-range-track,
113 | .seek::-moz-range-thumb {
114 | -webkit-appearance: none;
115 | }
116 |
117 | .seek::-moz-range-thumb,
118 | .volume::-moz-range-thumb {
119 | margin-top: -0.125em;
120 | border: none;
121 | width: 0.6em;
122 | height: 0.6em;
123 | border-radius: 50%;
124 | box-shadow: 0 0 0.125em #333;
125 | background: #fff;
126 | }
127 |
128 | .seek::-moz-range-track,
129 | .volume::-moz-range-track{
130 | background: linear-gradient(#C00000, #C00000) no-repeat rgb(89,89,89);
131 | height: 3px;
132 | }
133 |
134 | .seek::-moz-range-track {
135 | background-size: 0% 100%;
136 | }
137 |
138 | .volume::-moz-range-track {
139 | background-size: 50% 100%;
140 | }
141 |
142 |
143 |
144 | /*webkit and moz - show seek bar button on hover or click*/
145 | .seek::-webkit-slider-thumb {
146 | background: transparent;
147 | }
148 |
149 | .seek::-moz-range-thumb {
150 | background: transparent;
151 | }
152 |
153 | .seek::-webkit-slider-thumb:active,
154 | .seek::-webkit-slider-thumb:hover {
155 | background: #FFFFFF ;
156 | }
157 |
158 | .seek::-moz-range-thumb:active,
159 | .seek::-moz-range-thumb:hover {
160 | background: #FFFFFF ;
161 | }
162 |
163 | .seek::-ms-thumb {
164 | border: none;
165 | width: 0.6em;
166 | height: 0.6em;
167 | border-radius: 50%;
168 | display: block;
169 | background: #FFFFFF;
170 | }
171 |
172 |
--------------------------------------------------------------------------------
/demo/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "VideoTaggingDemo",
3 | "version": "0.0.0",
4 | "license": "MIT",
5 | "private": true,
6 | "ignore": [
7 | "**/.*",
8 | "node_modules",
9 | "bower_components",
10 | "test",
11 | "tests"
12 | ],
13 | "dependencies": {
14 | "angular": "~1.3.14",
15 | "angular-route": "~1.3.14",
16 | "angular-sanitize": "~1.3.15",
17 | "webcomponentsjs": "~0.7.20",
18 | "polymer": "~1.2.3",
19 | "moment": "~2.10.6",
20 | "bootstrap": "~3.3.6",
21 | "jquery": "~2.1.4",
22 | "underscore": "~1.8.3",
23 | "bootstrap-tokenfield": "~0.12.1",
24 | "jquery-ui": "~1.11.4",
25 | "video-tagging": "~1.0.3"
26 | },
27 | "resolutions": {
28 | "bootstrap": "~3.3.6",
29 | "jquery": "~2.1.4"
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/demo/index.html:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | Video Tagging
12 |
13 |
14 |
15 |
16 |
17 |
Video-tagging Demo
18 |
19 | Select tagging job:
20 | video-tagging using square markers
21 | video-tagging using point markers
22 | video-tagging using rectangle markers
23 | image-tagging using rectangle markers
24 |
25 |
26 |
27 |
32 |
33 |
120 |
121 |
122 |
--------------------------------------------------------------------------------
/demo/mov1.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/demo/mov1.mp4
--------------------------------------------------------------------------------
/demo/mov2.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/demo/mov2.mp4
--------------------------------------------------------------------------------
/demo/test_images/1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/demo/test_images/1.jpg
--------------------------------------------------------------------------------
/demo/test_images/2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/demo/test_images/2.jpg
--------------------------------------------------------------------------------
/demo/test_images/3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/demo/test_images/3.jpg
--------------------------------------------------------------------------------
/demo/test_images/4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CatalystCode/video-tagging/196d218330c91da310c943e8faf40ee70662fd4b/demo/test_images/4.jpg
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
25 | sss
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/js/jquery.imgareaselect.js:
--------------------------------------------------------------------------------
1 | /*
2 | * imgAreaSelect jQuery plugin
3 | * version 0.9.10
4 | *
5 | * Copyright (c) 2008-2013 Michal Wojciechowski (odyniec.net)
6 | *
7 | * Dual licensed under the MIT (MIT-LICENSE.txt)
8 | * and GPL (GPL-LICENSE.txt) licenses.
9 | *
10 | * http://odyniec.net/projects/imgareaselect/
11 | *
12 | * Modified by Ari Bornstein to add support for non fixAspectRatio scenarios
13 | *
14 | */
15 |
16 | (function($) {
17 |
18 | var abs = Math.abs,
19 | max = Math.max,
20 | min = Math.min,
21 | round = Math.round;
22 |
23 | function div() {
24 | return $('
');
25 | }
26 |
27 | $.imgAreaSelect = function (img, options) {
28 | var
29 |
30 | $img = $(img),
31 |
32 | imgLoaded,
33 |
34 | $box = div(),
35 | $area = div(),
36 | $border = div().add(div()).add(div()).add(div()),
37 | $outer = div().add(div()).add(div()).add(div()),
38 | $handles = $([]),
39 |
40 | $areaOpera,
41 |
42 | left, top,
43 |
44 | imgOfs = { left: 0, top: 0 },
45 |
46 | imgWidth, imgHeight,
47 |
48 | $parent,
49 |
50 | parOfs = { left: 0, top: 0 },
51 |
52 | zIndex = 0,
53 |
54 | position = 'absolute',
55 |
56 | startX, startY,
57 |
58 | scaleX, scaleY,
59 |
60 | resize,
61 |
62 | minWidth, minHeight, maxWidth, maxHeight,
63 |
64 | aspectRatio,
65 |
66 | shown,
67 |
68 | x1, y1, x2, y2,
69 |
70 | selection = { x1: 0, y1: 0, x2: 0, y2: 0, width: 0, height: 0 },
71 |
72 | docElem = document.documentElement,
73 |
74 | ua = navigator.userAgent,
75 |
76 | $p, d, i, o, w, h, adjusted;
77 |
78 | function viewX(x) {
79 | return x + imgOfs.left - parOfs.left;
80 | }
81 |
82 | function viewY(y) {
83 | return y + imgOfs.top - parOfs.top;
84 | }
85 |
86 | function selX(x) {
87 | return x - imgOfs.left + parOfs.left;
88 | }
89 |
90 | function selY(y) {
91 | return y - imgOfs.top + parOfs.top;
92 | }
93 |
94 | function evX(event) {
95 | return event.pageX - parOfs.left;
96 | }
97 |
98 | function evY(event) {
99 | return event.pageY - parOfs.top;
100 | }
101 |
102 | function getSelection(noScale) {
103 | var sx = noScale || scaleX, sy = noScale || scaleY;
104 |
105 | return { x1: round(selection.x1 * sx),
106 | y1: round(selection.y1 * sy),
107 | x2: round(selection.x2 * sx),
108 | y2: round(selection.y2 * sy),
109 | width: round(selection.x2 * sx) - round(selection.x1 * sx),
110 | height: round(selection.y2 * sy) - round(selection.y1 * sy) };
111 | }
112 |
113 | function setSelection(x1, y1, x2, y2, noScale) {
114 | var sx = noScale || scaleX, sy = noScale || scaleY;
115 |
116 | selection = {
117 | x1: round(x1 / sx || 0),
118 | y1: round(y1 / sy || 0),
119 | x2: round(x2 / sx || 0),
120 | y2: round(y2 / sy || 0)
121 | };
122 |
123 | selection.width = selection.x2 - selection.x1;
124 | selection.height = selection.y2 - selection.y1;
125 | }
126 |
127 | function adjust() {
128 | if (!imgLoaded || !$img.width())
129 | return;
130 |
131 | imgOfs = { left: round($img.offset().left), top: round($img.offset().top) };
132 |
133 | imgWidth = $img.innerWidth();
134 | imgHeight = $img.innerHeight();
135 |
136 | imgOfs.top += ($img.outerHeight() - imgHeight) >> 1;
137 | imgOfs.left += ($img.outerWidth() - imgWidth) >> 1;
138 |
139 | minWidth = round(options.minWidth / scaleX) || 0;
140 | minHeight = round(options.minHeight / scaleY) || 0;
141 | maxWidth = round(min(options.maxWidth / scaleX || 1<<24, imgWidth));
142 | maxHeight = round(min(options.maxHeight / scaleY || 1<<24, imgHeight));
143 |
144 | if ($().jquery == '1.3.2' && position == 'fixed' &&
145 | !docElem['getBoundingClientRect'])
146 | {
147 | imgOfs.top += max(document.body.scrollTop, docElem.scrollTop);
148 | imgOfs.left += max(document.body.scrollLeft, docElem.scrollLeft);
149 | }
150 |
151 | parOfs = /absolute|relative/.test($parent.css('position')) ?
152 | { left: round($parent.offset().left) - $parent.scrollLeft(),
153 | top: round($parent.offset().top) - $parent.scrollTop() } :
154 | position == 'fixed' ?
155 | { left: $(document).scrollLeft(), top: $(document).scrollTop() } :
156 | { left: 0, top: 0 };
157 |
158 | left = viewX(0);
159 | top = viewY(0);
160 |
161 | if (selection.x2 > imgWidth || selection.y2 > imgHeight)
162 | doResize();
163 | }
164 |
165 | function update(resetKeyPress) {
166 | if (!shown) return;
167 |
168 | $box.css({ left: viewX(selection.x1), top: viewY(selection.y1) })
169 | .add($area).width(w = selection.width).height(h = selection.height);
170 |
171 | $area.add($border).add($handles).css({ left: 0, top: 0 });
172 |
173 | $border
174 | .width(max(w - $border.outerWidth() + $border.innerWidth(), 0))
175 | .height(max(h - $border.outerHeight() + $border.innerHeight(), 0));
176 |
177 | $($outer[0]).css({ left: left, top: top,
178 | width: selection.x1, height: imgHeight });
179 | $($outer[1]).css({ left: left + selection.x1, top: top,
180 | width: w, height: selection.y1 });
181 | $($outer[2]).css({ left: left + selection.x2, top: top,
182 | width: imgWidth - selection.x2, height: imgHeight });
183 | $($outer[3]).css({ left: left + selection.x1, top: top + selection.y2,
184 | width: w, height: imgHeight - selection.y2 });
185 |
186 | w -= $handles.outerWidth();
187 | h -= $handles.outerHeight();
188 |
189 | switch ($handles.length) {
190 | case 8:
191 | $($handles[4]).css({ left: w >> 1 });
192 | $($handles[5]).css({ left: w, top: h >> 1 });
193 | $($handles[6]).css({ left: w >> 1, top: h });
194 | $($handles[7]).css({ top: h >> 1 });
195 | case 4:
196 | $handles.slice(1,3).css({ left: w });
197 | $handles.slice(2,4).css({ top: h });
198 | }
199 |
200 | if (resetKeyPress !== false) {
201 | if ($.imgAreaSelect.onKeyPress != docKeyPress)
202 | $(document).unbind($.imgAreaSelect.keyPress,
203 | $.imgAreaSelect.onKeyPress);
204 |
205 | if (options.keys)
206 | $(document)[$.imgAreaSelect.keyPress](
207 | $.imgAreaSelect.onKeyPress = docKeyPress);
208 | }
209 |
210 | if (msie && $border.outerWidth() - $border.innerWidth() == 2) {
211 | $border.css('margin', 0);
212 | setTimeout(function () { $border.css('margin', 'auto'); }, 0);
213 | }
214 | }
215 |
216 | function doUpdate(resetKeyPress) {
217 | adjust();
218 | update(resetKeyPress);
219 | x1 = viewX(selection.x1); y1 = viewY(selection.y1);
220 | x2 = viewX(selection.x2); y2 = viewY(selection.y2);
221 | }
222 |
223 | function hide($elem, fn) {
224 | options.fadeSpeed ? $elem.fadeOut(options.fadeSpeed, fn) : $elem.hide();
225 |
226 | }
227 |
228 | function areaMouseMove(event) {
229 | var x = selX(evX(event)) - selection.x1,
230 | y = selY(evY(event)) - selection.y1;
231 |
232 | if (!adjusted) {
233 | adjust();
234 | adjusted = true;
235 |
236 | $box.one('mouseout', function () { adjusted = false; });
237 | }
238 |
239 | resize = '';
240 |
241 | if (options.resizable) {
242 | if (y <= options.resizeMargin)
243 | resize = 'n';
244 | else if (y >= selection.height - options.resizeMargin)
245 | resize = 's';
246 | if (x <= options.resizeMargin)
247 | resize += 'w';
248 | else if (x >= selection.width - options.resizeMargin)
249 | resize += 'e';
250 | }
251 |
252 | $box.css('cursor', resize ? resize + '-resize' :
253 | options.movable ? 'move' : '');
254 | if ($areaOpera)
255 | $areaOpera.toggle();
256 | }
257 |
258 | function docMouseUp(event) {
259 | $('body').css('cursor', '');
260 | if (options.autoHide || selection.width * selection.height == 0)
261 | hide($box.add($outer), function () { $(this).hide(); });
262 |
263 | $(document).unbind('mousemove', selectingMouseMove);
264 | $box.mousemove(areaMouseMove);
265 |
266 | options.onSelectEnd(img, getSelection());
267 | }
268 |
269 | function areaMouseDown(event) {
270 | if (event.which != 1) return false;
271 |
272 | adjust();
273 |
274 | if (resize) {
275 | $('body').css('cursor', resize + '-resize');
276 |
277 | x1 = viewX(selection[/w/.test(resize) ? 'x2' : 'x1']);
278 | y1 = viewY(selection[/n/.test(resize) ? 'y2' : 'y1']);
279 |
280 | $(document).mousemove(selectingMouseMove)
281 | .one('mouseup', docMouseUp);
282 | $box.unbind('mousemove', areaMouseMove);
283 | }
284 | else if (options.movable) {
285 | startX = left + selection.x1 - evX(event);
286 | startY = top + selection.y1 - evY(event);
287 |
288 | $box.unbind('mousemove', areaMouseMove);
289 |
290 | $(document).mousemove(movingMouseMove)
291 | .one('mouseup', function () {
292 | options.onSelectEnd(img, getSelection());
293 |
294 | $(document).unbind('mousemove', movingMouseMove);
295 | $box.mousemove(areaMouseMove);
296 | });
297 | }
298 | else
299 | $img.mousedown(event);
300 |
301 | return false;
302 | }
303 |
304 | function fixAspectRatio(xFirst) {
305 | if (aspectRatio)
306 | if (xFirst) {
307 | x2 = max(left, min(left + imgWidth,
308 | x1 + abs(y2 - y1) * aspectRatio * (x2 > x1 || -1)));
309 |
310 | y2 = round(max(top, min(top + imgHeight,
311 | y1 + abs(x2 - x1) / aspectRatio * (y2 > y1 || -1))));
312 | x2 = round(x2);
313 | }
314 | else {
315 | y2 = max(top, min(top + imgHeight,
316 | y1 + abs(x2 - x1) / aspectRatio * (y2 > y1 || -1)));
317 | x2 = round(max(left, min(left + imgWidth,
318 | x1 + abs(y2 - y1) * aspectRatio * (x2 > x1 || -1))));
319 | y2 = round(y2);
320 | }
321 | }
322 |
323 | function doResize() {
324 | x1 = min(x1, left + imgWidth);
325 | y1 = min(y1, top + imgHeight);
326 |
327 | if (abs(x2 - x1) < minWidth) {
328 | x2 = x1 - minWidth * (x2 < x1 || -1);
329 |
330 | if (x2 < left)
331 | x1 = left + minWidth;
332 | else if (x2 > left + imgWidth)
333 | x1 = left + imgWidth - minWidth;
334 | }
335 |
336 | if (abs(y2 - y1) < minHeight) {
337 | y2 = y1 - minHeight * (y2 < y1 || -1);
338 |
339 | if (y2 < top)
340 | y1 = top + minHeight;
341 | else if (y2 > top + imgHeight)
342 | y1 = top + imgHeight - minHeight;
343 | }
344 |
345 | x2 = max(left, min(x2, left + imgWidth));
346 | y2 = max(top, min(y2, top + imgHeight));
347 |
348 | if (options.square)
349 | {
350 | fixAspectRatio(abs(x2 - x1) < abs(y2 - y1) * aspectRatio);
351 |
352 | if (abs(x2 - x1) > maxWidth) {
353 | x2 = x1 - maxWidth * (x2 < x1 || -1);
354 | fixAspectRatio();
355 | }
356 |
357 | if (abs(y2 - y1) > maxHeight) {
358 | y2 = y1 - maxHeight * (y2 < y1 || -1);
359 | fixAspectRatio(true);
360 | }
361 | }
362 |
363 | selection = { x1: selX(min(x1, x2)), x2: selX(max(x1, x2)),
364 | y1: selY(min(y1, y2)), y2: selY(max(y1, y2)),
365 | width: abs(x2 - x1), height: abs(y2 - y1) };
366 |
367 | update();
368 |
369 | options.onSelectChange(img, getSelection());
370 | }
371 |
372 | function selectingMouseMove(event) {
373 | x2 = /w|e|^$/.test(resize) || aspectRatio ? evX(event) : viewX(selection.x2);
374 | y2 = /n|s|^$/.test(resize) || aspectRatio ? evY(event) : viewY(selection.y2);
375 |
376 | doResize();
377 |
378 | return false;
379 |
380 | }
381 |
382 | function doMove(newX1, newY1) {
383 | x2 = (x1 = newX1) + selection.width;
384 | y2 = (y1 = newY1) + selection.height;
385 |
386 | $.extend(selection, { x1: selX(x1), y1: selY(y1), x2: selX(x2),
387 | y2: selY(y2) });
388 |
389 | update();
390 |
391 | options.onSelectChange(img, getSelection());
392 | }
393 |
394 | function movingMouseMove(event) {
395 | x1 = max(left, min(startX + evX(event), left + imgWidth - selection.width));
396 | y1 = max(top, min(startY + evY(event), top + imgHeight - selection.height));
397 |
398 | doMove(x1, y1);
399 |
400 | event.preventDefault();
401 |
402 | return false;
403 | }
404 |
405 | function startSelection() {
406 | $(document).unbind('mousemove', startSelection);
407 | adjust();
408 |
409 | x2 = x1;
410 | y2 = y1;
411 |
412 | doResize();
413 |
414 | resize = '';
415 |
416 | if (!$outer.is(':visible'))
417 | $box.add($outer).hide().fadeIn(options.fadeSpeed||0);
418 |
419 | shown = true;
420 |
421 | $(document).unbind('mouseup', cancelSelection)
422 | .mousemove(selectingMouseMove).one('mouseup', docMouseUp);
423 | $box.unbind('mousemove', areaMouseMove);
424 |
425 | options.onSelectStart(img, getSelection());
426 | }
427 |
428 | function cancelSelection() {
429 | $(document).unbind('mousemove', startSelection)
430 | .unbind('mouseup', cancelSelection);
431 | hide($box.add($outer));
432 |
433 | setSelection(selX(x1), selY(y1), selX(x1), selY(y1));
434 |
435 | if (!(this instanceof $.imgAreaSelect)) {
436 | options.onSelectChange(img, getSelection());
437 | options.onSelectEnd(img, getSelection());
438 | }
439 | }
440 |
441 | function imgMouseDown(event) {
442 | if (event.which != 1 || $outer.is(':animated')) return false;
443 |
444 | adjust();
445 | startX = x1 = evX(event);
446 | startY = y1 = evY(event);
447 |
448 | $(document).mousemove(startSelection).mouseup(cancelSelection);
449 |
450 | return false;
451 | }
452 |
453 | function windowResize() {
454 | doUpdate(false);
455 | }
456 |
457 | function imgLoad() {
458 | imgLoaded = true;
459 |
460 | setOptions(options = $.extend({
461 | classPrefix: 'imgareaselect',
462 | movable: true,
463 | parent: 'body',
464 | resizable: true,
465 | resizeMargin: 10,
466 | onInit: function () {},
467 | onSelectStart: function () {},
468 | onSelectChange: function () {},
469 | onSelectEnd: function () {}
470 | }, options));
471 |
472 | $box.add($outer).css({ visibility: '' });
473 |
474 | if (options.show) {
475 | shown = true;
476 | adjust();
477 | update();
478 | $box.add($outer).hide().fadeIn(options.fadeSpeed||0);
479 | }
480 |
481 | setTimeout(function () { options.onInit(img, getSelection()); }, 0);
482 | }
483 |
484 | var docKeyPress = function(event) {
485 | var k = options.keys, d, t, key = event.keyCode;
486 |
487 | d = !isNaN(k.alt) && (event.altKey || event.originalEvent.altKey) ? k.alt :
488 | !isNaN(k.ctrl) && event.ctrlKey ? k.ctrl :
489 | !isNaN(k.shift) && event.shiftKey ? k.shift :
490 | !isNaN(k.arrows) ? k.arrows : 10;
491 |
492 | if (k.arrows == 'resize' || (k.shift == 'resize' && event.shiftKey) ||
493 | (k.ctrl == 'resize' && event.ctrlKey) ||
494 | (k.alt == 'resize' && (event.altKey || event.originalEvent.altKey)))
495 | {
496 | switch (key) {
497 | case 37:
498 | d = -d;
499 | case 39:
500 | t = max(x1, x2);
501 | x1 = min(x1, x2);
502 | x2 = max(t + d, x1);
503 | if (options.square) fixAspectRatio();
504 | break;
505 | case 38:
506 | d = -d;
507 | case 40:
508 | t = max(y1, y2);
509 | y1 = min(y1, y2);
510 | y2 = max(t + d, y1);
511 | if (options.square) fixAspectRatio(true);
512 | break;
513 | default:
514 | return;
515 | }
516 |
517 | doResize();
518 | }
519 | else {
520 | x1 = min(x1, x2);
521 | y1 = min(y1, y2);
522 |
523 | switch (key) {
524 | case 37:
525 | doMove(max(x1 - d, left), y1);
526 | break;
527 | case 38:
528 | doMove(x1, max(y1 - d, top));
529 | break;
530 | case 39:
531 | doMove(x1 + min(d, imgWidth - selX(x2)), y1);
532 | break;
533 | case 40:
534 | doMove(x1, y1 + min(d, imgHeight - selY(y2)));
535 | break;
536 | default:
537 | return;
538 | }
539 | }
540 |
541 | return false;
542 | };
543 |
544 | function styleOptions($elem, props) {
545 | for (var option in props)
546 | if (options[option] !== undefined)
547 | $elem.css(props[option], options[option]);
548 | }
549 |
550 | function setOptions(newOptions) {
551 | if (newOptions.parent)
552 | ($parent = $(newOptions.parent)).append($box.add($outer));
553 |
554 | $.extend(options, newOptions);
555 |
556 | adjust();
557 |
558 | if (newOptions.handles != null) {
559 | $handles.remove();
560 | $handles = $([]);
561 |
562 | i = newOptions.handles ? newOptions.handles == 'corners' ? 4 : 8 : 0;
563 |
564 | while (i--)
565 | $handles = $handles.add(div());
566 |
567 | $handles.addClass(options.classPrefix + '-handle').css({
568 | position: 'absolute',
569 | fontSize: 0,
570 | zIndex: zIndex + 1 || 1
571 | });
572 |
573 | if (!parseInt($handles.css('width')) >= 0)
574 | $handles.width(5).height(5);
575 |
576 | if (o = options.borderWidth)
577 | $handles.css({ borderWidth: o, borderStyle: 'solid' });
578 |
579 | styleOptions($handles, { borderColor1: 'border-color',
580 | borderColor2: 'background-color',
581 | borderOpacity: 'opacity' });
582 | }
583 |
584 | scaleX = options.imageWidth / imgWidth || 1;
585 | scaleY = options.imageHeight / imgHeight || 1;
586 |
587 | if (newOptions.x1 != null) {
588 | setSelection(newOptions.x1, newOptions.y1, newOptions.x2,
589 | newOptions.y2);
590 | newOptions.show = !newOptions.hide;
591 | }
592 |
593 | if (newOptions.keys)
594 | options.keys = $.extend({ shift: 1, ctrl: 'resize' },
595 | newOptions.keys);
596 |
597 | $outer.addClass(options.classPrefix + '-outer');
598 | $area.addClass(options.classPrefix + '-selection');
599 | for (i = 0; i++ < 4;)
600 | $($border[i-1]).addClass(options.classPrefix + '-border' + i);
601 |
602 | styleOptions($area, { selectionColor: 'background-color',
603 | selectionOpacity: 'opacity' });
604 | styleOptions($border, { borderOpacity: 'opacity',
605 | borderWidth: 'border-width' });
606 | styleOptions($outer, { outerColor: 'background-color',
607 | outerOpacity: 'opacity' });
608 | if (o = options.borderColor1)
609 | $($border[0]).css({ borderStyle: 'solid', borderColor: o });
610 | if (o = options.borderColor2)
611 | $($border[1]).css({ borderStyle: 'dashed', borderColor: o });
612 |
613 | $box.append($area.add($border).add($areaOpera)).append($handles);
614 |
615 | if (msie) {
616 | if (o = ($outer.css('filter')||'').match(/opacity=(\d+)/))
617 | $outer.css('opacity', o[1]/100);
618 | if (o = ($border.css('filter')||'').match(/opacity=(\d+)/))
619 | $border.css('opacity', o[1]/100);
620 | }
621 |
622 | if (newOptions.hide)
623 | hide($box.add($outer));
624 | else if (newOptions.show && imgLoaded) {
625 | shown = true;
626 | $box.add($outer).fadeIn(options.fadeSpeed||0);
627 | doUpdate();
628 | }
629 |
630 | aspectRatio = (d = (options.aspectRatio || '').split(/:/))[0] / d[1];
631 |
632 | $img.add($outer).unbind('mousedown', imgMouseDown);
633 |
634 | if (options.disable || options.enable === false) {
635 | $box.unbind('mousemove', areaMouseMove).unbind('mousedown', areaMouseDown);
636 | $(window).unbind('resize', windowResize);
637 | }
638 | else {
639 | if (options.enable || options.disable === false) {
640 | if (options.resizable || options.movable)
641 | $box.mousemove(areaMouseMove).mousedown(areaMouseDown);
642 |
643 | $(window).resize(windowResize);
644 | }
645 |
646 | if (!options.persistent)
647 | $img.add($outer).mousedown(imgMouseDown);
648 | }
649 |
650 | options.enable = options.disable = undefined;
651 | }
652 |
653 | this.remove = function () {
654 | setOptions({ disable: true });
655 | $box.add($outer).remove();
656 | };
657 |
658 | this.getOptions = function () { return options; };
659 |
660 | this.setOptions = setOptions;
661 |
662 | this.getSelection = getSelection;
663 |
664 | this.setSelection = setSelection;
665 |
666 | this.cancelSelection = cancelSelection;
667 |
668 | this.update = doUpdate;
669 |
670 | var msie = (/msie ([\w.]+)/i.exec(ua)||[])[1],
671 | opera = /opera/i.test(ua),
672 | safari = /webkit/i.test(ua) && !/chrome/i.test(ua);
673 |
674 | $p = $img;
675 |
676 | while ($p.length) {
677 | zIndex = max(zIndex,
678 | !isNaN($p.css('z-index')) ? $p.css('z-index') : zIndex);
679 | if ($p.css('position') == 'fixed')
680 | position = 'fixed';
681 |
682 | $p = $p.parent(':not(body)');
683 | }
684 |
685 | zIndex = options.zIndex || zIndex;
686 |
687 | if (msie)
688 | $img.attr('unselectable', 'on');
689 |
690 | $.imgAreaSelect.keyPress = msie || safari ? 'keydown' : 'keypress';
691 |
692 | if (opera)
693 |
694 | $areaOpera = div().css({ width: '100%', height: '100%',
695 | position: 'absolute', zIndex: zIndex + 2 || 2 });
696 |
697 | $box.add($outer).css({ visibility: 'hidden', position: position,
698 | overflow: 'hidden', zIndex: zIndex || '0' });
699 | $box.css({ zIndex: zIndex + 2 || 2 });
700 | $area.add($border).css({ position: 'absolute', fontSize: 0 });
701 |
702 | img.complete || img.readyState == 'complete' || !$img.is('img') ?
703 | imgLoad() : $img.one('load', imgLoad);
704 |
705 | if (!imgLoaded && msie && msie >= 7)
706 | img.src = img.src;
707 | };
708 |
709 | $.fn.imgAreaSelect = function (options) {
710 | options = options || {};
711 |
712 | this.each(function () {
713 | if ($(this).data('imgAreaSelect')) {
714 | if (options.remove) {
715 | $(this).data('imgAreaSelect').remove();
716 | $(this).removeData('imgAreaSelect');
717 | }
718 | else
719 | $(this).data('imgAreaSelect').setOptions(options);
720 | }
721 | else if (!options.remove) {
722 | if (options.enable === undefined && options.disable === undefined)
723 | options.enable = true;
724 |
725 | $(this).data('imgAreaSelect', new $.imgAreaSelect(this, options));
726 | }
727 | });
728 |
729 | if (options.instance)
730 | return $(this).data('imgAreaSelect');
731 |
732 | return this;
733 | };
734 |
735 | })(jQuery);
736 |
--------------------------------------------------------------------------------
/js/jquery.imgareaselect.min.js:
--------------------------------------------------------------------------------
1 | (function($){var abs=Math.abs,max=Math.max,min=Math.min,round=Math.round;function div(){return $('
')}$.imgAreaSelect=function(img,options){var $img=$(img),imgLoaded,$box=div(),$area=div(),$border=div().add(div()).add(div()).add(div()),$outer=div().add(div()).add(div()).add(div()),$handles=$([]),$areaOpera,left,top,imgOfs={left:0,top:0},imgWidth,imgHeight,$parent,parOfs={left:0,top:0},zIndex=0,position='absolute',startX,startY,scaleX,scaleY,resize,minWidth,minHeight,maxWidth,maxHeight,aspectRatio,shown,x1,y1,x2,y2,selection={x1:0,y1:0,x2:0,y2:0,width:0,height:0},docElem=document.documentElement,ua=navigator.userAgent,$p,d,i,o,w,h,adjusted;function viewX(x){return x+imgOfs.left-parOfs.left}function viewY(y){return y+imgOfs.top-parOfs.top}function selX(x){return x-imgOfs.left+parOfs.left}function selY(y){return y-imgOfs.top+parOfs.top}function evX(event){return event.pageX-parOfs.left}function evY(event){return event.pageY-parOfs.top}function getSelection(noScale){var sx=noScale||scaleX,sy=noScale||scaleY;return{x1:round(selection.x1*sx),y1:round(selection.y1*sy),x2:round(selection.x2*sx),y2:round(selection.y2*sy),width:round(selection.x2*sx)-round(selection.x1*sx),height:round(selection.y2*sy)-round(selection.y1*sy)}}function setSelection(x1,y1,x2,y2,noScale){var sx=noScale||scaleX,sy=noScale||scaleY;selection={x1:round(x1/sx||0),y1:round(y1/sy||0),x2:round(x2/sx||0),y2:round(y2/sy||0)};selection.width=selection.x2-selection.x1;selection.height=selection.y2-selection.y1}function adjust(){if(!imgLoaded||!$img.width())return;imgOfs={left:round($img.offset().left),top:round($img.offset().top)};imgWidth=$img.innerWidth();imgHeight=$img.innerHeight();imgOfs.top+=($img.outerHeight()-imgHeight)>>1;imgOfs.left+=($img.outerWidth()-imgWidth)>>1;minWidth=round(options.minWidth/scaleX)||0;minHeight=round(options.minHeight/scaleY)||0;maxWidth=round(min(options.maxWidth/scaleX||1<<24,imgWidth));maxHeight=round(min(options.maxHeight/scaleY||1<<24,imgHeight));if($().jquery=='1.3.2'&&position=='fixed'&&!docElem['getBoundingClientRect']){imgOfs.top+=max(document.body.scrollTop,docElem.scrollTop);imgOfs.left+=max(document.body.scrollLeft,docElem.scrollLeft)}parOfs=/absolute|relative/.test($parent.css('position'))?{left:round($parent.offset().left)-$parent.scrollLeft(),top:round($parent.offset().top)-$parent.scrollTop()}:position=='fixed'?{left:$(document).scrollLeft(),top:$(document).scrollTop()}:{left:0,top:0};left=viewX(0);top=viewY(0);if(selection.x2>imgWidth||selection.y2>imgHeight)doResize()}function update(resetKeyPress){if(!shown)return;$box.css({left:viewX(selection.x1),top:viewY(selection.y1)}).add($area).width(w=selection.width).height(h=selection.height);$area.add($border).add($handles).css({left:0,top:0});$border.width(max(w-$border.outerWidth()+$border.innerWidth(),0)).height(max(h-$border.outerHeight()+$border.innerHeight(),0));$($outer[0]).css({left:left,top:top,width:selection.x1,height:imgHeight});$($outer[1]).css({left:left+selection.x1,top:top,width:w,height:selection.y1});$($outer[2]).css({left:left+selection.x2,top:top,width:imgWidth-selection.x2,height:imgHeight});$($outer[3]).css({left:left+selection.x1,top:top+selection.y2,width:w,height:imgHeight-selection.y2});w-=$handles.outerWidth();h-=$handles.outerHeight();switch($handles.length){case 8:$($handles[4]).css({left:w>>1});$($handles[5]).css({left:w,top:h>>1});$($handles[6]).css({left:w>>1,top:h});$($handles[7]).css({top:h>>1});case 4:$handles.slice(1,3).css({left:w});$handles.slice(2,4).css({top:h})}if(resetKeyPress!==false){if($.imgAreaSelect.onKeyPress!=docKeyPress)$(document).unbind($.imgAreaSelect.keyPress,$.imgAreaSelect.onKeyPress);if(options.keys)$(document)[$.imgAreaSelect.keyPress]($.imgAreaSelect.onKeyPress=docKeyPress)}if(msie&&$border.outerWidth()-$border.innerWidth()==2){$border.css('margin',0);setTimeout(function(){$border.css('margin','auto')},0)}}function doUpdate(resetKeyPress){adjust();update(resetKeyPress);x1=viewX(selection.x1);y1=viewY(selection.y1);x2=viewX(selection.x2);y2=viewY(selection.y2)}function hide($elem,fn){options.fadeSpeed?$elem.fadeOut(options.fadeSpeed,fn):$elem.hide()}function areaMouseMove(event){var x=selX(evX(event))-selection.x1,y=selY(evY(event))-selection.y1;if(!adjusted){adjust();adjusted=true;$box.one('mouseout',function(){adjusted=false})}resize='';if(options.resizable){if(y<=options.resizeMargin)resize='n';else if(y>=selection.height-options.resizeMargin)resize='s';if(x<=options.resizeMargin)resize+='w';else if(x>=selection.width-options.resizeMargin)resize+='e'}$box.css('cursor',resize?resize+'-resize':options.movable?'move':'');if($areaOpera)$areaOpera.toggle()}function docMouseUp(event){$('body').css('cursor','');if(options.autoHide||selection.width*selection.height==0)hide($box.add($outer),function(){$(this).hide()});$(document).unbind('mousemove',selectingMouseMove);$box.mousemove(areaMouseMove);options.onSelectEnd(img,getSelection())}function areaMouseDown(event){if(event.which!=1)return false;adjust();if(resize){$('body').css('cursor',resize+'-resize');x1=viewX(selection[/w/.test(resize)?'x2':'x1']);y1=viewY(selection[/n/.test(resize)?'y2':'y1']);$(document).mousemove(selectingMouseMove).one('mouseup',docMouseUp);$box.unbind('mousemove',areaMouseMove)}else if(options.movable){startX=left+selection.x1-evX(event);startY=top+selection.y1-evY(event);$box.unbind('mousemove',areaMouseMove);$(document).mousemove(movingMouseMove).one('mouseup',function(){options.onSelectEnd(img,getSelection());$(document).unbind('mousemove',movingMouseMove);$box.mousemove(areaMouseMove)})}else $img.mousedown(event);return false}function fixAspectRatio(xFirst){if(aspectRatio)if(xFirst){x2=max(left,min(left+imgWidth,x1+abs(y2-y1)*aspectRatio*(x2>x1||-1)));y2=round(max(top,min(top+imgHeight,y1+abs(x2-x1)/aspectRatio*(y2>y1||-1))));x2=round(x2)}else{y2=max(top,min(top+imgHeight,y1+abs(x2-x1)/aspectRatio*(y2>y1||-1)));x2=round(max(left,min(left+imgWidth,x1+abs(y2-y1)*aspectRatio*(x2>x1||-1))));y2=round(y2)}}function doResize(){x1=min(x1,left+imgWidth);y1=min(y1,top+imgHeight);if(abs(x2-x1)left+imgWidth)x1=left+imgWidth-minWidth}if(abs(y2-y1)top+imgHeight)y1=top+imgHeight-minHeight}x2=max(left,min(x2,left+imgWidth));y2=max(top,min(y2,top+imgHeight));fixAspectRatio(abs(x2-x1)maxWidth){x2=x1-maxWidth*(x2maxHeight){y2=y1-maxHeight*(y2=0)$handles.width(5).height(5);if(o=options.borderWidth)$handles.css({borderWidth:o,borderStyle:'solid'});styleOptions($handles,{borderColor1:'border-color',borderColor2:'background-color',borderOpacity:'opacity'})}scaleX=options.imageWidth/imgWidth||1;scaleY=options.imageHeight/imgHeight||1;if(newOptions.x1!=null){setSelection(newOptions.x1,newOptions.y1,newOptions.x2,newOptions.y2);newOptions.show=!newOptions.hide}if(newOptions.keys)options.keys=$.extend({shift:1,ctrl:'resize'},newOptions.keys);$outer.addClass(options.classPrefix+'-outer');$area.addClass(options.classPrefix+'-selection');for(i=0;i++<4;)$($border[i-1]).addClass(options.classPrefix+'-border'+i);styleOptions($area,{selectionColor:'background-color',selectionOpacity:'opacity'});styleOptions($border,{borderOpacity:'opacity',borderWidth:'border-width'});styleOptions($outer,{outerColor:'background-color',outerOpacity:'opacity'});if(o=options.borderColor1)$($border[0]).css({borderStyle:'solid',borderColor:o});if(o=options.borderColor2)$($border[1]).css({borderStyle:'dashed',borderColor:o});$box.append($area.add($border).add($areaOpera)).append($handles);if(msie){if(o=($outer.css('filter')||'').match(/opacity=(\d+)/))$outer.css('opacity',o[1]/100);if(o=($border.css('filter')||'').match(/opacity=(\d+)/))$border.css('opacity',o[1]/100)}if(newOptions.hide)hide($box.add($outer));else if(newOptions.show&&imgLoaded){shown=true;$box.add($outer).fadeIn(options.fadeSpeed||0);doUpdate()}aspectRatio=(d=(options.aspectRatio||'').split(/:/))[0]/d[1];$img.add($outer).unbind('mousedown',imgMouseDown);if(options.disable||options.enable===false){$box.unbind('mousemove',areaMouseMove).unbind('mousedown',areaMouseDown);$(window).unbind('resize',windowResize)}else{if(options.enable||options.disable===false){if(options.resizable||options.movable)$box.mousemove(areaMouseMove).mousedown(areaMouseDown);$(window).resize(windowResize)}if(!options.persistent)$img.add($outer).mousedown(imgMouseDown)}options.enable=options.disable=undefined}this.remove=function(){setOptions({disable:true});$box.add($outer).remove()};this.getOptions=function(){return options};this.setOptions=setOptions;this.getSelection=getSelection;this.setSelection=setSelection;this.cancelSelection=cancelSelection;this.update=doUpdate;var msie=(/msie ([\w.]+)/i.exec(ua)||[])[1],opera=/opera/i.test(ua),safari=/webkit/i.test(ua)&&!/chrome/i.test(ua);$p=$img;while($p.length){zIndex=max(zIndex,!isNaN($p.css('z-index'))?$p.css('z-index'):zIndex);if($p.css('position')=='fixed')position='fixed';$p=$p.parent(':not(body)')}zIndex=options.zIndex||zIndex;if(msie)$img.attr('unselectable','on');$.imgAreaSelect.keyPress=msie||safari?'keydown':'keypress';if(opera)$areaOpera=div().css({width:'100%',height:'100%',position:'absolute',zIndex:zIndex+2||2});$box.add($outer).css({visibility:'hidden',position:position,overflow:'hidden',zIndex:zIndex||'0'});$box.css({zIndex:zIndex+2||2});$area.add($border).css({position:'absolute',fontSize:0});img.complete||img.readyState=='complete'||!$img.is('img')?imgLoad():$img.one('load',imgLoad);if(!imgLoaded&&msie&&msie>=7)img.src=img.src};$.fn.imgAreaSelect=function(options){options=options||{};this.each(function(){if($(this).data('imgAreaSelect')){if(options.remove){$(this).data('imgAreaSelect').remove();$(this).removeData('imgAreaSelect')}else $(this).data('imgAreaSelect').setOptions(options)}else if(!options.remove){if(options.enable===undefined&&options.disable===undefined)options.enable=true;$(this).data('imgAreaSelect',new $.imgAreaSelect(this,options))}});if(options.instance)return $(this).data('imgAreaSelect');return this}})(jQuery);
--------------------------------------------------------------------------------
/js/jquery.imgareaselect.pack.js:
--------------------------------------------------------------------------------
1 | eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(m($){18 W=2v.4T,D=2v.4S,F=2v.4R,u=2v.4Q;m V(){C $("<4P/>")};$.N=m(T,c){18 O=$(T),1F,A=V(),1k=V(),I=V().r(V()).r(V()).r(V()),B=V().r(V()).r(V()).r(V()),E=$([]),1K,G,l,17={v:0,l:0},Q,M,1l,1g={v:0,l:0},12=0,1J="1H",2k,2j,1t,1s,S,1B,1A,2o,2n,14,1Q,a,b,j,g,f={a:0,b:0,j:0,g:0,H:0,L:0},2u=R.4O,1M=4N.4M,$p,d,i,o,w,h,2p;m 1n(x){C x+17.v-1g.v};m 1m(y){C y+17.l-1g.l};m 1b(x){C x-17.v+1g.v};m 1a(y){C y-17.l+1g.l};m 1z(3J){C 3J.4L-1g.v};m 1y(3I){C 3I.4K-1g.l};m 13(32){18 1i=32||1t,1h=32||1s;C{a:u(f.a*1i),b:u(f.b*1h),j:u(f.j*1i),g:u(f.g*1h),H:u(f.j*1i)-u(f.a*1i),L:u(f.g*1h)-u(f.b*1h)}};m 23(a,b,j,g,31){18 1i=31||1t,1h=31||1s;f={a:u(a/1i||0),b:u(b/1h||0),j:u(j/1i||0),g:u(g/1h||0)};f.H=f.j-f.a;f.L=f.g-f.b};m 1f(){9(!1F||!O.H()){C}17={v:u(O.2t().v),l:u(O.2t().l)};Q=O.2Y();M=O.3H();17.l+=(O.30()-M)>>1;17.v+=(O.2q()-Q)>>1;1B=u(c.4J/1t)||0;1A=u(c.4I/1s)||0;2o=u(F(c.4H/1t||1<<24,Q));2n=u(F(c.4G/1s||1<<24,M));9($().4F=="1.3.2"&&1J=="21"&&!2u["4E"]){17.l+=D(R.1q.2r,2u.2r);17.v+=D(R.1q.2s,2u.2s)}1g=/1H|4D/.1c(1l.q("1p"))?{v:u(1l.2t().v)-1l.2s(),l:u(1l.2t().l)-1l.2r()}:1J=="21"?{v:$(R).2s(),l:$(R).2r()}:{v:0,l:0};G=1n(0);l=1m(0);9(f.j>Q||f.g>M){1U()}};m 1V(3F){9(!1Q){C}A.q({v:1n(f.a),l:1m(f.b)}).r(1k).H(w=f.H).L(h=f.L);1k.r(I).r(E).q({v:0,l:0});I.H(D(w-I.2q()+I.2Y(),0)).L(D(h-I.30()+I.3H(),0));$(B[0]).q({v:G,l:l,H:f.a,L:M});$(B[1]).q({v:G+f.a,l:l,H:w,L:f.b});$(B[2]).q({v:G+f.j,l:l,H:Q-f.j,L:M});$(B[3]).q({v:G+f.a,l:l+f.g,H:w,L:M-f.g});w-=E.2q();h-=E.30();2O(E.3f){15 8:$(E[4]).q({v:w>>1});$(E[5]).q({v:w,l:h>>1});$(E[6]).q({v:w>>1,l:h});$(E[7]).q({l:h>>1});15 4:E.3G(1,3).q({v:w});E.3G(2,4).q({l:h})}9(3F!==Y){9($.N.2Z!=2R){$(R).U($.N.2z,$.N.2Z)}9(c.1T){$(R)[$.N.2z]($.N.2Z=2R)}}9(1j&&I.2q()-I.2Y()==2){I.q("3E",0);3x(m(){I.q("3E","4C")},0)}};m 22(3D){1f();1V(3D);a=1n(f.a);b=1m(f.b);j=1n(f.j);g=1m(f.g)};m 27(2X,2w){c.1P?2X.4B(c.1P,2w):2X.1r()};m 1d(2W){18 x=1b(1z(2W))-f.a,y=1a(1y(2W))-f.b;9(!2p){1f();2p=11;A.1G("4A",m(){2p=Y})}S="";9(c.2D){9(y<=c.1W){S="n"}X{9(y>=f.L-c.1W){S="s"}}9(x<=c.1W){S+="w"}X{9(x>=f.H-c.1W){S+="e"}}}A.q("2V",S?S+"-19":c.26?"4z":"");9(1K){1K.4y()}};m 2S(4x){$("1q").q("2V","");9(c.4w||f.H*f.L==0){27(A.r(B),m(){$(J).1r()})}$(R).U("P",2l);A.P(1d);c.2f(T,13())};m 2C(1X){9(1X.3z!=1){C Y}1f();9(S){$("1q").q("2V",S+"-19");a=1n(f[/w/.1c(S)?"j":"a"]);b=1m(f[/n/.1c(S)?"g":"b"]);$(R).P(2l).1G("1x",2S);A.U("P",1d)}X{9(c.26){2k=G+f.a-1z(1X);2j=l+f.b-1y(1X);A.U("P",1d);$(R).P(2T).1G("1x",m(){c.2f(T,13());$(R).U("P",2T);A.P(1d)})}X{O.1O(1X)}}C Y};m 1w(3C){9(14){9(3C){j=D(G,F(G+Q,a+W(g-b)*14*(j>a||-1)));g=u(D(l,F(l+M,b+W(j-a)/14*(g>b||-1))));j=u(j)}X{g=D(l,F(l+M,b+W(j-a)/14*(g>b||-1)));j=u(D(G,F(G+Q,a+W(g-b)*14*(j>a||-1))));g=u(g)}}};m 1U(){a=F(a,G+Q);b=F(b,l+M);9(W(j-a)<1B){j=a-1B*(j G+Q){a=G+Q-1B}}}9(W(g-b)<1A){g=b-1A*(gl+M){b=l+M-1A}}}j=D(G,F(j,G+Q));g=D(l,F(g,l+M));1w(W(j-a)2o){j=a-2o*(j2n){g=b-2n*(g=0){E.H(5).L(5)}9(o=c.2K){E.q({2K:o,2H:"3m"})}1R(E,{3n:"2J-28",3l:"2I-28",3o:"1e"})}1t=c.4l/Q||1;1s=c.4k/M||1;9(K.a!=3q){23(K.a,K.b,K.j,K.g);K.2F=!K.1r}9(K.1T){c.1T=$.2c({2b:1,2a:"19"},K.1T)}B.29(c.1S+"-4j");1k.29(c.1S+"-4i");3p(i=0;i++<4;){$(I[i-1]).29(c.1S+"-2J"+i)}1R(1k,{4h:"2I-28",4g:"1e"});1R(I,{3o:"1e",2K:"2J-H"});1R(B,{4f:"2I-28",4e:"1e"});9(o=c.3n){$(I[0]).q({2H:"3m",3k:o})}9(o=c.3l){$(I[1]).q({2H:"4d",3k:o})}A.2G(1k.r(I).r(1K)).2G(E);9(1j){9(o=(B.q("3j")||"").3i(/1e=(\\d+)/)){B.q("1e",o[1]/1Z)}9(o=(I.q("3j")||"").3i(/1e=(\\d+)/)){I.q("1e",o[1]/1Z)}}9(K.1r){27(A.r(B))}X{9(K.2F&&1F){1Q=11;A.r(B).2E(c.1P||0);22()}}14=(d=(c.4c||"").4b(/:/))[0]/d[1];O.r(B).U("1O",2A);9(c.1E||c.1D===Y){A.U("P",1d).U("1O",2C);$(3h).U("19",2B)}X{9(c.1D||c.1E===Y){9(c.2D||c.26){A.P(1d).1O(2C)}$(3h).19(2B)}9(!c.4a){O.r(B).1O(2A)}}c.1D=c.1E=1Y};J.1o=m(){25({1E:11});A.r(B).1o()};J.49=m(){C c};J.33=25;J.48=13;J.47=23;J.46=1N;J.45=22;18 1j=(/44 ([\\w.]+)/i.43(1M)||[])[1],3c=/42/i.1c(1M),3d=/41/i.1c(1M)&&!/3Z/i.1c(1M);$p=O;3g($p.3f){12=D(12,!1L($p.q("z-3e"))?$p.q("z-3e"):12);9($p.q("1p")=="21"){1J="21"}$p=$p.20(":3Y(1q)")}12=c.1I||12;9(1j){O.3X("3W","3V")}$.N.2z=1j||3d?"3U":"3T";9(3c){1K=V().q({H:"1Z%",L:"1Z%",1p:"1H",1I:12+2||2})}A.r(B).q({3b:"3a",1p:1J,3S:"3a",1I:12||"0"});A.q({1I:12+2||2});1k.r(I).q({1p:"1H",36:0});T.35||T.3R=="35"||!O.2y("3Q")?2x():O.1G("3P",2x);9(!1F&&1j&&1j>=7){T.34=T.34}};$.2w.N=m(Z){Z=Z||{};J.3O(m(){9($(J).1C("N")){9(Z.1o){$(J).1C("N").1o();$(J).3N("N")}X{$(J).1C("N").33(Z)}}X{9(!Z.1o){9(Z.1D===1Y&&Z.1E===1Y){Z.1D=11}$(J).1C("N",3M $.N(J,Z))}}});9(Z.3L){C $(J).1C("N")}C J}})(3K);',62,304,'|||||||||if|x1|y1|_7|||_23|y2|||x2||top|function||||css|add|||_4|left|||||_a|_d|return|_2|_e|_3|_10|width|_c|this|_55|height|_13|imgAreaSelect|_8|mousemove|_12|document|_1c|_6|unbind|_5|_1|else|false|_58||true|_16|_2c|_21|case|_50|_11|var|resize|_29|_28|test|_3a|opacity|_30|_15|sy|sx|_35|_b|_14|_27|_26|remove|position|body|hide|_1b|_1a|break|_45|_42|mouseup|evY|evX|_1e|_1d|data|enable|disable|_9|one|absolute|zIndex|_17|_f|isNaN|ua|_4a|mousedown|fadeSpeed|_22|_51|classPrefix|keys|_31|_32|resizeMargin|_40|undefined|100|parent|fixed|_36|_2e||_4f|movable|_38|color|addClass|ctrl|shift|extend|_54|altKey|onSelectEnd|onSelectChange|_49|_4c|_19|_18|_3e|_48|_20|_1f|_25|outerWidth|scrollTop|scrollLeft|offset|_24|Math|fn|_4e|is|keyPress|_4b|_4d|_3f|resizable|fadeIn|show|append|borderStyle|background|border|borderWidth|handles|_53|key|switch|alt|arrows|_34|_3c|_41|_44|cursor|_3b|_39|innerWidth|onKeyPress|outerHeight|_2f|_2d|setOptions|src|complete|fontSize||||hidden|visibility|_56|_57|index|length|while|window|match|filter|borderColor|borderColor2|solid|borderColor1|borderOpacity|for|null|_52|default|originalEvent|ctrlKey|shiftKey|onInit|setTimeout|onSelectStart|which|_47|_46|_43|_37|margin|_33|slice|innerHeight|_2b|_2a|jQuery|instance|new|removeData|each|load|img|readyState|overflow|keypress|keydown|on|unselectable|attr|not|chrome||webkit|opera|exec|msie|update|cancelSelection|setSelection|getSelection|getOptions|persistent|split|aspectRatio|dashed|outerOpacity|outerColor|selectionOpacity|selectionColor|selection|outer|imageHeight|imageWidth|parseInt|handle|corners|in|keyCode|imgareaselect|animated|instanceof|visible|preventDefault|autoHide|_3d|toggle|move|mouseout|fadeOut|auto|relative|getBoundingClientRect|jquery|maxHeight|maxWidth|minHeight|minWidth|pageY|pageX|userAgent|navigator|documentElement|div|round|min|max|abs'.split('|')))
2 |
--------------------------------------------------------------------------------
/optional-tags.html:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
16 |
17 |
91 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "videotaggingcontrol",
3 | "version": "1.0.0",
4 | "description": "A control for video tagging",
5 | "main": "server.js",
6 | "directories": {
7 | "test": "test"
8 | },
9 | "dependencies": {
10 | "express": "^4.13.3"
11 | },
12 | "devDependencies": {},
13 | "scripts": {
14 | "test": "echo \"Error: no test specified\" && exit 1",
15 | "start": "node server.js"
16 | },
17 | "repository": {
18 | "type": "git",
19 | "url": "git+https://github.com/CatalystCode/VideoTaggingControl.git"
20 | },
21 | "author": "",
22 | "license": "ISC",
23 | "bugs": {
24 | "url": "https://github.com/CatalystCode/VideoTaggingControl/issues"
25 | },
26 | "homepage": "https://github.com/CatalystCode/VideoTaggingControl#readme"
27 | }
28 |
--------------------------------------------------------------------------------
/playback-control.html:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
x 1.0
15 |
x .50
16 |
x .25
17 |
x .10
18 |
x .05
19 |
20 |
21 |
59 |
60 |
--------------------------------------------------------------------------------
/test/basic-test.html:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/test/index.html:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/video-tagging.html:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | X
27 |
28 |
29 | Your browser does not support the HTML5 canvas location.
30 |
31 |
32 | Your browser does not support the video location.
33 |
34 |
35 |
75 |
76 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
985 |
986 |
987 |
988 |
989 |
--------------------------------------------------------------------------------
/video-taggingstyles.html:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 |
8 |
249 |
250 |
--------------------------------------------------------------------------------