[483] | 1 | define([ |
---|
| 2 | "dojo/_base/kernel", |
---|
| 3 | "dojo/_base/array", |
---|
| 4 | "dojo/_base/connect", |
---|
| 5 | "dojo/_base/event", |
---|
| 6 | "dojo/dom-class", |
---|
| 7 | "dojo/dom-construct", |
---|
| 8 | "dojo/dom-style", |
---|
| 9 | "./_css3" |
---|
| 10 | ], function(kernel, array, connect, event, domClass, domConstruct, domStyle, css3){ |
---|
| 11 | // module: |
---|
| 12 | // dojox/mobile/pageTurningUtils |
---|
| 13 | |
---|
| 14 | kernel.experimental("dojox.mobile.pageTurningUtils"); |
---|
| 15 | |
---|
| 16 | return function(){ |
---|
| 17 | // summary: |
---|
| 18 | // Utilities to provide page turning effects just like turning a real book. |
---|
| 19 | // example: |
---|
| 20 | // | require([ |
---|
| 21 | // | "dojo/ready", |
---|
| 22 | // | "dojox/mobile/pageTurningUtils" |
---|
| 23 | // | ], function(ready, pageTurningUtils){ |
---|
| 24 | // | var utils = new pageTurningUtils(); |
---|
| 25 | // | ready(function(){ |
---|
| 26 | // | utils.init(300, 400); // Specify width and height by pixels |
---|
| 27 | // | utils.initCatalog(document.getElementById("catalog")); |
---|
| 28 | // | }); |
---|
| 29 | // | ); |
---|
| 30 | // | <div id="catalog"> |
---|
| 31 | // | <div id="page1"> |
---|
| 32 | // | <div id="front1"><img src="img1.png"></div> |
---|
| 33 | // | <div id="back1"><img src="img2.png"></div> |
---|
| 34 | // | </div> |
---|
| 35 | // | <div id="page2"> |
---|
| 36 | // | <div id="front2"><img src="img3.png"></div> |
---|
| 37 | // | <div id="back2"><img src="img4.png"></div> |
---|
| 38 | // | </div> |
---|
| 39 | // | <div id="page3"> |
---|
| 40 | // | <div id="front3"><img src="img5.png"></div> |
---|
| 41 | // | <div id="back3"></div> |
---|
| 42 | // | </div> |
---|
| 43 | // | </div> |
---|
| 44 | |
---|
| 45 | this.w = 0; |
---|
| 46 | this.h = 0; |
---|
| 47 | this.turnfrom = "top"; |
---|
| 48 | this.page = 1; |
---|
| 49 | this.dogear = 1.0; |
---|
| 50 | this.duration = 2; |
---|
| 51 | this.alwaysDogeared = false; |
---|
| 52 | |
---|
| 53 | /* Internal properties */ |
---|
| 54 | this._styleParams = {}; |
---|
| 55 | this._catalogNode = null; |
---|
| 56 | this._currentPageNode = null; |
---|
| 57 | this._transitionEndHandle = null; |
---|
| 58 | |
---|
| 59 | this.init = function(/*int*/w, /*int*/h, /*String?*/turnfrom, |
---|
| 60 | /*int?*/page, /*Number?*/dogear, /*Number?*/duration, |
---|
| 61 | /*Boolean?*/alwaysDogeared){ |
---|
| 62 | // summary: |
---|
| 63 | // Sets property values necessary for calculating the style parameters |
---|
| 64 | // for page positioning and page turning effects. |
---|
| 65 | // w: int |
---|
| 66 | // The width of each page by pixels. You cannot specify it by percentage. |
---|
| 67 | // h: int |
---|
| 68 | // The height of each page by pixels. You cannot specify it by percentage. |
---|
| 69 | // turnfrom: String? |
---|
| 70 | // Specifies from which side/corner the page turning starts. |
---|
| 71 | // You can choose from "top", "bottom" or "left". Defaults to "top". |
---|
| 72 | // If "top", each page is turned from top-right corner of the page. |
---|
| 73 | // If "bottom", each page is turned from bottom-right corner of the page. |
---|
| 74 | // And if "left", each page is turned from top-left corner of the page. |
---|
| 75 | // The page is shown as dog-eared except the case of "bottom". |
---|
| 76 | // page: int? |
---|
| 77 | // The number of pages shown in the screen at a time. |
---|
| 78 | // This parameter should be either of 1 or 2. Defaults to 1. |
---|
| 79 | // If 1, the only one side of two facing pages are shown. |
---|
| 80 | // If 2, the two facing pages are shown at a time. |
---|
| 81 | // dogear: Number? |
---|
| 82 | // The ratio of actual dog-ear width to the maximum dog-ear width which is |
---|
| 83 | // 11 percent of the page width (= 0.11 * w). |
---|
| 84 | // This parameter should be a float number between 0 and 1. Defaults to 1. |
---|
| 85 | // The actual dog-ear width is calculated by the following formula: |
---|
| 86 | // | 0.11 * w * dogear. |
---|
| 87 | // This parameter is ignored if "bottom" is specified to turnfrom parameter. |
---|
| 88 | // duration: Number? |
---|
| 89 | // The duration of page turning animations by seconds. (ex. 1.5, 3, etc) |
---|
| 90 | // Defaults to 2. |
---|
| 91 | // alwaysDogeared: Boolean? |
---|
| 92 | // Specifies whether all pages are always dog-eared or not. |
---|
| 93 | // If true, all pages are always dog-eared. |
---|
| 94 | // If false, only the current page is dog-eared while the others are not. |
---|
| 95 | // This parameter is ignored if "bottom" is specified to turnfrom parameter. |
---|
| 96 | |
---|
| 97 | // Set property values |
---|
| 98 | this.w = w; |
---|
| 99 | this.h = h; |
---|
| 100 | this.turnfrom = turnfrom ? turnfrom : this.turnfrom; |
---|
| 101 | this.page = page ? page : this.page; |
---|
| 102 | this.dogear = typeof dogear !== 'undefined' ? dogear : this.dogear; |
---|
| 103 | this.duration = typeof duration !== 'undefined' ? duration : this.duration; |
---|
| 104 | this.alwaysDogeared = typeof alwaysDogeared !== 'undefined' ? alwaysDogeared : this.alwaysDogeared |
---|
| 105 | |
---|
| 106 | if(this.turnfrom === "bottom"){ // dog-ear is not supported if using "bottom" |
---|
| 107 | this.alwaysDogeared = true; |
---|
| 108 | } |
---|
| 109 | // Calculate style parameters for page positioning and page turning effects |
---|
| 110 | this._calcStyleParams(); |
---|
| 111 | }; |
---|
| 112 | |
---|
| 113 | this._calcStyleParams = function(){ |
---|
| 114 | // tags: |
---|
| 115 | // private |
---|
| 116 | var tan58 = Math.tan(58 * Math.PI/180), |
---|
| 117 | cos32 = Math.cos(32 * Math.PI/180), |
---|
| 118 | sin32 = Math.sin(32 * Math.PI/180), |
---|
| 119 | tan32 = Math.tan(32 * Math.PI/180), |
---|
| 120 | w = this.w, |
---|
| 121 | h = this.h, |
---|
| 122 | page = this.page, |
---|
| 123 | turnfrom = this.turnfrom, |
---|
| 124 | params = this._styleParams; |
---|
| 125 | |
---|
| 126 | // Calculate each div size and position based on the page turning algorithm |
---|
| 127 | // fw: frontWidth, fh: frontHeight, dw: dogear, cx: posX, cy: posY, |
---|
| 128 | // dx: dogearX, dy: dogearY, fy:actualPagePos |
---|
| 129 | var Q = fold = w * tan58, |
---|
| 130 | fw = Q * sin32 + Q * cos32 * tan58, |
---|
| 131 | fh = fold + w + w/tan58, |
---|
| 132 | dw = w * 0.11 * this.dogear, |
---|
| 133 | pw = w - dw, |
---|
| 134 | base = pw * cos32, |
---|
| 135 | cx, cy, dx, dy, fy; // These params depend on the types of "turnfrom" parameter |
---|
| 136 | |
---|
| 137 | switch(this.turnfrom){ // TODO Should separate each case as a plugin? |
---|
| 138 | case "top": |
---|
| 139 | cx = fw - base; |
---|
| 140 | cy = base * tan58; |
---|
| 141 | dx = fw - dw; |
---|
| 142 | dy = cy + pw/tan58 - 7; |
---|
| 143 | fy = cy/cos32; |
---|
| 144 | |
---|
| 145 | params.init = { |
---|
| 146 | page: css3.add({ |
---|
| 147 | top: -fy + "px", |
---|
| 148 | left: (-fw + (page === 2 ? w : 0)) + "px", |
---|
| 149 | width: fw + "px", |
---|
| 150 | height: fh + "px" |
---|
| 151 | }, { |
---|
| 152 | transformOrigin: "100% 0%" |
---|
| 153 | }), |
---|
| 154 | front: css3.add({ |
---|
| 155 | width: w + "px", |
---|
| 156 | height: h + "px" |
---|
| 157 | }, { |
---|
| 158 | boxShadow: "0 0" |
---|
| 159 | }), |
---|
| 160 | back: css3.add({ |
---|
| 161 | width: w + "px", |
---|
| 162 | height: h + "px" |
---|
| 163 | }, { |
---|
| 164 | boxShadow: "0 0" |
---|
| 165 | }), |
---|
| 166 | shadow: { |
---|
| 167 | display: "", |
---|
| 168 | left: fw + "px", |
---|
| 169 | height: h * 1.5 + "px" |
---|
| 170 | } |
---|
| 171 | }; |
---|
| 172 | params.turnForward = { |
---|
| 173 | page: css3.add({}, { |
---|
| 174 | transform: "rotate(0deg)" |
---|
| 175 | }), |
---|
| 176 | front: css3.add({}, { |
---|
| 177 | transform: "translate("+ fw + "px," + fy +"px) rotate(0deg)", |
---|
| 178 | transformOrigin: "-110px -18px" |
---|
| 179 | }), |
---|
| 180 | back: css3.add({}, { |
---|
| 181 | transform: "translate("+ (fw - w) + "px," + fy +"px) rotate(0deg)", |
---|
| 182 | transformOrigin: "0px 0px" |
---|
| 183 | }) |
---|
| 184 | }; |
---|
| 185 | params.turnBackward = { |
---|
| 186 | page: css3.add({}, { |
---|
| 187 | transform: "rotate(-32deg)" |
---|
| 188 | }), |
---|
| 189 | front: css3.add({}, { |
---|
| 190 | transform: "translate("+ cx + "px," + cy +"px) rotate(32deg)", |
---|
| 191 | transformOrigin: "0px 0px" |
---|
| 192 | }), |
---|
| 193 | back: css3.add({}, { |
---|
| 194 | transform: "translate("+ dx + "px," + dy +"px) rotate(-32deg)", |
---|
| 195 | transformOrigin: "0px 0px" |
---|
| 196 | }) |
---|
| 197 | }; |
---|
| 198 | break; |
---|
| 199 | |
---|
| 200 | case "bottom": |
---|
| 201 | cx = fw - (h * sin32 + w * cos32) - 2; |
---|
| 202 | cy = fh - (h + w/tan32) * cos32; |
---|
| 203 | dx = fw; |
---|
| 204 | dy = fh - w/sin32 - h; |
---|
| 205 | fy = fh - w/tan32 - h; |
---|
| 206 | |
---|
| 207 | params.init = { |
---|
| 208 | page: css3.add({ |
---|
| 209 | top: (-fy + 50) + "px", |
---|
| 210 | left: (-fw + (page === 2 ? w : 0)) + "px", |
---|
| 211 | width: fw + "px", |
---|
| 212 | height: fh + "px" |
---|
| 213 | }, { |
---|
| 214 | transformOrigin: "100% 100%" |
---|
| 215 | }), |
---|
| 216 | front: css3.add({ |
---|
| 217 | width: w + "px", |
---|
| 218 | height: h + "px" |
---|
| 219 | }, { |
---|
| 220 | boxShadow: "0 0" |
---|
| 221 | }), |
---|
| 222 | back: css3.add({ |
---|
| 223 | width: w + "px", |
---|
| 224 | height: h + "px" |
---|
| 225 | }, { |
---|
| 226 | boxShadow: "0 0" |
---|
| 227 | }), |
---|
| 228 | shadow: { |
---|
| 229 | display: "none" |
---|
| 230 | } |
---|
| 231 | }; |
---|
| 232 | params.turnForward = { |
---|
| 233 | page: css3.add({}, { |
---|
| 234 | transform: "rotate(0deg)" |
---|
| 235 | }), |
---|
| 236 | front: css3.add({}, { |
---|
| 237 | transform: "translate("+ fw + "px," + fy +"px) rotate(0deg)", |
---|
| 238 | transformOrigin: "-220px 35px" |
---|
| 239 | }), |
---|
| 240 | back: css3.add({}, { |
---|
| 241 | transform: "translate("+ (w * 2) + "px," + fy +"px) rotate(0deg)", |
---|
| 242 | transformOrigin: "0px 0px" |
---|
| 243 | }) |
---|
| 244 | }; |
---|
| 245 | params.turnBackward = { |
---|
| 246 | page: css3.add({}, { |
---|
| 247 | transform: "rotate(32deg)" |
---|
| 248 | }), |
---|
| 249 | front: css3.add({}, { |
---|
| 250 | transform: "translate("+ cx + "px," + cy +"px) rotate(-32deg)", |
---|
| 251 | transformOrigin: "0px 0px" |
---|
| 252 | }), |
---|
| 253 | back: css3.add({}, { |
---|
| 254 | transform: "translate("+ dx + "px," + dy +"px) rotate(0deg)", |
---|
| 255 | transformOrigin: "0px 0px" |
---|
| 256 | }) |
---|
| 257 | }; |
---|
| 258 | break; |
---|
| 259 | |
---|
| 260 | case "left": |
---|
| 261 | cx = -w; |
---|
| 262 | cy = pw/tan32 - 2; |
---|
| 263 | dx = -pw; |
---|
| 264 | dy = fy = pw/sin32 + dw * sin32; |
---|
| 265 | |
---|
| 266 | params.init = { |
---|
| 267 | page: css3.add({ |
---|
| 268 | top: -cy + "px", |
---|
| 269 | left: w + "px", |
---|
| 270 | width: fw + "px", |
---|
| 271 | height: fh + "px" |
---|
| 272 | }, { |
---|
| 273 | transformOrigin: "0% 0%" |
---|
| 274 | }), |
---|
| 275 | front: css3.add({ |
---|
| 276 | width: w + "px", |
---|
| 277 | height: h + "px" |
---|
| 278 | }, { |
---|
| 279 | boxShadow: "0 0" |
---|
| 280 | }), |
---|
| 281 | back: css3.add({ |
---|
| 282 | width: w + "px", |
---|
| 283 | height: h + "px" |
---|
| 284 | }, { |
---|
| 285 | boxShadow: "0 0" |
---|
| 286 | }), |
---|
| 287 | shadow: { |
---|
| 288 | display: "", |
---|
| 289 | left: "-4px", |
---|
| 290 | height: ((page === 2 ? h * 1.5 : h) + 50) + "px" |
---|
| 291 | } |
---|
| 292 | }; |
---|
| 293 | params.turnForward = { |
---|
| 294 | page: css3.add({}, { |
---|
| 295 | transform: "rotate(0deg)" |
---|
| 296 | }), |
---|
| 297 | front: css3.add({}, { |
---|
| 298 | transform: "translate("+ cx + "px," + cy +"px) rotate(0deg)", |
---|
| 299 | transformOrigin: "160px 68px" |
---|
| 300 | }), |
---|
| 301 | back: css3.add({}, { |
---|
| 302 | transform: "translate(0px," + cy +"px) rotate(0deg)", |
---|
| 303 | transformOrigin: "0px 0px" |
---|
| 304 | }) |
---|
| 305 | }; |
---|
| 306 | params.turnBackward = { |
---|
| 307 | page: css3.add({}, { |
---|
| 308 | transform: "rotate(32deg)" |
---|
| 309 | }), |
---|
| 310 | front: css3.add({}, { |
---|
| 311 | transform: "translate("+ (-dw) + "px," + dy +"px) rotate(-32deg)", |
---|
| 312 | transformOrigin: "0px 0px" |
---|
| 313 | }), |
---|
| 314 | back: css3.add({}, { |
---|
| 315 | transform: "translate("+ dx + "px," + dy +"px) rotate(32deg)", |
---|
| 316 | transformOrigin: "top right" |
---|
| 317 | }) |
---|
| 318 | }; |
---|
| 319 | break; |
---|
| 320 | } |
---|
| 321 | |
---|
| 322 | params.init.catalog = { // catalogNode |
---|
| 323 | width: (page === 2 ? w * 2 : w) + "px", |
---|
| 324 | height: ((page === 2 ? h * 1.5 : h) + (turnfrom == "top" ? 0 : 50)) + "px" |
---|
| 325 | }; |
---|
| 326 | }; |
---|
| 327 | |
---|
| 328 | this.getChildren = function(/*DomNode*/node){ |
---|
| 329 | return array.filter(node.childNodes, function(n){ return n.nodeType === 1; }); |
---|
| 330 | }; |
---|
| 331 | |
---|
| 332 | this.getPages = function(){ |
---|
| 333 | // summary: |
---|
| 334 | // Get the array of all page nodes. |
---|
| 335 | return this._catalogNode ? this.getChildren(this._catalogNode) : null; |
---|
| 336 | }; |
---|
| 337 | |
---|
| 338 | this.getCurrentPage = function(){ |
---|
| 339 | // summary: |
---|
| 340 | // Get the current page node. |
---|
| 341 | return this._currentPageNode; |
---|
| 342 | }; |
---|
| 343 | |
---|
| 344 | this.getIndexOfPage = function(/*DomNode*/pageNode, /*DomNode[]?*/pages){ |
---|
| 345 | if(!pages){ |
---|
| 346 | pages = this.getPages(); |
---|
| 347 | } |
---|
| 348 | for(var i=0; i<pages.length; i++){ |
---|
| 349 | if(pageNode === pages[i]){ return i; } |
---|
| 350 | } |
---|
| 351 | return -1; |
---|
| 352 | }; |
---|
| 353 | |
---|
| 354 | this.getNextPage = function(/*DomNode*/pageNode){ |
---|
| 355 | for(var n = pageNode.nextSibling; n; n = n.nextSibling){ |
---|
| 356 | if(n.nodeType === 1){ return n; } |
---|
| 357 | } |
---|
| 358 | return null; |
---|
| 359 | }; |
---|
| 360 | |
---|
| 361 | this.getPreviousPage = function(/*DomNode*/pageNode){ |
---|
| 362 | for(var n = pageNode.previousSibling; n; n = n.previousSibling){ |
---|
| 363 | if(n.nodeType === 1){ return n; } |
---|
| 364 | } |
---|
| 365 | return null; |
---|
| 366 | }; |
---|
| 367 | |
---|
| 368 | this.isPageTurned = function(/*DomNode*/pageNode){ |
---|
| 369 | return pageNode.style[css3.name("transform")] == "rotate(0deg)"; |
---|
| 370 | }; |
---|
| 371 | |
---|
| 372 | this._onPageTurned = function(e){ |
---|
| 373 | event.stop(e); |
---|
| 374 | if(domClass.contains(e.target, "mblPageTurningPage")){ |
---|
| 375 | this.onPageTurned(e.target); |
---|
| 376 | } |
---|
| 377 | }; |
---|
| 378 | |
---|
| 379 | this.onPageTurned = function(/*DomNode*/ /*===== pageNode =====*/){ |
---|
| 380 | // summary: |
---|
| 381 | // Stub function to which your application connects |
---|
| 382 | // to handle the event when each page is tured |
---|
| 383 | // description: |
---|
| 384 | // Called just after each page is turned. |
---|
| 385 | }; |
---|
| 386 | |
---|
| 387 | this.initCatalog = function(/*DomNode*/catalogNode){ |
---|
| 388 | // summary: |
---|
| 389 | // Initializes the specified catalog/book. |
---|
| 390 | // description: |
---|
| 391 | // Apply style class and other various styles to the specified catalog node |
---|
| 392 | // for initialization. |
---|
| 393 | // This function must be called every time when property values |
---|
| 394 | // are changed by calling this.init(...) function. |
---|
| 395 | // catalogNode: DOMNode |
---|
| 396 | // The catalog node to be initialized. |
---|
| 397 | |
---|
| 398 | if(this._catalogNode != catalogNode){ |
---|
| 399 | if(this._transitionEndHandle){ |
---|
| 400 | connect.disconnect(this._transitionEndHandle); |
---|
| 401 | } |
---|
| 402 | this._transitionEndHandle = connect.connect(catalogNode, css3.name("transitionEnd"), this, "_onPageTurned") |
---|
| 403 | this._catalogNode = catalogNode; |
---|
| 404 | } |
---|
| 405 | |
---|
| 406 | // Initialize catalog node |
---|
| 407 | domClass.add(catalogNode, "mblPageTurningCatalog"); |
---|
| 408 | domStyle.set(catalogNode, this._styleParams.init.catalog); |
---|
| 409 | |
---|
| 410 | // Initialize child pages |
---|
| 411 | var pages = this.getPages(); |
---|
| 412 | array.forEach(pages, function(pageNode){ |
---|
| 413 | this.initPage(pageNode); |
---|
| 414 | }, this); |
---|
| 415 | |
---|
| 416 | this.resetCatalog(); |
---|
| 417 | }; |
---|
| 418 | |
---|
| 419 | this._getBaseZIndex = function(){ |
---|
| 420 | // Check z-index of catalogNode |
---|
| 421 | return this._catalogNode.style.zIndex || 0; |
---|
| 422 | }; |
---|
| 423 | |
---|
| 424 | this.resetCatalog = function(){ |
---|
| 425 | // summary: |
---|
| 426 | // Resets the catalog by adjust the state of child pages. |
---|
| 427 | // description: |
---|
| 428 | // Adjust z-index and dog-ear show/hide state of each child page. |
---|
| 429 | // This function must be called when you add a new page |
---|
| 430 | // or remove some page after initialization. |
---|
| 431 | |
---|
| 432 | // Adjust z-index and dog-ear of child pages |
---|
| 433 | var pages = this.getPages(), |
---|
| 434 | len = pages.length, |
---|
| 435 | base = this._getBaseZIndex(); |
---|
| 436 | for(var i = len - 1; i>=0; i--){ |
---|
| 437 | var pageNode = pages[i]; |
---|
| 438 | this.showDogear(pageNode); |
---|
| 439 | if(this.isPageTurned(pageNode)){ |
---|
| 440 | pageNode.style.zIndex = base + len + 1; |
---|
| 441 | }else{ |
---|
| 442 | pageNode.style.zIndex = base + len - i; |
---|
| 443 | !this.alwaysDogeared && this.hideDogear(pageNode); |
---|
| 444 | this._currentPageNode = pageNode; |
---|
| 445 | } |
---|
| 446 | } |
---|
| 447 | if(!this.alwaysDogeared && this._currentPageNode != pages[len - 1]){ |
---|
| 448 | this.showDogear(this._currentPageNode); |
---|
| 449 | } |
---|
| 450 | }; |
---|
| 451 | |
---|
| 452 | this.initPage = function(/*DomNode*/pageNode, /*int?*/dir){ |
---|
| 453 | // summary: |
---|
| 454 | // Initializes the specified page. |
---|
| 455 | // description: |
---|
| 456 | // Apply style class and other various styles to the specified page node |
---|
| 457 | // for initialization. |
---|
| 458 | // This function must be called when you add a new page after initialization. |
---|
| 459 | // pageNode: DOMNode |
---|
| 460 | // The page node to be initialized. |
---|
| 461 | // dir: int? |
---|
| 462 | // Specified whether the page is turned or not at initialization. |
---|
| 463 | // This parameter should be either of 1 or -1. |
---|
| 464 | // If 1, the page is turned at initialization. If -1, it is not turned. |
---|
| 465 | |
---|
| 466 | // Create shadow node if not exist |
---|
| 467 | var childNodes = this.getChildren(pageNode); |
---|
| 468 | while(childNodes.length < 3){ |
---|
| 469 | pageNode.appendChild(domConstruct.create("div", null)); |
---|
| 470 | childNodes = this.getChildren(pageNode); |
---|
| 471 | } |
---|
| 472 | |
---|
| 473 | // Check if it is the first time to initialize this page node or not |
---|
| 474 | var isFirst = !domClass.contains(pageNode, "mblPageTurningPage"); |
---|
| 475 | |
---|
| 476 | // Apply style class |
---|
| 477 | domClass.add(pageNode, "mblPageTurningPage"); |
---|
| 478 | domClass.add(childNodes[0], "mblPageTurningFront"); // frontNode |
---|
| 479 | domClass.add(childNodes[1], "mblPageTurningBack"); // backNode |
---|
| 480 | domClass.add(childNodes[2], "mblPageTurningShadow"); // shadowNode |
---|
| 481 | |
---|
| 482 | // Apply styles |
---|
| 483 | var p = this._styleParams.init; |
---|
| 484 | domStyle.set(pageNode, p.page); |
---|
| 485 | domStyle.set(childNodes[0], p.front); // frontNode |
---|
| 486 | domStyle.set(childNodes[1], p.back); // backNode |
---|
| 487 | p.shadow && domStyle.set(childNodes[2], p.shadow); // shadowNode |
---|
| 488 | |
---|
| 489 | if(!dir){ |
---|
| 490 | // Determine whether to turn this page or not |
---|
| 491 | if(isFirst && this._currentPageNode){ |
---|
| 492 | var pages = this.getPages(); |
---|
| 493 | dir = this.getIndexOfPage(pageNode) < this.getIndexOfPage(this._currentPageNode) ? 1 : -1; |
---|
| 494 | }else{ |
---|
| 495 | dir = this.isPageTurned(pageNode) ? 1 : -1; |
---|
| 496 | } |
---|
| 497 | } |
---|
| 498 | this._turnPage(pageNode, dir, 0); |
---|
| 499 | }; |
---|
| 500 | |
---|
| 501 | this.turnToNext = function(/*Number?*/duration){ |
---|
| 502 | // summary: |
---|
| 503 | // Turns a page forward. |
---|
| 504 | // description: |
---|
| 505 | // The current page is turned forward if it is not the last page of the book. |
---|
| 506 | // duration: Number? |
---|
| 507 | // The duration of page turning animations by seconds. (ex. 1.5, 3, etc) |
---|
| 508 | // If this parameter is omitted, this.duration property value is used. |
---|
| 509 | var nextPage = this.getNextPage(this._currentPageNode); |
---|
| 510 | if(nextPage){ |
---|
| 511 | this._turnPage(this._currentPageNode, 1, duration); |
---|
| 512 | this._currentPageNode = nextPage; |
---|
| 513 | } |
---|
| 514 | }; |
---|
| 515 | |
---|
| 516 | this.turnToPrev = function(/*Number?*/duration){ |
---|
| 517 | // summary: |
---|
| 518 | // Turns a page backward. |
---|
| 519 | // description: |
---|
| 520 | // The current page is turned backward if it is not the first page of the book. |
---|
| 521 | // duration: Number? |
---|
| 522 | // The duration of page turning animations by seconds. (ex. 1.5, 3, etc) |
---|
| 523 | // If this parameter is omitted, this.duration property value is used. |
---|
| 524 | var prevPage = this.getPreviousPage(this._currentPageNode); |
---|
| 525 | if(prevPage){ |
---|
| 526 | this._turnPage(prevPage, -1, duration); |
---|
| 527 | this._currentPageNode = prevPage; |
---|
| 528 | } |
---|
| 529 | }; |
---|
| 530 | |
---|
| 531 | this.goTo = function(/*int*/index){ |
---|
| 532 | // summary: |
---|
| 533 | // Jumps to the specified page without page turning animations. |
---|
| 534 | // index: int |
---|
| 535 | // The index of the page you want to jump to. |
---|
| 536 | var pages = this.getPages(); |
---|
| 537 | if(this._currentPageNode === pages[index] || pages.length <= index) { return; } |
---|
| 538 | |
---|
| 539 | var goBackward = index < this.getIndexOfPage(this._currentPageNode, pages); |
---|
| 540 | while(this._currentPageNode !== pages[index]) { |
---|
| 541 | goBackward ? this.turnToPrev(0) : this.turnToNext(0); |
---|
| 542 | } |
---|
| 543 | }; |
---|
| 544 | |
---|
| 545 | this._turnPage = function(/*DomNode*/pageNode, /*int*/dir, /*Number?*/duration){ |
---|
| 546 | // tags: |
---|
| 547 | // private |
---|
| 548 | var childNodes = this.getChildren(pageNode), |
---|
| 549 | d = ((typeof duration !== 'undefined') ? duration : this.duration) + "s", |
---|
| 550 | p = (dir === 1) ? this._styleParams.turnForward : this._styleParams.turnBackward; |
---|
| 551 | |
---|
| 552 | // Apply styles for page turning animations |
---|
| 553 | p.page[css3.name("transitionDuration")] = d; |
---|
| 554 | domStyle.set(pageNode, p.page); |
---|
| 555 | |
---|
| 556 | p.front[css3.name("transitionDuration")] = d; |
---|
| 557 | domStyle.set(childNodes[0], p.front); // frontNode |
---|
| 558 | |
---|
| 559 | p.back[css3.name("transitionDuration")] = d; |
---|
| 560 | domStyle.set(childNodes[1], p.back); // backNode |
---|
| 561 | |
---|
| 562 | // Adjust z-index and dog-ear |
---|
| 563 | var pages = this.getPages(), |
---|
| 564 | nextPage = this.getNextPage(pageNode), |
---|
| 565 | len = pages.length, |
---|
| 566 | base = this._getBaseZIndex(); |
---|
| 567 | if(dir === 1){ |
---|
| 568 | pageNode.style.zIndex = base + len + 1; |
---|
| 569 | if(!this.alwaysDogeared && nextPage && this.getNextPage(nextPage)){ |
---|
| 570 | this.showDogear(nextPage); |
---|
| 571 | } |
---|
| 572 | }else{ |
---|
| 573 | if(nextPage){ |
---|
| 574 | nextPage.style.zIndex = base + len - this.getIndexOfPage(nextPage, pages); |
---|
| 575 | !this.alwaysDogeared && this.hideDogear(nextPage); |
---|
| 576 | } |
---|
| 577 | } |
---|
| 578 | }; |
---|
| 579 | |
---|
| 580 | this.showDogear = function(/*DomNode*/pageNode){ |
---|
| 581 | // summary: |
---|
| 582 | // Shows the dog-ear. |
---|
| 583 | var childNodes = this.getChildren(pageNode);; |
---|
| 584 | domStyle.set(pageNode, "overflow", ""); |
---|
| 585 | childNodes[1] && domStyle.set(childNodes[1], "display", ""); // backNode |
---|
| 586 | childNodes[2] && domStyle.set(childNodes[2], "display", this.turnfrom === "bottom" ? "none" : ""); // shadowNode |
---|
| 587 | }; |
---|
| 588 | |
---|
| 589 | this.hideDogear = function(/*DomNode*/pageNode){ |
---|
| 590 | // summary: |
---|
| 591 | // Hides the dog-ear. |
---|
| 592 | if(this.turnfrom === "bottom"){ return; } |
---|
| 593 | |
---|
| 594 | var childNodes = this.getChildren(pageNode); |
---|
| 595 | domStyle.set(pageNode, "overflow", "visible"); |
---|
| 596 | childNodes[1] && domStyle.set(childNodes[1], "display", "none"); // backNode |
---|
| 597 | childNodes[2] && domStyle.set(childNodes[2], "display", "none"); // shadowNode |
---|
| 598 | }; |
---|
| 599 | }; |
---|
| 600 | }); |
---|