├── .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 | ![Alt text](assets/images/area.png?raw=true "Title") 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 | ![Alt text](assets/images/videocontrols.png?raw=true "Title") 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 | ![Alt text](assets/images/taggingcontrols.png?raw=true "Title") 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 | ![Alt text](assets/images/singlepoint.png?raw=true "Title") 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 | ![Alt text](assets/images/area.png?raw=true "Title") 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 | ![Alt text](assets/images/frames1.png?raw=true "Title") 197 | Expanded- each region is an object with coordinates and a tags array. 198 | ![Alt text](assets/images/frames2.png?raw=true "Title") 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 | ![Alt text](assets/images/frames3.png?raw=true "Title") 225 | 226 | ####Browser Support 227 | 228 | ![Alt text](assets/images/chrome.png?raw=true "Title") Chrome 47 229 | ![Alt text](assets/images/ff.png?raw=true "Title") 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 |
21 |
22 | 23 | 24 | 25 | icon-file-picture 26 |
27 |
28 | 29 | 30 |
31 |
32 | liga: 33 | 34 |
35 |
36 |
37 |
38 | 39 | 40 | 41 | icon-file-play 42 |
43 |
44 | 45 | 46 |
47 |
48 | liga: 49 | 50 |
51 |
52 |
53 |
54 | 55 | 56 | 57 | icon-price-tag 58 |
59 |
60 | 61 | 62 |
63 |
64 | liga: 65 | 66 |
67 |
68 |
69 |
70 | 71 | 72 | 73 | icon-price-tags 74 |
75 |
76 | 77 | 78 |
79 |
80 | liga: 81 | 82 |
83 |
84 |
85 |
86 | 87 | 88 | 89 | icon-pushpin 90 |
91 |
92 | 93 | 94 |
95 |
96 | liga: 97 | 98 |
99 |
100 |
101 |
102 | 103 | 104 | 105 | icon-floppy-disk 106 |
107 |
108 | 109 | 110 |
111 |
112 | liga: 113 | 114 |
115 |
116 |
117 |
118 | 119 | 120 | 121 | icon-cross 122 |
123 |
124 | 125 | 126 |
127 |
128 | liga: 129 | 130 |
131 |
132 |
133 |
134 | 135 | 136 | 137 | icon-play3 138 |
139 |
140 | 141 | 142 |
143 |
144 | liga: 145 | 146 |
147 |
148 |
149 |
150 | 151 | 152 | 153 | icon-pause2 154 |
155 |
156 | 157 | 158 |
159 |
160 | liga: 161 | 162 |
163 |
164 |
165 |
166 | 167 | 168 | 169 | icon-stop2 170 |
171 |
172 | 173 | 174 |
175 |
176 | liga: 177 | 178 |
179 |
180 |
181 |
182 | 183 | 184 | 185 | icon-backward2 186 |
187 |
188 | 189 | 190 |
191 |
192 | liga: 193 | 194 |
195 |
196 |
197 |
198 | 199 | 200 | 201 | icon-forward3 202 |
203 |
204 | 205 | 206 |
207 |
208 | liga: 209 | 210 |
211 |
212 |
213 |
214 | 215 | 216 | 217 | icon-first 218 |
219 |
220 | 221 | 222 |
223 |
224 | liga: 225 | 226 |
227 |
228 |
229 |
230 | 231 | 232 | 233 | icon-last 234 |
235 |
236 | 237 | 238 |
239 |
240 | liga: 241 | 242 |
243 |
244 |
245 |
246 | 247 | 248 | 249 | icon-previous2 250 |
251 |
252 | 253 | 254 |
255 |
256 | liga: 257 | 258 |
259 |
260 |
261 |
262 | 263 | 264 | 265 | icon-next2 266 |
267 |
268 | 269 | 270 |
271 |
272 | liga: 273 | 274 |
275 |
276 |
277 |
278 | 279 | 280 | 281 | icon-eject 282 |
283 |
284 | 285 | 286 |
287 |
288 | liga: 289 | 290 |
291 |
292 |
293 |
294 | 295 | 296 | 297 | icon-volume-medium 298 |
299 |
300 | 301 | 302 |
303 |
304 | liga: 305 | 306 |
307 |
308 |
309 |
310 | 311 | 312 | 313 | icon-volume-mute2 314 |
315 |
316 | 317 | 318 |
319 |
320 | liga: 321 | 322 |
323 |
324 |
325 |
326 | 327 | 328 | 329 | icon-arrow-right 330 |
331 |
332 | 333 | 334 |
335 |
336 | liga: 337 | 338 |
339 |
340 |
341 |
342 | 343 | 344 | 345 | icon-arrow-left 346 |
347 |
348 | 349 | 350 |
351 |
352 | liga: 353 | 354 |
355 |
356 |
357 |
358 | 359 | 360 | 361 | icon-arrow-right2 362 |
363 |
364 | 365 | 366 |
367 |
368 | liga: 369 | 370 |
371 |
372 |
373 |
374 | 375 | 376 | 377 | icon-arrow-left2 378 |
379 |
380 | 381 | 382 |
383 |
384 | liga: 385 | 386 |
387 |
388 |
389 |
390 | 391 | 392 | 393 | icon-circle-right 394 |
395 |
396 | 397 | 398 |
399 |
400 | liga: 401 | 402 |
403 |
404 |
405 |
406 | 407 | 408 | 409 | icon-circle-left 410 |
411 |
412 | 413 | 414 |
415 |
416 | liga: 417 | 418 |
419 |
420 |
421 |
422 | 423 | 424 | 425 | icon-checkbox-unchecked 426 |
427 |
428 | 429 | 430 |
431 |
432 | liga: 433 | 434 |
435 |
436 |
437 |
438 | 439 | 440 | 441 | icon-share 442 |
443 |
444 | 445 | 446 |
447 |
448 | liga: 449 | 450 |
451 |
452 |
453 | 454 | 455 |
456 |

Font Test Drive

457 | 462 | 464 | 465 |
  466 |
467 |
468 | 469 |
470 |

Generated by IcoMoon

471 |
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 | 7 | { 8 | "fontFamily": "icomoon-video-tagging", 9 | "majorVersion": 1, 10 | "minorVersion": 0, 11 | "version": "Version 1.0", 12 | "fontId": "icomoon-video-tagging", 13 | "psName": "icomoon-video-tagging", 14 | "subFamily": "Regular", 15 | "fullName": "icomoon-video-tagging", 16 | "description": "Font generated by IcoMoon." 17 | } 18 | 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 | 25 |
26 |
27 |
28 |
29 | 30 |
31 |
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*(jG+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 | 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 | 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 | 90 | 985 | 986 | 987 | 988 | 989 | -------------------------------------------------------------------------------- /video-taggingstyles.html: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 250 | --------------------------------------------------------------------------------