Mercurial > hg > digilib-old
annotate webapp/src/main/webapp/jquery/jquery.digilib.geometry.js @ 944:3916303b8f17
"preview" works now also for zoomIn/Out
| author | robcast |
|---|---|
| date | Wed, 28 Dec 2011 22:04:18 +0100 |
| parents | 7779b37d1d05 |
| children | 3d5e7458f9ae |
| rev | line source |
|---|---|
| 785 | 1 /** required digilib geometry plugin |
| 2 */ | |
| 3 | |
| 4 (function($) { | |
| 5 //var dlGeometry = function() { | |
| 6 /* | |
| 7 * Size class | |
| 8 */ | |
| 9 var size = function(w, h) { | |
| 10 var that; | |
| 11 if (typeof w === "object") { | |
| 12 // assume its size | |
| 13 that = { | |
| 14 width : w.width, | |
| 15 height : w.height | |
| 16 }; | |
| 17 } else { | |
| 18 that = { | |
| 19 width : parseFloat(w), | |
| 20 height : parseFloat(h) | |
| 21 }; | |
| 22 } | |
| 23 that.equals = function(other) { | |
| 24 return (this.width === other.width && this.height === other.height); | |
| 25 }; | |
| 26 that.toString = function() { | |
| 27 return (this.width + "x" + this.height); | |
| 28 }; | |
| 29 return that; | |
| 30 }; | |
| 31 | |
| 32 /* | |
| 33 * Position class | |
| 34 */ | |
| 35 var position = function(x, y) { | |
| 36 var that; | |
| 37 if (typeof x === "object") { | |
| 38 if (x instanceof jQuery) { | |
| 39 // jQuery object | |
| 40 var pos = x.offset(); | |
| 41 that = { | |
| 42 x : pos.left, | |
| 43 y : pos.top | |
| 44 }; | |
| 45 } else { | |
| 46 if (x.x != null) { | |
| 47 // position object | |
| 48 that = { | |
| 49 x : x.x, | |
| 50 y : x.y | |
| 51 }; | |
| 52 } | |
| 53 if (x.pageX != null) { | |
| 54 // event object | |
| 55 that = { | |
| 56 x : x.pageX, | |
| 57 y : x.pageY | |
| 58 }; | |
| 59 } | |
| 60 } | |
| 61 } else { | |
| 62 that = { | |
| 63 x : parseFloat(x), | |
| 64 y : parseFloat(y) | |
| 65 }; | |
| 66 } | |
| 67 that.equals = function(other) { | |
| 68 return (this.x === other.x && this.y === other.y); | |
| 69 }; | |
| 70 // add position other to this | |
| 71 that.add = function(other) { | |
| 72 this.x += other.x; | |
| 73 this.y += other.y; | |
| 74 return this; | |
| 75 }; | |
| 76 // returns negative position | |
| 77 that.neg = function() { | |
| 78 return position({ | |
| 79 x : -this.x, | |
| 80 y : -this.y | |
| 81 }); | |
| 82 }; | |
| 83 // returns new position that is the difference between this and other | |
| 84 that.delta = function(other) { | |
| 85 return position({ | |
| 86 x : other.x - this.x, | |
| 87 y : other.y - this.y | |
| 88 }); | |
| 89 }; | |
| 944 | 90 // adjusts CSS position of $elem to this position |
| 785 | 91 that.adjustDiv = function($elem) { |
| 92 $elem.offset({ | |
| 93 left : this.x, | |
| 94 top : this.y | |
| 95 }); | |
| 96 }; | |
| 97 // returns distance of this position to pos (length if pos == null) | |
| 98 that.distance = function(pos) { | |
| 99 if (pos == null) { | |
| 100 pos = { | |
| 101 x : 0, | |
| 102 y : 0 | |
| 103 }; | |
| 104 } | |
| 105 var dx = pos.x - this.x; | |
| 106 var dy = pos.y - this.y; | |
| 107 return Math.sqrt(dx * dx + dy * dy); | |
| 108 }; | |
| 109 that.toString = function() { | |
| 110 return (this.x + "," + this.y); | |
| 111 }; | |
| 112 return that; | |
| 113 }; | |
| 114 /* | |
| 115 * Rectangle class | |
| 116 */ | |
| 117 var rectangle = function(x, y, w, h) { | |
| 118 var that = {}; | |
| 119 if (typeof x === "object") { | |
| 120 if (x instanceof jQuery) { | |
| 121 // jQuery object | |
| 122 var pos = x.offset(); | |
| 123 that = { | |
| 124 x : pos.left, | |
| 125 y : pos.top, | |
| 126 width : x.width(), | |
| 127 height : x.height() | |
| 128 }; | |
| 129 } else if (y == null) { | |
| 130 // assume x is rectangle | |
| 131 that = { | |
| 132 x : x.x, | |
| 133 y : x.y, | |
| 134 width : x.width, | |
| 135 height : x.height | |
| 136 }; | |
| 137 } else { | |
| 138 // assume x and y are Position | |
| 139 that = { | |
| 140 x : Math.min(x.x, y.x), | |
| 141 y : Math.min(x.y, y.y), | |
| 142 width : Math.abs(y.x - x.x), | |
| 143 height : Math.abs(y.y - x.y) | |
| 144 }; | |
| 145 } | |
| 146 } else { | |
| 147 that = { | |
| 148 x : parseFloat(x), | |
| 149 y : parseFloat(y), | |
| 150 width : parseFloat(w), | |
| 151 height : parseFloat(h) | |
| 152 }; | |
| 153 } | |
| 154 // returns a copy of this Rectangle | |
| 155 that.copy = function() { | |
| 156 return rectangle(this); | |
| 157 }; | |
| 158 // returns the position of this Rectangle | |
| 159 that.getPosition = function() { | |
| 160 return position(this); | |
| 161 }; | |
| 162 // returns the size of this Rectangle | |
| 163 that.getSize = function() { | |
| 164 return size(this); | |
| 165 }; | |
| 166 // returns the upper left corner position | |
| 167 that.getPt1 = that.getPosition; | |
| 168 // returns the lower right corner position of this Rectangle | |
| 169 that.getPt2 = function() { | |
| 170 return position({ | |
| 171 x : this.x + this.width, | |
| 172 y : this.y + this.height | |
| 173 }); | |
| 174 }; | |
| 175 // sets the upper left corner position to pos | |
| 176 that.setPosition = function(pos) { | |
| 177 this.x = pos.x; | |
| 178 this.y = pos.y; | |
| 179 return this; | |
| 180 }; | |
|
807
1b1728926534
geometry: overlapsRect() plus some comment clarifications
hertzhaft
parents:
793
diff
changeset
|
181 // adds pos to the position |
| 785 | 182 that.setPt1 = that.setPosition; // TODO: not really the same |
| 183 that.addPosition = function(pos) { | |
| 184 this.x += pos.x; | |
| 185 this.y += pos.y; | |
| 186 return this; | |
| 187 }; | |
| 877 | 188 // adds pos to the dimensions |
| 189 that.enlarge = function(pos) { | |
| 190 this.width += pos.x; | |
| 191 this.height += pos.y; | |
| 192 return this; | |
| 193 }; | |
| 785 | 194 // sets the lower right corner to position pos |
| 195 that.setPt2 = function(pos) { | |
| 196 this.width = pos.x - this.x; | |
| 197 this.height = pos.y - this.y; | |
| 198 return this; | |
| 199 }; | |
| 200 // returns the center position of this Rectangle | |
| 201 that.getCenter = function() { | |
| 202 return position({ | |
| 203 x : this.x + this.width / 2, | |
| 204 y : this.y + this.height / 2 | |
| 205 }); | |
| 206 }; | |
|
807
1b1728926534
geometry: overlapsRect() plus some comment clarifications
hertzhaft
parents:
793
diff
changeset
|
207 // moves this rectangle's center to position pos |
| 785 | 208 that.setCenter = function(pos) { |
| 209 this.x = pos.x - this.width / 2; | |
| 210 this.y = pos.y - this.height / 2; | |
| 211 return this; | |
| 212 }; | |
| 944 | 213 // returns true if both rectangles have equal position and size |
| 785 | 214 that.equals = function(other) { |
| 215 var eq = (this.x === other.x && this.y === other.y && this.width === other.width); | |
| 216 return eq; | |
| 217 }; | |
| 944 | 218 // returns a rectangle with the difference width, height and position |
| 219 that.delta = function(other) { | |
| 220 return rectangle(other.x - this.x, other.y - this.y, | |
| 221 other.width - this.width, other.height - this.height); | |
| 222 }; | |
| 785 | 223 // returns the area of this Rectangle |
| 224 that.getArea = function() { | |
| 225 return (this.width * this.height); | |
| 226 }; | |
| 227 // eliminates negative width and height | |
| 228 that.normalize = function() { | |
| 229 var p = this.getPt2(); | |
| 230 this.x = Math.min(this.x, p.x); | |
| 231 this.y = Math.min(this.y, p.y); | |
| 232 this.width = Math.abs(this.width); | |
| 233 this.height = Math.abs(this.height); | |
| 234 return this; | |
| 235 }; | |
| 236 // returns if Position "pos" lies inside of this rectangle | |
| 237 that.containsPosition = function(pos) { | |
| 238 var ct = ((pos.x >= this.x) && (pos.y >= this.y) | |
| 239 && (pos.x <= this.x + this.width) && (pos.y <= this.y | |
| 240 + this.height)); | |
| 241 return ct; | |
| 242 }; | |
|
807
1b1728926534
geometry: overlapsRect() plus some comment clarifications
hertzhaft
parents:
793
diff
changeset
|
243 // returns true if rectangle "rect" is contained in this rectangle |
| 785 | 244 that.containsRect = function(rect) { |
| 245 return (this.containsPosition(rect.getPt1()) && this | |
| 246 .containsPosition(rect.getPt2())); | |
| 247 }; | |
|
807
1b1728926534
geometry: overlapsRect() plus some comment clarifications
hertzhaft
parents:
793
diff
changeset
|
248 // returns true if rectangle "rect" and this rectangle overlap |
|
1b1728926534
geometry: overlapsRect() plus some comment clarifications
hertzhaft
parents:
793
diff
changeset
|
249 that.overlapsRect = function(rect) { |
| 812 | 250 return this.intersect(rect) != null; |
|
807
1b1728926534
geometry: overlapsRect() plus some comment clarifications
hertzhaft
parents:
793
diff
changeset
|
251 }; |
| 785 | 252 // changes this rectangle's x/y values so it stays inside of rectangle |
|
807
1b1728926534
geometry: overlapsRect() plus some comment clarifications
hertzhaft
parents:
793
diff
changeset
|
253 // "rect", keeping the proportions |
| 785 | 254 that.stayInside = function(rect) { |
| 812 | 255 this.x = Math.max(this.x, rect.x); |
| 256 this.y = Math.max(this.y, rect.y); | |
| 785 | 257 if (this.x + this.width > rect.x + rect.width) { |
| 258 this.x = rect.x + rect.width - this.width; | |
| 259 } | |
| 260 if (this.y + this.height > rect.y + rect.height) { | |
| 261 this.y = rect.y + rect.height - this.height; | |
| 262 } | |
| 263 return this; | |
| 264 }; | |
|
807
1b1728926534
geometry: overlapsRect() plus some comment clarifications
hertzhaft
parents:
793
diff
changeset
|
265 // clips this rectangle so it stays inside of rectangle "rect" |
| 785 | 266 that.clipTo = function(rect) { |
| 267 var p1 = rect.getPt1(); | |
| 268 var p2 = rect.getPt2(); | |
| 269 var this2 = this.getPt2(); | |
| 270 this.setPosition(position(Math.max(this.x, p1.x), Math.max(this.y, p1.y))); | |
| 271 this.setPt2(position(Math.min(this2.x, p2.x), Math.min(this2.y, p2.y))); | |
| 272 return this; | |
| 273 }; | |
|
807
1b1728926534
geometry: overlapsRect() plus some comment clarifications
hertzhaft
parents:
793
diff
changeset
|
274 // returns the intersection of rectangle "rect" and this one |
| 785 | 275 that.intersect = function(rect) { |
| 847 | 276 var r = rect.copy(); |
| 277 var result = r.clipTo(this); | |
| 278 if (result.width < 0 || result.height < 0) result = null; | |
| 279 return result; | |
| 785 | 280 }; |
| 812 | 281 |
|
807
1b1728926534
geometry: overlapsRect() plus some comment clarifications
hertzhaft
parents:
793
diff
changeset
|
282 // returns a copy of rectangle "rect" that fits into this one |
|
1b1728926534
geometry: overlapsRect() plus some comment clarifications
hertzhaft
parents:
793
diff
changeset
|
283 // (moving it first) |
| 785 | 284 that.fit = function(rect) { |
| 847 | 285 var r = rect.copy(); |
| 286 r.x = Math.max(r.x, this.x); | |
| 287 r.y = Math.max(r.y, this.x); | |
| 288 if (r.x + r.width > this.x + this.width) { | |
| 289 r.x = this.x + this.width - r.width; | |
| 785 | 290 } |
| 847 | 291 if (r.y + r.height > this.y + this.height) { |
| 292 r.y = this.y + this.height - r.height; | |
| 785 | 293 } |
| 847 | 294 return r.intersect(this); |
| 785 | 295 }; |
|
807
1b1728926534
geometry: overlapsRect() plus some comment clarifications
hertzhaft
parents:
793
diff
changeset
|
296 // adjusts position and size of jQuery element "$elem" to this rectangle |
| 785 | 297 that.adjustDiv = function($elem) { |
| 298 $elem.offset({ | |
| 299 left : this.x, | |
| 300 top : this.y | |
| 301 }); | |
| 302 $elem.width(this.width).height(this.height); | |
| 303 }; | |
|
807
1b1728926534
geometry: overlapsRect() plus some comment clarifications
hertzhaft
parents:
793
diff
changeset
|
304 // returns position and size of this rectangle in css-compatible format |
| 785 | 305 that.getAsCss = function() { |
| 306 return { | |
| 307 left : this.x, | |
| 308 top : this.y, | |
| 309 width : this.width, | |
| 310 height : this.height | |
| 311 }; | |
| 312 }; | |
|
807
1b1728926534
geometry: overlapsRect() plus some comment clarifications
hertzhaft
parents:
793
diff
changeset
|
313 // returns position and size of this rectangle formatted for SVG attributes |
|
1b1728926534
geometry: overlapsRect() plus some comment clarifications
hertzhaft
parents:
793
diff
changeset
|
314 that.getAsSvg = function() { |
|
1b1728926534
geometry: overlapsRect() plus some comment clarifications
hertzhaft
parents:
793
diff
changeset
|
315 return [this.x, this.y, this.width, this.height].join(" "); |
|
1b1728926534
geometry: overlapsRect() plus some comment clarifications
hertzhaft
parents:
793
diff
changeset
|
316 }; |
|
1b1728926534
geometry: overlapsRect() plus some comment clarifications
hertzhaft
parents:
793
diff
changeset
|
317 // returns size and position of this rectangle formatted for ??? (w x h@x,y) |
| 785 | 318 that.toString = function() { |
| 319 return this.width + "x" + this.height + "@" + this.x + "," + this.y; | |
| 320 }; | |
| 321 return that; | |
| 322 }; | |
| 323 | |
| 324 /* | |
| 325 * Transform class | |
| 326 * | |
| 327 * defines a class of affine transformations | |
| 328 */ | |
| 329 var transform = function(spec) { | |
| 330 var that = { | |
| 331 m00 : 1.0, | |
| 332 m01 : 0.0, | |
| 333 m02 : 0.0, | |
| 334 m10 : 0.0, | |
| 335 m11 : 1.0, | |
| 336 m12 : 0.0, | |
| 337 m20 : 0.0, | |
| 338 m21 : 0.0, | |
| 339 m22 : 1.0 | |
| 340 }; | |
| 341 if (spec) { | |
| 342 jQuery.extend(that, spec); | |
| 343 } | |
| 344 ; | |
| 345 that.concat = function(trafA) { | |
| 346 // add Transform trafA to this Transform (i.e. this = trafC = trafA | |
| 347 // * this) | |
| 348 var trafC = {}; | |
| 349 for ( var i = 0; i < 3; i++) { | |
| 350 for ( var j = 0; j < 3; j++) { | |
| 351 var c = 0.0; | |
| 352 for ( var k = 0; k < 3; k++) { | |
| 353 c += trafA["m" + i + k] * this["m" + k + j]; | |
| 354 } | |
| 355 trafC["m" + i + j] = c; | |
| 356 } | |
| 357 } | |
| 358 jQuery.extend(this, trafC); | |
| 359 return this; | |
| 360 }; | |
| 361 that.transform = function(rect) { | |
| 362 // returns transformed Rectangle or Position with this Transform | |
| 363 // applied | |
| 364 var x = this.m00 * rect.x + this.m01 * rect.y + this.m02; | |
| 365 var y = this.m10 * rect.x + this.m11 * rect.y + this.m12; | |
| 366 var pt = position(x, y); | |
| 367 if (rect.width) { | |
| 368 // transform the other corner point | |
| 369 var pt2 = this.transform(rect.getPt2()); | |
| 370 return rectangle(pt, pt2); | |
| 371 } | |
| 372 return pt; | |
| 373 }; | |
| 374 that.invtransform = function(rect) { | |
| 375 // returns transformed Rectangle or Position with the inverse of | |
| 376 // this Transform applied | |
| 377 var det = this.m00 * this.m11 - this.m01 * this.m10; | |
| 378 var x = (this.m11 * rect.x - this.m01 * rect.y - this.m11 | |
| 379 * this.m02 + this.m01 * this.m12) | |
| 380 / det; | |
| 381 var y = (-this.m10 * rect.x + this.m00 * rect.y + this.m10 | |
| 382 * this.m02 - this.m00 * this.m12) | |
| 383 / det; | |
| 384 var pt = position(x, y); | |
| 385 if (rect.width) { | |
| 386 // transform the other corner point | |
| 387 var pt2 = this.invtransform(rect.getPt2()); | |
| 388 return rectangle(pt, pt2); | |
| 389 } | |
| 390 return pt; | |
| 391 }; | |
| 392 that.toString = function(pretty) { | |
| 393 var s = '['; | |
| 394 if (pretty) | |
| 395 s += '\n'; | |
| 396 for ( var i = 0; i < 3; ++i) { | |
| 397 s += '['; | |
| 398 for ( var j = 0; j < 3; ++j) { | |
| 399 if (j) | |
| 400 s += ','; | |
| 401 s += this['m' + i + j]; | |
| 402 } | |
| 403 s += ']'; | |
| 404 if (pretty) | |
| 405 s += '\n'; | |
| 406 } | |
| 407 s += ']'; | |
| 408 if (pretty) | |
| 409 s += '\n'; | |
| 410 return s; | |
| 411 }; | |
| 412 // add class methods to instance | |
| 413 that.getRotation = transform.getRotation; | |
| 414 that.getRotationAround = transform.getRotationAround; | |
| 415 that.getTranslation = transform.getTranslation; | |
| 416 that.getMirror = transform.getMirror; | |
| 417 that.getScale = transform.getScale; | |
| 418 | |
| 419 return that; | |
| 420 }; | |
| 421 | |
| 422 transform.getRotation = function(angle) { | |
| 423 // returns a Transform that is a rotation by angle degrees around [0,0] | |
| 424 if (angle !== 0) { | |
| 425 var t = Math.PI * parseFloat(angle) / 180.0; | |
| 426 var cost = Math.cos(t); | |
| 427 var sint = Math.sin(t); | |
| 428 var traf = { | |
| 429 m00 : cost, | |
| 430 m01 : -sint, | |
| 431 m10 : sint, | |
| 432 m11 : cost | |
| 433 }; | |
| 434 return transform(traf); | |
| 435 } | |
| 436 return transform(); | |
| 437 }; | |
| 438 | |
| 439 transform.getRotationAround = function(angle, pos) { | |
| 440 // returns a Transform that is a rotation by angle degrees around pos | |
| 441 var traf = transform.getTranslation(pos.neg()); | |
| 442 traf.concat(transform.getRotation(angle)); | |
| 443 traf.concat(transform.getTranslation(pos)); | |
| 444 return traf; | |
| 445 }; | |
| 446 | |
| 447 transform.getTranslation = function(pos) { | |
| 448 // returns a Transform that is a translation by [pos.x, pos,y] | |
| 449 var traf = { | |
| 450 m02 : pos.x, | |
| 451 m12 : pos.y | |
| 452 }; | |
| 453 return transform(traf); | |
| 454 }; | |
| 455 | |
| 456 transform.getMirror = function(type) { | |
| 457 // returns a Transform that is a mirror about the axis type | |
| 458 if (type === 'x') { | |
| 459 var traf = { | |
| 460 m00 : 1, | |
| 461 m11 : -1 | |
| 462 }; | |
| 463 } else { | |
| 464 var traf = { | |
| 465 m00 : -1, | |
| 466 m11 : 1 | |
| 467 }; | |
| 468 } | |
| 469 return transform(traf); | |
| 470 }; | |
| 471 | |
| 472 transform.getScale = function(size) { | |
| 473 // returns a Transform that is a scale by [size.width, size.height] | |
| 474 var traf = { | |
| 475 m00 : size.width, | |
| 476 m11 : size.height | |
| 477 }; | |
| 478 return transform(traf); | |
| 479 }; | |
| 480 | |
| 786 | 481 // export constructor functions to digilib plugin |
|
793
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
482 var geometry = { |
| 786 | 483 size : size, |
| 484 position : position, | |
| 485 rectangle : rectangle, | |
| 486 transform : transform | |
|
793
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
487 }; |
|
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
488 // install function called by digilib on plugin object |
|
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
489 var install = function() { |
|
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
490 // add constructor object to fn |
|
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
491 this.fn.geometry = geometry; |
| 785 | 492 }; |
|
793
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
493 // digilib plugin object |
|
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
494 var plugin = { |
|
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
495 name : 'geometry', |
|
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
496 install : install, |
|
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
497 fn : {}, |
|
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
498 // TODO: remove old init |
|
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
499 init : init |
|
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
500 }; |
|
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
501 // TODO: remove old version of init returning contructor |
|
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
502 var init = function () { |
|
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
503 return geometry; |
|
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
504 }; |
|
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
505 // plug into digilib |
| 786 | 506 if ($.fn.digilib == null) { |
| 507 $.error("jquery.digilib.geometry must be loaded after jquery.digilib!"); | |
| 508 } else { | |
|
793
63c1b33e38b1
documentation for new plugin api in jquery-digilib-plugin.txt.
robcast
parents:
788
diff
changeset
|
509 $.fn.digilib('plugin', plugin); |
| 786 | 510 } |
| 785 | 511 })(jQuery); |
