From f28d6eb527df07b1de8da8f13c564de34f2bc919 Mon Sep 17 00:00:00 2001 From: Jonas Orrico Date: Mon, 2 Mar 2015 12:04:29 -0300 Subject: [PATCH] Update to Turn.js v4.1.0 --- turn.js | 4549 +++++++++++++++++++++++++++++++++------------------ turn.min.js | 115 +- 2 files changed, 3052 insertions(+), 1612 deletions(-) diff --git a/turn.js b/turn.js index d6feac9..1d51aa8 100644 --- a/turn.js +++ b/turn.js @@ -1,20 +1,10 @@ /** - * turn.js 3rd release - * www.turnjs.com + * turn.js 4th release + * turnjs.com + * turnjs.com/license.txt * - * Copyright (C) 2012, Emmanuel Garcia. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Any redistribution, use, or modification is done solely for personal - * benefit and not for any commercial purpose or for monetary gain. - * + * Copyright (C) 2012 Emmanuel Garcia + * All rights reserved **/ (function($) { @@ -22,1912 +12,3341 @@ 'use strict'; var has3d, + + hasRot, - vendor ='', + vendor = '', + + version = '4.1.0', - PI = Math.PI, + PI = Math.PI, - A90 = PI/2, + A90 = PI/2, - isTouch = 'ontouchstart' in window, + isTouch = 'ontouchstart' in window, - events = (isTouch) ? {start: 'touchstart', move: 'touchmove', end: 'touchend'} - : {start: 'mousedown', move: 'mousemove', end: 'mouseup'}, + mouseEvents = (isTouch) ? + { + down: 'touchstart', + move: 'touchmove', + up: 'touchend', + over: 'touchstart', + out: 'touchend' + } + : + { + down: 'mousedown', + move: 'mousemove', + up: 'mouseup', + over: 'mouseover', + out: 'mouseout' + }, - // Contansts used for each corner - // tl * tr - // * * - // bl * br + // Contansts used for each corner + // | tl * tr | + // l | * * | r + // | bl * br | - corners = { - backward: ['bl', 'tl'], - forward: ['br', 'tr'], - all: ['tl', 'bl', 'tr', 'br'] - }, + corners = { + backward: ['bl', 'tl'], + forward: ['br', 'tr'], + all: ['tl', 'bl', 'tr', 'br', 'l', 'r'] + }, - displays = ['single', 'double'], + // Display values - // Default options + displays = ['single', 'double'], - turnOptions = { + // Direction values - // First page + directions = ['ltr', 'rtl'], - page: 1, - - // Enables gradients + // Default options - gradients: true, + turnOptions = { - // Duration of transition in milliseconds + // Enables hardware acceleration - duration: 600, + acceleration: true, - // Enables hardware acceleration + // Display - acceleration: true, + display: 'double', - // Display + // Duration of transition in milliseconds - display: 'double', + duration: 600, - // Events + // First page - when: null - }, + page: 1, + + // Enables gradients - flipOptions = { + gradients: true, - // Back page - - folding: null, + // Corners used when turning the page - // Corners - // backward: Activates both tl and bl corners - // forward: Activates both tr and br corners - // all: Activates all the corners + turnCorners: 'bl,br', - corners: 'forward', - - // Size of the active zone of each corner + // Events - cornerSize: 100, + when: null + }, - // Enables gradients + flipOptions = { - gradients: true, + // Size of the active zone of each corner - // Duration of transition in milliseconds + cornerSize: 100 - duration: 600, + }, - // Enables hardware acceleration + // Number of pages in the DOM, minimum value: 6 - acceleration: true - }, - - // Number of pages in the DOM, minimum value: 6 - - pagesInDOM = 6, - - pagePosition = {0: {top: 0, left: 0, right: 'auto', bottom: 'auto'}, - 1: {top: 0, right: 0, left: 'auto', bottom: 'auto'}}, - - // Gets basic attributes for a layer - - divAtt = function(top, left, zIndex, overf) { - return {'css': { - position: 'absolute', - top: top, - left: left, - 'overflow': overf || 'hidden', - 'z-index': zIndex || 'auto' - } - }; - }, - - // Gets a 2D point from a bezier curve of four points - - bezier = function(p1, p2, p3, p4, t) { - var mum1 = 1 - t, - mum13 = mum1 * mum1 * mum1, - mu3 = t * t * t; - - return point2D(Math.round(mum13*p1.x + 3*t*mum1*mum1*p2.x + 3*t*t*mum1*p3.x + mu3*p4.x), - Math.round(mum13*p1.y + 3*t*mum1*mum1*p2.y + 3*t*t*mum1*p3.y + mu3*p4.y)); - }, - - // Converts an angle from degrees to radians - - rad = function(degrees) { - return degrees/180*PI; - }, - - // Converts an angle from radians to degrees - - deg = function(radians) { - return radians/PI*180; - }, - - // Gets a 2D point - - point2D = function(x, y) { - return {x: x, y: y}; - }, - - // Returns the traslate value - - translate = function(x, y, use3d) { - return (has3d && use3d) ? ' translate3d(' + x + 'px,' + y + 'px, 0px) ' : ' translate(' + x + 'px, ' + y + 'px) '; - }, - - // Returns the rotation value - - rotate = function(degrees) { - return ' rotate(' + degrees + 'deg) '; - }, - - // Checks if a property belongs to an object - - has = function(property, object) { - return Object.prototype.hasOwnProperty.call(object, property); - }, - - // Gets the CSS3 vendor prefix - - getPrefix = function() { - var vendorPrefixes = ['Moz','Webkit','Khtml','O','ms'], - len = vendorPrefixes.length, - vendor = ''; - - while (len--) - if ((vendorPrefixes[len] + 'Transform') in document.body.style) - vendor='-'+vendorPrefixes[len].toLowerCase()+'-'; - - return vendor; - }, - - // Adds gradients - - gradient = function(obj, p0, p1, colors, numColors) { - - var j, cols = []; - - if (vendor=='-webkit-') { - - for (j = 0; jlastPage) - throw new Error ('It is impossible to add the page "'+page+'", the maximum value is: "'+lastPage+'"'); + this.css({position: 'relative', width: options.width, height: options.height}); - } else { - page = lastPage; - incPages = true; - } + // Set the initial display - if (page>=1 && page<=lastPage) { + this.turn('display', options.display); - // Stop animations - if (data.done) this.turn('stop'); + // Set the direction - // Move pages if it's necessary - if (page in data.pageObjs) - turnMethods._movePages.call(this, page, 1); + if (options.direction!=='') + this.turn('direction', options.direction); + + // Prevent blue screen problems of switching to hardware acceleration mode + // By forcing hardware acceleration for ever - // Update number of pages - if (incPages) - data.totalPages = lastPage; - - // Add element - data.pageObjs[page] = $(element).addClass('turn-page p' + page); - - // Add page - turnMethods._addPage.call(this, page); - - // Update view - if (data.done) - this.turn('update'); - - turnMethods._removeFromDOM.call(this); - } - - return this; - }, - - // Adds a page from internal data + if (has3d && !isTouch && options.acceleration) + this.transform(translate(0, 0, true)); - _addPage: function(page) { - - var data = this.data(), - element = data.pageObjs[page]; + // Add pages from the DOM - if (element) - if (turnMethods._necessPage.call(this, page)) { - - if (!data.pageWrap[page]) { - - var pageWidth = (data.display=='double') ? this.width()/2 : this.width(), - pageHeight = this.height(); - - element.css({width:pageWidth, height:pageHeight}); - - // Place - data.pagePlace[page] = page; - - // Wrapper - data.pageWrap[page] = $('
', {'class': 'turn-page-wrapper', - page: page, - css: {position: 'absolute', - overflow: 'hidden', - width: pageWidth, - height: pageHeight}}). - css(pagePosition[(data.display=='double') ? page%2 : 0]); - - // Append to this - this.append(data.pageWrap[page]); - - // Move data.pageObjs[page] (element) to wrapper - data.pageWrap[page].prepend(data.pageObjs[page]); - } - - // If the page is in the current view, create the flip effect - if (!page || turnMethods._setPageLoc.call(this, page)==1) - turnMethods._makeFlip.call(this, page); - - } else { + for (i = 0; ilastPage) + throw turnError('Page "'+page+'" cannot be inserted'); - // Returns a range of `pagesInDOM` pages that should be in the DOM - // Example: - // - page of the current view, return true - // * page is in the range, return true - // 0 page is not in the range, return false - // - // 1 2-3 4-5 6-7 8-9 10-11 12-13 - // ** ** -- ** ** + } else { + + page = lastPage; + incPages = true; - range: function(page) { + } - var remainingPages, left, right, - data = this.data(); - page = page || data.tpage || data.page; - var view = turnMethods._view.call(this, page); + if (page>=1 && page<=lastPage) { - if (page<1 || page>data.totalPages) - throw new Error ('"'+page+'" is not a page for range'); - - view[1] = view[1] || view[0]; - - if (view[0]>=1 && view[1]<=data.totalPages) { + if (data.display=='double') + className = (page%2) ? ' odd' : ' even'; + else + className = ''; - remainingPages = Math.floor((pagesInDOM-2)/2); + // Stop animations + if (data.done) + this.turn('stop'); - if (data.totalPages-view[1] > view[0]) { - left = Math.min(view[0]-1, remainingPages); - right = 2*remainingPages-left; - } else { - right = Math.min(data.totalPages-view[1], remainingPages); - left = 2*remainingPages-right; - } + // Move pages if it's necessary + if (page in data.pageObjs) + turnMethods._movePages.call(this, page, 1); - } else { - left = pagesInDOM-1; - right = pagesInDOM-1; - } + // Increase the number of pages + if (incPages) + data.totalPages = lastPage; - return [Math.max(1, view[0]-left), Math.min(data.totalPages, view[1]+right)]; + // Add element + data.pageObjs[page] = $(element). + css({'float': 'left'}). + addClass('page p' + page + className); - }, + if (!hasHardPage() && data.pageObjs[page].hasClass('hard')) { + data.pageObjs[page].removeClass('hard'); + } - // Detects if a page is within the range of `pagesInDOM` from the current view + // Add page + turnMethods._addPage.call(this, page); - _necessPage: function(page) { - - if (page===0) - return true; + // Remove pages out of range + turnMethods._removeFromDOM.call(this); + } - var range = this.turn('range'); + return this; + }, - return page>=range[0] && page<=range[1]; - - }, + // Adds a page - // Releases memory by removing pages from the DOM + _addPage: function(page) { + + var data = this.data(), + element = data.pageObjs[page]; - _removeFromDOM: function() { + if (element) + if (turnMethods._necessPage.call(this, page)) { - var page, data = this.data(); + if (!data.pageWrap[page]) { - for (page in data.pageWrap) - if (has(page, data.pageWrap) && !turnMethods._necessPage.call(this, page)) - turnMethods._removePageFromDOM.call(this, page); - - - }, + // Wrapper + data.pageWrap[page] = $('
', + {'class': 'page-wrapper', + page: page, + css: {position: 'absolute', + overflow: 'hidden'}}); - // Removes a page from DOM and its internal references + // Append to this flipbook + this.append(data.pageWrap[page]); - _removePageFromDOM: function(page) { + if (!data.pagePlace[page]) { + + data.pagePlace[page] = page; + // Move `pageObjs[page]` to wrapper + data.pageObjs[page].appendTo(data.pageWrap[page]); + + } - var data = this.data(); + // Set the size of the page + var prop = turnMethods._pageSize.call(this, page, true); + element.css({width: prop.width, height: prop.height}); + data.pageWrap[page].css(prop); - if (data.pages[page]) { - var dd = data.pages[page].data(); - if (dd.f && dd.f.fwrapper) - dd.f.fwrapper.remove(); - data.pages[page].remove(); - delete data.pages[page]; - } + } - if (data.pageObjs[page]) - data.pageObjs[page].remove(); + if (data.pagePlace[page] == page) { - if (data.pageWrap[page]) { - data.pageWrap[page].remove(); - delete data.pageWrap[page]; - } + // If the page isn't in another place, create the flip effect + turnMethods._makeFlip.call(this, page); - delete data.pagePlace[page]; + } + + } else { - }, + // Place + data.pagePlace[page] = 0; - // Removes a page + // Remove element from the DOM + if (data.pageObjs[page]) + data.pageObjs[page].remove(); - removePage: function(page) { + } - var data = this.data(); + }, - if (data.pageObjs[page]) { - // Stop animations - this.turn('stop'); + // Checks if a page is in memory + + hasPage: function(page) { - // Remove `page` - turnMethods._removePageFromDOM.call(this, page); - delete data.pageObjs[page]; + return has(page, this.data().pageObjs); + + }, - // Move the pages behind `page` - turnMethods._movePages.call(this, page, -1); + // Centers the flipbook - // Resize the size of this magazine - data.totalPages = data.totalPages-1; - turnMethods._makeRange.call(this); + center: function(page) { + + var data = this.data(), + size = $(this).turn('size'), + left = 0; - // Check the current view - if (data.page>data.totalPages) - this.turn('page', data.totalPages); - } + if (!data.noCenter) { + if (data.display=='double') { + var view = this.turn('view', page || data.tpage || data.page); - return this; - - }, + if (data.direction=='ltr') { + if (!view[0]) + left -= size.width/4; + else if (!view[1]) + left += size.width/4; + } else { + if (!view[0]) + left += size.width/4; + else if (!view[1]) + left -= size.width/4; + } + + } - // Moves pages + $(this).css({marginLeft: left}); + } - _movePages: function(from, change) { + return this; - var page, - data = this.data(), - single = data.display=='single', - move = function(page) { + }, - var next = page + change, - odd = next%2; + // Destroys the flipbook - if (data.pageObjs[page]) - data.pageObjs[next] = data.pageObjs[page].removeClass('page' + page).addClass('page' + next); + destroy: function () { - if (data.pagePlace[page] && data.pageWrap[page]) { - data.pagePlace[next] = next; - data.pageWrap[next] = data.pageWrap[page].css(pagePosition[(single) ? 0 : odd]).attr('page', next); - - if (data.pages[page]) - data.pages[next] = data.pages[page].flip('options', { - page: next, - next: (single || odd) ? next+1 : next-1, - corners: (single) ? 'all' : ((odd) ? 'forward' : 'backward') - }); + var page, + flipbook = this, + data = this.data(), + events = [ + 'end', 'first', 'flip', 'last', 'pressed', + 'released', 'start', 'turning', 'turned', + 'zooming', 'missing']; - if (change) { - delete data.pages[page]; - delete data.pagePlace[page]; - delete data.pageObjs[page]; - delete data.pageWrap[page]; - delete data.pageObjs[page]; - } - } - }; + if (trigger('destroying', this)=='prevented') + return; - if (change>0) - for (page=data.totalPages; page>=from; page--) move(page); - else - for (page=from; page<=data.totalPages; page++) move(page); + data.destroying = true; - }, + $.each(events, function(index, eventName) { + flipbook.unbind(eventName); + }); - // Sets or Gets the display mode + this.parent().unbind('start', data.eventHandlers.start); - display: function(display) { + $(document).unbind(mouseEvents.move, data.eventHandlers.touchMove). + unbind(mouseEvents.up, data.eventHandlers.touchEnd); + + while (data.totalPages!==0) { + this.turn('removePage', data.totalPages); + } - var data = this.data(), - currentDisplay = data.display; + if (data.fparent) + data.fparent.remove(); - if (display) { + if (data.shadow) + data.shadow.remove(); - if ($.inArray(display, displays)==-1) - throw new Error ('"'+display + '" is not a value for display'); - - if (display=='single') { - if (!data.pageObjs[0]) { - this.turn('stop'). - css({'overflow': 'hidden'}); - data.pageObjs[0] = $('
', {'class': 'turn-page p-temporal'}). - css({width: this.width(), height: this.height()}). - appendTo(this); - } - } else { - if (data.pageObjs[0]) { - this.turn('stop'). - css({'overflow': ''}); - data.pageObjs[0].remove(); - delete data.pageObjs[0]; - } - } + this.removeData(); + data = null; - data.display = display; + return this; - if (currentDisplay) { - var size = this.turn('size'); - turnMethods._movePages.call(this, 1, 0); - this.turn('size', size.width, size.height). - turn('update'); - } + }, - return this; + // Checks if this element is a flipbook - } else - return currentDisplay; - - }, + is: function() { - // Detects if the pages are being animated + return typeof(this.data().pages)=='object'; - animating: function() { + }, - return this.data().pageMv.length>0; + // Sets and gets the zoom value - }, + zoom: function(newZoom) { + + var data = this.data(); - // Disables and enables the effect + if (typeof(newZoom)=='number') { - disable: function(bool) { + if (newZoom<0.001 || newZoom>100) + throw turnError(newZoom+ ' is not a value for zoom'); + + if (trigger('zooming', this, [newZoom, data.zoom])=='prevented') + return this; + + var size = this.turn('size'), + currentView = this.turn('view'), + iz = 1/data.zoom, + newWidth = Math.round(size.width * iz * newZoom), + newHeight = Math.round(size.height * iz * newZoom); + + data.zoom = newZoom; - var page, - data = this.data(), - view = this.turn('view'); + $(this).turn('stop'). + turn('size', newWidth, newHeight); + /*. + css({marginTop: size.height * iz / 2 - newHeight / 2});*/ - data.disabled = bool===undefined || bool===true; + if (data.opts.autoCenter) + this.turn('center'); + /*else + $(this).css({marginLeft: size.width * iz / 2 - newWidth / 2});*/ - for (page in data.pages) - if (has(page, data.pages)) - data.pages[page].flip('disable', bool ? $.inArray(page, view) : false ); + turnMethods._updateShadow.call(this); - return this; + for (var i = 0; i0) ? view[0] : 0, (view[1]<=data.totalPages) ? view[1] : 0] - : [(view[0]>0 && view[0]<=data.totalPages) ? view[0] : 0]; + range: function(page) { - }, + var remainingPages, left, right, view, + data = this.data(); - // Stops animations + page = page || data.tpage || data.page || 1; + view = turnMethods._view.call(this, page); - stop: function(ok) { + if (page<1 || page>data.totalPages) + throw turnError('"'+page+'" is not a valid page'); - var i, opts, data = this.data(), pages = data.pageMv; + + view[1] = view[1] || view[0]; + + if (view[0]>=1 && view[1]<=data.totalPages) { - data.pageMv = []; + remainingPages = Math.floor((pagesInDOM-2)/2); - if (data.tpage) { - data.page = data.tpage; - delete data['tpage']; - } + if (data.totalPages-view[1] > view[0]) { + left = Math.min(view[0]-1, remainingPages); + right = 2*remainingPages-left; + } else { + right = Math.min(data.totalPages-view[1], remainingPages); + left = 2*remainingPages-right; + } - for (i in pages) { - if (!has(i, pages)) continue; - opts = data.pages[pages[i]].data().f.opts; - flipMethods._moveFoldingPage.call(data.pages[pages[i]], null); - data.pages[pages[i]].flip('hideFoldedPage'); - data.pagePlace[opts.next] = opts.next; - - if (opts.force) { - opts.next = (opts.page%2===0) ? opts.page-1 : opts.page+1; - delete opts['force']; - } + } else { + left = pagesInDOM-1; + right = pagesInDOM-1; + } - } + return [Math.max(1, view[0]-left), + Math.min(data.totalPages, view[1]+right)]; - this.turn('update'); + }, - return this; - }, + // Detects if a page is within the range of `pagesInDOM` from the current view - // Gets and sets the number of pages + _necessPage: function(page) { + + if (page===0) + return true; - pages: function(pages) { + var range = this.turn('range'); - var data = this.data(); + return this.data().pageObjs[page].hasClass('fixed') || + (page>=range[0] && page<=range[1]); + + }, - if (pages) { - if (pagespages) - this.turn('page', pages); - } + var page, data = this.data(); - data.totalPages = pages; + for (page in data.pageWrap) + if (has(page, data.pageWrap) && + !turnMethods._necessPage.call(this, page)) + turnMethods._removePageFromDOM.call(this, page); + + }, - return this; - } else - return data.totalPages; + // Removes a page from DOM and its internal references - }, + _removePageFromDOM: function(page) { - // Sets a page without effect + var data = this.data(); - _fitPage: function(page, ok) { - - var data = this.data(), newView = this.turn('view', page); - - if (data.page!=page) { - this.trigger('turning', [page, newView]); - if ($.inArray(1, newView)!=-1) this.trigger('first'); - if ($.inArray(data.totalPages, newView)!=-1) this.trigger('last'); - } + if (data.pages[page]) { + var dd = data.pages[page].data(); - if (!data.pageObjs[page]) - return; + flipMethods._moveFoldingPage.call(data.pages[page], false); - data.tpage = page; + if (dd.f && dd.f.fwrapper) + dd.f.fwrapper.remove(); - this.turn('stop', ok); - turnMethods._removeFromDOM.call(this); - turnMethods._makeRange.call(this); - this.trigger('turned', [page, newView]); + data.pages[page].removeData(); + data.pages[page].remove(); + delete data.pages[page]; + } - }, - - // Turns to a page + if (data.pageObjs[page]) + data.pageObjs[page].remove(); - _turnPage: function(page) { + if (data.pageWrap[page]) { + data.pageWrap[page].remove(); + delete data.pageWrap[page]; + } - var current, next, - data = this.data(), - view = this.turn('view'), - newView = this.turn('view', page); - - if (data.page!=page) { - this.trigger('turning', [page, newView]); - if ($.inArray(1, newView)!=-1) this.trigger('first'); - if ($.inArray(data.totalPages, newView)!=-1) this.trigger('last'); - } + turnMethods._removeMv.call(this, page); - if (!data.pageObjs[page]) - return; + delete data.pagePlace[page]; + delete data.pageZoom[page]; - data.tpage = page; + }, - this.turn('stop'); + // Removes a page - turnMethods._makeRange.call(this); + removePage: function(page) { - if (data.display=='single') { - current = view[0]; - next = newView[0]; - } else if (view[1] && page>view[1]) { - current = view[1]; - next = newView[0]; - } else if (view[0] && page view[0]) ? 'br' : 'bl'); - else - data.pages[current].flip('turnPage'); - } + if (page<1 || page>data.totalPages) + throw turnError('The page '+ page + ' doesn\'t exist'); + + if (data.pageObjs[page]) { - }, + // Stop animations + this.turn('stop'); - // Gets and sets a page + // Remove `page` + turnMethods._removePageFromDOM.call(this, page); - page: function(page) { + delete data.pageObjs[page]; - page = parseInt(page, 10); + } - var data = this.data(); + // Move the pages + turnMethods._movePages.call(this, page, -1); - if (page>0 && page<=data.totalPages) { - if (!data.done || $.inArray(page, this.turn('view'))!=-1) - turnMethods._fitPage.call(this, page); - else - turnMethods._turnPage.call(this, page); - - return this; + // Resize the size of this flipbook + data.totalPages = data.totalPages-1; - } else - return data.page; - - }, + // Check the current view - // Turns to the next view + if (data.page>data.totalPages) { - next: function() { - - var data = this.data(); - return this.turn('page', turnMethods._view.call(this, data.page).pop() + 1); - - }, + data.page = null; + turnMethods._fitPage.call(this, data.totalPages); - // Turns to the previous view + } else { - previous: function() { - - var data = this.data(); - return this.turn('page', turnMethods._view.call(this, data.page).shift() - 1); + turnMethods._makeRange.call(this); + this.turn('update'); - }, + } + } - // Adds a motion to the internal list + return this; + + }, - _addMotionPage: function() { + // Moves pages - var opts = $(this).data().f.opts, - turn = opts.turn, - dd = turn.data(); + _movePages: function(from, change) { - opts.pageMv = opts.page; - turnMethods._addMv.call(turn, opts.pageMv); - dd.pagePlace[opts.next] = opts.page; - turn.turn('update'); + var page, + that = this, + data = this.data(), + single = data.display=='single', + move = function(page) { - }, + var next = page + change, + odd = next%2, + className = (odd) ? ' odd ' : ' even '; - // This event is called in context of flip + if (data.pageObjs[page]) + data.pageObjs[next] = data.pageObjs[page]. + removeClass('p' + page + ' odd even'). + addClass('p' + next + className); - _start: function(e, opts, corner) { + if (data.pagePlace[page] && data.pageWrap[page]) { - var data = opts.turn.data(), - event = $.Event('start'); + data.pagePlace[next] = next; + + if (data.pageObjs[next].hasClass('fixed')) + data.pageWrap[next] = data.pageWrap[page]. + attr('page', next); + else + data.pageWrap[next] = data.pageWrap[page]. + css(turnMethods._pageSize.call(that, next, true)). + attr('page', next); + + if (data.pages[page]) + data.pages[next] = data.pages[page]. + flip('options', { + page: next, + next: (single || odd) ? next+1 : next-1 + }); - e.stopPropagation(); + if (change) { + delete data.pages[page]; + delete data.pagePlace[page]; + delete data.pageZoom[page]; + delete data.pageObjs[page]; + delete data.pageWrap[page]; + } - opts.turn.trigger(event, [opts, corner]); + } - if (event.isDefaultPrevented()) { - e.preventDefault(); - return; - } - - if (data.display=='single') { + }; - var left = corner.charAt(1)=='l'; - if ((opts.page==1 && left) || (opts.page==data.totalPages && !left)) - e.preventDefault(); - else { - if (left) { - opts.next = (opts.nextopts.page) ? opts.next : opts.page+1; - } + if (change>0) + for (page=data.totalPages; page>=from; page--) + move(page); + else + for (page=from; page<=data.totalPages; page++) + move(page); - } + }, - turnMethods._addMotionPage.call(this); - }, + // Sets or Gets the display mode - // This event is called in context of flip + display: function(display) { - _end: function(e, turned) { - - var that = $(this), - data = that.data().f, - opts = data.opts, - turn = opts.turn, - dd = turn.data(); + var data = this.data(), + currentDisplay = data.display; - e.stopPropagation(); + if (display===undefined) { + + return currentDisplay; - if (turned || dd.tpage) { + } else { - if (dd.tpage==opts.next || dd.tpage==opts.page) { - delete dd['tpage']; - turnMethods._fitPage.call(turn, dd.tpage || opts.next, true); - } + if ($.inArray(display, displays)==-1) + throw turnError('"'+display + '" is not a value for display'); + + switch(display) { + case 'single': - } else { - turnMethods._removeMv.call(turn, opts.pageMv); - turn.turn('update'); - } - - }, - - // This event is called in context of flip + // Create a temporal page to use as folded page - _pressed: function() { + if (!data.pageObjs[0]) { + this.turn('stop'). + css({'overflow': 'hidden'}); - var page, - that = $(this), - data = that.data().f, - turn = data.opts.turn, - pages = turn.data().pages; - - for (page in pages) - if (page!=data.opts.page) - pages[page].flip('disable', true); + data.pageObjs[0] = $('
', + {'class': 'page p-temporal'}). + css({width: this.width(), height: this.height()}). + appendTo(this); + } - return data.time = new Date().getTime(); + this.addClass('shadow'); - }, + break; + case 'double': - // This event is called in context of flip + // Remove the temporal page - _released: function(e, point) { - - var that = $(this), - data = that.data().f; + if (data.pageObjs[0]) { + this.turn('stop').css({'overflow': ''}); + data.pageObjs[0].remove(); + delete data.pageObjs[0]; + } - e.stopPropagation(); + this.removeClass('shadow'); - if ((new Date().getTime())-data.time<200 || point.x<0 || point.x>$(this).width()) { - e.preventDefault(); - data.opts.turn.data().tpage = data.opts.next; - data.opts.turn.turn('update'); - $(that).flip('turnPage'); - } + break; + } + - }, + data.display = display; - // This event is called in context of flip - - _flip: function() { + if (currentDisplay) { + var size = this.turn('size'); + turnMethods._movePages.call(this, 1, 0); + this.turn('size', size.width, size.height). + turn('update'); + } - var opts = $(this).data().f.opts; - - opts.turn.trigger('turn', [opts.next]); - - }, - - // Calculate the z-index value for pages during the animation - - calculateZ: function(mv) { - - var i, page, nextPage, placePage, dpage, - that = this, - data = this.data(), - view = this.turn('view'), - currentPage = view[0] || view[1], - r = {pageZ: {}, partZ: {}, pageV: {}}, - - addView = function(page) { - var view = that.turn('view', page); - if (view[0]) r.pageV[view[0]] = true; - if (view[1]) r.pageV[view[1]] = true; - }; - - for (i = 0; i0; + + }, + + // Gets the current activated corner + + corner: function() { + + var corner, + page, + data = this.data(); + + for (page in data.pages) { + if (has(page, data.pages)) + if ((corner = data.pages[page].flip('corner'))) { + return corner; + } + } + + return false; + }, + + // Gets the data stored in the flipbook + + data: function() { + + return this.data(); + + }, + + // Disables and enables the effect + + disable: function(disable) { + + var page, + data = this.data(), + view = this.turn('view'); + + data.disabled = disable===undefined || disable===true; + + for (page in data.pages) { + if (has(page, data.pages)) + data.pages[page].flip('disable', + (data.disabled) ? true : $.inArray(parseInt(page, 10), view)==-1); + } + + return this; + + }, + + // Disables and enables the effect + + disabled: function(disable) { + + if (disable===undefined) { + return this.data().disabled===true; + } else { + return this.turn('disable', disable); + } + + }, + + // Gets and sets the size + + size: function(width, height) { + + if (width===undefined || height===undefined) { + + return {width: this.width(), height: this.height()}; + + } else { + + this.turn('stop'); + + var page, prop, + data = this.data(), + pageWidth = (data.display=='double') ? width/2 : width; + + this.css({width: width, height: height}); + + if (data.pageObjs[0]) + data.pageObjs[0].css({width: pageWidth, height: height}); + + for (page in data.pageWrap) { + if (!has(page, data.pageWrap)) continue; + + prop = turnMethods._pageSize.call(this, page, true); + + data.pageObjs[page].css({width: prop.width, height: prop.height}); + data.pageWrap[page].css(prop); + + if (data.pages[page]) + data.pages[page].css({width: prop.width, height: prop.height}); + } + + this.turn('resize'); + + return this; + + } + }, + + // Resizes each page + + resize: function() { + + var page, data = this.data(); + + if (data.pages[0]) { + data.pageWrap[0].css({left: -this.width()}); + data.pages[0].flip('resize', true); + } + + for (page = 1; page <= data.totalPages; page++) + if (data.pages[page]) + data.pages[page].flip('resize', true); + + turnMethods._updateShadow.call(this); + + if (data.opts.autoCenter) + this.turn('center'); + + }, + + // Removes an animation from the cache + + _removeMv: function(page) { + + var i, data = this.data(); + + for (i=0; i0) ? view[0] : 0, + (view[1]<=data.totalPages) ? view[1] : 0]; + else + return [(view[0]>0 && view[0]<=data.totalPages) ? view[0] : 0]; + + }, + + // Stops animations + + stop: function(ignore, animate) { + + if (this.turn('animating')) { + + var i, opts, page, + data = this.data(); + + if (data.tpage) { + data.page = data.tpage; + delete data['tpage']; + } + + for (i = 0; ipages; page--) + this.turn('removePage', page); + + } + + data.totalPages = pages; + turnMethods._fitPage.call(this, data.page); + + return this; + + } else + return data.totalPages; + + }, + + // Checks missing pages + + _missing : function(page) { + + var data = this.data(); + + if (data.totalPages<1) + return; + + var p, + range = this.turn('range', page), + missing = []; + + for (p = range[0]; p<=range[1]; p++) { + if (!data.pageObjs[p]) + missing.push(p); + } + + if (missing.length>0) + this.trigger('missing', [missing]); + + }, + + // Sets a page without effect + + _fitPage: function(page) { + + var data = this.data(), + newView = this.turn('view', page); + + turnMethods._missing.call(this, page); + + if (!data.pageObjs[page]) + return; + + data.page = page; + + this.turn('stop'); + + for (var i = 0; iview[1]) { + current = view[1]; + next = newView[0]; + } else if (view[0] && pagecurrent) ? 'r' : 'l'); + else + data.pages[current].flip('turnPage', + (page>current) ? 'l' : 'r'); + else { + if (data.direction=='ltr') + data.pages[current].flip('turnPage', + optsCorners[(page>current) ? 1 : 0]); + else + data.pages[current].flip('turnPage', + optsCorners[(page>current) ? 0 : 1]); + } + + }, + + // Gets and sets a page + + page: function(page) { + + var data = this.data(); + + if (page===undefined) { + + return data.page; + + } else { + + if (!data.disabled && !data.destroying) { + + page = parseInt(page, 10); + + if (page>0 && page<=data.totalPages) { + + if (page!=data.page) { + if (!data.done || $.inArray(page, this.turn('view'))!=-1) + turnMethods._fitPage.call(this, page); + else + turnMethods._turnPage.call(this, page); + } + + return this; + + } else { + + throw turnError('The page ' + page + ' does not exist'); + + } + + } + + } + + }, + + // Turns to the next view + + next: function() { + + return this.turn('page', Math.min(this.data().totalPages, + turnMethods._view.call(this, this.data().page).pop() + 1)); + + }, + + // Turns to the previous view + + previous: function() { + + return this.turn('page', Math.max(1, + turnMethods._view.call(this, this.data().page).shift() - 1)); + + }, + + // Shows a peeling corner + + peel: function(corner, animate) { + + var data = this.data(), + view = this.turn('view'); + + animate = (animate===undefined) ? true : animate===true; + + if (corner===false) { + + this.turn('stop', null, animate); + + } else { + + if (data.display=='single') { + + data.pages[data.page].flip('peel', corner, animate); + + } else { + + var page; + + if (data.direction=='ltr') { + + page = (corner.indexOf('l')!=-1) ? view[0] : view[1]; + + } else { + + page = (corner.indexOf('l')!=-1) ? view[1] : view[0]; + + } + + if (data.pages[page]) + data.pages[page].flip('peel', corner, animate); + + } + } + + return this; + + }, + + // Adds a motion to the internal list + // This event is called in context of flip + + _addMotionPage: function() { + + var opts = $(this).data().f.opts, + turn = opts.turn, + dd = turn.data(); + + turnMethods._addMv.call(turn, opts.page); + + }, + + // This event is called in context of flip + + _eventStart: function(e, opts, corner) { + + var data = opts.turn.data(), + actualZoom = data.pageZoom[opts.page]; + + if (e.isDefaultPrevented()) { + turnMethods._updateShadow.call(opts.turn); + return; + } + + if (actualZoom && actualZoom!=data.zoom) { + + opts.turn.trigger('zoomed',[ + opts.page, + opts.turn.turn('view', opts.page), + actualZoom, + data.zoom]); + + data.pageZoom[opts.page] = data.zoom; + + } + + if (data.display=='single' && corner) { + + if ((corner.charAt(1)=='l' && data.direction=='ltr') || + (corner.charAt(1)=='r' && data.direction=='rtl')) + { + + opts.next = (opts.nextopts.page) ? opts.next : opts.page+1; + + } + + } + + turnMethods._addMotionPage.call(e.target); + turnMethods._updateShadow.call(opts.turn); + }, + + // This event is called in context of flip + + _eventEnd: function(e, opts, turned) { + + var that = $(e.target), + data = that.data().f, + turn = opts.turn, + dd = turn.data(); + + if (turned) { + + var tpage = dd.tpage || dd.page; + + if (tpage==opts.next || tpage==opts.page) { + delete dd.tpage; + + turnMethods._fitPage.call(turn, tpage || opts.next, true); + } + + } else { + + turnMethods._removeMv.call(turn, opts.page); + turnMethods._updateShadow.call(turn); + turn.turn('update'); + + } + + }, + + // This event is called in context of flip + + _eventPressed: function(e) { + + var page, + data = $(e.target).data().f, + turn = data.opts.turn, + turnData = turn.data(), + pages = turnData.pages; + + turnData.mouseAction = true; + + turn.turn('update'); + + return data.time = new Date().getTime(); + + }, + + // This event is called in context of flip + + _eventReleased: function(e, point) { + + var outArea, + page = $(e.target), + data = page.data().f, + turn = data.opts.turn, + turnData = turn.data(); + + if (turnData.display=='single') { + outArea = (point.corner=='br' || point.corner=='tr') ? + point.xpage.width()/2; + } else { + outArea = point.x<0 || point.x>page.width(); + } + + if ((new Date()).getTime()-data.time<200 || outArea) { + + e.preventDefault(); + turnMethods._turnPage.call(turn, data.opts.next); + + } + + turnData.mouseAction = false; + + }, + + // This event is called in context of flip + + _flip: function(e) { + + e.stopPropagation(); + + var opts = $(e.target).data().f.opts; + + opts.turn.trigger('turn', [opts.next]); + + if (opts.turn.data().opts.autoCenter) { + opts.turn.turn('center', opts.next); + } + + }, + + // + _touchStart: function() { + var data = this.data(); + for (var page in data.pages) { + if (has(page, data.pages) && + flipMethods._eventStart.apply(data.pages[page], arguments)===false) { + return false; + } + } + }, + + // + _touchMove: function() { + var data = this.data(); + for (var page in data.pages) { + if (has(page, data.pages)) { + flipMethods._eventMove.apply(data.pages[page], arguments); + } + } + }, + + // + _touchEnd: function() { + var data = this.data(); + for (var page in data.pages) { + if (has(page, data.pages)) { + flipMethods._eventEnd.apply(data.pages[page], arguments); + } + } + }, + + // Calculate the z-index value for pages during the animation + + calculateZ: function(mv) { + + var i, page, nextPage, placePage, dpage, + that = this, + data = this.data(), + view = this.turn('view'), + currentPage = view[0] || view[1], + total = mv.length-1, + r = {pageZ: {}, partZ: {}, pageV: {}}, + + addView = function(page) { + var view = that.turn('view', page); + if (view[0]) r.pageV[view[0]] = true; + if (view[1]) r.pageV[view[1]] = true; + }; + + for (i = 0; i<=total; i++) { + page = mv[i]; + nextPage = data.pages[page].data().f.opts.next; + placePage = data.pagePlace[page]; + addView(page); + addView(nextPage); + dpage = (data.pagePlace[nextPage]==nextPage) ? nextPage : page; + r.pageZ[dpage] = data.totalPages - Math.abs(currentPage-dpage); + r.partZ[placePage] = data.totalPages*2 - total + i; + } + + return r; + }, + + // Updates the z-index and display property of every page + + update: function() { + + var page, + data = this.data(); + + if (this.turn('animating') && data.pageMv[0]!==0) { + + // Update motion + + var p, apage, fixed, + pos = this.turn('calculateZ', data.pageMv), + corner = this.turn('corner'), + actualView = this.turn('view'), + newView = this.turn('view', data.tpage); + + for (page in data.pageWrap) { + + if (!has(page, data.pageWrap)) + continue; + + fixed = data.pageObjs[page].hasClass('fixed'); + + data.pageWrap[page].css({ + display: (pos.pageV[page] || fixed) ? '' : 'none', + zIndex: + (data.pageObjs[page].hasClass('hard') ? + pos.partZ[page] + : + pos.pageZ[page] + ) || (fixed ? -1 : 0) + }); + + if ((p = data.pages[page])) { + + p.flip('z', pos.partZ[page] || null); + + if (pos.pageV[page]) + p.flip('resize'); + + if (data.tpage) { // Is it turning the page to `tpage`? + + p.flip('hover', false). + flip('disable', + $.inArray(parseInt(page, 10), data.pageMv)==-1 && + page!=newView[0] && + page!=newView[1]); + + } else { + + p.flip('hover', corner===false). + flip('disable', page!=actualView[0] && page!=actualView[1]); + + } + + } + + } + + } else { + + // Update static pages + + for (page in data.pageWrap) { + + if (!has(page, data.pageWrap)) + continue; + + var pageLocation = turnMethods._setPageLoc.call(this, page); + + if (data.pages[page]) { + data.pages[page]. + flip('disable', data.disabled || pageLocation!=1). + flip('hover', true). + flip('z', null); + } + } + } + + return this; + }, + + // Updates the position and size of the flipbook's shadow + + _updateShadow: function() { + + var view, view2, shadow, + data = this.data(), + width = this.width(), + height = this.height(), + pageWidth = (data.display=='single') ? width : width/2; + + view = this.turn('view'); + + if (!data.shadow) { + data.shadow = $('
', { + 'class': 'shadow', + 'css': divAtt(0, 0, 0).css + }). + appendTo(this); + } + + for (var i = 0; i=width || point.y>=height) + return false; + + var allowedCorners = flipMethods._cAllowed.call(this); + + switch (data.effect) { + case 'hard': + + if (point.x>width-csz) + point.corner = 'r'; + else if (point.x=height-csz) + point.corner+= 'b'; + else + return false; + + if (point.x<=csz) + point.corner+= 'l'; + else if (point.x>=width-csz) + point.corner+= 'r'; + else + return false; + + break; + } + + return (!point.corner || $.inArray(point.corner, allowedCorners)==-1) ? + false : point; + + }, + + _isIArea: function(e) { + + var pos = this.data().f.parent.offset(); + + e = (isTouch && e.originalEvent) ? e.originalEvent.touches[0] : e; + + return flipMethods._cornerActivated.call(this, + { + x: e.pageX-pos.left, + y: e.pageY-pos.top + }); + + }, + + _c: function(corner, opts) { + + opts = opts || 0; + + switch (corner) { + case 'tl': + return point2D(opts, opts); + case 'tr': + return point2D(this.width()-opts, opts); + case 'bl': + return point2D(opts, this.height()-opts); + case 'br': + return point2D(this.width()-opts, this.height()-opts); + case 'l': + return point2D(opts, 0); + case 'r': + return point2D(this.width()-opts, 0); + } + + }, + + _c2: function(corner) { + + switch (corner) { + case 'tl': + return point2D(this.width()*2, 0); + case 'tr': + return point2D(-this.width(), 0); + case 'bl': + return point2D(this.width()*2, this.height()); + case 'br': + return point2D(-this.width(), this.height()); + case 'l': + return point2D(this.width()*2, 0); + case 'r': + return point2D(-this.width(), 0); + } + + }, + + _foldingPage: function() { + + var data = this.data().f; + + if (!data) + return; + + var opts = data.opts; + + if (opts.turn) { + data = opts.turn.data(); + if (data.display == 'single') + return (opts.next>1 || opts.page>1) ? data.pageObjs[0] : null; + else + return data.pageObjs[opts.next]; + } + + }, + + _backGradient: function() { + + var data = this.data().f, + turnData = data.opts.turn.data(), + gradient = turnData.opts.gradients && (turnData.display=='single' || + (data.opts.page!=2 && data.opts.page!=turnData.totalPages-1)); + + if (gradient && !data.bshadow) + data.bshadow = $('
', divAtt(0, 0, 1)). + css({'position': '', width: this.width(), height: this.height()}). + appendTo(data.parent); + + return gradient; + + }, - setData: function(d) { - - var data = this.data(); + type: function () { + + return this.data().f.effect; - data.f = $.extend(data.f, d); + }, - return this; - }, + resize: function(full) { + + var data = this.data().f, + turnData = data.opts.turn.data(), + width = this.width(), + height = this.height(); + + switch (data.effect) { + case 'hard': + + if (full) { + data.wrapper.css({width: width, height: height}); + data.fpage.css({width: width, height: height}); + if (turnData.opts.gradients) { + data.ashadow.css({width: width, height: height}); + data.bshadow.css({width: width, height: height}); + } + } + + break; + case 'sheet': + + if (full) { + var size = Math.round(Math.sqrt(Math.pow(width, 2)+Math.pow(height, 2))); + + data.wrapper.css({width: size, height: size}); + data.fwrapper.css({width: size, height: size}). + children(':first-child'). + css({width: width, height: height}); + + data.fpage.css({width: width, height: height}); + + if (turnData.opts.gradients) + data.ashadow.css({width: width, height: height}); + + if (flipMethods._backGradient.call(this)) + data.bshadow.css({width: width, height: height}); + } + + if (data.parent.is(':visible')) { + var offset = findPos(data.parent[0]); + + data.fwrapper.css({top: offset.top, + left: offset.left}); - options: function(opts) { - - var data = this.data().f; + //if (data.opts.turn) { + offset = findPos(data.opts.turn[0]); + data.fparent.css({top: -offset.top, left: -offset.left}); + //} + } - if (opts) { - flipMethods.setData.call(this, {opts: $.extend({}, data.opts || flipOptions, opts) }); - return this; - } else - return data.opts; + this.flip('z', data.opts['z-index']); - }, + break; + } - z: function(z) { + }, - var data = this.data().f; - data.opts['z-index'] = z; - data.fwrapper.css({'z-index': z || parseInt(data.parent.css('z-index'), 10) || 0}); + // Prepares the page by adding a general wrapper and another objects - return this; - }, + _addPageWrapper: function() { - _cAllowed: function() { + var att, + data = this.data().f, + turnData = data.opts.turn.data(), + parent = this.parent(); + + data.parent = parent; + + if (!data.wrapper) + switch (data.effect) { + case 'hard': + + var cssProperties = {}; + cssProperties[vendor + 'transform-style'] = 'preserve-3d'; + cssProperties[vendor + 'backface-visibility'] = 'hidden'; + + data.wrapper = $('
', divAtt(0, 0, 2)). + css(cssProperties). + appendTo(parent). + prepend(this); + + data.fpage = $('
', divAtt(0, 0, 1)). + css(cssProperties). + appendTo(parent); + + if (turnData.opts.gradients) { + data.ashadow = $('
', divAtt(0, 0, 0)). + hide(). + appendTo(parent); + + data.bshadow = $('
', divAtt(0, 0, 0)); + } + + break; + case 'sheet': + + var width = this.width(), + height = this.height(), + size = Math.round(Math.sqrt(Math.pow(width, 2)+Math.pow(height, 2))); + + data.fparent = data.opts.turn.data().fparent; + + if (!data.fparent) { + var fparent = $('
', {css: {'pointer-events': 'none'}}).hide(); + fparent.data().flips = 0; + fparent.css(divAtt(0, 0, 'auto', 'visible').css). + appendTo(data.opts.turn); + + data.opts.turn.data().fparent = fparent; + data.fparent = fparent; + } + + this.css({position: 'absolute', top: 0, left: 0, bottom: 'auto', right: 'auto'}); + + data.wrapper = $('
', divAtt(0, 0, this.css('z-index'))). + appendTo(parent). + prepend(this); - return corners[this.data().f.opts.corners] || this.data().f.opts.corners; + data.fwrapper = $('
', divAtt(parent.offset().top, parent.offset().left)). + hide(). + appendTo(data.fparent); + + data.fpage = $('
', divAtt(0, 0, 0, 'visible')). + css({cursor: 'default'}). + appendTo(data.fwrapper); + + if (turnData.opts.gradients) + data.ashadow = $('
', divAtt(0, 0, 1)). + appendTo(data.fpage); + + flipMethods.setData.call(this, data); + + break; + } + + // Set size + flipMethods.resize.call(this, true); + + }, + + // Takes a 2P point from the screen and applies the transformation + + _fold: function(point) { + + var data = this.data().f, + turnData = data.opts.turn.data(), + o = flipMethods._c.call(this, point.corner), + width = this.width(), + height = this.height(); + + switch (data.effect) { + + case 'hard': + + if (point.corner=='l') + point.x = Math.min(Math.max(point.x, 0), width*2); + else + point.x = Math.max(Math.min(point.x, width), -width); + + var leftPos, + shadow, + gradientX, + fpageOrigin, + parentOrigin, + totalPages = turnData.totalPages, + zIndex = data.opts['z-index'] || totalPages, + parentCss = {'overflow': 'visible'}, + relX = (o.x) ? (o.x - point.x)/width : point.x/width, + angle = relX * 90, + half = angle<90; + + switch (point.corner) { + case 'l': + + fpageOrigin = '0% 50%'; + parentOrigin = '100% 50%'; + + if (half) { + leftPos = 0; + shadow = data.opts.next-1>0; + gradientX = 1; + } else { + leftPos = '100%'; + shadow = data.opts.page+1 A90) { + tr.x = tr.x + Math.abs(tr.y * rel.y/rel.x); + tr.y = 0; + if (Math.round(tr.x*Math.tan(PI-alpha)) < height) { + point.y = Math.sqrt(Math.pow(height, 2)+2 * middle.x * rel.x); + if (top) point.y = height - point.y; + return compute(); + } + } + + if (alpha>A90) { + var beta = PI-alpha, dd = h - height/Math.sin(beta); + mv = point2D(Math.round(dd*Math.cos(beta)), Math.round(dd*Math.sin(beta))); + if (left) mv.x = - mv.x; + if (top) mv.y = - mv.y; + } + + px = Math.round(tr.y/Math.tan(alpha) + tr.x); + + var side = width - px, + sideX = side*Math.cos(alpha*2), + sideY = side*Math.sin(alpha*2); + df = point2D( + Math.round((left ? side -sideX : px+sideX)), + Math.round((top) ? sideY : height - sideY)); + + // Gradients + if (turnData.opts.gradients) { + + gradientSize = side*Math.sin(alpha); + + var endingPoint = flipMethods._c2.call(that, point.corner), + far = Math.sqrt(Math.pow(endingPoint.x-point.x, 2)+Math.pow(endingPoint.y-point.y, 2))/width; + + shadowVal = Math.sin(A90*((far>1) ? 2 - far : far)); + + gradientOpacity = Math.min(far, 1); + + + gradientStartVal = gradientSize>100 ? (gradientSize-100)/gradientSize : 0; + + gradientEndPointA = point2D( + gradientSize*Math.sin(alpha)/width*100, + gradientSize*Math.cos(alpha)/height*100); + + + if (flipMethods._backGradient.call(that)) { + + gradientEndPointB = point2D( + gradientSize*1.2*Math.sin(alpha)/width*100, + gradientSize*1.2*Math.cos(alpha)/height*100); + + if (!left) gradientEndPointB.x = 100-gradientEndPointB.x; + if (!top) gradientEndPointB.y = 100-gradientEndPointB.y; + + } + + } + + tr.x = Math.round(tr.x); + tr.y = Math.round(tr.y); + + return true; + }, + + transform = function(tr, c, x, a) { + + var f = ['0', 'auto'], mvW = (width-h)*x[0]/100, mvH = (height-h)*x[1]/100, + cssA = {left: f[c[0]], top: f[c[1]], right: f[c[2]], bottom: f[c[3]]}, + cssB = {}, + aliasingFk = (a!=90 && a!=-90) ? (left ? -1 : 1) : 0, + origin = x[0] + '% ' + x[1] + '%'; + + that.css(cssA). + transform(rotate(a) + translate(tr.x + aliasingFk, tr.y, ac), origin); + + data.fpage.css(cssA).transform( + rotate(a) + + translate(tr.x + df.x - mv.x - width*x[0]/100, tr.y + df.y - mv.y - height*x[1]/100, ac) + + rotate((180/a - 2)*a), + origin); + + data.wrapper.transform(translate(-tr.x + mvW-aliasingFk, -tr.y + mvH, ac) + rotate(-a), origin); + + data.fwrapper.transform(translate(-tr.x + mv.x + mvW, -tr.y + mv.y + mvH, ac) + rotate(-a), origin); + + if (turnData.opts.gradients) { + + if (x[0]) + gradientEndPointA.x = 100-gradientEndPointA.x; + + if (x[1]) + gradientEndPointA.y = (100-gradientEndPointA.y); + + cssB['box-shadow'] = '0 0 20px rgba(0,0,0,'+(0.5*shadowVal)+')'; + folding.css(cssB); + + gradient(data.ashadow, + point2D(left?100:0, top?0:100), + point2D(gradientEndPointA.x, gradientEndPointA.y), + [[gradientStartVal, 'rgba(0,0,0,0)'], + [((1-gradientStartVal)*0.8)+gradientStartVal, 'rgba(0,0,0,'+(0.2*gradientOpacity)+')'], + [1, 'rgba(255,255,255,'+(0.2*gradientOpacity)+')']], + 3, + alpha); + + if (flipMethods._backGradient.call(that)) + gradient(data.bshadow, + point2D(left?0:100, top?0:100), + point2D(gradientEndPointB.x, gradientEndPointB.y), + [[0.6, 'rgba(0,0,0,0)'], + [0.8, 'rgba(0,0,0,'+(0.3*gradientOpacity)+')'], + [1, 'rgba(0,0,0,0)'] + ], + 3); + } - }, + }; - _cornerActivated: function(e) { - if (e.originalEvent === undefined) { - return false; - } + switch (point.corner) { + case 'l' : - e = (isTouch) ? e.originalEvent.touches : [e]; - var data = this.data().f, - pos = data.parent.offset(), - width = this.width(), - height = this.height(), - c = {x: Math.max(0, e[0].pageX-pos.left), y: Math.max(0, e[0].pageY-pos.top)}, - csz = data.opts.cornerSize, - allowedCorners = flipMethods._cAllowed.call(this); + break; + case 'r' : - if (c.x<=0 || c.y<=0 || c.x>=width || c.y>=height) return false; - if (c.y=height-csz) c.corner = 'b'; - else return false; - - if (c.x<=csz) c.corner+= 'l'; - else if (c.x>=width-csz) c.corner+= 'r'; - else return false; + break; + case 'tl' : + point.x = Math.max(point.x, 1); + compute(); + transform(tr, [1,0,0,1], [100, 0], a); + break; + case 'tr' : + point.x = Math.min(point.x, width-1); + compute(); + transform(point2D(-tr.x, tr.y), [0,0,0,1], [0, 0], -a); + break; + case 'bl' : + point.x = Math.max(point.x, 1); + compute(); + transform(point2D(tr.x, -tr.y), [1,1,0,0], [100, 100], -a); + break; + case 'br' : + point.x = Math.min(point.x, width-1); + compute(); + transform(point2D(-tr.x, -tr.y), [0,1,1,0], [0, 100], a); + break; + } - return ($.inArray(c.corner, allowedCorners)==-1) ? false : c; + break; + } + + data.point = point; + + }, + + _moveFoldingPage: function(move) { + + var data = this.data().f; + + if (!data) + return; + + var turn = data.opts.turn, + turnData = turn.data(), + place = turnData.pagePlace; + + if (move) { - }, + var nextPage = data.opts.next; + + if (place[nextPage]!=data.opts.page) { - _c: function(corner, opts) { + if (data.folding) + flipMethods._moveFoldingPage.call(this, false); + + var folding = flipMethods._foldingPage.call(this); + + folding.appendTo(data.fpage); + place[nextPage] = data.opts.page; + data.folding = nextPage; + } - opts = opts || 0; - return ({tl: point2D(opts, opts), - tr: point2D(this.width()-opts, opts), - bl: point2D(opts, this.height()-opts), - br: point2D(this.width()-opts, this.height()-opts)})[corner]; + turn.turn('update'); + + } else { + + if (data.folding) { + + if (turnData.pages[data.folding]) { + + // If we have flip available - }, + var flipData = turnData.pages[data.folding].data().f; + + turnData.pageObjs[data.folding]. + appendTo(flipData.wrapper); - _c2: function(corner) { + } else if (turnData.pageWrap[data.folding]) { + + // If we have the pageWrapper - return {tl: point2D(this.width()*2, 0), - tr: point2D(-this.width(), 0), - bl: point2D(this.width()*2, this.height()), - br: point2D(-this.width(), this.height())}[corner]; + turnData.pageObjs[data.folding]. + appendTo(turnData.pageWrap[data.folding]); - }, + } - _foldingPage: function(corner) { + if (data.folding in place) { + place[data.folding] = data.folding; + } - var opts = this.data().f.opts; - - if (opts.folding) return opts.folding; - else if(opts.turn) { - var data = opts.turn.data(); - if (data.display == 'single') - return (data.pageObjs[opts.next]) ? data.pageObjs[0] : null; - else - return data.pageObjs[opts.next]; - } + delete data.folding; - }, + } + } + }, - _backGradient: function() { + _showFoldedPage: function(c, animate) { - var data = this.data().f, - turn = data.opts.turn, - gradient = data.opts.backGradient && - (!turn || turn.data().display=='single' || (data.opts.page!=2 && data.opts.page!=turn.data().totalPages-1) ); + var folding = flipMethods._foldingPage.call(this), + dd = this.data(), + data = dd.f, + visible = data.visible; + if (folding) { - if (gradient && !data.bshadow) - data.bshadow = $('
', divAtt(0, 0, 1)). - css({'position': '', width: this.width(), height: this.height()}). - appendTo(data.parent); + if (!visible || !data.point || data.point.corner!=c.corner) { - return gradient; + var corner = ( + data.status=='hover' || + data.status=='peel' || + data.opts.turn.data().mouseAction) ? + c.corner : null; - }, + visible = false; - resize: function(full) { - - var data = this.data().f, - width = this.width(), - height = this.height(), - size = Math.round(Math.sqrt(Math.pow(width, 2)+Math.pow(height, 2))); + if (trigger('start', this, [data.opts, corner])=='prevented') + return false; - if (full) { - data.wrapper.css({width: size, height: size}); - data.fwrapper.css({width: size, height: size}). - children(':first-child'). - css({width: width, height: height}); + } - data.fpage.css({width: height, height: width}); + if (animate) { + + var that = this, + point = (data.point && data.point.corner==c.corner) ? + data.point : flipMethods._c.call(this, c.corner, 1); + + this.animatef({ + from: [point.x, point.y], + to: [c.x, c.y], + duration: 500, + frame: function(v) { + c.x = Math.round(v[0]); + c.y = Math.round(v[1]); + flipMethods._fold.call(that, c); + } + }); - if (data.opts.frontGradient) - data.ashadow.css({width: height, height: width}); + } else { - if (flipMethods._backGradient.call(this)) - data.bshadow.css({width: width, height: height}); - } + flipMethods._fold.call(this, c); - if (data.parent.is(':visible')) { - data.fwrapper.css({top: data.parent.offset().top, - left: data.parent.offset().left}); - - if (data.opts.turn) - data.fparent.css({top: -data.opts.turn.offset().top, left: -data.opts.turn.offset().left}); - } - - this.flip('z', data.opts['z-index']); + if (dd.effect && !dd.effect.turning) + this.animatef(false); - }, + } - // Prepares the page by adding a general wrapper and another objects + if (!visible) { - _addPageWrapper: function() { - - var att, - data = this.data().f, - parent = this.parent(); + switch(data.effect) { + case 'hard': - if (!data.wrapper) { + data.visible = true; + flipMethods._moveFoldingPage.call(this, true); + data.fpage.show(); + if (data.opts.shadows) + data.bshadow.show(); - var left = this.css('left'), - top = this.css('top'), - width = this.width(), - height = this.height(), - size = Math.round(Math.sqrt(Math.pow(width, 2)+Math.pow(height, 2))); - - data.parent = parent; - data.fparent = (data.opts.turn) ? data.opts.turn.data().fparent : $('#turn-fwrappers'); + break; + case 'sheet': - if (!data.fparent) { - var fparent = $('
', {css: {'pointer-events': 'none'}}).hide(); - fparent.data().flips = 0; + data.visible = true; + data.fparent.show().data().flips++; + flipMethods._moveFoldingPage.call(this, true); + data.fwrapper.show(); + if (data.bshadow) + data.bshadow.show(); - if (data.opts.turn) { - fparent.css(divAtt(-data.opts.turn.offset().top, -data.opts.turn.offset().left, 'auto', 'visible').css). - appendTo(data.opts.turn); - - data.opts.turn.data().fparent = fparent; - } else { - fparent.css(divAtt(0, 0, 'auto', 'visible').css). - attr('id', 'turn-fwrappers'). - appendTo($('body')); - } - - data.fparent = fparent; - } - - this.css({position: 'absolute', top: 0, left: 0, bottom: 'auto', right: 'auto'}); - - data.wrapper = $('
', divAtt(0, 0, this.css('z-index'))). - appendTo(parent). - prepend(this); - - data.fwrapper = $('
', divAtt(parent.offset().top, parent.offset().left)). - hide(). - appendTo(data.fparent); + break; + } - data.fpage = $('
', {css: {cursor: 'default'}}). - appendTo($('
', divAtt(0, 0, 0, 'visible')). - appendTo(data.fwrapper)); - - if (data.opts.frontGradient) - data.ashadow = $('
', divAtt(0, 0, 1)). - appendTo(data.fpage); - - // Save data - - flipMethods.setData.call(this, data); - - // Set size - flipMethods.resize.call(this, true); - } - - }, - - // Takes a 2P point from the screen and applies the transformation - - _fold: function(point) { - - var that = this, - a = 0, - alpha = 0, - beta, - px, - gradientEndPointA, - gradientEndPointB, - gradientStartV, - gradientSize, - gradientOpacity, - mv = point2D(0, 0), - df = point2D(0, 0), - tr = point2D(0, 0), - width = this.width(), - height = this.height(), - folding = flipMethods._foldingPage.call(this), - tan = Math.tan(alpha), - data = this.data().f, - ac = data.opts.acceleration, - h = data.wrapper.height(), - o = flipMethods._c.call(this, point.corner), - top = point.corner.substr(0, 1) == 't', - left = point.corner.substr(1, 1) == 'l', - - compute = function() { - var rel = point2D((o.x) ? o.x - point.x : point.x, (o.y) ? o.y - point.y : point.y), - tan = (Math.atan2(rel.y, rel.x)), - middle; - - alpha = A90 - tan; - a = deg(alpha); - middle = point2D((left) ? width - rel.x/2 : point.x + rel.x/2, rel.y/2); - - var gamma = alpha - Math.atan2(middle.y, middle.x), - distance = Math.max(0, Math.sin(gamma) * Math.sqrt(Math.pow(middle.x, 2) + Math.pow(middle.y, 2))); - - tr = point2D(distance * Math.sin(alpha), distance * Math.cos(alpha)); - - if (alpha > A90) { - - tr.x = tr.x + Math.abs(tr.y * Math.tan(tan)); - tr.y = 0; - - if (Math.round(tr.x*Math.tan(PI-alpha)) < height) { - - point.y = Math.sqrt(Math.pow(height, 2)+2 * middle.x * rel.x); - if (top) point.y = height - point.y; - return compute(); - - } - } - - if (alpha>A90) { - var beta = PI-alpha, dd = h - height/Math.sin(beta); - mv = point2D(Math.round(dd*Math.cos(beta)), Math.round(dd*Math.sin(beta))); - if (left) mv.x = - mv.x; - if (top) mv.y = - mv.y; - } - - px = Math.round(tr.y/Math.tan(alpha) + tr.x); - - var side = width - px, - sideX = side*Math.cos(alpha*2), - sideY = side*Math.sin(alpha*2); - df = point2D(Math.round( (left ? side -sideX : px+sideX)), Math.round((top) ? sideY : height - sideY)); - - - // GRADIENTS - - gradientSize = side*Math.sin(alpha); - var endingPoint = flipMethods._c2.call(that, point.corner), - far = Math.sqrt(Math.pow(endingPoint.x-point.x, 2)+Math.pow(endingPoint.y-point.y, 2)); - - gradientOpacity = (far100 ? (gradientSize-100)/gradientSize : 0; - gradientEndPointA = point2D(gradientSize*Math.sin(A90-alpha)/height*100, gradientSize*Math.cos(A90-alpha)/width*100); - - if (top) gradientEndPointA.y = 100-gradientEndPointA.y; - if (left) gradientEndPointA.x = 100-gradientEndPointA.x; - } - - if (flipMethods._backGradient.call(that)) { - - gradientEndPointB = point2D(gradientSize*Math.sin(alpha)/width*100, gradientSize*Math.cos(alpha)/height*100); - if (!left) gradientEndPointB.x = 100-gradientEndPointB.x; - if (!top) gradientEndPointB.y = 100-gradientEndPointB.y; - } - // - - tr.x = Math.round(tr.x); - tr.y = Math.round(tr.y); - - return true; - }, - - transform = function(tr, c, x, a) { - - var f = ['0', 'auto'], mvW = (width-h)*x[0]/100, mvH = (height-h)*x[1]/100, - v = {left: f[c[0]], top: f[c[1]], right: f[c[2]], bottom: f[c[3]]}, - aliasingFk = (a!=90 && a!=-90) ? (left ? -1 : 1) : 0; - - x = x[0] + '% ' + x[1] + '%'; - - that.css(v).transform(rotate(a) + translate(tr.x + aliasingFk, tr.y, ac), x); - - data.fpage.parent().css(v); - data.wrapper.transform(translate(-tr.x + mvW-aliasingFk, -tr.y + mvH, ac) + rotate(-a), x); - - data.fwrapper.transform(translate(-tr.x + mv.x + mvW, -tr.y + mv.y + mvH, ac) + rotate(-a), x); - data.fpage.parent().transform(rotate(a) + translate(tr.x + df.x - mv.x, tr.y + df.y - mv.y, ac), x); - - if (data.opts.frontGradient) - gradient(data.ashadow, - point2D(left?100:0, top?100:0), - point2D(gradientEndPointA.x, gradientEndPointA.y), - [[gradientStartV, 'rgba(0,0,0,0)'], - [((1-gradientStartV)*0.8)+gradientStartV, 'rgba(0,0,0,'+(0.2*gradientOpacity)+')'], - [1, 'rgba(255,255,255,'+(0.2*gradientOpacity)+')']], - 3, - alpha); - - if (flipMethods._backGradient.call(that)) - gradient(data.bshadow, - point2D(left?0:100, top?0:100), - point2D(gradientEndPointB.x, gradientEndPointB.y), - [[0.8, 'rgba(0,0,0,0)'], - [1, 'rgba(0,0,0,'+(0.3*gradientOpacity)+')'], - [1, 'rgba(0,0,0,0)']], - 3); - - }; - - switch (point.corner) { - case 'tl' : - point.x = Math.max(point.x, 1); - compute(); - transform(tr, [1,0,0,1], [100, 0], a); - data.fpage.transform(translate(-height, -width, ac) + rotate(90-a*2) , '100% 100%'); - folding.transform(rotate(90) + translate(0, -height, ac), '0% 0%'); - break; - case 'tr' : - point.x = Math.min(point.x, width-1); - compute(); - transform(point2D(-tr.x, tr.y), [0,0,0,1], [0, 0], -a); - data.fpage.transform(translate(0, -width, ac) + rotate(-90+a*2) , '0% 100%'); - folding.transform(rotate(270) + translate(-width, 0, ac), '0% 0%'); - break; - case 'bl' : - point.x = Math.max(point.x, 1); - compute(); - transform(point2D(tr.x, -tr.y), [1,1,0,0], [100, 100], -a); - data.fpage.transform(translate(-height, 0, ac) + rotate(-90+a*2), '100% 0%'); - folding.transform(rotate(270) + translate(-width, 0, ac), '0% 0%'); - break; - case 'br' : - point.x = Math.min(point.x, width-1); - compute(); - transform(point2D(-tr.x, -tr.y), [0,1,1,0], [0, 100], a); - data.fpage.transform(rotate(90-a*2), '0% 0%'); - folding.transform(rotate(90) + translate(0, -height, ac), '0% 0%'); - - break; - } + } - data.point = point; - - }, + return true; - _moveFoldingPage: function(bool) { - - var data = this.data().f, - folding = flipMethods._foldingPage.call(this); - - if (folding) { - if (bool) { - if (!data.fpage.children()[data.ashadow? '1' : '0']) { - flipMethods.setData.call(this, {backParent: folding.parent()}); - data.fpage.prepend(folding); - } - } else { - if (data.backParent) - data.backParent.prepend(folding); - - } - } - - }, - - _showFoldedPage: function(c, animate) { - - var folding = flipMethods._foldingPage.call(this), - dd = this.data(), - data = dd.f; - - if (!data.point || data.point.corner!=c.corner) { - var event = $.Event('start'); - this.trigger(event, [data.opts, c.corner]); - - if (event.isDefaultPrevented()) - return false; - } - - - if (folding) { - - if (animate) { - - var that = this, point = (data.point && data.point.corner==c.corner) ? data.point : flipMethods._c.call(this, c.corner, 1); - - this.animatef({from: [point.x, point.y], to:[c.x, c.y], duration: 500, frame: function(v) { - c.x = Math.round(v[0]); - c.y = Math.round(v[1]); - flipMethods._fold.call(that, c); - }}); - - } else { - - flipMethods._fold.call(this, c); - if (dd.effect && !dd.effect.turning) - this.animatef(false); - - } - - if (!data.fwrapper.is(':visible')) { - data.fparent.show().data().flips++; - flipMethods._moveFoldingPage.call(this, true); - data.fwrapper.show(); - - if (data.bshadow) - data.bshadow.show(); - } - - return true; - } - - return false; - }, - - hide: function() { - - var data = this.data().f, - folding = flipMethods._foldingPage.call(this); - - if ((--data.fparent.data().flips)===0) - data.fparent.hide(); - - this.css({left: 0, top: 0, right: 'auto', bottom: 'auto'}).transform('', '0% 100%'); + } - data.wrapper.transform('', '0% 100%'); + return false; + }, - data.fwrapper.hide(); + hide: function() { - if (data.bshadow) - data.bshadow.hide(); + var data = this.data().f, + turnData = data.opts.turn.data(), + folding = flipMethods._foldingPage.call(this); - folding.transform('', '0% 0%'); + switch (data.effect) { + case 'hard': + + if (turnData.opts.gradients) { + data.bshadowLoc = 0; + data.bshadow.remove(); + data.ashadow.hide(); + } - return this; - }, + data.wrapper.transform(''); + data.fpage.hide(); - hideFoldedPage: function(animate) { + break; + case 'sheet': - var data = this.data().f; + if ((--data.fparent.data().flips)===0) + data.fparent.hide(); - if (!data.point) return; + this.css({left: 0, top: 0, right: 'auto', bottom: 'auto'}). + transform(''); - var that = this, - p1 = data.point, - hide = function() { - data.point = null; - that.flip('hide'); - that.trigger('end', [false]); - }; + data.wrapper.transform(''); - if (animate) { - var p4 = flipMethods._c.call(this, p1.corner), - top = (p1.corner.substr(0,1)=='t'), - delta = (top) ? Math.min(0, p1.y-p4.y)/2 : Math.max(0, p1.y-p4.y)/2, - p2 = point2D(p1.x, p1.y+delta), - p3 = point2D(p4.x, p4.y-delta); - - this.animatef({ - from: 0, - to: 1, - frame: function(v) { - var np = bezier(p1, p2, p3, p4, v); - p1.x = np.x; - p1.y = np.y; - flipMethods._fold.call(that, p1); - }, - complete: hide, - duration: 800, - hiding: true - }); + data.fwrapper.hide(); - } else { - this.animatef(false); - hide(); - } - }, + if (data.bshadow) + data.bshadow.hide(); - turnPage: function(corner) { + folding.transform(''); - var that = this, - data = this.data().f; + break; + } - corner = {corner: (data.corner) ? data.corner.corner : corner || flipMethods._cAllowed.call(this)[0]}; + data.visible = false; - var p1 = data.point || flipMethods._c.call(this, corner.corner, (data.opts.turn) ? data.opts.turn.data().opts.elevation : 0), - p4 = flipMethods._c2.call(this, corner.corner); + return this; + }, - this.trigger('flip'). - animatef({ - from: 0, - to: 1, - frame: function(v) { - var np = bezier(p1, p1, p4, p4, v); - corner.x = np.x; - corner.y = np.y; - flipMethods._showFoldedPage.call(that, corner); - }, - - complete: function() { - that.trigger('end', [true]); - }, - duration: data.opts.duration, - turning: true - }); + hideFoldedPage: function(animate) { - data.corner = null; - }, + var data = this.data().f; - moving: function() { + if (!data.point) return; - return 'effect' in this.data(); - - }, + var that = this, + p1 = data.point, + hide = function() { + data.point = null; + data.status = ''; + that.flip('hide'); + that.trigger('end', [data.opts, false]); + }; - isTurning: function() { + if (animate) { - return this.flip('moving') && this.data().effect.turning; - - }, - - _eventStart: function(e) { - - var data = this.data().f; - - if (!data.disabled && !this.flip('isTurning')) { - data.corner = flipMethods._cornerActivated.call(this, e); - if (data.corner && flipMethods._foldingPage.call(this, data.corner)) { - flipMethods._moveFoldingPage.call(this, true); - this.trigger('pressed', [data.point]); - return false; - } else - data.corner = null; - } - - }, - - _eventMove: function(e) { - - var data = this.data().f; - - if (!data.disabled) { - e = (isTouch) ? e.originalEvent.touches : [e]; - - if (data.corner) { - - var pos = data.parent.offset(); - - data.corner.x = e[0].pageX-pos.left; - data.corner.y = e[0].pageY-pos.top; - - flipMethods._showFoldedPage.call(this, data.corner); - - } else if (!this.data().effect && this.is(':visible')) { // roll over - - var corner = flipMethods._cornerActivated.call(this, e[0]); - if (corner) { - var origin = flipMethods._c.call(this, corner.corner, data.opts.cornerSize/2); - corner.x = origin.x; - corner.y = origin.y; - flipMethods._showFoldedPage.call(this, corner, true); - } else - flipMethods.hideFoldedPage.call(this, true); - - } - } - }, - - _eventEnd: function() { + var p4 = flipMethods._c.call(this, p1.corner), + top = (p1.corner.substr(0,1)=='t'), + delta = (top) ? Math.min(0, p1.y-p4.y)/2 : Math.max(0, p1.y-p4.y)/2, + p2 = point2D(p1.x, p1.y+delta), + p3 = point2D(p4.x, p4.y-delta); + + this.animatef({ + from: 0, + to: 1, + frame: function(v) { + var np = bezier(p1, p2, p3, p4, v); + p1.x = np.x; + p1.y = np.y; + flipMethods._fold.call(that, p1); + }, + complete: hide, + duration: 800, + hiding: true + }); - var data = this.data().f; + } else { - if (!data.disabled && data.point) { - var event = $.Event('released'); - this.trigger(event, [data.point]); - if (!event.isDefaultPrevented()) - flipMethods.hideFoldedPage.call(this, true); - } + this.animatef(false); + hide(); - data.corner = null; + } + }, - }, + turnPage: function(corner) { - disable: function(disable) { + var that = this, + data = this.data().f, + turnData = data.opts.turn.data(); - flipMethods.setData.call(this, {'disabled': disable}); - return this; - - } -}, - -cla = function(that, methods, args) { + corner = {corner: (data.corner) ? + data.corner.corner : + corner || flipMethods._cAllowed.call(this)[0]}; - if (!args[0] || typeof(args[0])=='object') - return methods.init.apply(that, args); - else if(methods[args[0]] && args[0].toString().substr(0, 1)!='_') - return methods[args[0]].apply(that, Array.prototype.slice.call(args, 1)); - else - throw args[0] + ' is an invalid value'; + var p1 = data.point || + flipMethods._c.call(this, + corner.corner, + (data.opts.turn) ? turnData.opts.elevation : 0), + p4 = flipMethods._c2.call(this, corner.corner); + + this.trigger('flip'). + animatef({ + from: 0, + to: 1, + frame: function(v) { + + var np = bezier(p1, p1, p4, p4, v); + corner.x = np.x; + corner.y = np.y; + flipMethods._showFoldedPage.call(that, corner); + + }, + complete: function() { + + that.trigger('end', [data.opts, true]); + + }, + duration: turnData.opts.duration, + turning: true + }); + + data.corner = null; + }, + + moving: function() { + + return 'effect' in this.data(); + + }, + + isTurning: function() { + + return this.flip('moving') && this.data().effect.turning; + + }, + + corner: function() { + + return this.data().f.corner; + + }, + + _eventStart: function(e) { + + var data = this.data().f, + turn = data.opts.turn; + + if (!data.corner && !data.disabled && !this.flip('isTurning') && + data.opts.page==turn.data().pagePlace[data.opts.page]) + { + + data.corner = flipMethods._isIArea.call(this, e); + + if (data.corner && flipMethods._foldingPage.call(this)) { + + this.trigger('pressed', [data.point]); + flipMethods._showFoldedPage.call(this, data.corner); + + return false; + + } else + data.corner = null; + + } + + }, + + _eventMove: function(e) { + + var data = this.data().f; + + if (!data.disabled) { + + e = (isTouch) ? e.originalEvent.touches : [e]; + + if (data.corner) { + + var pos = data.parent.offset(); + data.corner.x = e[0].pageX-pos.left; + data.corner.y = e[0].pageY-pos.top; + flipMethods._showFoldedPage.call(this, data.corner); + + } else if (data.hover && !this.data().effect && this.is(':visible')) { + + var point = flipMethods._isIArea.call(this, e[0]); + + if (point) { + + if ((data.effect=='sheet' && point.corner.length==2) || data.effect=='hard') { + data.status = 'hover'; + var origin = flipMethods._c.call(this, point.corner, data.opts.cornerSize/2); + point.x = origin.x; + point.y = origin.y; + flipMethods._showFoldedPage.call(this, point, true); + } + + } else { + + if (data.status=='hover') { + data.status = ''; + flipMethods.hideFoldedPage.call(this, true); + } + + } + + } + + } + + }, + + _eventEnd: function() { + + var data = this.data().f, + corner = data.corner; + + if (!data.disabled && corner) { + if (trigger('released', this, [data.point || corner])!='prevented') { + flipMethods.hideFoldedPage.call(this, true); + } + } + + data.corner = null; + + }, + + disable: function(disable) { + + flipMethods.setData.call(this, {'disabled': disable}); + return this; + + }, + + hover: function(hover) { + + flipMethods.setData.call(this, {'hover': hover}); + return this; + + }, + + peel: function (corner, animate) { + + var data = this.data().f; + + if (corner) { + + if ($.inArray(corner, corners.all)==-1) + throw turnError('Corner '+corner+' is not permitted'); + + if ($.inArray(corner, flipMethods._cAllowed.call(this))!=-1) { + + var point = flipMethods._c.call(this, corner, data.opts.cornerSize/2); + + data.status = 'peel'; + + flipMethods._showFoldedPage.call(this, + { + corner: corner, + x: point.x, + y: point.y + }, animate); + + } + + + } else { + + data.status = ''; + + flipMethods.hideFoldedPage.call(this, animate); + + } + + return this; + } }; + +// Processes classes + +function dec(that, methods, args) { + + if (!args[0] || typeof(args[0])=='object') + return methods.init.apply(that, args); + + else if (methods[args[0]]) + return methods[args[0]].apply(that, Array.prototype.slice.call(args, 1)); + + else + throw turnError(args[0] + ' is not a method or property'); + +} + + +// Attributes for a layer + +function divAtt(top, left, zIndex, overf) { + + return {'css': { + position: 'absolute', + top: top, + left: left, + 'overflow': overf || 'hidden', + zIndex: zIndex || 'auto' + } +}; + +} + +// Gets a 2D point from a bezier curve of four points + +function bezier(p1, p2, p3, p4, t) { + + var a = 1 - t, + b = a * a * a, + c = t * t * t; + + return point2D(Math.round(b*p1.x + 3*t*a*a*p2.x + 3*t*t*a*p3.x + c*p4.x), + Math.round(b*p1.y + 3*t*a*a*p2.y + 3*t*t*a*p3.y + c*p4.y)); + +} + +// Converts an angle from degrees to radians + +function rad(degrees) { + + return degrees/180*PI; + +} + +// Converts an angle from radians to degrees + +function deg(radians) { + + return radians/PI*180; + +} + +// Gets a 2D point + +function point2D(x, y) { + + return {x: x, y: y}; + +} + +// Webkit 534.3 on Android wrongly repaints elements that use overflow:hidden + rotation + +function rotationAvailable() { + var parts; + + if ((parts = /AppleWebkit\/([0-9\.]+)/i.exec(navigator.userAgent))) { + var webkitVersion = parseFloat(parts[1]); + return (webkitVersion>534.3); + } else { + return true; + } +} + +// Returns the traslate value + +function translate(x, y, use3d) { + + return (has3d && use3d) ? ' translate3d(' + x + 'px,' + y + 'px, 0px) ' + : ' translate(' + x + 'px, ' + y + 'px) '; + +} + +// Returns the rotation value + +function rotate(degrees) { + + return ' rotate(' + degrees + 'deg) '; + +} + +// Checks if a property belongs to an object + +function has(property, object) { + + return Object.prototype.hasOwnProperty.call(object, property); + +} + +// Gets the CSS3 vendor prefix + +function getPrefix() { + + var vendorPrefixes = ['Moz','Webkit','Khtml','O','ms'], + len = vendorPrefixes.length, + vendor = ''; + + while (len--) + if ((vendorPrefixes[len] + 'Transform') in document.body.style) + vendor='-'+vendorPrefixes[len].toLowerCase()+'-'; + + return vendor; + +} + +// Detects the transitionEnd Event + +function getTransitionEnd() { + + var t, + el = document.createElement('fakeelement'), + transitions = { + 'transition':'transitionend', + 'OTransition':'oTransitionEnd', + 'MSTransition':'transitionend', + 'MozTransition':'transitionend', + 'WebkitTransition':'webkitTransitionEnd' + }; + + for (t in transitions) { + if (el.style[t] !== undefined) { + return transitions[t]; + } + } +} + +// Gradients + +function gradient(obj, p0, p1, colors, numColors) { + + var j, cols = []; + + if (vendor=='-webkit-') { + + for (j = 0; je)throw Error('It is impossible to add the page "'+ -b+'", the maximum value is: "'+e+'"');}else b=e,c=!0;1<=b&&b<=e&&(d.done&&this.turn("stop"),b in d.pageObjs&&g._movePages.call(this,b,1),c&&(d.totalPages=e),d.pageObjs[b]=h(a).addClass("turn-page p"+b),g._addPage.call(this,b),d.done&&this.turn("update"),g._removeFromDOM.call(this));return this},_addPage:function(a){var b=this.data(),c=b.pageObjs[a];if(c)if(g._necessPage.call(this,a)){if(!b.pageWrap[a]){var d="double"==b.display?this.width()/2:this.width(),e=this.height();c.css({width:d,height:e}); -b.pagePlace[a]=a;b.pageWrap[a]=h("
",{"class":"turn-page-wrapper",page:a,css:{position:"absolute",overflow:"hidden",width:d,height:e}}).css(K["double"==b.display?a%2:0]);this.append(b.pageWrap[a]);b.pageWrap[a].prepend(b.pageObjs[a])}(!a||1==g._setPageLoc.call(this,a))&&g._makeFlip.call(this,a)}else b.pagePlace[a]=0,b.pageObjs[a]&&b.pageObjs[a].remove()},hasPage:function(a){return a in this.data().pageObjs},_makeFlip:function(a){var b=this.data();if(!b.pages[a]&&b.pagePlace[a]==a){var c="single"== -b.display,d=a%2;b.pages[a]=b.pageObjs[a].css({width:c?this.width():this.width()/2,height:this.height()}).flip({page:a,next:c&&a===b.totalPages?a-1:d||c?a+1:a-1,turn:this,duration:b.opts.duration,acceleration:b.opts.acceleration,corners:c?"all":d?"forward":"backward",backGradient:b.opts.gradients,frontGradient:b.opts.gradients}).flip("disable",b.disabled).bind("pressed",g._pressed).bind("released",g._released).bind("start",g._start).bind("end",g._end).bind("flip",g._flip)}return b.pages[a]},_makeRange:function(){var a; -this.data();var b=this.turn("range");for(a=b[0];a<=b[1];a++)g._addPage.call(this,a)},range:function(a){var b,c,d=this.data(),a=a||d.tpage||d.page,e=g._view.call(this,a);if(1>a||a>d.totalPages)throw Error('"'+a+'" is not a page for range');e[1]=e[1]||e[0];1<=e[0]&&e[1]<=d.totalPages?(a=Math.floor(2),d.totalPages-e[1]>e[0]?(b=Math.min(e[0]-1,a),c=2*a-b):(c=Math.min(d.totalPages-e[1],a),b=2*a-c)):c=b=5;return[Math.max(1,e[0]-b),Math.min(d.totalPages,e[1]+c)]},_necessPage:function(a){if(0===a)return!0; -var b=this.turn("range");return a>=b[0]&&a<=b[1]},_removeFromDOM:function(){var a,b=this.data();for(a in b.pageWrap)p(a,b.pageWrap)&&!g._necessPage.call(this,a)&&g._removePageFromDOM.call(this,a)},_removePageFromDOM:function(a){var b=this.data();if(b.pages[a]){var c=b.pages[a].data();c.f&&c.f.fwrapper&&c.f.fwrapper.remove();b.pages[a].remove();delete b.pages[a]}b.pageObjs[a]&&b.pageObjs[a].remove();b.pageWrap[a]&&(b.pageWrap[a].remove(),delete b.pageWrap[a]);delete b.pagePlace[a]},removePage:function(a){var b= -this.data();b.pageObjs[a]&&(this.turn("stop"),g._removePageFromDOM.call(this,a),delete b.pageObjs[a],g._movePages.call(this,a,-1),b.totalPages-=1,g._makeRange.call(this),b.page>b.totalPages&&this.turn("page",b.totalPages));return this},_movePages:function(a,b){var c,d=this.data(),e="single"==d.display,f=function(a){var c=a+b,f=c%2;d.pageObjs[a]&&(d.pageObjs[c]=d.pageObjs[a].removeClass("page"+a).addClass("page"+c));d.pagePlace[a]&&d.pageWrap[a]&&(d.pagePlace[c]=c,d.pageWrap[c]=d.pageWrap[a].css(K[e? -0:f]).attr("page",c),d.pages[a]&&(d.pages[c]=d.pages[a].flip("options",{page:c,next:e||f?c+1:c-1,corners:e?"all":f?"forward":"backward"})),b&&(delete d.pages[a],delete d.pagePlace[a],delete d.pageObjs[a],delete d.pageWrap[a],delete d.pageObjs[a]))};if(0=a;c--)f(c);else for(c=a;c<=d.totalPages;c++)f(c)},display:function(a){var b=this.data(),c=b.display;if(a){if(-1==h.inArray(a,O))throw Error('"'+a+'" is not a value for display');"single"==a?b.pageObjs[0]||(this.turn("stop").css({overflow:"hidden"}), -b.pageObjs[0]=h("
",{"class":"turn-page p-temporal"}).css({width:this.width(),height:this.height()}).appendTo(this)):b.pageObjs[0]&&(this.turn("stop").css({overflow:""}),b.pageObjs[0].remove(),delete b.pageObjs[0]);b.display=a;c&&(a=this.turn("size"),g._movePages.call(this,1,0),this.turn("size",a.width,a.height).turn("update"));return this}return c},animating:function(){return 0a&&this.turn("page",a)}b.totalPages=a;return this}return b.totalPages},_fitPage:function(a,b){var c=this.data(),d=this.turn("view",a);c.page!=a&&(this.trigger("turning",[a,d]),-1!=h.inArray(1,d)&&this.trigger("first"),-1!=h.inArray(c.totalPages,d)&&this.trigger("last"));c.pageObjs[a]&&(c.tpage=a,this.turn("stop",b),g._removeFromDOM.call(this),g._makeRange.call(this),this.trigger("turned", -[a,d]))},_turnPage:function(a){var b,c,d=this.data(),e=this.turn("view"),f=this.turn("view",a);d.page!=a&&(this.trigger("turning",[a,f]),-1!=h.inArray(1,f)&&this.trigger("first"),-1!=h.inArray(d.totalPages,f)&&this.trigger("last"));if(d.pageObjs[a]&&(d.tpage=a,this.turn("stop"),g._makeRange.call(this),"single"==d.display?(b=e[0],c=f[0]):e[1]&&a>e[1]?(b=e[1],c=f[0]):e[0]&&ae[0]?"br":"bl"):d.pages[b].flip("turnPage")},page:function(a){var a=parseInt(a,10),b=this.data();return 0b.page?b.next:b.page+1),g._addMotionPage.call(this))},_end:function(a, -b){var c=h(this).data().f.opts,d=c.turn,e=d.data();a.stopPropagation();if(b||e.tpage){if(e.tpage==c.next||e.tpage==c.page)delete e.tpage,g._fitPage.call(d,e.tpage||c.next,!0)}else g._removeMv.call(d,c.pageMv),d.turn("update")},_pressed:function(){var a,b=h(this).data().f,c=b.opts.turn.data().pages;for(a in c)a!=b.opts.page&&c[a].flip("disable",!0);return b.time=(new Date).getTime()},_released:function(a,b){var c=h(this),d=c.data().f;a.stopPropagation();if(200>(new Date).getTime()-d.time||0>b.x||b.x> -h(this).width())a.preventDefault(),d.opts.turn.data().tpage=d.opts.next,d.opts.turn.turn("update"),h(c).flip("turnPage")},_flip:function(){var a=h(this).data().f.opts;a.turn.trigger("turn",[a.next])},calculateZ:function(a){var b,c,d,e,f=this,i=this.data();b=this.turn("view");var h=b[0]||b[1],g={pageZ:{},partZ:{},pageV:{}},j=function(a){a=f.turn("view",a);a[0]&&(g.pageV[a[0]]=!0);a[1]&&(g.pageV[a[1]]=!0)};for(b=0;b=a.x||0>=a.y||a.x>=d||a.y>=e)return!1;if(a.y=e-b)a.corner="b";else return!1;if(a.x<=b)a.corner+="l";else if(a.x>=d-b)a.corner+="r";else return!1;return-1==h.inArray(a.corner,c)?!1:a},_c:function(a, -b){b=b||0;return{tl:j(b,b),tr:j(this.width()-b,b),bl:j(b,this.height()-b),br:j(this.width()-b,this.height()-b)}[a]},_c2:function(a){return{tl:j(2*this.width(),0),tr:j(-this.width(),0),bl:j(2*this.width(),this.height()),br:j(-this.width(),this.height())}[a]},_foldingPage:function(){var a=this.data().f.opts;if(a.folding)return a.folding;if(a.turn){var b=a.turn.data();return"single"==b.display?b.pageObjs[a.next]?b.pageObjs[0]:null:b.pageObjs[a.next]}},_backGradient:function(){var a=this.data().f,b=a.opts.turn; -if((b=a.opts.backGradient&&(!b||"single"==b.data().display||2!=a.opts.page&&a.opts.page!=b.data().totalPages-1))&&!a.bshadow)a.bshadow=h("
",l(0,0,1)).css({position:"",width:this.width(),height:this.height()}).appendTo(a.parent);return b},resize:function(a){var b=this.data().f,c=this.width(),d=this.height(),e=Math.round(Math.sqrt(Math.pow(c,2)+Math.pow(d,2)));a&&(b.wrapper.css({width:e,height:e}),b.fwrapper.css({width:e,height:e}).children(":first-child").css({width:c,height:d}),b.fpage.css({width:d, -height:c}),b.opts.frontGradient&&b.ashadow.css({width:d,height:c}),i._backGradient.call(this)&&b.bshadow.css({width:c,height:d}));b.parent.is(":visible")&&(b.fwrapper.css({top:b.parent.offset().top,left:b.parent.offset().left}),b.opts.turn&&b.fparent.css({top:-b.opts.turn.offset().top,left:-b.opts.turn.offset().left}));this.flip("z",b.opts["z-index"])},_addPageWrapper:function(){var a=this.data().f,b=this.parent();if(!a.wrapper){this.css("left");this.css("top");var c=this.width(),d=this.height(); -Math.round(Math.sqrt(Math.pow(c,2)+Math.pow(d,2)));a.parent=b;a.fparent=a.opts.turn?a.opts.turn.data().fparent:h("#turn-fwrappers");a.fparent||(c=h("
",{css:{"pointer-events":"none"}}).hide(),c.data().flips=0,a.opts.turn?(c.css(l(-a.opts.turn.offset().top,-a.opts.turn.offset().left,"auto","visible").css).appendTo(a.opts.turn),a.opts.turn.data().fparent=c):c.css(l(0,0,"auto","visible").css).attr("id","turn-fwrappers").appendTo(h("body")),a.fparent=c);this.css({position:"absolute",top:0,left:0, -bottom:"auto",right:"auto"});a.wrapper=h("
",l(0,0,this.css("z-index"))).appendTo(b).prepend(this);a.fwrapper=h("
",l(b.offset().top,b.offset().left)).hide().appendTo(a.fparent);a.fpage=h("
",{css:{cursor:"default"}}).appendTo(h("
",l(0,0,0,"visible")).appendTo(a.fwrapper));a.opts.frontGradient&&(a.ashadow=h("
",l(0,0,1)).appendTo(a.fpage));i.setData.call(this,a);i.resize.call(this,!0)}},_fold:function(a){var b=this,c=0,d=0,e,f,h,g,v,H,n=j(0,0),p=j(0,0),k=j(0,0),r=this.width(), -u=this.height(),l=i._foldingPage.call(this);Math.tan(d);var o=this.data().f,w=o.opts.acceleration,y=o.wrapper.height(),q=i._c.call(this,a.corner),D="t"==a.corner.substr(0,1),A="l"==a.corner.substr(1,1),F=function(){var m=j(q.x?q.x-a.x:a.x,q.y?q.y-a.y:a.y),B=Math.atan2(m.y,m.x),z;d=E-B;c=180*(d/G);z=j(A?r-m.x/2:a.x+m.x/2,m.y/2);var l=d-Math.atan2(z.y,z.x),l=Math.max(0,Math.sin(l)*Math.sqrt(Math.pow(z.x,2)+Math.pow(z.y,2)));k=j(l*Math.sin(d),l*Math.cos(d));if(d>E&&(k.x+=Math.abs(k.y*Math.tan(B)),k.y= -0,Math.round(k.x*Math.tan(G-d))E&&(m=G-d,B=y-u/Math.sin(m),n=j(Math.round(B*Math.cos(m)),Math.round(B*Math.sin(m))),A&&(n.x=-n.x),D))n.y=-n.y;e=Math.round(k.y/Math.tan(d)+k.x);m=r-e;B=m*Math.cos(2*d);z=m*Math.sin(2*d);p=j(Math.round(A?m-B:e+B),Math.round(D?z:u-z));v=m*Math.sin(d);m=i._c2.call(b,a.corner);m=Math.sqrt(Math.pow(m.x-a.x,2)+Math.pow(m.y-a.y,2));H=mh)throw q('Page "'+b+'" cannot be inserted');}else b=h,d=!0;1<=b&&b<=h&&(c="double"==e.display?b%2?" odd":" even":"",e.done&& +this.turn("stop"),b in e.pageObjs&&g._movePages.call(this,b,1),d&&(e.totalPages=h),e.pageObjs[b]=f(a).css({"float":"left"}).addClass("page p"+b+c),-1!=navigator.userAgent.indexOf("MSIE 9.0")&&e.pageObjs[b].hasClass("hard")&&e.pageObjs[b].removeClass("hard"),g._addPage.call(this,b),g._removeFromDOM.call(this));return this},_addPage:function(a){var b=this.data(),c=b.pageObjs[a];if(c)if(g._necessPage.call(this,a)){if(!b.pageWrap[a]){b.pageWrap[a]=f("
",{"class":"page-wrapper",page:a,css:{position:"absolute", +overflow:"hidden"}});this.append(b.pageWrap[a]);b.pagePlace[a]||(b.pagePlace[a]=a,b.pageObjs[a].appendTo(b.pageWrap[a]));var d=g._pageSize.call(this,a,!0);c.css({width:d.width,height:d.height});b.pageWrap[a].css(d)}b.pagePlace[a]==a&&g._makeFlip.call(this,a)}else b.pagePlace[a]=0,b.pageObjs[a]&&b.pageObjs[a].remove()},hasPage:function(a){return n(a,this.data().pageObjs)},center:function(a){var b=this.data(),c=f(this).turn("size"),d=0;b.noCenter||("double"==b.display&&(a=this.turn("view",a||b.tpage|| +b.page),"ltr"==b.direction?a[0]?a[1]||(d+=c.width/4):d-=c.width/4:a[0]?a[1]||(d-=c.width/4):d+=c.width/4),f(this).css({marginLeft:d}));return this},destroy:function(){var a=this,b=this.data(),c="end first flip last pressed released start turning turned zooming missing".split(" ");if("prevented"!=t("destroying",this)){b.destroying=!0;f.each(c,function(b,c){a.unbind(c)});this.parent().unbind("start",b.eventHandlers.start);for(f(document).unbind(r.move,b.eventHandlers.touchMove).unbind(r.up,b.eventHandlers.touchEnd);0!== +b.totalPages;)this.turn("removePage",b.totalPages);b.fparent&&b.fparent.remove();b.shadow&&b.shadow.remove();this.removeData();b=null;return this}},is:function(){return"object"==typeof this.data().pages},zoom:function(a){var b=this.data();if("number"==typeof a){if(0.0010>a||100this.data().totalPages)){b=this.turn("range");for(a=b[0];a<=b[1];a++)g._addPage.call(this,a)}},range:function(a){var b,c,d,e=this.data(),a=a||e.tpage||e.page||1;d=g._view.call(this,a);if(1>a||a>e.totalPages)throw q('"'+a+'" is not a valid page');d[1]=d[1]||d[0];1<=d[0]&&d[1]<=e.totalPages?(a=Math.floor(2),e.totalPages-d[1]>d[0]?(b=Math.min(d[0]-1,a),c=2*a-b):(c=Math.min(e.totalPages-d[1],a),b=2*a-c)):c=b=5;return[Math.max(1,d[0]-b),Math.min(e.totalPages, +d[1]+c)]},_necessPage:function(a){if(0===a)return!0;var b=this.turn("range");return this.data().pageObjs[a].hasClass("fixed")||a>=b[0]&&a<=b[1]},_removeFromDOM:function(){var a,b=this.data();for(a in b.pageWrap)n(a,b.pageWrap)&&!g._necessPage.call(this,a)&&g._removePageFromDOM.call(this,a)},_removePageFromDOM:function(a){var b=this.data();if(b.pages[a]){var c=b.pages[a].data();i._moveFoldingPage.call(b.pages[a],!1);c.f&&c.f.fwrapper&&c.f.fwrapper.remove();b.pages[a].removeData();b.pages[a].remove(); +delete b.pages[a]}b.pageObjs[a]&&b.pageObjs[a].remove();b.pageWrap[a]&&(b.pageWrap[a].remove(),delete b.pageWrap[a]);g._removeMv.call(this,a);delete b.pagePlace[a];delete b.pageZoom[a]},removePage:function(a){var b=this.data();if("*"==a)for(;0!==b.totalPages;)this.turn("removePage",b.totalPages);else{if(1>a||a>b.totalPages)throw q("The page "+a+" doesn't exist");b.pageObjs[a]&&(this.turn("stop"),g._removePageFromDOM.call(this,a),delete b.pageObjs[a]);g._movePages.call(this,a,-1);b.totalPages-=1;b.page> +b.totalPages?(b.page=null,g._fitPage.call(this,b.totalPages)):(g._makeRange.call(this),this.turn("update"))}return this},_movePages:function(a,b){var c,d=this,e=this.data(),h="single"==e.display,f=function(a){var c=a+b,f=c%2,i=f?" odd ":" even ";e.pageObjs[a]&&(e.pageObjs[c]=e.pageObjs[a].removeClass("p"+a+" odd even").addClass("p"+c+i));e.pagePlace[a]&&e.pageWrap[a]&&(e.pagePlace[c]=c,e.pageWrap[c]=e.pageObjs[c].hasClass("fixed")?e.pageWrap[a].attr("page",c):e.pageWrap[a].css(g._pageSize.call(d, +c,!0)).attr("page",c),e.pages[a]&&(e.pages[c]=e.pages[a].flip("options",{page:c,next:h||f?c+1:c-1})),b&&(delete e.pages[a],delete e.pagePlace[a],delete e.pageZoom[a],delete e.pageObjs[a],delete e.pageWrap[a]))};if(0=a;c--)f(c);else for(c=a;c<=e.totalPages;c++)f(c)},display:function(a){var b=this.data(),c=b.display;if(void 0===a)return c;if(-1==f.inArray(a,V))throw q('"'+a+'" is not a value for display');switch(a){case "single":b.pageObjs[0]||(this.turn("stop").css({overflow:"hidden"}), +b.pageObjs[0]=f("
",{"class":"page p-temporal"}).css({width:this.width(),height:this.height()}).appendTo(this));this.addClass("shadow");break;case "double":b.pageObjs[0]&&(this.turn("stop").css({overflow:""}),b.pageObjs[0].remove(),delete b.pageObjs[0]),this.removeClass("shadow")}b.display=a;c&&(a=this.turn("size"),g._movePages.call(this,1,0),this.turn("size",a.width,a.height).turn("update"));return this},direction:function(a){var b=this.data();if(void 0===a)return b.direction;a=a.toLowerCase(); +if(-1==f.inArray(a,W))throw q('"'+a+'" is not a value for direction');"rtl"==a&&f(this).attr("dir","ltr").css({direction:"ltr"});b.direction=a;b.done&&this.turn("size",f(this).width(),f(this).height());return this},animating:function(){return 0a;c--)this.turn("removePage",c);b.totalPages=a;g._fitPage.call(this,b.page);return this}return b.totalPages},_missing:function(a){var b= +this.data();if(!(1>b.totalPages)){for(var c=this.turn("range",a),d=[],a=c[0];a<=c[1];a++)b.pageObjs[a]||d.push(a);0h[1]?(b=h[1],c=i[0]): +h[0]&&ab?"r":"l"):d.pages[b].flip("turnPage",a>b?"l":"r"):"ltr"==d.direction?d.pages[b].flip("turnPage",e[a>b?1:0]):d.pages[b].flip("turnPage",e[a>b?0:1]))},page:function(a){var b= +this.data();if(void 0===a)return b.page;if(!b.disabled&&!b.destroying){a=parseInt(a,10);if(0b.page?b.next:b.page+1),g._addMotionPage.call(a.target));g._updateShadow.call(b.turn)},_eventEnd:function(a,b,c){f(a.target).data();var a=b.turn,d=a.data();if(c){if(c=d.tpage||d.page,c==b.next||c==b.page)delete d.tpage,g._fitPage.call(a,c||b.next,!0)}else g._removeMv.call(a, +b.page),g._updateShadow.call(a),a.turn("update")},_eventPressed:function(a){var a=f(a.target).data().f,b=a.opts.turn;b.data().mouseAction=!0;b.turn("update");return a.time=(new Date).getTime()},_eventReleased:function(a,b){var c;c=f(a.target);var d=c.data().f,e=d.opts.turn,h=e.data();c="single"==h.display?"br"==b.corner||"tr"==b.corner?b.xc.width()/2:0>b.x||b.x>c.width();if(200>(new Date).getTime()-d.time||c)a.preventDefault(),g._turnPage.call(e,d.opts.next);h.mouseAction=!1},_flip:function(a){a.stopPropagation(); +a=f(a.target).data().f.opts;a.turn.trigger("turn",[a.next]);a.turn.data().opts.autoCenter&&a.turn.turn("center",a.next)},_touchStart:function(){var a=this.data(),b;for(b in a.pages)if(n(b,a.pages)&&!1===i._eventStart.apply(a.pages[b],arguments))return!1},_touchMove:function(){var a=this.data(),b;for(b in a.pages)n(b,a.pages)&&i._eventMove.apply(a.pages[b],arguments)},_touchEnd:function(){var a=this.data(),b;for(b in a.pages)n(b,a.pages)&&i._eventEnd.apply(a.pages[b],arguments)},calculateZ:function(a){var b, +c,d,e,h=this,f=this.data();b=this.turn("view");var i=b[0]||b[1],g=a.length-1,j={pageZ:{},partZ:{},pageV:{}},k=function(a){a=h.turn("view",a);a[0]&&(j.pageV[a[0]]=!0);a[1]&&(j.pageV[a[1]]=!0)};for(b=0;b<=g;b++)c=a[b],d=f.pages[c].data().f.opts.next,e=f.pagePlace[c],k(c),k(d),c=f.pagePlace[d]==d?d:c,j.pageZ[c]=f.totalPages-Math.abs(i-c),j.partZ[e]=2*f.totalPages-g+b;return j},update:function(){var a,b=this.data();if(this.turn("animating")&&0!==b.pageMv[0]){var c,d=this.turn("calculateZ",b.pageMv),e= +this.turn("corner"),h=this.turn("view"),i=this.turn("view",b.tpage);for(a in b.pageWrap)if(n(a,b.pageWrap)&&(c=b.pageObjs[a].hasClass("fixed"),b.pageWrap[a].css({display:d.pageV[a]||c?"":"none",zIndex:(b.pageObjs[a].hasClass("hard")?d.partZ[a]:d.pageZ[a])||(c?-1:0)}),c=b.pages[a]))c.flip("z",d.partZ[a]||null),d.pageV[a]&&c.flip("resize"),b.tpage?c.flip("hover",!1).flip("disable",-1==f.inArray(parseInt(a,10),b.pageMv)&&a!=i[0]&&a!=i[1]):c.flip("hover",!1===e).flip("disable",a!=h[0]&&a!=h[1])}else for(a in b.pageWrap)n(a, +b.pageWrap)&&(d=g._setPageLoc.call(this,a),b.pages[a]&&b.pages[a].flip("disable",b.disabled||1!=d).flip("hover",!0).flip("z",null));return this},_updateShadow:function(){var a,b,c=this.data(),d=this.width(),e=this.height(),h="single"==c.display?d:d/2;a=this.turn("view");c.shadow||(c.shadow=f("
",{"class":"shadow",css:l(0,0,0).css}).appendTo(this));for(var i=0;i=a.x||0>=a.y||a.x>=c||a.y>=d)return!1;var h=i._cAllowed.call(this);switch(b.effect){case "hard":if(a.x>c-e)a.corner="r";else if(a.x=d-e)a.corner+="b";else return!1;if(a.x<=e)a.corner+="l";else if(a.x>=c-e)a.corner+="r";else return!1}return!a.corner||-1==f.inArray(a.corner,h)?!1:a},_isIArea:function(a){var b=this.data().f.parent.offset(),a=u&&a.originalEvent?a.originalEvent.touches[0]: +a;return i._cornerActivated.call(this,{x:a.pageX-b.left,y:a.pageY-b.top})},_c:function(a,b){b=b||0;switch(a){case "tl":return j(b,b);case "tr":return j(this.width()-b,b);case "bl":return j(b,this.height()-b);case "br":return j(this.width()-b,this.height()-b);case "l":return j(b,0);case "r":return j(this.width()-b,0)}},_c2:function(a){switch(a){case "tl":return j(2*this.width(),0);case "tr":return j(-this.width(),0);case "bl":return j(2*this.width(),this.height());case "br":return j(-this.width(), +this.height());case "l":return j(2*this.width(),0);case "r":return j(-this.width(),0)}},_foldingPage:function(){var a=this.data().f;if(a){var b=a.opts;if(b.turn)return a=b.turn.data(),"single"==a.display?1",l(0,0,1)).css({position:"",width:this.width(),height:this.height()}).appendTo(a.parent); +return b},type:function(){return this.data().f.effect},resize:function(a){var b=this.data().f,c=b.opts.turn.data(),d=this.width(),e=this.height();switch(b.effect){case "hard":a&&(b.wrapper.css({width:d,height:e}),b.fpage.css({width:d,height:e}),c.opts.gradients&&(b.ashadow.css({width:d,height:e}),b.bshadow.css({width:d,height:e})));break;case "sheet":a&&(a=Math.round(Math.sqrt(Math.pow(d,2)+Math.pow(e,2))),b.wrapper.css({width:a,height:a}),b.fwrapper.css({width:a,height:a}).children(":first-child").css({width:d, +height:e}),b.fpage.css({width:d,height:e}),c.opts.gradients&&b.ashadow.css({width:d,height:e}),i._backGradient.call(this)&&b.bshadow.css({width:d,height:e})),b.parent.is(":visible")&&(c=D(b.parent[0]),b.fwrapper.css({top:c.top,left:c.left}),c=D(b.opts.turn[0]),b.fparent.css({top:-c.top,left:-c.left})),this.flip("z",b.opts["z-index"])}},_addPageWrapper:function(){var a=this.data().f,b=a.opts.turn.data(),c=this.parent();a.parent=c;if(!a.wrapper)switch(a.effect){case "hard":var d={};d[w+"transform-style"]= +"preserve-3d";d[w+"backface-visibility"]="hidden";a.wrapper=f("
",l(0,0,2)).css(d).appendTo(c).prepend(this);a.fpage=f("
",l(0,0,1)).css(d).appendTo(c);b.opts.gradients&&(a.ashadow=f("
",l(0,0,0)).hide().appendTo(c),a.bshadow=f("
",l(0,0,0)));break;case "sheet":var d=this.width(),e=this.height();Math.round(Math.sqrt(Math.pow(d,2)+Math.pow(e,2)));a.fparent=a.opts.turn.data().fparent;a.fparent||(d=f("
",{css:{"pointer-events":"none"}}).hide(),d.data().flips=0,d.css(l(0,0,"auto", +"visible").css).appendTo(a.opts.turn),a.opts.turn.data().fparent=d,a.fparent=d);this.css({position:"absolute",top:0,left:0,bottom:"auto",right:"auto"});a.wrapper=f("
",l(0,0,this.css("z-index"))).appendTo(c).prepend(this);a.fwrapper=f("
",l(c.offset().top,c.offset().left)).hide().appendTo(a.fparent);a.fpage=f("
",l(0,0,0,"visible")).css({cursor:"default"}).appendTo(a.fwrapper);b.opts.gradients&&(a.ashadow=f("
",l(0,0,1)).appendTo(a.fpage));i.setData.call(this,a)}i.resize.call(this, +!0)},_fold:function(a){var b=this.data().f,c=b.opts.turn.data(),d=i._c.call(this,a.corner),e=this.width(),h=this.height();switch(b.effect){case "hard":a.x="l"==a.corner?Math.min(Math.max(a.x,0),2*e):Math.max(Math.min(a.x,e),-e);var f,g,s,x,k,n=c.totalPages,l=b.opts["z-index"]||n,q={overflow:"visible"},p=d.x?(d.x-a.x)/e:a.x/e,r=90*p,t=90>r;switch(a.corner){case "l":x="0% 50%";k="100% 50%";t?(f=0,g=0L&&(m.x+=Math.abs(m.y*b.y/b.x),m.y=0,Math.round(m.x*Math.tan(K-g))L&&(b=K-g,f=R-h/Math.sin(b),v=j(Math.round(f*Math.cos(b)),Math.round(f*Math.sin(b))),C&&(v.x=-v.x), +E&&(v.y=-v.y));z=Math.round(m.y/Math.tan(g)+m.x);b=e-z;f=b*Math.cos(2*g);k=b*Math.sin(2*g);Q=j(Math.round(C?b-f:z+f),Math.round(E?k:h-k));c.opts.gradients&&(y=b*Math.sin(g),b=i._c2.call(u,a.corner),b=Math.sqrt(Math.pow(b.x-a.x,2)+Math.pow(b.y-a.y,2))/e,D=Math.sin(L*(1