├── public ├── _includes │ ├── img │ │ └── fav.ico │ ├── font │ │ ├── comic_zine_ot-webfont.eot │ │ ├── comic_zine_ot-webfont.ttf │ │ ├── comic_zine_ot-webfont.woff │ │ ├── stylesheet.css │ │ ├── demo.html │ │ └── Blue Vinyl License.txt │ ├── css │ │ ├── screen.css │ │ └── spectrum.css │ └── js │ │ ├── slider.js │ │ ├── site.js │ │ ├── rotate-letters.js │ │ ├── spectrum.js │ │ └── jquery.1.9.1.min.js ├── canvas │ ├── index.html │ ├── style.css │ └── graf.js └── index.html ├── .gitignore ├── package.json ├── README.md └── app.js /public/_includes/img/fav.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orangespaceman/graf-wall/master/public/_includes/img/fav.ico -------------------------------------------------------------------------------- /public/_includes/font/comic_zine_ot-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orangespaceman/graf-wall/master/public/_includes/font/comic_zine_ot-webfont.eot -------------------------------------------------------------------------------- /public/_includes/font/comic_zine_ot-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orangespaceman/graf-wall/master/public/_includes/font/comic_zine_ot-webfont.ttf -------------------------------------------------------------------------------- /public/_includes/font/comic_zine_ot-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orangespaceman/graf-wall/master/public/_includes/font/comic_zine_ot-webfont.woff -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | lib-cov 2 | *.seed 3 | *.log 4 | *.csv 5 | *.dat 6 | *.out 7 | *.pid 8 | *.gz 9 | 10 | pids 11 | logs 12 | results 13 | 14 | npm-debug.log 15 | node_modules 16 | deploy.sh -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "canvas-graf-node", 3 | "node":"0.8.16", 4 | "description": "Node.js-based canvas graf thing", 5 | "version": "0.0.1", 6 | "repository": { "type" : "git", "url" : "https://github.com/orangespaceman/Graf-Wall" }, 7 | "keywords": ["stuff", "thing"], 8 | "dependencies": { 9 | "express" : "2.5.x", 10 | "socket.io" : "0.9.x" 11 | }, 12 | "devDependencies": {}, 13 | "optionalDependencies": {}, 14 | "engines": { 15 | "node": "*" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /public/canvas/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Graf Wall 6 | 7 | 8 | 9 | 10 | 11 | 12 |

Graf wall

13 |

Draw at:

14 |

0

15 | 16 | 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Graf-Wall 2 | ========= 3 | 4 | A basic multi-user drawing canvas/node/websockets thing 5 | 6 | 7 | Installation 8 | ------------ 9 | 10 | Clone the repo, and run ```npm install``` to get the correct versions of socket.io and express 11 | 12 | 13 | Usage 14 | ----- 15 | 16 | Run with ```node app.js``` 17 | 18 | View the root in a web browser to see the controller 19 | 20 | View ```/canvas``` in a web browser to see the results 21 | 22 | Uses port ```7004``` by default but this can be changed in app.js -------------------------------------------------------------------------------- /public/_includes/font/stylesheet.css: -------------------------------------------------------------------------------- 1 | /* Generated by Font Squirrel (http://www.fontsquirrel.com) on February 24, 2013 06:33:06 AM America/New_York */ 2 | 3 | 4 | 5 | @font-face { 6 | font-family: 'ComicZineOTRegular'; 7 | src: url('comic_zine_ot-webfont.eot'); 8 | src: url('comic_zine_ot-webfont.eot?#iefix') format('embedded-opentype'), 9 | url('comic_zine_ot-webfont.woff') format('woff'), 10 | url('comic_zine_ot-webfont.ttf') format('truetype'), 11 | url('comic_zine_ot-webfont.svg#ComicZineOTRegular') format('svg'); 12 | font-weight: normal; 13 | font-style: normal; 14 | 15 | } 16 | 17 | -------------------------------------------------------------------------------- /public/canvas/style.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | width:100%; 4 | height:100%; 5 | margin:0; 6 | padding:0; 7 | } 8 | 9 | h1, 10 | h2 { 11 | font-family: 'ComicZineOTRegular', Georgia, sans-serif; 12 | font-weight:normal; 13 | font-size:2.8em; 14 | width:100%; 15 | text-align:center; 16 | background:rgba(255, 255, 255, 0.2); 17 | line-height:1; 18 | padding:0; 19 | margin:0 auto; 20 | color:#fff; 21 | position:absolute; 22 | z-index:2; 23 | left:0; 24 | top:0; 25 | opacity:0.75; 26 | } 27 | 28 | h2 { 29 | top:auto; 30 | bottom:0; 31 | } 32 | 33 | p#count { 34 | position:absolute; 35 | right:10px; 36 | bottom:10px; 37 | margin:0; 38 | color:#fff; 39 | z-index:4; 40 | } 41 | 42 | canvas { 43 | position:absolute; 44 | left:0; 45 | top:0; 46 | width:100%; 47 | height:100%; 48 | z-index:1; 49 | } -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Node graf 3 | * 4 | * $ node app.js 5 | * 6 | */ 7 | var express = require('express'), 8 | server = express.createServer(), 9 | io = require("socket.io").listen(server,{"log level":0}), 10 | port = process.env.PORT || process.env['app_port'] || 7004, 11 | connectCount= 0; 12 | 13 | // serve static files, routes, etc 14 | server.use(express.query()); 15 | server.use(express.static(__dirname + '/public')); 16 | server.use(express.favicon(__dirname + '/public/_includes/img/fav.ico')); 17 | server.listen(port); 18 | 19 | // test over long-polling (disable websockets) 20 | //io.set('transports', [ 'xhr-polling' ]); 21 | 22 | // listen for socket.io connection 23 | io.sockets.on('connection', function (socket) { 24 | 25 | connectCount++; 26 | socket.broadcast.emit('connectCount', connectCount); 27 | 28 | socket.on('disconnect', function() { 29 | connectCount--; 30 | socket.broadcast.emit('connectCount', connectCount); 31 | }); 32 | 33 | socket.on('mouse', function (data) { 34 | socket.broadcast.emit('mouse', data); 35 | }); 36 | }); -------------------------------------------------------------------------------- /public/_includes/font/demo.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | Font Face Demo 9 | 10 | 21 | 22 | 23 | 24 |
25 |

FONT-FACE DEMO FOR THE COMIC ZINE FONT

26 | 27 | 28 | 29 |

Comic Zine OT Regular - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

30 | 31 |
32 | 33 | 34 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Graf Wall - Controller 6 | 7 | 8 | 9 | 10 | 11 | 12 |

Graf Wall

13 |
14 |

Draw here

15 |
16 |
17 |
18 |

Colour

19 | 20 | 21 |
22 | 23 |
24 |

Size

25 | 26 |
27 |
28 |

1

29 |

10

30 | 31 |
32 |
33 |
34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /public/_includes/font/Blue Vinyl License.txt: -------------------------------------------------------------------------------- 1 | Blue Vinyl Fonts 2 | (c) 2008 All Rights Reserved 3 | bvfonts.com 4 | 5 | The Freeware Font(s) included in this pack were created by Jess Latham. I am inspired by my uncontrolable love for music and graphic design. All fonts are original works. 6 | 7 | Please do not include this font on any CD-ROM compilations. This font is not to be resold or remarketed. This font is free to use in any private and commercial manner. If you plan to use this font commercially and would like to say thanks for the free font you can purchase a pay font from bvfonts.com and I would be very grateful. 8 | 9 | Please read the legal notice below. Basically what it is saying is that I'm human and although I work very hard to make fonts that work well, I'm not perfect. 10 | 11 | NO WARRANTIES. Blue Vinyl Fonts expressly disclaims any warranty for this SOFTWARE PRODUCT. This SOFTWARE PRODUCT and any related documentation is provided "as is" without warranty of any kind, either express or implied, including, without limitation, the implied warranties or merchantability, fitness for a particular purpose, or noninfringement. The entire risk arising out of use or performance of the SOFTWARE PRODUCT remains with you. 12 | 13 | NO LIABILITY FOR CONSEQUENTIAL DAMAGES. In no event shall Blue Vinyl Fonts be liable for any damages whatsoever (including, without limitation, damages for loss of business profits, business interruption, loss of business information, or any other pecuniary loss) arising out of the use of or inability to use this product, even if Blue Vinyl Fonts has been advised of the possibility of such damages. 14 | 15 | UNDER NO CIRCUMSTANCES SHOULD THESE FONTS BE USED IN A SITUATION THAT COULD ENDANGER LIFE OR THE ENVIROMENT. FOR INSTANCE AIRPLANE NAVIGATION, SAFETY SIGNS, etc. 16 | 17 | EDUCATIONAL PURPOSES: If this font is used in an educational situation it is up to you the user or teacher to confirm that they are useful and you take full responsibility for it's use. 18 | 19 | Blue Vinyl Fonts reserves the right to make changes to this license at any time. 20 | 21 | Have questions? Please visit bvfonts.com and click the email me link. I love hearing from you! 22 | 23 | - Jess Latham 24 | Blue Vinyl Fonts 25 | -------------------------------------------------------------------------------- /public/canvas/graf.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This file starts the graf 3 | */ 4 | var startGraf = (function() { 5 | 6 | // object : the containing page element 7 | container = null, 8 | 9 | // object: the html canvas area 10 | canvas = null, 11 | 12 | // int : due to issues with percentages, calculated canvas dimensions 13 | canvasWidth = null, 14 | canvasHeight = null, 15 | 16 | // object : the canvas draw context 17 | drawContext = null, 18 | 19 | 20 | /** 21 | * start the process 22 | * 23 | * @return void 24 | */ 25 | init = function(){ 26 | 27 | container = document.getElementsByTagName("body")[0]; 28 | canvas = document.getElementById("graf"); 29 | 30 | getCanvasDimensions(); 31 | 32 | // create draw context 33 | drawContext = canvas.getContext("2d"); 34 | 35 | emptyCanvas(); 36 | 37 | // set a mouse listener 38 | initMouseListener(); 39 | 40 | // add URL 41 | addURL(); 42 | 43 | // listen for sent events 44 | socket = io.connect(); 45 | 46 | // message received 47 | socket.on('mouse', function (data) { 48 | draw({ 49 | percentX: data.x, 50 | percentY: data.y, 51 | colour: data.colour, 52 | size: data.size 53 | }); 54 | }); 55 | 56 | // update active user count 57 | socket.on('connectCount', connectCount); 58 | 59 | // set a listener to reset canvas dimensions if ever the canvas is changed 60 | window.onresize = function(){ 61 | getCanvasDimensions(); 62 | emptyCanvas(); 63 | }; 64 | }, 65 | 66 | 67 | /* 68 | * 69 | */ 70 | emptyCanvas = function() { 71 | drawContext.fillStyle = "rgba(0, 0, 0, 1)"; 72 | drawContext.fillRect(0, 0, canvasWidth, canvasHeight); 73 | }, 74 | 75 | 76 | /* 77 | * Get and set the Canvas dimensions based on the width and height of the container 78 | */ 79 | getCanvasDimensions = function(){ 80 | canvas.width = canvasWidth = container.offsetWidth; 81 | canvas.height = canvasHeight = container.offsetHeight; 82 | }, 83 | 84 | 85 | /** 86 | * Initialise the mouse listener, to detect when the mouse button is being pressed 87 | */ 88 | initMouseListener = function(){ 89 | document.onmousemove = function(e) { 90 | //draw(e); 91 | }; 92 | }, 93 | 94 | /* 95 | * Create a new line 96 | */ 97 | draw = function(e){ 98 | 99 | // set initial line parameters 100 | var graf = { 101 | x : e.clientX || Math.round(canvasWidth * e.percentX), 102 | y : e.clientY || Math.round(canvasHeight * e.percentY), 103 | colour : e.colour || "#ff9900", 104 | size : e.size || 10 105 | }; 106 | 107 | // draw 108 | drawContext.fillStyle = graf.colour; 109 | drawContext.beginPath(); 110 | drawContext.arc(graf.x, graf.y, graf.size, 0, Math.PI*2, true); 111 | drawContext.closePath(); 112 | drawContext.fill(); 113 | }, 114 | 115 | 116 | /* 117 | * add URL 118 | */ 119 | addURL = function() { 120 | document.getElementById("url").innerHTML = window.location.protocol + "//" + window.location.host; 121 | }, 122 | 123 | 124 | /* 125 | * count connections 126 | */ 127 | connectCount = function(data) { 128 | document.getElementById("count").innerHTML = data; 129 | }; 130 | 131 | 132 | /* 133 | * Reveal methods 134 | */ 135 | return { 136 | init: init 137 | }; 138 | })(); 139 | 140 | 141 | // go go go! 142 | window.addEventListener("load", startGraf.init); -------------------------------------------------------------------------------- /public/_includes/css/screen.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Graf wall - controller 3 | */ 4 | 5 | /* normalise */ 6 | html { font-size: 100%; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } 7 | html, button, input, select, textarea { font-family: sans-serif; color: #222; } 8 | body { margin: 0; font-size: 1em; line-height: 1.4; } 9 | 10 | 11 | /* site */ 12 | html, 13 | body { 14 | width:100%; 15 | height:100%; 16 | margin:0; 17 | padding:0; 18 | overflow:hidden; 19 | } 20 | 21 | body { 22 | background:#aaa; 23 | font-size:16px; 24 | } 25 | 26 | h1, 27 | h2 { 28 | font-family: 'ComicZineOTRegular', Georgia, sans-serif; 29 | color:#000; 30 | font-weight:normal; 31 | font-size:2.0em; 32 | margin:0; 33 | } 34 | 35 | h1 { 36 | width:100%; 37 | text-align:center; 38 | background:#f60; 39 | font-size:2.4em; 40 | line-height:1; 41 | font-weight:normal; 42 | padding:0; 43 | margin:0 auto 0.25em auto; 44 | box-shadow: 2px 2px 5px #888; 45 | 46 | -webkit-transition : all 0.25s ease-out; 47 | -moz-transition : all 0.25s ease-out; 48 | -ms-transition : all 0.25s ease-out; 49 | -o-transition : all 0.25s ease-out; 50 | transition : all 0.25s ease-out; 51 | } 52 | 53 | p { 54 | margin:0; 55 | } 56 | 57 | #drawhere { 58 | width:95%; 59 | height:40%; 60 | display:table; 61 | margin:0 auto; 62 | border:1px solid #f90; 63 | border-radius:5px; 64 | background:#fff; 65 | cursor:pointer; 66 | } 67 | 68 | #drawhere, 69 | #drawhere * { 70 | -webkit-touch-callout: none; 71 | -webkit-user-select: none; 72 | -webkit-text-size-adjust: none; 73 | -webkit-tap-highlight-color: rgba(0,0,0,0); 74 | } 75 | 76 | #drawhere h2 { 77 | display:table-cell; 78 | vertical-align:middle; 79 | text-align:center; 80 | } 81 | 82 | label { 83 | display:block; 84 | float:left; 85 | width:50%; 86 | } 87 | 88 | p#error { 89 | clear:both; 90 | width:90%; 91 | background:#f90; 92 | color:#fff; 93 | font-weight:bold; 94 | font-style:italic; 95 | padding:5px 2.5%; 96 | border-radius:10px; 97 | margin:20px auto; 98 | font-size:1em; 99 | } 100 | 101 | /* controls */ 102 | #controls { 103 | width:95%; 104 | margin:0 auto; 105 | } 106 | 107 | .control { 108 | float:left; 109 | width:50%; 110 | } 111 | 112 | /* controls - colour */ 113 | 114 | 115 | 116 | /* controls - slider */ 117 | .slider-block { 118 | position:relative; 119 | } 120 | 121 | .slider { 122 | position:relative; 123 | width:90%; 124 | height:15px; 125 | background:#eee; 126 | border-radius:15px; 127 | } 128 | 129 | .noUiSlider { /* bar BG */ 130 | width:100%; 131 | height:100%; 132 | } 133 | 134 | .noUi-midBar { /* bar fill */ 135 | height:100%; 136 | z-index:0; 137 | background:#f90; 138 | border-radius:10px; 139 | } 140 | 141 | .noUi-handle > .handle { /* handle */ 142 | position:absolute; 143 | top:-15px; 144 | left:-22px; 145 | z-index:5; 146 | width: 40px; 147 | height: 40px; 148 | /*border:1px dotted #f90;*/ 149 | } 150 | 151 | .noUi-handle > .handle span { /* handle */ 152 | display:block; 153 | background: #fff; 154 | border-radius: 15px; 155 | border: 2px solid #f60; 156 | width:15px; 157 | height:15px; 158 | margin:13px; 159 | cursor:pointer; 160 | } 161 | 162 | .noUi-handle > div:hover span, 163 | .noUi-handle > div.noUi-activeHandle span { /* handle in use */ 164 | background:#ccc; 165 | } 166 | 167 | .slider-block #size { 168 | position:absolute; 169 | right:0; 170 | top:-5px; 171 | color:#d37316; 172 | font-size:1em; 173 | background:transparent; 174 | border:none; 175 | width:10%; 176 | text-align:right; 177 | } 178 | 179 | .slider-block .scale-low, 180 | .slider-block .scale-high { 181 | position:absolute; 182 | left:0; 183 | top:20px; 184 | margin:0; 185 | font-size:0.9em; 186 | } 187 | 188 | .slider-block .scale-high { 189 | left:auto; 190 | right:10%; 191 | } 192 | 193 | 194 | /* 195 | .rotate { 196 | display:inline-block; 197 | -webkit-animation-name: rotate; 198 | -webkit-animation-duration: 1s; 199 | -webkit-animation-direction: alternate; 200 | -webkit-animation-timing-function: ease-in-out; 201 | -webkit-animation-iteration-count: infinite; 202 | } 203 | */ 204 | /* 205 | @-webkit-keyframes rotate { 206 | from { -webkit-transform:rotate(-15deg); } 207 | to { -webkit-transform:rotate(15deg); } 208 | } 209 | */ 210 | 211 | 212 | 213 | /* 214 | * mobile, landscape 215 | */ 216 | @media only screen and (max-height: 320px) { 217 | h1 { 218 | font-size:1.5em; 219 | } 220 | } 221 | 222 | 223 | @media only screen and (min-width: 35em) { 224 | 225 | 226 | } 227 | 228 | 229 | /* boilerplate */ 230 | .clearfix:before, .clearfix:after { content: ""; display: table; } 231 | .clearfix:after { clear: both; } 232 | .clearfix { *zoom: 1; } 233 | -------------------------------------------------------------------------------- /public/_includes/js/slider.js: -------------------------------------------------------------------------------- 1 | /** noUislider 2.5.5 2 | ** No copyrights or licenses. Do what you like. Feel free to share this code, or build upon it. 3 | ** @author: @leongersen 4 | ** @repository: https://github.com/leongersen/noUiSlider 5 | **/ 6 | (function(a){a.fn.noUiSlider=function(b,c){function d(a){return a<0}function e(a){return Math.abs(a)}function f(a,b){return Math.round(a/b)*b}function g(a){return jQuery.extend(true,{},a)}var h,i,j,c=c||[],k,l="ontouchstart"in document.documentElement;h={handles:2,connect:true,scale:[0,100],start:[25,75],to:0,handle:0,change:"",end:"",step:false,save:false,click:true};j={scale:function(a,b,c){var f=b[0],g=b[1];if(d(f)){a=a+e(f);g=g+e(f)}else{a=a-f;g=g-f}return a*c/g},deScale:function(a,b,c){var f=b[0],g=b[1];g=d(f)?g+e(f):g-f;return a*g/c+f},connect:function(a){if(a.connect){if(a.handles.length>1){a.connect.css({left:a.low.left(),right:a.slider.innerWidth()-a.up.left()})}else{a.low?a.connect.css({left:a.low.left(),right:0}):a.connect.css({left:0,right:a.slider.innerWidth()-a.up.left()})}}},left:function(){return parseFloat(a(this).css("left"))},call:function(a,b,c){if(typeof a=="function"){a.call(b,c)}},bounce:function(a,b,c,d){var e=false;if(d.is(a.up)){if(a.low&&ba.up.left()){b=a.up.left();e=true}}if(b>a.slider.innerWidth()){b=a.slider.innerWidth();e=true}else if(b<0){b=0;e=true}return[b,e]}};i={init:function(){return this.each(function(){var b,d,e;d=a(this).css("position","relative");e=new Object;e.options=a.extend(h,c);b=e.options;typeof b.start=="object"?1:b.start=[b.start];e.slider=d;e.low=a('
');e.up=a('
');e.connect=a('
');b.connect?e.connect.appendTo(e.slider):e.connect=false;if(b.knobs){b.handles=b.knobs}if(b.handles===1){if(b.connect===true||b.connect==="lower"){e.low=false;e.up=e.up.appendTo(e.slider);e.handles=[e.up]}else if(b.connect==="upper"||!b.connect){e.low=e.low.prependTo(e.slider);e.up=false;e.handles=[e.low]}}else{e.low=e.low.prependTo(e.slider);e.up=e.up.appendTo(e.slider);e.handles=[e.low,e.up]}if(e.low){e.low.left=j.left}if(e.up){e.up.left=j.left}e.slider.children().css("position","absolute");a.each(e.handles,function(c){a(this).css({left:j.scale(b.start[c],e.options.scale,e.slider.innerWidth()),zIndex:c+1}).children().bind(l?"touchstart.noUi":"mousedown.noUi",k.start)});if(b.click){e.slider.click(k.click).find("*:not(.noUi-midBar)").click(k.flse)}j.connect(e);e.options=b;e.slider.data("api",e)})},move:function(){var b,d,e,f,h;b=g(a(this).data("api"));b.options=a.extend(b.options,c);if(b.options.knob){b.options.handle=b.options.knob}f=b.options.handle;f=b.handles[f=="lower"||f==0||typeof f=="undefined"?0:1];d=j.bounce(b,j.scale(b.options.to,b.options.scale,b.slider.innerWidth()),f.left(),f);f.css("left",d[0]);if(f.is(b.up)&&f.left()==0||f.is(b.low)&&f.left()==b.slider.innerWidth()){f.css("zIndex",parseInt(f.css("zIndex"))+2)}if(c.save===true){b.options.scale=c.scale;a(this).data("api",b)}j.connect(b);j.call(b.options.change,b.slider,"move");j.call(b.options.end,b.slider,"move")},value:function(){var b,d,e;e=g(a(this).data("api"));e.options=a.extend(e.options,c);b=e.low?Math.round(j.deScale(e.low.left(),e.options.scale,e.slider.innerWidth())):false;d=e.up?Math.round(j.deScale(e.up.left(),e.options.scale,e.slider.innerWidth())):false;if(c.save){e.options.scale=c.scale;a(this).data("api",e)}return[b,d]},api:function(){return a(this).data("api")},disable:function(){return this.each(function(){a(this).addClass("disabled")})},enable:function(){return this.each(function(){a(this).removeClass("disabled")})}},k={start:function(b){if(!a(this).parent().parent().hasClass("disabled")){b.preventDefault();a("body").bind("selectstart.noUi",k.flse);a(this).addClass("noUi-activeHandle");a(document).bind(l?"touchmove.noUi":"mousemove.noUi",k.move);l?a(this).bind("touchend.noUi",k.end):a(document).bind("mouseup.noUi",k.end)}},move:function(b){var c,f,g,h,i=false,k,l;g=a(".noUi-activeHandle");h=g.parent().parent().data("api");k=g.parent().is(h.low)?h.low:h.up;c=b.pageX-Math.round(h.slider.offset().left);if(isNaN(c)){c=b.originalEvent.touches[0].pageX-Math.round(h.slider.offset().left)}f=k.left();l=j.bounce(h,c,f,k);c=l[0];i=l[1];if(h.options.step&&!i){var m=h.options.scale[0],n=h.options.scale[1];if(d(n)){n=e(m-n);m=0}n=n+ -1*m;var o=j.scale(h.options.step,[0,n],h.slider.innerWidth());if(Math.abs(f-c)>=o){c=c") 52 | .attr("id", "error") 53 | .text("Your connection is slow, it could be improved by using a modern browser or connecting via wifi") 54 | .insertAfter("#controls"); 55 | } 56 | }); 57 | 58 | 59 | // detect previous/next clicks 60 | function detectMouse() { 61 | $body = $("body"); 62 | $window = $(window); 63 | $drawhere = $("#drawhere"); 64 | 65 | $drawhere.on('mousedown', function(e){ 66 | mouseDown = true; 67 | }); 68 | 69 | $drawhere.on('mouseup', function(e){ 70 | mouseDown = false; 71 | }); 72 | 73 | $drawhere.on('mousemove', function(e){ 74 | if (mouseDown) { 75 | sendMouse(e); 76 | } 77 | }); 78 | 79 | // capture touch events 80 | $drawhere[0].addEventListener("touchstart", touchHandler, true); 81 | $drawhere[0].addEventListener("touchmove", touchHandler, true); 82 | $drawhere[0].addEventListener("touchend", touchHandler, true); 83 | $drawhere[0].addEventListener("touchcancel",touchHandler, true); 84 | 85 | setDimensions(); 86 | $window.on('resize', setDimensions); 87 | } 88 | 89 | 90 | function setDimensions() { 91 | var drawherePos = $drawhere.offset(); 92 | drawX = drawherePos.left, 93 | drawY = drawherePos.top, 94 | drawWidth = $drawhere.width(); 95 | drawHeight = $drawhere.height(); 96 | } 97 | 98 | 99 | // send (and log) a message 100 | function sendMouse(e) { 101 | var mouse = { 102 | x: (e.clientX - drawX)/drawWidth, 103 | y: (e.clientY - drawY)/drawHeight, 104 | colour: $colour.val(), 105 | size: $size.val() 106 | }; 107 | socket.emit("mouse", mouse); 108 | log("mouse", mouse); 109 | } 110 | 111 | 112 | // log recieved messages 113 | function log(source, message) { 114 | //console.log(source + " message received: ", message); 115 | } 116 | 117 | 118 | /* colour picker */ 119 | function createColourPicker() { 120 | $("#colour").spectrum({ 121 | // flat: true, 122 | showInput: true, 123 | color:"#ff9900" 124 | }); 125 | $colour = $(".sp-input"); 126 | } 127 | 128 | 129 | /* slider */ 130 | function createSlider() { 131 | var sliderOptions = { 132 | handles: 1, 133 | connect: "lower", 134 | scale: [1,20], 135 | start: 10, 136 | change: sliderUpdated, 137 | end: sliderUpdated 138 | }; 139 | 140 | $body.find(".slider").noUiSlider('init', sliderOptions); 141 | $size = $("#size"); 142 | } 143 | 144 | function sliderUpdated() { 145 | var val = $(this).noUiSlider('value')[1]; 146 | $size.val(val); 147 | } 148 | 149 | 150 | /* rotate letters */ 151 | function rotateLetters() { 152 | $("h1, h2").rotateLetters(); 153 | } 154 | 155 | 156 | 157 | /* 158 | * iOS viewport fix 159 | * https://raw.github.com/gist/901295/bf9a44b636a522e608bba11a91b8298acd081f50/ios-viewport-scaling-bug-fix.js 160 | * By @mathias, @cheeaun and @jdalton 161 | */ 162 | (function(){ 163 | var addEvent = 'addEventListener', 164 | type = 'gesturestart', 165 | qsa = 'querySelectorAll', 166 | scales = [1, 1], 167 | meta = qsa in doc ? doc[qsa]('meta[name=viewport]') : []; 168 | 169 | function fix() { 170 | meta.content = 'width=device-width,minimum-scale=' + scales[0] + ',maximum-scale=' + scales[1]; 171 | doc.removeEventListener(type, fix, true); 172 | } 173 | 174 | if ((meta = meta[meta.length - 1]) && addEvent in doc) { 175 | fix(); 176 | scales = [0.25, 1.6]; 177 | doc[addEvent](type, fix, true); 178 | } 179 | })(); 180 | 181 | 182 | 183 | /* 184 | * http://stackoverflow.com/questions/1517924/javascript-mapping-touch-events-to-mouse-events 185 | */ 186 | function touchHandler(event) { 187 | var touches = event.changedTouches, 188 | first = touches[0], 189 | type = ""; 190 | 191 | switch(event.type) { 192 | case "touchstart": type="mousedown"; break; 193 | case "touchmove": type="mousemove"; break; 194 | case "touchend": type="mouseup"; break; 195 | default: return; 196 | } 197 | 198 | //initMouseEvent(type, canBubble, cancelable, view, clickCount, 199 | // screenX, screenY, clientX, clientY, ctrlKey, 200 | // altKey, shiftKey, metaKey, button, relatedTarget); 201 | 202 | var simulatedEvent = document.createEvent("MouseEvent"); 203 | simulatedEvent.initMouseEvent(type, true, true, window, 1, 204 | first.screenX, first.screenY, 205 | first.clientX, first.clientY, false, 206 | false, false, false, 0/*left*/, null); 207 | 208 | first.target.dispatchEvent(simulatedEvent); 209 | event.preventDefault(); 210 | } 211 | 212 | 213 | }(document, $)); -------------------------------------------------------------------------------- /public/_includes/js/rotate-letters.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Rotate and animate individual letters 3 | */ 4 | (function( $ ) { 5 | 6 | var 7 | 8 | // 9 | settings, 10 | 11 | // defaults to extend 12 | defaults = { 13 | 'angle' : 15, 14 | 'duration' : 1000, 15 | 'delay' : 100, 16 | 'direction' : 'alternate', 17 | 'timing' : 'ease-in-out', 18 | 'iteration' : 'infinite', 19 | 'el' : 'span', 20 | 'className' : 'rotate' 21 | }, 22 | 23 | // plugin methods 24 | methods = { 25 | 26 | // 27 | init : function( options ) { 28 | 29 | // extend defaults with any options that were provided 30 | settings = $.extend(defaults, options); 31 | 32 | // init 33 | return this.each(function() { 34 | 35 | var $this = $(this), 36 | charArray, 37 | wrappedText = ""; 38 | 39 | // split every character into its own element 40 | charArray = this.innerHTML.split(''); 41 | $.each(charArray, function(index, character){ 42 | wrappedText += "<"+settings.el+" class='"+settings.className+"'>"+character+""; 43 | }); 44 | 45 | // insert all new elements in a single DOM call 46 | $this.html(wrappedText); 47 | 48 | var anim = CSSAnimations.create('rotate', { 49 | '25%' : { 'transform': 'rotate('+settings.angle+'deg);', '-webkit-transform': 'rotate('+settings.angle+'deg);' }, 50 | '75%' : { 'transform': 'rotate(-'+settings.angle+'deg);', '-webkit-transform': 'rotate(-'+settings.angle+'deg);' } 51 | }); 52 | 53 | $this.find('.'+settings.className).each(function(counter){ 54 | $(this).css({ 55 | 'display' : 'inline-block', 56 | 57 | 'animation-name' : settings.className, 58 | 'animation-duration' : settings.duration + "ms", 59 | // 'animation-direction' : settings.direction, 60 | 'animation-timing-function': settings.timing, 61 | 'animation-iteration-count': settings.iteration, 62 | 'animation-delay' : (counter * settings.delay) + "ms", 63 | '-webkit-animation-delay' : (counter * settings.delay) + "ms" 64 | }); 65 | }); 66 | }); 67 | }, 68 | 69 | // 70 | stop : function( ) { 71 | 72 | } 73 | }; 74 | 75 | 76 | $.fn.rotateLetters = function( method ) { 77 | 78 | // Method calling logic 79 | if ( methods[method] ) { 80 | return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 )); 81 | } else if ( typeof method === 'object' || ! method ) { 82 | return methods.init.apply( this, arguments ); 83 | } else { 84 | $.error( 'Method ' + method + ' does not exist on jQuery.rotateLetters' ); 85 | } 86 | 87 | }; 88 | })( jQuery ); 89 | 90 | 91 | 92 | 93 | 94 | 95 | /* 96 | * https://github.com/jlongster/css-animations.js 97 | */ 98 | (function() { 99 | 100 | // Utility 101 | 102 | function findKeyframeRules(styles, func) { 103 | var rules = styles.cssRules || styles.rules || []; 104 | 105 | for(var i=0; i) */ 327 | .sp-replacer { 328 | margin:0; 329 | overflow:hidden; 330 | cursor:pointer; 331 | padding: 4px; 332 | display:inline-block; 333 | *zoom: 1; 334 | *display: inline; 335 | border: solid 1px #91765d; 336 | background: #eee; 337 | color: #333; 338 | vertical-align: middle; 339 | } 340 | .sp-replacer:hover, .sp-replacer.sp-active { 341 | border-color: #F0C49B; 342 | color: #111; 343 | } 344 | .sp-replacer.sp-disabled { 345 | cursor:default; 346 | border-color: silver; 347 | color: silver; 348 | } 349 | .sp-dd { 350 | padding: 2px 0; 351 | height: 16px; 352 | line-height: 16px; 353 | float:left; 354 | font-size:10px; 355 | } 356 | .sp-preview 357 | { 358 | position:relative; 359 | width:25px; 360 | height: 20px; 361 | border: solid 1px #222; 362 | margin-right: 5px; 363 | float:left; 364 | z-index: 0; 365 | } 366 | 367 | .sp-palette 368 | { 369 | *width: 220px; 370 | max-width: 220px; 371 | } 372 | .sp-palette .sp-thumb-el 373 | { 374 | width:16px; 375 | height: 16px; 376 | margin:2px 1px; 377 | border: solid 1px #d0d0d0; 378 | } 379 | 380 | .sp-container 381 | { 382 | padding-bottom:0; 383 | } 384 | 385 | 386 | /* Buttons: http://hellohappy.org/css3-buttons/ */ 387 | .sp-container button { 388 | background-color: #eeeeee; 389 | background-image: -webkit-linear-gradient(top, #eeeeee, #cccccc); 390 | background-image: -moz-linear-gradient(top, #eeeeee, #cccccc); 391 | background-image: -ms-linear-gradient(top, #eeeeee, #cccccc); 392 | background-image: -o-linear-gradient(top, #eeeeee, #cccccc); 393 | background-image: -ms-linear-gradient(top, #eeeeee, #cccccc); 394 | background-image: linear-gradient(to bottom, #eeeeee, #cccccc); 395 | border: 1px solid #ccc; 396 | border-bottom: 1px solid #bbb; 397 | border-radius: 3px; 398 | color: #333; 399 | font-size: 14px; 400 | line-height: 1; 401 | padding: 5px 4px; 402 | text-align: center; 403 | text-shadow: 0 1px 0 #eee; 404 | vertical-align: middle; 405 | } 406 | .sp-container button:hover { 407 | background-color: #dddddd; 408 | background-image: -webkit-linear-gradient(top, #dddddd, #bbbbbb); 409 | background-image: -moz-linear-gradient(top, #dddddd, #bbbbbb); 410 | background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb); 411 | background-image: -o-linear-gradient(top, #dddddd, #bbbbbb); 412 | background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb); 413 | background-image: linear-gradient(to bottom, #dddddd, #bbbbbb); 414 | border: 1px solid #bbb; 415 | border-bottom: 1px solid #999; 416 | cursor: pointer; 417 | text-shadow: 0 1px 0 #ddd; 418 | } 419 | .sp-container button:active { 420 | border: 1px solid #aaa; 421 | border-bottom: 1px solid #888; 422 | -webkit-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; 423 | -moz-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; 424 | -ms-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; 425 | -o-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; 426 | box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; 427 | } 428 | .sp-cancel 429 | { 430 | font-size: 11px; 431 | color: #d93f3f !important; 432 | margin:0; 433 | padding:2px; 434 | margin-right: 5px; 435 | vertical-align: middle; 436 | text-decoration:none; 437 | 438 | } 439 | .sp-cancel:hover 440 | { 441 | color: #d93f3f !important; 442 | text-decoration: underline; 443 | } 444 | 445 | 446 | .sp-palette span:hover, .sp-palette span.sp-thumb-active 447 | { 448 | border-color: #000; 449 | } 450 | 451 | .sp-preview, .sp-alpha, .sp-thumb-el 452 | { 453 | position:relative; 454 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==); 455 | } 456 | .sp-preview-inner, .sp-alpha-inner, .sp-thumb-inner 457 | { 458 | display:block; 459 | position:absolute; 460 | top:0;left:0;bottom:0;right:0; 461 | } 462 | 463 | .sp-palette .sp-thumb-inner 464 | { 465 | background-position: 50% 50%; 466 | background-repeat: no-repeat; 467 | } 468 | 469 | .sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner 470 | { 471 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=); 472 | } 473 | 474 | .sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner 475 | { 476 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=); 477 | } -------------------------------------------------------------------------------- /public/_includes/js/spectrum.js: -------------------------------------------------------------------------------- 1 | // Spectrum Colorpicker v1.0.9 2 | // https://github.com/bgrins/spectrum 3 | // Author: Brian Grinstead 4 | // License: MIT 5 | 6 | (function (window, $, undefined) { 7 | var defaultOpts = { 8 | 9 | // Events 10 | beforeShow: noop, 11 | move: noop, 12 | change: noop, 13 | show: noop, 14 | hide: noop, 15 | 16 | // Options 17 | color: false, 18 | flat: false, 19 | showInput: false, 20 | showButtons: true, 21 | clickoutFiresChange: false, 22 | showInitial: false, 23 | showPalette: false, 24 | showPaletteOnly: false, 25 | showSelectionPalette: true, 26 | localStorageKey: false, 27 | maxSelectionSize: 7, 28 | cancelText: "cancel", 29 | chooseText: "choose", 30 | preferredFormat: false, 31 | className: "", 32 | showAlpha: false, 33 | theme: "sp-light", 34 | palette: ['fff', '000'], 35 | selectionPalette: [], 36 | disabled: false 37 | }, 38 | spectrums = [], 39 | IE = !!/msie/i.exec( window.navigator.userAgent ), 40 | rgbaSupport = (function() { 41 | function contains( str, substr ) { 42 | return !!~('' + str).indexOf(substr); 43 | } 44 | 45 | var elem = document.createElement('div'); 46 | var style = elem.style; 47 | style.cssText = 'background-color:rgba(0,0,0,.5)'; 48 | return contains(style.backgroundColor, 'rgba') || contains(style.backgroundColor, 'hsla'); 49 | })(), 50 | replaceInput = [ 51 | "
", 52 | "
", 53 | "
", 54 | "
" 55 | ].join(''), 56 | markup = (function () { 57 | 58 | // IE does not support gradients with multiple stops, so we need to simulate 59 | // that for the rainbow slider with 8 divs that each have a single gradient 60 | var gradientFix = ""; 61 | if (IE) { 62 | for (var i = 1; i <= 6; i++) { 63 | gradientFix += "
"; 64 | } 65 | } 66 | 67 | return [ 68 | "
", 69 | "
", 70 | "
", 71 | "
", 72 | "
", 73 | "
", 74 | "
", 75 | "
", 76 | "
", 77 | "
", 78 | "
", 79 | "
", 80 | "
", 81 | "
", 82 | "
", 83 | "
", 84 | "
", 85 | gradientFix, 86 | "
", 87 | "
", 88 | "
", 89 | "
", 90 | "
", 91 | "", 92 | "
", 93 | "
", 94 | "
", 95 | "", 96 | "", 97 | "
", 98 | "
", 99 | "
" 100 | ].join(""); 101 | })(); 102 | 103 | function paletteTemplate (p, color, className) { 104 | var html = []; 105 | for (var i = 0; i < p.length; i++) { 106 | var tiny = tinycolor(p[i]); 107 | var c = tiny.toHsl().l < 0.5 ? "sp-thumb-el sp-thumb-dark" : "sp-thumb-el sp-thumb-light"; 108 | c += (tinycolor.equals(color, p[i])) ? " sp-thumb-active" : ""; 109 | 110 | var swatchStyle = rgbaSupport ? ("background-color:" + tiny.toRgbString()) : "filter:" + tiny.toFilter(); 111 | html.push(''); 112 | } 113 | return "
" + html.join('') + "
"; 114 | } 115 | 116 | function hideAll() { 117 | for (var i = 0; i < spectrums.length; i++) { 118 | if (spectrums[i]) { 119 | spectrums[i].hide(); 120 | } 121 | } 122 | } 123 | 124 | function instanceOptions(o, callbackContext) { 125 | var opts = $.extend({}, defaultOpts, o); 126 | opts.callbacks = { 127 | 'move': bind(opts.move, callbackContext), 128 | 'change': bind(opts.change, callbackContext), 129 | 'show': bind(opts.show, callbackContext), 130 | 'hide': bind(opts.hide, callbackContext), 131 | 'beforeShow': bind(opts.beforeShow, callbackContext) 132 | }; 133 | 134 | return opts; 135 | } 136 | 137 | function spectrum(element, o) { 138 | 139 | var opts = instanceOptions(o, element), 140 | flat = opts.flat, 141 | showSelectionPalette = opts.showSelectionPalette, 142 | localStorageKey = opts.localStorageKey, 143 | theme = opts.theme, 144 | callbacks = opts.callbacks, 145 | resize = throttle(reflow, 10), 146 | visible = false, 147 | dragWidth = 0, 148 | dragHeight = 0, 149 | dragHelperHeight = 0, 150 | slideHeight = 0, 151 | slideWidth = 0, 152 | alphaWidth = 0, 153 | alphaSlideHelperWidth = 0, 154 | slideHelperHeight = 0, 155 | currentHue = 0, 156 | currentSaturation = 0, 157 | currentValue = 0, 158 | currentAlpha = 1, 159 | palette = opts.palette.slice(0), 160 | paletteArray = $.isArray(palette[0]) ? palette : [palette], 161 | selectionPalette = opts.selectionPalette.slice(0), 162 | draggingClass = "sp-dragging"; 163 | 164 | var doc = element.ownerDocument, 165 | body = doc.body, 166 | boundElement = $(element), 167 | disabled = false, 168 | container = $(markup, doc).addClass(theme), 169 | dragger = container.find(".sp-color"), 170 | dragHelper = container.find(".sp-dragger"), 171 | slider = container.find(".sp-hue"), 172 | slideHelper = container.find(".sp-slider"), 173 | alphaSliderInner = container.find(".sp-alpha-inner"), 174 | alphaSlider = container.find(".sp-alpha"), 175 | alphaSlideHelper = container.find(".sp-alpha-handle"), 176 | textInput = container.find(".sp-input"), 177 | paletteContainer = container.find(".sp-palette"), 178 | initialColorContainer = container.find(".sp-initial"), 179 | cancelButton = container.find(".sp-cancel"), 180 | chooseButton = container.find(".sp-choose"), 181 | isInput = boundElement.is("input"), 182 | shouldReplace = isInput && !flat, 183 | replacer = (shouldReplace) ? $(replaceInput).addClass(theme) : $([]), 184 | offsetElement = (shouldReplace) ? replacer : boundElement, 185 | previewElement = replacer.find(".sp-preview-inner"), 186 | initialColor = opts.color || (isInput && boundElement.val()), 187 | colorOnShow = false, 188 | preferredFormat = opts.preferredFormat, 189 | currentPreferredFormat = preferredFormat, 190 | clickoutFiresChange = !opts.showButtons || opts.clickoutFiresChange; 191 | 192 | 193 | function applyOptions() { 194 | 195 | container.toggleClass("sp-flat", flat); 196 | container.toggleClass("sp-input-disabled", !opts.showInput); 197 | container.toggleClass("sp-alpha-enabled", opts.showAlpha); 198 | container.toggleClass("sp-buttons-disabled", !opts.showButtons || flat); 199 | container.toggleClass("sp-palette-disabled", !opts.showPalette); 200 | container.toggleClass("sp-palette-only", opts.showPaletteOnly); 201 | container.toggleClass("sp-initial-disabled", !opts.showInitial); 202 | container.addClass(opts.className); 203 | 204 | reflow(); 205 | } 206 | 207 | function initialize() { 208 | 209 | if (IE) { 210 | container.find("*:not(input)").attr("unselectable", "on"); 211 | } 212 | 213 | applyOptions(); 214 | 215 | if (shouldReplace) { 216 | boundElement.hide().after(replacer); 217 | } 218 | 219 | if (flat) { 220 | boundElement.after(container).hide(); 221 | } 222 | else { 223 | $(body).append(container.hide()); 224 | } 225 | 226 | if (localStorageKey && window.localStorage) { 227 | 228 | // Migrate old palettes over to new format. May want to remove this eventually. 229 | try { 230 | var oldPalette = window.localStorage[localStorageKey].split(",#"); 231 | if (oldPalette.length > 1) { 232 | delete window.localStorage[localStorageKey]; 233 | $.each(oldPalette, function(i, c) { 234 | addColorToSelectionPalette(c); 235 | }); 236 | } 237 | } 238 | catch(e) { } 239 | 240 | try { 241 | selectionPalette = window.localStorage[localStorageKey].split(";"); 242 | } 243 | catch (e) { } 244 | } 245 | 246 | offsetElement.bind("click.spectrum touchstart.spectrum", function (e) { 247 | if (!disabled) { 248 | toggle(); 249 | } 250 | 251 | e.stopPropagation(); 252 | 253 | if (!$(e.target).is("input")) { 254 | e.preventDefault(); 255 | } 256 | }); 257 | 258 | if(boundElement.is(":disabled") || (opts.disabled === true)) { 259 | disable(); 260 | } 261 | 262 | // Prevent clicks from bubbling up to document. This would cause it to be hidden. 263 | container.click(stopPropagation); 264 | 265 | // Handle user typed input 266 | textInput.change(setFromTextInput); 267 | textInput.bind("paste", function () { 268 | setTimeout(setFromTextInput, 1); 269 | }); 270 | textInput.keydown(function (e) { if (e.keyCode == 13) { setFromTextInput(); } }); 271 | 272 | cancelButton.text(opts.cancelText); 273 | cancelButton.bind("click.spectrum", function (e) { 274 | e.stopPropagation(); 275 | e.preventDefault(); 276 | hide("cancel"); 277 | }); 278 | 279 | chooseButton.text(opts.chooseText); 280 | chooseButton.bind("click.spectrum", function (e) { 281 | e.stopPropagation(); 282 | e.preventDefault(); 283 | 284 | if (isValid()) { 285 | updateOriginalInput(true); 286 | hide(); 287 | } 288 | }); 289 | 290 | draggable(alphaSlider, function (dragX, dragY, e) { 291 | currentAlpha = (dragX / alphaWidth); 292 | if (e.shiftKey) { 293 | currentAlpha = Math.round(currentAlpha * 10) / 10; 294 | } 295 | 296 | move(); 297 | }); 298 | 299 | draggable(slider, function (dragX, dragY) { 300 | currentHue = parseFloat(dragY / slideHeight); 301 | move(); 302 | }, dragStart, dragStop); 303 | 304 | draggable(dragger, function (dragX, dragY) { 305 | currentSaturation = parseFloat(dragX / dragWidth); 306 | currentValue = parseFloat((dragHeight - dragY) / dragHeight); 307 | move(); 308 | }, dragStart, dragStop); 309 | 310 | if (!!initialColor) { 311 | set(initialColor); 312 | 313 | // In case color was black - update the preview UI and set the format 314 | // since the set function will not run (default color is black). 315 | updateUI(); 316 | currentPreferredFormat = preferredFormat || tinycolor(initialColor).format; 317 | 318 | addColorToSelectionPalette(initialColor); 319 | } 320 | else { 321 | updateUI(); 322 | } 323 | 324 | if (flat) { 325 | show(); 326 | } 327 | 328 | function palletElementClick(e) { 329 | if (e.data && e.data.ignore) { 330 | set($(this).data("color")); 331 | move(); 332 | } 333 | else { 334 | set($(this).data("color")); 335 | updateOriginalInput(true); 336 | move(); 337 | hide(); 338 | } 339 | 340 | return false; 341 | } 342 | 343 | var paletteEvent = IE ? "mousedown.spectrum" : "click.spectrum touchstart.spectrum"; 344 | paletteContainer.delegate(".sp-thumb-el", paletteEvent, palletElementClick); 345 | initialColorContainer.delegate(".sp-thumb-el:nth-child(1)", paletteEvent, { ignore: true }, palletElementClick); 346 | } 347 | 348 | function addColorToSelectionPalette(color) { 349 | if (showSelectionPalette) { 350 | var colorRgb = tinycolor(color).toRgbString(); 351 | if ($.inArray(colorRgb, selectionPalette) === -1) { 352 | selectionPalette.push(colorRgb); 353 | } 354 | 355 | if (localStorageKey && window.localStorage) { 356 | try { 357 | window.localStorage[localStorageKey] = selectionPalette.join(";"); 358 | } 359 | catch(e) { } 360 | } 361 | } 362 | } 363 | 364 | function getUniqueSelectionPalette() { 365 | var unique = []; 366 | var p = selectionPalette; 367 | var paletteLookup = {}; 368 | var rgb; 369 | 370 | if (opts.showPalette) { 371 | 372 | for (var i = 0; i < paletteArray.length; i++) { 373 | for (var j = 0; j < paletteArray[i].length; j++) { 374 | rgb = tinycolor(paletteArray[i][j]).toRgbString(); 375 | paletteLookup[rgb] = true; 376 | } 377 | } 378 | 379 | for (i = 0; i < p.length; i++) { 380 | rgb = tinycolor(p[i]).toRgbString(); 381 | 382 | if (!paletteLookup.hasOwnProperty(rgb)) { 383 | unique.push(p[i]); 384 | paletteLookup[rgb] = true; 385 | } 386 | } 387 | } 388 | 389 | return unique.reverse().slice(0, opts.maxSelectionSize); 390 | } 391 | 392 | function drawPalette() { 393 | 394 | var currentColor = get(); 395 | 396 | var html = $.map(paletteArray, function (palette, i) { 397 | return paletteTemplate(palette, currentColor, "sp-palette-row sp-palette-row-" + i); 398 | }); 399 | 400 | if (selectionPalette) { 401 | html.push(paletteTemplate(getUniqueSelectionPalette(), currentColor, "sp-palette-row sp-palette-row-selection")); 402 | } 403 | 404 | paletteContainer.html(html.join("")); 405 | } 406 | 407 | function drawInitial() { 408 | if (opts.showInitial) { 409 | var initial = colorOnShow; 410 | var current = get(); 411 | initialColorContainer.html(paletteTemplate([initial, current], current, "sp-palette-row-initial")); 412 | } 413 | } 414 | 415 | function dragStart() { 416 | if (dragHeight === 0 || dragWidth === 0 || slideHeight === 0) { 417 | reflow(); 418 | } 419 | container.addClass(draggingClass); 420 | } 421 | 422 | function dragStop() { 423 | container.removeClass(draggingClass); 424 | } 425 | 426 | function setFromTextInput() { 427 | var tiny = tinycolor(textInput.val()); 428 | if (tiny.ok) { 429 | set(tiny); 430 | } 431 | else { 432 | textInput.addClass("sp-validation-error"); 433 | } 434 | } 435 | 436 | function toggle() { 437 | if (visible) { 438 | hide(); 439 | } 440 | else { 441 | show(); 442 | } 443 | } 444 | 445 | function show() { 446 | if (visible) { 447 | reflow(); 448 | return; 449 | } 450 | if (callbacks.beforeShow(get()) === false) return; 451 | 452 | hideAll(); 453 | visible = true; 454 | 455 | $(doc).bind("click.spectrum", hide); 456 | $(window).bind("resize.spectrum", resize); 457 | replacer.addClass("sp-active"); 458 | container.show(); 459 | 460 | if (opts.showPalette) { 461 | drawPalette(); 462 | } 463 | reflow(); 464 | updateUI(); 465 | 466 | colorOnShow = get(); 467 | 468 | drawInitial(); 469 | callbacks.show(colorOnShow); 470 | } 471 | 472 | function hide(e) { 473 | 474 | // Return on right click 475 | if (e && e.type == "click" && e.button == 2) { return; } 476 | 477 | // Return if hiding is unnecessary 478 | if (!visible || flat) { return; } 479 | visible = false; 480 | 481 | $(doc).unbind("click.spectrum", hide); 482 | $(window).unbind("resize.spectrum", resize); 483 | 484 | replacer.removeClass("sp-active"); 485 | container.hide(); 486 | 487 | var colorHasChanged = !tinycolor.equals(get(), colorOnShow); 488 | 489 | if (colorHasChanged) { 490 | if (clickoutFiresChange && e !== "cancel") { 491 | updateOriginalInput(true); 492 | } 493 | else { 494 | revert(); 495 | } 496 | } 497 | 498 | callbacks.hide(get()); 499 | } 500 | 501 | function revert() { 502 | set(colorOnShow, true); 503 | } 504 | 505 | function set(color, ignoreFormatChange) { 506 | if (tinycolor.equals(color, get())) { 507 | return; 508 | } 509 | 510 | var newColor = tinycolor(color); 511 | var newHsv = newColor.toHsv(); 512 | 513 | currentHue = newHsv.h; 514 | currentSaturation = newHsv.s; 515 | currentValue = newHsv.v; 516 | currentAlpha = newHsv.a; 517 | 518 | updateUI(); 519 | 520 | if (!ignoreFormatChange) { 521 | currentPreferredFormat = preferredFormat || newColor.format; 522 | } 523 | } 524 | 525 | function get() { 526 | return tinycolor.fromRatio({ h: currentHue, s: currentSaturation, v: currentValue, a: Math.round(currentAlpha * 100) / 100 }); 527 | } 528 | 529 | function isValid() { 530 | return !textInput.hasClass("sp-validation-error"); 531 | } 532 | 533 | function move() { 534 | updateUI(); 535 | 536 | callbacks.move(get()); 537 | } 538 | 539 | function updateUI() { 540 | 541 | textInput.removeClass("sp-validation-error"); 542 | 543 | updateHelperLocations(); 544 | 545 | // Update dragger background color (gradients take care of saturation and value). 546 | var flatColor = tinycolor({ h: currentHue, s: "1.0", v: "1.0" }); 547 | dragger.css("background-color", flatColor.toHexString()); 548 | 549 | // Get a format that alpha will be included in (hex and names ignore alpha) 550 | var format = currentPreferredFormat; 551 | if (currentAlpha < 1) { 552 | if (format === "hex" || format === "name") { 553 | format = "rgb"; 554 | } 555 | } 556 | 557 | var realColor = get(), 558 | realHex = realColor.toHexString(), 559 | realRgb = realColor.toRgbString(); 560 | 561 | 562 | // Update the replaced elements background color (with actual selected color) 563 | if (rgbaSupport || realColor.alpha === 1) { 564 | previewElement.css("background-color", realRgb); 565 | } 566 | else { 567 | previewElement.css("background-color", "transparent"); 568 | previewElement.css("filter", realColor.toFilter()); 569 | } 570 | 571 | if (opts.showAlpha) { 572 | var rgb = realColor.toRgb(); 573 | rgb.a = 0; 574 | var realAlpha = tinycolor(rgb).toRgbString(); 575 | var gradient = "linear-gradient(left, " + realAlpha + ", " + realHex + ")"; 576 | 577 | if (IE) { 578 | alphaSliderInner.css("filter", tinycolor(realAlpha).toFilter({ gradientType: 1 }, realHex)); 579 | } 580 | else { 581 | alphaSliderInner.css("background", "-webkit-" + gradient); 582 | alphaSliderInner.css("background", "-moz-" + gradient); 583 | alphaSliderInner.css("background", "-ms-" + gradient); 584 | alphaSliderInner.css("background", gradient); 585 | } 586 | } 587 | 588 | 589 | // Update the text entry input as it changes happen 590 | if (opts.showInput) { 591 | if (currentAlpha < 1) { 592 | if (format === "hex" || format === "name") { 593 | format = "rgb"; 594 | } 595 | } 596 | textInput.val(realColor.toString(format)); 597 | } 598 | 599 | if (opts.showPalette) { 600 | drawPalette(); 601 | } 602 | 603 | drawInitial(); 604 | } 605 | 606 | function updateHelperLocations() { 607 | var s = currentSaturation; 608 | var v = currentValue; 609 | 610 | // Where to show the little circle in that displays your current selected color 611 | var dragX = s * dragWidth; 612 | var dragY = dragHeight - (v * dragHeight); 613 | dragX = Math.max( 614 | -dragHelperHeight, 615 | Math.min(dragWidth - dragHelperHeight, dragX - dragHelperHeight) 616 | ); 617 | dragY = Math.max( 618 | -dragHelperHeight, 619 | Math.min(dragHeight - dragHelperHeight, dragY - dragHelperHeight) 620 | ); 621 | dragHelper.css({ 622 | "top": dragY, 623 | "left": dragX 624 | }); 625 | 626 | var alphaX = currentAlpha * alphaWidth; 627 | alphaSlideHelper.css({ 628 | "left": alphaX - (alphaSlideHelperWidth / 2) 629 | }); 630 | 631 | // Where to show the bar that displays your current selected hue 632 | var slideY = (currentHue) * slideHeight; 633 | slideHelper.css({ 634 | "top": slideY - slideHelperHeight 635 | }); 636 | } 637 | 638 | function updateOriginalInput(fireCallback) { 639 | var color = get(); 640 | 641 | if (isInput) { 642 | boundElement.val(color.toString(currentPreferredFormat)).change(); 643 | } 644 | 645 | var hasChanged = !tinycolor.equals(color, colorOnShow); 646 | colorOnShow = color; 647 | 648 | // Update the selection palette with the current color 649 | addColorToSelectionPalette(color); 650 | if (fireCallback && hasChanged) { 651 | callbacks.change(color); 652 | } 653 | } 654 | 655 | function reflow() { 656 | dragWidth = dragger.width(); 657 | dragHeight = dragger.height(); 658 | dragHelperHeight = dragHelper.height(); 659 | slideWidth = slider.width(); 660 | slideHeight = slider.height(); 661 | slideHelperHeight = slideHelper.height(); 662 | alphaWidth = alphaSlider.width(); 663 | alphaSlideHelperWidth = alphaSlideHelper.width(); 664 | 665 | if (!flat) { 666 | container.offset(getOffset(container, offsetElement)); 667 | } 668 | 669 | updateHelperLocations(); 670 | } 671 | 672 | function destroy() { 673 | boundElement.show(); 674 | offsetElement.unbind("click.spectrum touchstart.spectrum"); 675 | container.remove(); 676 | replacer.remove(); 677 | spectrums[spect.id] = null; 678 | } 679 | 680 | function option(optionName, optionValue) { 681 | if (optionName === undefined) { 682 | return $.extend({}, opts); 683 | } 684 | if (optionValue === undefined) { 685 | return opts[optionName]; 686 | } 687 | 688 | opts[optionName] = optionValue; 689 | applyOptions(); 690 | } 691 | 692 | function enable() { 693 | disabled = false; 694 | boundElement.attr("disabled", false); 695 | offsetElement.removeClass("sp-disabled"); 696 | } 697 | 698 | function disable() { 699 | hide(); 700 | disabled = true; 701 | boundElement.attr("disabled", true); 702 | offsetElement.addClass("sp-disabled"); 703 | } 704 | 705 | initialize(); 706 | 707 | var spect = { 708 | show: show, 709 | hide: hide, 710 | toggle: toggle, 711 | reflow: reflow, 712 | option: option, 713 | enable: enable, 714 | disable: disable, 715 | set: function (c) { 716 | set(c); 717 | updateOriginalInput(); 718 | }, 719 | get: get, 720 | destroy: destroy, 721 | container: container 722 | }; 723 | 724 | spect.id = spectrums.push(spect) - 1; 725 | 726 | return spect; 727 | } 728 | 729 | /** 730 | * checkOffset - get the offset below/above and left/right element depending on screen position 731 | * Thanks https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.datepicker.js 732 | */ 733 | function getOffset(picker, input) { 734 | var extraY = 0; 735 | var dpWidth = picker.outerWidth(); 736 | var dpHeight = picker.outerHeight(); 737 | var inputHeight = input.outerHeight(); 738 | var doc = picker[0].ownerDocument; 739 | var docElem = doc.documentElement; 740 | var viewWidth = docElem.clientWidth + $(doc).scrollLeft(); 741 | var viewHeight = docElem.clientHeight + $(doc).scrollTop(); 742 | var offset = input.offset(); 743 | offset.top += inputHeight; 744 | 745 | offset.left -= 746 | Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? 747 | Math.abs(offset.left + dpWidth - viewWidth) : 0); 748 | 749 | offset.top -= 750 | Math.min(offset.top, ((offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? 751 | Math.abs(dpHeight + inputHeight - extraY) : extraY)); 752 | 753 | return offset; 754 | } 755 | 756 | /** 757 | * noop - do nothing 758 | */ 759 | function noop() { 760 | 761 | } 762 | 763 | /** 764 | * stopPropagation - makes the code only doing this a little easier to read in line 765 | */ 766 | function stopPropagation(e) { 767 | e.stopPropagation(); 768 | } 769 | 770 | /** 771 | * Create a function bound to a given object 772 | * Thanks to underscore.js 773 | */ 774 | function bind(func, obj) { 775 | var slice = Array.prototype.slice; 776 | var args = slice.call(arguments, 2); 777 | return function () { 778 | return func.apply(obj, args.concat(slice.call(arguments))); 779 | }; 780 | } 781 | 782 | /** 783 | * Lightweight drag helper. Handles containment within the element, so that 784 | * when dragging, the x is within [0,element.width] and y is within [0,element.height] 785 | */ 786 | function draggable(element, onmove, onstart, onstop) { 787 | onmove = onmove || function () { }; 788 | onstart = onstart || function () { }; 789 | onstop = onstop || function () { }; 790 | var doc = element.ownerDocument || document; 791 | var dragging = false; 792 | var offset = {}; 793 | var maxHeight = 0; 794 | var maxWidth = 0; 795 | var hasTouch = ('ontouchstart' in window); 796 | 797 | var duringDragEvents = {}; 798 | duringDragEvents["selectstart"] = prevent; 799 | duringDragEvents["dragstart"] = prevent; 800 | duringDragEvents[(hasTouch ? "touchmove" : "mousemove")] = move; 801 | duringDragEvents[(hasTouch ? "touchend" : "mouseup")] = stop; 802 | 803 | function prevent(e) { 804 | if (e.stopPropagation) { 805 | e.stopPropagation(); 806 | } 807 | if (e.preventDefault) { 808 | e.preventDefault(); 809 | } 810 | e.returnValue = false; 811 | } 812 | 813 | function move(e) { 814 | if (dragging) { 815 | // Mouseup happened outside of window 816 | if (IE && document.documentMode < 9 && !e.button) { 817 | return stop(); 818 | } 819 | 820 | var touches = e.originalEvent.touches; 821 | var pageX = touches ? touches[0].pageX : e.pageX; 822 | var pageY = touches ? touches[0].pageY : e.pageY; 823 | 824 | var dragX = Math.max(0, Math.min(pageX - offset.left, maxWidth)); 825 | var dragY = Math.max(0, Math.min(pageY - offset.top, maxHeight)); 826 | 827 | if (hasTouch) { 828 | // Stop scrolling in iOS 829 | prevent(e); 830 | } 831 | 832 | onmove.apply(element, [dragX, dragY, e]); 833 | } 834 | } 835 | function start(e) { 836 | var rightclick = (e.which) ? (e.which == 3) : (e.button == 2); 837 | var touches = e.originalEvent.touches; 838 | 839 | if (!rightclick && !dragging) { 840 | if (onstart.apply(element, arguments) !== false) { 841 | dragging = true; 842 | maxHeight = $(element).height(); 843 | maxWidth = $(element).width(); 844 | offset = $(element).offset(); 845 | 846 | $(doc).bind(duringDragEvents); 847 | $(doc.body).addClass("sp-dragging"); 848 | 849 | if (!hasTouch) { 850 | move(e); 851 | } 852 | 853 | prevent(e); 854 | } 855 | } 856 | } 857 | function stop() { 858 | if (dragging) { 859 | $(doc).unbind(duringDragEvents); 860 | $(doc.body).removeClass("sp-dragging"); 861 | onstop.apply(element, arguments); 862 | } 863 | dragging = false; 864 | } 865 | 866 | $(element).bind(hasTouch ? "touchstart" : "mousedown", start); 867 | } 868 | 869 | function throttle(func, wait, debounce) { 870 | var timeout; 871 | return function () { 872 | var context = this, args = arguments; 873 | var throttler = function () { 874 | timeout = null; 875 | func.apply(context, args); 876 | }; 877 | if (debounce) clearTimeout(timeout); 878 | if (debounce || !timeout) timeout = setTimeout(throttler, wait); 879 | }; 880 | } 881 | 882 | 883 | /** 884 | * Define a jQuery plugin 885 | */ 886 | var dataID = "spectrum.id"; 887 | $.fn.spectrum = function (opts, extra) { 888 | 889 | if (typeof opts == "string") { 890 | 891 | var returnValue = this; 892 | var args = Array.prototype.slice.call( arguments, 1 ); 893 | 894 | this.each(function () { 895 | var spect = spectrums[$(this).data(dataID)]; 896 | if (spect) { 897 | 898 | var method = spect[opts]; 899 | if (!method) { 900 | throw new Error( "Spectrum: no such method: '" + opts + "'" ); 901 | } 902 | 903 | if (opts == "get") { 904 | returnValue = spect.get(); 905 | } 906 | else if (opts == "container") { 907 | returnValue = spect.container; 908 | } 909 | else if (opts == "option") { 910 | returnValue = spect.option.apply(spect, args); 911 | } 912 | else if (opts == "destroy") { 913 | spect.destroy(); 914 | $(this).removeData(dataID); 915 | } 916 | else { 917 | method.apply(spect, args); 918 | } 919 | } 920 | }); 921 | 922 | return returnValue; 923 | } 924 | 925 | // Initializing a new instance of spectrum 926 | return this.spectrum("destroy").each(function () { 927 | var spect = spectrum(this, opts); 928 | $(this).data(dataID, spect.id); 929 | }); 930 | }; 931 | 932 | $.fn.spectrum.load = true; 933 | $.fn.spectrum.loadOpts = {}; 934 | $.fn.spectrum.draggable = draggable; 935 | $.fn.spectrum.defaults = defaultOpts; 936 | 937 | $.spectrum = { }; 938 | $.spectrum.localization = { }; 939 | $.spectrum.palettes = { }; 940 | 941 | $.fn.spectrum.processNativeColorInputs = function () { 942 | var colorInput = $("")[0]; 943 | var supportsColor = colorInput.type === "color" && colorInput.value != "!"; 944 | 945 | if (!supportsColor) { 946 | $("input[type=color]").spectrum({ 947 | preferredFormat: "hex6" 948 | }); 949 | } 950 | }; 951 | 952 | // TinyColor.js - - 2011 Brian Grinstead - v0.5 953 | 954 | (function (window) { 955 | 956 | var trimLeft = /^[\s,#]+/, 957 | trimRight = /\s+$/, 958 | tinyCounter = 0, 959 | math = Math, 960 | mathRound = math.round, 961 | mathMin = math.min, 962 | mathMax = math.max, 963 | mathRandom = math.random, 964 | parseFloat = window.parseFloat; 965 | 966 | function tinycolor(color, opts) { 967 | 968 | // If input is already a tinycolor, return itself 969 | if (typeof color == "object" && color.hasOwnProperty("_tc_id")) { 970 | return color; 971 | } 972 | 973 | var rgb = inputToRGB(color); 974 | var r = rgb.r, g = rgb.g, b = rgb.b, a = parseFloat(rgb.a), format = rgb.format; 975 | 976 | return { 977 | ok: rgb.ok, 978 | format: format, 979 | _tc_id: tinyCounter++, 980 | alpha: a, 981 | toHsv: function () { 982 | var hsv = rgbToHsv(r, g, b); 983 | return { h: hsv.h, s: hsv.s, v: hsv.v, a: a }; 984 | }, 985 | toHsvString: function () { 986 | var hsv = rgbToHsv(r, g, b); 987 | var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100); 988 | return (a == 1) ? 989 | "hsv(" + h + ", " + s + "%, " + v + "%)" : 990 | "hsva(" + h + ", " + s + "%, " + v + "%, " + a + ")"; 991 | }, 992 | toHsl: function () { 993 | var hsl = rgbToHsl(r, g, b); 994 | return { h: hsl.h, s: hsl.s, l: hsl.l, a: a }; 995 | }, 996 | toHslString: function () { 997 | var hsl = rgbToHsl(r, g, b); 998 | var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100); 999 | return (a == 1) ? 1000 | "hsl(" + h + ", " + s + "%, " + l + "%)" : 1001 | "hsla(" + h + ", " + s + "%, " + l + "%, " + a + ")"; 1002 | }, 1003 | toHex: function () { 1004 | return rgbToHex(r, g, b); 1005 | }, 1006 | toHexString: function (force6Char) { 1007 | return '#' + rgbToHex(r, g, b, force6Char); 1008 | }, 1009 | toRgb: function () { 1010 | return { r: mathRound(r), g: mathRound(g), b: mathRound(b), a: a }; 1011 | }, 1012 | toRgbString: function () { 1013 | return (a == 1) ? 1014 | "rgb(" + mathRound(r) + ", " + mathRound(g) + ", " + mathRound(b) + ")" : 1015 | "rgba(" + mathRound(r) + ", " + mathRound(g) + ", " + mathRound(b) + ", " + a + ")"; 1016 | }, 1017 | toName: function () { 1018 | return hexNames[rgbToHex(r, g, b)] || false; 1019 | }, 1020 | toFilter: function (opts, secondColor) { 1021 | 1022 | var hex = rgbToHex(r, g, b, true); 1023 | var secondHex = hex; 1024 | var alphaHex = Math.round(parseFloat(a) * 255).toString(16); 1025 | var secondAlphaHex = alphaHex; 1026 | var gradientType = opts && opts.gradientType ? "GradientType = 1, " : ""; 1027 | 1028 | if (secondColor) { 1029 | var s = tinycolor(secondColor); 1030 | secondHex = s.toHex(); 1031 | secondAlphaHex = Math.round(parseFloat(s.alpha) * 255).toString(16); 1032 | } 1033 | 1034 | return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr=#" + pad2(alphaHex) + hex + ",endColorstr=#" + pad2(secondAlphaHex) + secondHex + ")"; 1035 | }, 1036 | toString: function (format) { 1037 | format = format || this.format; 1038 | var formattedString = false; 1039 | if (format === "rgb") { 1040 | formattedString = this.toRgbString(); 1041 | } 1042 | if (format === "hex") { 1043 | formattedString = this.toHexString(); 1044 | } 1045 | if (format === "hex6") { 1046 | formattedString = this.toHexString(true); 1047 | } 1048 | if (format === "name") { 1049 | formattedString = this.toName(); 1050 | } 1051 | if (format === "hsl") { 1052 | formattedString = this.toHslString(); 1053 | } 1054 | if (format === "hsv") { 1055 | formattedString = this.toHsvString(); 1056 | } 1057 | 1058 | return formattedString || this.toHexString(true); 1059 | } 1060 | }; 1061 | } 1062 | 1063 | // If input is an object, force 1 into "1.0" to handle ratios properly 1064 | // String input requires "1.0" as input, so 1 will be treated as 1 1065 | tinycolor.fromRatio = function (color) { 1066 | 1067 | if (typeof color == "object") { 1068 | for (var i in color) { 1069 | if (color[i] === 1) { 1070 | color[i] = "1.0"; 1071 | } 1072 | } 1073 | } 1074 | 1075 | return tinycolor(color); 1076 | 1077 | }; 1078 | 1079 | // Given a string or object, convert that input to RGB 1080 | // Possible string inputs: 1081 | // 1082 | // "red" 1083 | // "#f00" or "f00" 1084 | // "#ff0000" or "ff0000" 1085 | // "rgb 255 0 0" or "rgb (255, 0, 0)" 1086 | // "rgb 1.0 0 0" or "rgb (1, 0, 0)" 1087 | // "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1" 1088 | // "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1" 1089 | // "hsl(0, 100%, 50%)" or "hsl 0 100% 50%" 1090 | // "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1" 1091 | // "hsv(0, 100%, 100%)" or "hsv 0 100% 100%" 1092 | // 1093 | function inputToRGB(color) { 1094 | 1095 | var rgb = { r: 0, g: 0, b: 0 }; 1096 | var a = 1; 1097 | var ok = false; 1098 | var format = false; 1099 | 1100 | if (typeof color == "string") { 1101 | color = stringInputToObject(color); 1102 | } 1103 | 1104 | if (typeof color == "object") { 1105 | if (color.hasOwnProperty("r") && color.hasOwnProperty("g") && color.hasOwnProperty("b")) { 1106 | rgb = rgbToRgb(color.r, color.g, color.b); 1107 | ok = true; 1108 | format = "rgb"; 1109 | } 1110 | else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("v")) { 1111 | rgb = hsvToRgb(color.h, color.s, color.v); 1112 | ok = true; 1113 | format = "hsv"; 1114 | } 1115 | else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("l")) { 1116 | rgb = hslToRgb(color.h, color.s, color.l); 1117 | ok = true; 1118 | format = "hsl"; 1119 | } 1120 | 1121 | if (color.hasOwnProperty("a")) { 1122 | a = color.a; 1123 | } 1124 | } 1125 | 1126 | rgb.r = mathMin(255, mathMax(rgb.r, 0)); 1127 | rgb.g = mathMin(255, mathMax(rgb.g, 0)); 1128 | rgb.b = mathMin(255, mathMax(rgb.b, 0)); 1129 | 1130 | 1131 | // Don't let the range of [0,255] come back in [0,1]. 1132 | // Potentially lose a little bit of precision here, but will fix issues where 1133 | // .5 gets interpreted as half of the total, instead of half of 1. 1134 | // If it was supposed to be 128, this was already taken care of in the conversion function 1135 | if (rgb.r < 1) { rgb.r = mathRound(rgb.r); } 1136 | if (rgb.g < 1) { rgb.g = mathRound(rgb.g); } 1137 | if (rgb.b < 1) { rgb.b = mathRound(rgb.b); } 1138 | 1139 | return { 1140 | ok: ok, 1141 | format: (color && color.format) || format, 1142 | r: rgb.r, 1143 | g: rgb.g, 1144 | b: rgb.b, 1145 | a: a 1146 | }; 1147 | } 1148 | 1149 | 1150 | 1151 | // Conversion Functions 1152 | // -------------------- 1153 | 1154 | // `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from: 1155 | // 1156 | 1157 | // `rgbToRgb` 1158 | // Handle bounds / percentage checking to conform to CSS color spec 1159 | // 1160 | // *Assumes:* r, g, b in [0, 255] or [0, 1] 1161 | // *Returns:* { r, g, b } in [0, 255] 1162 | function rgbToRgb(r, g, b) { 1163 | return { 1164 | r: bound01(r, 255) * 255, 1165 | g: bound01(g, 255) * 255, 1166 | b: bound01(b, 255) * 255 1167 | }; 1168 | } 1169 | 1170 | // `rgbToHsl` 1171 | // Converts an RGB color value to HSL. 1172 | // *Assumes:* r, g, and b are contained in [0, 255] or [0, 1] 1173 | // *Returns:* { h, s, l } in [0,1] 1174 | function rgbToHsl(r, g, b) { 1175 | 1176 | r = bound01(r, 255); 1177 | g = bound01(g, 255); 1178 | b = bound01(b, 255); 1179 | 1180 | var max = mathMax(r, g, b), min = mathMin(r, g, b); 1181 | var h, s, l = (max + min) / 2; 1182 | 1183 | if (max == min) { 1184 | h = s = 0; // achromatic 1185 | } 1186 | else { 1187 | var d = max - min; 1188 | s = l > 0.5 ? d / (2 - max - min) : d / (max + min); 1189 | switch (max) { 1190 | case r: h = (g - b) / d + (g < b ? 6 : 0); break; 1191 | case g: h = (b - r) / d + 2; break; 1192 | case b: h = (r - g) / d + 4; break; 1193 | } 1194 | 1195 | h /= 6; 1196 | } 1197 | 1198 | return { h: h, s: s, l: l }; 1199 | } 1200 | 1201 | // `hslToRgb` 1202 | // Converts an HSL color value to RGB. 1203 | // *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100] 1204 | // *Returns:* { r, g, b } in the set [0, 255] 1205 | function hslToRgb(h, s, l) { 1206 | var r, g, b; 1207 | 1208 | h = bound01(h, 360); 1209 | s = bound01(s, 100); 1210 | l = bound01(l, 100); 1211 | 1212 | function hue2rgb(p, q, t) { 1213 | if (t < 0) t += 1; 1214 | if (t > 1) t -= 1; 1215 | if (t < 1 / 6) return p + (q - p) * 6 * t; 1216 | if (t < 1 / 2) return q; 1217 | if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; 1218 | return p; 1219 | } 1220 | 1221 | if (s === 0) { 1222 | r = g = b = l; // achromatic 1223 | } 1224 | else { 1225 | var q = l < 0.5 ? l * (1 + s) : l + s - l * s; 1226 | var p = 2 * l - q; 1227 | r = hue2rgb(p, q, h + 1 / 3); 1228 | g = hue2rgb(p, q, h); 1229 | b = hue2rgb(p, q, h - 1 / 3); 1230 | } 1231 | 1232 | return { r: r * 255, g: g * 255, b: b * 255 }; 1233 | } 1234 | 1235 | // `rgbToHsv` 1236 | // Converts an RGB color value to HSV 1237 | // *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1] 1238 | // *Returns:* { h, s, v } in [0,1] 1239 | function rgbToHsv(r, g, b) { 1240 | 1241 | r = bound01(r, 255); 1242 | g = bound01(g, 255); 1243 | b = bound01(b, 255); 1244 | 1245 | var max = mathMax(r, g, b), min = mathMin(r, g, b); 1246 | var h, s, v = max; 1247 | 1248 | var d = max - min; 1249 | s = max === 0 ? 0 : d / max; 1250 | 1251 | if (max == min) { 1252 | h = 0; // achromatic 1253 | } 1254 | else { 1255 | switch (max) { 1256 | case r: h = (g - b) / d + (g < b ? 6 : 0); break; 1257 | case g: h = (b - r) / d + 2; break; 1258 | case b: h = (r - g) / d + 4; break; 1259 | } 1260 | h /= 6; 1261 | } 1262 | return { h: h, s: s, v: v }; 1263 | } 1264 | 1265 | // `hsvToRgb` 1266 | // Converts an HSV color value to RGB. 1267 | // *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100] 1268 | // *Returns:* { r, g, b } in the set [0, 255] 1269 | function hsvToRgb(h, s, v) { 1270 | h = bound01(h, 360) * 6; 1271 | s = bound01(s, 100); 1272 | v = bound01(v, 100); 1273 | 1274 | var i = math.floor(h), 1275 | f = h - i, 1276 | p = v * (1 - s), 1277 | q = v * (1 - f * s), 1278 | t = v * (1 - (1 - f) * s), 1279 | mod = i % 6, 1280 | r = [v, q, p, p, t, v][mod], 1281 | g = [t, v, v, q, p, p][mod], 1282 | b = [p, p, t, v, v, q][mod]; 1283 | 1284 | return { r: r * 255, g: g * 255, b: b * 255 }; 1285 | } 1286 | 1287 | // `rgbToHex` 1288 | // Converts an RGB color to hex 1289 | // Assumes r, g, and b are contained in the set [0, 255] 1290 | // Returns a 3 or 6 character hex 1291 | function rgbToHex(r, g, b, force6Char) { 1292 | 1293 | var hex = [ 1294 | pad2(mathRound(r).toString(16)), 1295 | pad2(mathRound(g).toString(16)), 1296 | pad2(mathRound(b).toString(16)) 1297 | ]; 1298 | 1299 | // Return a 3 character hex if possible 1300 | if (!force6Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) { 1301 | return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0); 1302 | } 1303 | 1304 | return hex.join(""); 1305 | } 1306 | 1307 | // `equals` 1308 | // Can be called with any tinycolor input 1309 | tinycolor.equals = function (color1, color2) { 1310 | if (!color1 || !color2) { return false; } 1311 | return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString(); 1312 | }; 1313 | tinycolor.random = function () { 1314 | return tinycolor.fromRatio({ 1315 | r: mathRandom(), 1316 | g: mathRandom(), 1317 | b: mathRandom() 1318 | }); 1319 | }; 1320 | 1321 | 1322 | // Modification Functions 1323 | // ---------------------- 1324 | // Thanks to less.js for some of the basics here 1325 | // 1326 | 1327 | 1328 | tinycolor.desaturate = function (color, amount) { 1329 | var hsl = tinycolor(color).toHsl(); 1330 | hsl.s -= ((amount || 10) / 100); 1331 | hsl.s = clamp01(hsl.s); 1332 | return tinycolor(hsl); 1333 | }; 1334 | tinycolor.saturate = function (color, amount) { 1335 | var hsl = tinycolor(color).toHsl(); 1336 | hsl.s += ((amount || 10) / 100); 1337 | hsl.s = clamp01(hsl.s); 1338 | return tinycolor(hsl); 1339 | }; 1340 | tinycolor.greyscale = function (color) { 1341 | return tinycolor.desaturate(color, 100); 1342 | }; 1343 | tinycolor.lighten = function (color, amount) { 1344 | var hsl = tinycolor(color).toHsl(); 1345 | hsl.l += ((amount || 10) / 100); 1346 | hsl.l = clamp01(hsl.l); 1347 | return tinycolor(hsl); 1348 | }; 1349 | tinycolor.darken = function (color, amount) { 1350 | var hsl = tinycolor(color).toHsl(); 1351 | hsl.l -= ((amount || 10) / 100); 1352 | hsl.l = clamp01(hsl.l); 1353 | return tinycolor(hsl); 1354 | }; 1355 | tinycolor.complement = function (color) { 1356 | var hsl = tinycolor(color).toHsl(); 1357 | hsl.h = (hsl.h + 0.5) % 1; 1358 | return tinycolor(hsl); 1359 | }; 1360 | 1361 | 1362 | // Combination Functions 1363 | // --------------------- 1364 | // Thanks to jQuery xColor for some of the ideas behind these 1365 | // 1366 | 1367 | tinycolor.triad = function (color) { 1368 | var hsl = tinycolor(color).toHsl(); 1369 | var h = hsl.h * 360; 1370 | return [ 1371 | tinycolor(color), 1372 | tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }), 1373 | tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l }) 1374 | ]; 1375 | }; 1376 | tinycolor.tetrad = function (color) { 1377 | var hsl = tinycolor(color).toHsl(); 1378 | var h = hsl.h * 360; 1379 | return [ 1380 | tinycolor(color), 1381 | tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }), 1382 | tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }), 1383 | tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l }) 1384 | ]; 1385 | }; 1386 | tinycolor.splitcomplement = function (color) { 1387 | var hsl = tinycolor(color).toHsl(); 1388 | var h = hsl.h * 360; 1389 | return [ 1390 | tinycolor(color), 1391 | tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l }), 1392 | tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l }) 1393 | ]; 1394 | }; 1395 | tinycolor.analogous = function (color, results, slices) { 1396 | results = results || 6; 1397 | slices = slices || 30; 1398 | 1399 | var hsl = tinycolor(color).toHsl(); 1400 | var part = 360 / slices; 1401 | var ret = [tinycolor(color)]; 1402 | 1403 | hsl.h *= 360; 1404 | 1405 | for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) { 1406 | hsl.h = (hsl.h + part) % 360; 1407 | ret.push(tinycolor(hsl)); 1408 | } 1409 | return ret; 1410 | }; 1411 | tinycolor.monochromatic = function (color, results) { 1412 | results = results || 6; 1413 | var hsv = tinycolor(color).toHsv(); 1414 | var h = hsv.h, s = hsv.s, v = hsv.v; 1415 | var ret = []; 1416 | var modification = 1 / results; 1417 | 1418 | while (results--) { 1419 | ret.push(tinycolor({ h: h, s: s, v: v })); 1420 | v = (v + modification) % 1; 1421 | } 1422 | 1423 | return ret; 1424 | }; 1425 | tinycolor.readable = function (color1, color2) { 1426 | var a = tinycolor(color1).toRgb(), b = tinycolor(color2).toRgb(); 1427 | return ( 1428 | (b.r - a.r) * (b.r - a.r) + 1429 | (b.g - a.g) * (b.g - a.g) + 1430 | (b.b - a.b) * (b.b - a.b) 1431 | ) > 0x28A4; 1432 | }; 1433 | 1434 | // Big List of Colors 1435 | // --------- 1436 | // 1437 | var names = tinycolor.names = { 1438 | aliceblue: "f0f8ff", 1439 | antiquewhite: "faebd7", 1440 | aqua: "0ff", 1441 | aquamarine: "7fffd4", 1442 | azure: "f0ffff", 1443 | beige: "f5f5dc", 1444 | bisque: "ffe4c4", 1445 | black: "000", 1446 | blanchedalmond: "ffebcd", 1447 | blue: "00f", 1448 | blueviolet: "8a2be2", 1449 | brown: "a52a2a", 1450 | burlywood: "deb887", 1451 | burntsienna: "ea7e5d", 1452 | cadetblue: "5f9ea0", 1453 | chartreuse: "7fff00", 1454 | chocolate: "d2691e", 1455 | coral: "ff7f50", 1456 | cornflowerblue: "6495ed", 1457 | cornsilk: "fff8dc", 1458 | crimson: "dc143c", 1459 | cyan: "0ff", 1460 | darkblue: "00008b", 1461 | darkcyan: "008b8b", 1462 | darkgoldenrod: "b8860b", 1463 | darkgray: "a9a9a9", 1464 | darkgreen: "006400", 1465 | darkgrey: "a9a9a9", 1466 | darkkhaki: "bdb76b", 1467 | darkmagenta: "8b008b", 1468 | darkolivegreen: "556b2f", 1469 | darkorange: "ff8c00", 1470 | darkorchid: "9932cc", 1471 | darkred: "8b0000", 1472 | darksalmon: "e9967a", 1473 | darkseagreen: "8fbc8f", 1474 | darkslateblue: "483d8b", 1475 | darkslategray: "2f4f4f", 1476 | darkslategrey: "2f4f4f", 1477 | darkturquoise: "00ced1", 1478 | darkviolet: "9400d3", 1479 | deeppink: "ff1493", 1480 | deepskyblue: "00bfff", 1481 | dimgray: "696969", 1482 | dimgrey: "696969", 1483 | dodgerblue: "1e90ff", 1484 | firebrick: "b22222", 1485 | floralwhite: "fffaf0", 1486 | forestgreen: "228b22", 1487 | fuchsia: "f0f", 1488 | gainsboro: "dcdcdc", 1489 | ghostwhite: "f8f8ff", 1490 | gold: "ffd700", 1491 | goldenrod: "daa520", 1492 | gray: "808080", 1493 | green: "008000", 1494 | greenyellow: "adff2f", 1495 | grey: "808080", 1496 | honeydew: "f0fff0", 1497 | hotpink: "ff69b4", 1498 | indianred: "cd5c5c", 1499 | indigo: "4b0082", 1500 | ivory: "fffff0", 1501 | khaki: "f0e68c", 1502 | lavender: "e6e6fa", 1503 | lavenderblush: "fff0f5", 1504 | lawngreen: "7cfc00", 1505 | lemonchiffon: "fffacd", 1506 | lightblue: "add8e6", 1507 | lightcoral: "f08080", 1508 | lightcyan: "e0ffff", 1509 | lightgoldenrodyellow: "fafad2", 1510 | lightgray: "d3d3d3", 1511 | lightgreen: "90ee90", 1512 | lightgrey: "d3d3d3", 1513 | lightpink: "ffb6c1", 1514 | lightsalmon: "ffa07a", 1515 | lightseagreen: "20b2aa", 1516 | lightskyblue: "87cefa", 1517 | lightslategray: "789", 1518 | lightslategrey: "789", 1519 | lightsteelblue: "b0c4de", 1520 | lightyellow: "ffffe0", 1521 | lime: "0f0", 1522 | limegreen: "32cd32", 1523 | linen: "faf0e6", 1524 | magenta: "f0f", 1525 | maroon: "800000", 1526 | mediumaquamarine: "66cdaa", 1527 | mediumblue: "0000cd", 1528 | mediumorchid: "ba55d3", 1529 | mediumpurple: "9370db", 1530 | mediumseagreen: "3cb371", 1531 | mediumslateblue: "7b68ee", 1532 | mediumspringgreen: "00fa9a", 1533 | mediumturquoise: "48d1cc", 1534 | mediumvioletred: "c71585", 1535 | midnightblue: "191970", 1536 | mintcream: "f5fffa", 1537 | mistyrose: "ffe4e1", 1538 | moccasin: "ffe4b5", 1539 | navajowhite: "ffdead", 1540 | navy: "000080", 1541 | oldlace: "fdf5e6", 1542 | olive: "808000", 1543 | olivedrab: "6b8e23", 1544 | orange: "ffa500", 1545 | orangered: "ff4500", 1546 | orchid: "da70d6", 1547 | palegoldenrod: "eee8aa", 1548 | palegreen: "98fb98", 1549 | paleturquoise: "afeeee", 1550 | palevioletred: "db7093", 1551 | papayawhip: "ffefd5", 1552 | peachpuff: "ffdab9", 1553 | peru: "cd853f", 1554 | pink: "ffc0cb", 1555 | plum: "dda0dd", 1556 | powderblue: "b0e0e6", 1557 | purple: "800080", 1558 | red: "f00", 1559 | rosybrown: "bc8f8f", 1560 | royalblue: "4169e1", 1561 | saddlebrown: "8b4513", 1562 | salmon: "fa8072", 1563 | sandybrown: "f4a460", 1564 | seagreen: "2e8b57", 1565 | seashell: "fff5ee", 1566 | sienna: "a0522d", 1567 | silver: "c0c0c0", 1568 | skyblue: "87ceeb", 1569 | slateblue: "6a5acd", 1570 | slategray: "708090", 1571 | slategrey: "708090", 1572 | snow: "fffafa", 1573 | springgreen: "00ff7f", 1574 | steelblue: "4682b4", 1575 | tan: "d2b48c", 1576 | teal: "008080", 1577 | thistle: "d8bfd8", 1578 | tomato: "ff6347", 1579 | turquoise: "40e0d0", 1580 | violet: "ee82ee", 1581 | wheat: "f5deb3", 1582 | white: "fff", 1583 | whitesmoke: "f5f5f5", 1584 | yellow: "ff0", 1585 | yellowgreen: "9acd32" 1586 | }; 1587 | 1588 | // Make it easy to access colors via `hexNames[hex]` 1589 | var hexNames = tinycolor.hexNames = flip(names); 1590 | 1591 | 1592 | // Utilities 1593 | // --------- 1594 | 1595 | // `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }` 1596 | function flip(o) { 1597 | var flipped = {}; 1598 | for (var i in o) { 1599 | if (o.hasOwnProperty(i)) { 1600 | flipped[o[i]] = i; 1601 | } 1602 | } 1603 | return flipped; 1604 | } 1605 | 1606 | // Take input from [0, n] and return it as [0, 1] 1607 | function bound01(n, max) { 1608 | if (isOnePointZero(n)) { n = "100%"; } 1609 | 1610 | var processPercent = isPercentage(n); 1611 | n = mathMin(max, mathMax(0, parseFloat(n))); 1612 | 1613 | // Automatically convert percentage into number 1614 | if (processPercent) { 1615 | n = n * (max / 100); 1616 | } 1617 | 1618 | // Handle floating point rounding errors 1619 | if (math.abs(n - max) < 0.000001) { 1620 | return 1; 1621 | } 1622 | else if (n >= 1) { 1623 | return (n % max) / parseFloat(max); 1624 | } 1625 | return n; 1626 | } 1627 | 1628 | // Force a number between 0 and 1 1629 | function clamp01(val) { 1630 | return mathMin(1, mathMax(0, val)); 1631 | } 1632 | 1633 | // Parse an integer into hex 1634 | function parseHex(val) { 1635 | return parseInt(val, 16); 1636 | } 1637 | 1638 | // Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1 1639 | // 1640 | function isOnePointZero(n) { 1641 | return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1; 1642 | } 1643 | 1644 | // Check to see if string passed in is a percentage 1645 | function isPercentage(n) { 1646 | return typeof n === "string" && n.indexOf('%') != -1; 1647 | } 1648 | 1649 | // Force a hex value to have 2 characters 1650 | function pad2(c) { 1651 | return c.length == 1 ? '0' + c : '' + c; 1652 | } 1653 | 1654 | var matchers = (function () { 1655 | 1656 | // 1657 | var CSS_INTEGER = "[-\\+]?\\d+%?"; 1658 | 1659 | // 1660 | var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?"; 1661 | 1662 | // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome. 1663 | var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")"; 1664 | 1665 | // Actual matching. 1666 | // Parentheses and commas are optional, but not required. 1667 | // Whitespace can take the place of commas or opening paren 1668 | var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; 1669 | var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; 1670 | 1671 | return { 1672 | rgb: new RegExp("rgb" + PERMISSIVE_MATCH3), 1673 | rgba: new RegExp("rgba" + PERMISSIVE_MATCH4), 1674 | hsl: new RegExp("hsl" + PERMISSIVE_MATCH3), 1675 | hsla: new RegExp("hsla" + PERMISSIVE_MATCH4), 1676 | hsv: new RegExp("hsv" + PERMISSIVE_MATCH3), 1677 | hex3: /^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, 1678 | hex6: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ 1679 | }; 1680 | })(); 1681 | 1682 | // `stringInputToObject` 1683 | // Permissive string parsing. Take in a number of formats, and output an object 1684 | // based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}` 1685 | function stringInputToObject(color) { 1686 | 1687 | color = color.replace(trimLeft, '').replace(trimRight, '').toLowerCase(); 1688 | var named = false; 1689 | if (names[color]) { 1690 | color = names[color]; 1691 | named = true; 1692 | } 1693 | else if (color == 'transparent') { 1694 | return { r: 0, g: 0, b: 0, a: 0 }; 1695 | } 1696 | 1697 | // Try to match string input using regular expressions. 1698 | // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360] 1699 | // Just return an object and let the conversion functions handle that. 1700 | // This way the result will be the same whether the tinycolor is initialized with string or object. 1701 | var match; 1702 | if ((match = matchers.rgb.exec(color))) { 1703 | return { r: match[1], g: match[2], b: match[3] }; 1704 | } 1705 | if ((match = matchers.rgba.exec(color))) { 1706 | return { r: match[1], g: match[2], b: match[3], a: match[4] }; 1707 | } 1708 | if ((match = matchers.hsl.exec(color))) { 1709 | return { h: match[1], s: match[2], l: match[3] }; 1710 | } 1711 | if ((match = matchers.hsla.exec(color))) { 1712 | return { h: match[1], s: match[2], l: match[3], a: match[4] }; 1713 | } 1714 | if ((match = matchers.hsv.exec(color))) { 1715 | return { h: match[1], s: match[2], v: match[3] }; 1716 | } 1717 | if ((match = matchers.hex6.exec(color))) { 1718 | return { 1719 | r: parseHex(match[1]), 1720 | g: parseHex(match[2]), 1721 | b: parseHex(match[3]), 1722 | format: named ? "name" : "hex" 1723 | }; 1724 | } 1725 | if ((match = matchers.hex3.exec(color))) { 1726 | return { 1727 | r: parseHex(match[1] + '' + match[1]), 1728 | g: parseHex(match[2] + '' + match[2]), 1729 | b: parseHex(match[3] + '' + match[3]), 1730 | format: named ? "name" : "hex" 1731 | }; 1732 | } 1733 | 1734 | return false; 1735 | } 1736 | 1737 | // Everything is ready, expose to window 1738 | window.tinycolor = tinycolor; 1739 | 1740 | })(this); 1741 | 1742 | $(function () { 1743 | if ($.fn.spectrum.load) { 1744 | $.fn.spectrum.processNativeColorInputs(); 1745 | } 1746 | }); 1747 | 1748 | })(window, jQuery); 1749 | -------------------------------------------------------------------------------- /public/_includes/js/jquery.1.9.1.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license 2 | //@ sourceMappingURL=jquery.min.map 3 | */(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="
t
",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj; 4 | return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="
",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&>(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X
","
"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l) 5 | }b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("