Advertisement
Guest User

jPageFlipper iPad/iPhone/iOS Touch bugfix

a guest
Aug 12th, 2013
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. //Also see Discussion "Using jPageFlipper on the iPad?" on jpageflipper.codeplex.com/
  3. //hotfix by Mortimer Neuss
  4.  
  5.  
  6. /// <reference path="../lib/jquery-1.4.1-vsdoc.js" />
  7.  
  8. (function ($s) {  // TODO rename $s to $
  9.     $.fn.pageFlipper = function (userOptions) {
  10.         var defaults = {
  11.             className: 'canvasHolder',
  12.             pageWidth: 500,
  13.             pageHeight: 375,
  14.             easing: 0.5,
  15.             fps: 20,
  16.             defaultPageColor: 'white',
  17.             backgroundColor: 'white',
  18.             cornerSide: 50
  19.         };
  20.  
  21.         var options = $.extend(defaults, userOptions);
  22.         options.updateDelay = 1000 / options.fps;
  23.         options.spreadWidth = options.pageWidth * 2;
  24.         options.pageDiagonal = Math.sqrt(options.pageWidth * options.pageWidth + options.pageHeight * options.pageHeight);
  25.         options.pageClipWidth = options.pageWidth;
  26.         options.pageClipHeight = options.pageWidth * 10;
  27.         options.pageHeightOffset = options.pageDiagonal - options.pageHeight;
  28.  
  29.         var canvas = null;
  30.         var tempCanvas = null;
  31.         var holder = null;
  32.         var context = null;
  33.         var tempContext = null;
  34.  
  35.         var mousePosition = null;
  36.         var followerPosition = null;
  37.  
  38.         var pageAngle = 0;
  39.  
  40.         var spineTopX = options.pageWidth;
  41.         var spineTopY = 0;
  42.         var spineBottomTop = options.pageHeight;
  43.  
  44.         var bisectorTangetY = options.pageHeight;
  45.  
  46.         var leftIsActive;
  47.         //Hotfix
  48.         var startCoords = {}, endCoords = {};
  49.         //hotfix
  50.         function is_touch_device() {  
  51.           try {  
  52.             document.createEvent("TouchEvent");  
  53.             return true;  
  54.           } catch (e) {  
  55.             return false;  
  56.           }  
  57.         }
  58.  
  59.         function createHandles() {
  60.             mousePosition = {top: options.pageHeight, left: options.pageWidth * 2};
  61.             followerPosition = {top: options.pageHeight, left: options.pageWidth * 2};
  62.             leftIsActive = false;
  63.         }
  64.  
  65.         function createCanvas(element) {
  66.             holder = $("<div id='canvasHolder'></div>");
  67.             holder
  68.                 .insertAfter(element)
  69.                 .addClass(options.className)
  70.                 .attr('width', options.pageWidth * 2)
  71.                 .attr('height', options.pageHeight + options.pageHeightOffset * 2);
  72.            
  73.             canvas = $("<canvas id='mainCanvas'></canvas>");
  74.             holder.append(canvas);
  75.  
  76.             canvas
  77.                 .attr('width', options.pageWidth * 2)
  78.                 .attr('height', options.pageHeight + options.pageHeightOffset * 2);
  79.  
  80.             tempCanvas = $("<canvas id='tempCanvas'></canvas>");
  81.             tempCanvas
  82.                 .css({
  83.                     position: 'absolute',
  84.                     top: canvas.position().top,
  85.                     left: canvas.position().left
  86.                 })
  87.                 .attr('width', canvas.width())
  88.                 .attr('height', canvas.height())
  89.                 .appendTo(holder);
  90.                
  91.             context = canvas.get(0).getContext('2d');
  92.             tempContext = tempCanvas.get(0).getContext('2d');
  93.  
  94.             context.strokeStyle = "#aaaaaa";
  95.             context.beginPath();
  96.             context.moveTo(options.pageWidth, options.pageHeightOffset);
  97.             context.lineTo(options.pageWidth, options.pageHeight + options.pageHeightOffset);
  98.             context.stroke();
  99.         }
  100.  
  101.         function getRealPosition(element, position) {
  102.             element = $(element);
  103.             if (position == null) {
  104.                 position = element.position();
  105.             }
  106.  
  107.             return {
  108.                 top: position.top + element.height() / 2 - options.pageHeightOffset,
  109.                 left: position.left + element.width() / 2
  110.             };
  111.         }
  112.  
  113.         var dragging = false;
  114.         var flipInProgress = false;
  115.  
  116.         function activateMouseHandle() {
  117.             $(tempCanvas)
  118.                 .bind('mousemove', onCanvasHovering)
  119.                 .bind('mouseout', onCanvasHoverOut)
  120.                 .bind('mousedown', onCanvasActionStart)
  121.                 .bind('touchstart', onCanvasActionStart);
  122.  
  123.             $(document)
  124.                 .bind('mousemove', function(event) {
  125.                     nextMouseUpIsClick = false;
  126.                     if (!flipInProgress) {
  127.                         if (dragging) {
  128.                             mousePosition = {left: event.pageX - $(holder).position().left, top: event.pageY - options.pageHeightOffset + 70};
  129.                         }
  130.                     }
  131.                 })
  132.                 .bind('touchmove', function(event) {
  133.                     nextMouseUpIsClick = false;
  134.                     //hotfix
  135.                     endCoords = event.originalEvent.targetTouches[0];
  136.  
  137.                     if (!flipInProgress) {
  138.                         if (dragging && event.originalEvent != null && event.originalEvent.touches.length == 1) {
  139.                             event.preventDefault();
  140.                             var touch = event.originalEvent.touches[0];
  141.                             mousePosition = {left: touch.screenX - $(holder).position().left, top: touch.screenY - options.pageHeightOffset + 70};
  142.                         }
  143.                     }
  144.                 })
  145.                 .bind('mouseup', onCanvasActionStop)
  146.                 .bind('touchend', onCanvasActionStop);
  147.         }
  148.  
  149.         var onCornerMoveComplete;
  150.  
  151.  
  152.         function clearTempCanvas() {
  153.             tempContext.clearRect(0, 0, tempCanvas.width(), tempCanvas.height());
  154.         }
  155.  
  156.         function onCanvasClick() {
  157.             if (flipInProgress) {
  158.                 completeFlip();
  159.                 clearTempCanvas();
  160.  
  161.                 invalidate();
  162.             }
  163.  
  164.             var lastDirectionPage = leftIsActive ? imageIndex == 0 : imageIndex == sourceImagesLength - 2;
  165.             if (lastDirectionPage) {
  166.                 return;
  167.             }
  168.  
  169.             var pageIsNotLast = leftIsActive ? imageIndex > 0 : imageIndex < sourceImagesLength - 2;
  170.             if (pageIsNotLast) {
  171.                 mousePosition = {top: options.pageHeight, left: leftIsActive ? options.pageWidth * 2 : 0};
  172.                 followerPosition = {left: leftIsActive ? 1 : options.pageWidth * 2 - 1, top: options.pageHeight - 1};
  173.                
  174.                 flipInProgress = true;
  175.  
  176.                 onCornerMoveComplete = getOnCornerMoveComplete(leftIsActive);
  177.             }
  178.         }
  179.  
  180.         function getOnCornerMoveComplete(leftPageIsActive) {
  181.             return function() {
  182.                 imageIndex += leftPageIsActive ? -2 : 2;
  183.                 mousePosition = {left: leftPageIsActive ? 0 : options.pageWidth * 2, top: options.pageHeight};
  184.                 followerPosition = mousePosition;
  185.                 drawBackgroundPages();
  186.                 clearTempCanvas();
  187.  
  188.                 dragging = false;
  189.             }
  190.         }
  191.  
  192.  
  193.         function onCanvasActionStop(event) {
  194.  
  195.             if (nextMouseUpIsClick) {
  196.                 onCanvasClick();
  197.                 return;
  198.             }
  199.  
  200.             if (!flipInProgress) {
  201.                 dragging = false;
  202.                 if (leftIsActive ? imageIndex == 0 : imageIndex == sourceImagesLength - 2) {
  203.                     return;
  204.                 }
  205.  
  206.                 //hotfix
  207.                 var left;
  208.                 if(is_touch_device()){
  209.                     left = endCoords.pageX;
  210.                 }else{
  211.                     left = event.pageX - $(holder).position().left;
  212.                 }
  213.  
  214.                 var actionDropArea = leftIsActive ? left > options.pageWidth : left < options.pageWidth;
  215.  
  216.                 if (actionDropArea) {
  217.  
  218.                     mousePosition = {left: leftIsActive ? options.spreadWidth : 0, top: options.pageHeight};
  219.                     flipInProgress = true;
  220.  
  221.                     onCornerMoveComplete = getOnCornerMoveComplete(leftIsActive);
  222.                 } else {
  223.                     mousePosition = {left: leftIsActive ? options.cornerSide : options.spreadWidth - options.cornerSide, top: options.pageHeight - options.cornerSide};
  224.                 }
  225.             }
  226.         }
  227.  
  228.         var nextMouseUpIsClick = false;
  229.  
  230.         function onCanvasActionStart(event) {
  231.             nextMouseUpIsClick = true;
  232.             //Hotfix
  233.             startCoords = endCoords = event.originalEvent.targetTouches[0];
  234.  
  235.             if (!flipInProgress) {
  236.                 var zeroPoint = $(holder).position();
  237.                 var relativePosition = {top: event.pageY - zeroPoint.top - options.pageHeightOffset, left: event.pageX - zeroPoint.left};
  238.            
  239.                 if (relativePosition.top >= 0 && relativePosition.top < options.pageHeight) {
  240.                     if (relativePosition.left >= 0 && relativePosition.left < options.pageWidth) {
  241.                         mousePosition = {left: options.cornerSide, top: options.pageHeight - options.cornerSide};
  242.                         if (!leftIsActive) {
  243.                             leftIsActive = true;
  244.                             followerPosition = {left: 0, top: options.pageHeight};
  245.                         }
  246.                     } else if (relativePosition.left >= options.pageWidth && relativePosition.left < options.spreadWidth) {
  247.                         mousePosition = {left: options.spreadWidth - options.cornerSide, top: options.pageHeight - options.cornerSide};
  248.                         if (leftIsActive) {
  249.                             leftIsActive = false;
  250.                             followerPosition = {left: options.spreadWidth, top: options.pageHeight};
  251.                         }
  252.                     } else {
  253.                         mousePosition = {left: leftIsActive ? 0 : options.spreadWidth, top: options.pageHeight};
  254.                     }
  255.  
  256.                     event.preventDefault();
  257.                     dragging = true;
  258.                 }
  259.             }
  260.         }
  261.        
  262.         function onCanvasHoverOut(event) {
  263.             if (!dragging && !flipInProgress) {
  264.                 mousePosition = {left: leftIsActive ? 0 : options.spreadWidth, top: options.pageHeight};;
  265.             }
  266.         }
  267.  
  268.         function onCanvasHovering(event) {
  269.             nextMouseUpIsClick = false;
  270.             //Hotbox
  271.             endCoords = event.pageX;
  272.  
  273.             if (!dragging && !flipInProgress) {
  274.                 var zeroPoint = $(holder).position();
  275.                 var relativePosition = {top: event.pageY - zeroPoint.top - options.pageHeightOffset, left: event.pageX - zeroPoint.left};
  276.            
  277.                 if (relativePosition.top >= 0 && relativePosition.top < options.pageHeight) {
  278.                     if (relativePosition.left >= 0 && relativePosition.left < options.pageWidth) {
  279.                         mousePosition = {left: options.cornerSide, top: options.pageHeight - options.cornerSide};
  280.                         if (!leftIsActive) {
  281.                             leftIsActive = true;
  282.                             followerPosition = {left: 0, top: options.pageHeight};
  283.                         }
  284.                     } else if (relativePosition.left >= options.pageWidth && relativePosition.left < options.spreadWidth) {
  285.                         mousePosition = {left: options.spreadWidth - options.cornerSide, top: options.pageHeight - options.cornerSide};
  286.                         if (leftIsActive) {
  287.                             leftIsActive = false;
  288.                             followerPosition = {left: options.spreadWidth, top: options.pageHeight};
  289.                         }
  290.                     } else {
  291.                         mousePosition = {left: leftIsActive ? 0 : options.spreadWidth, top: options.pageHeight};
  292.                     }
  293.                 } else {
  294.                     mousePosition = {left: leftIsActive ? 0 : options.spreadWidth, top: options.pageHeight};
  295.                 }
  296.             }
  297.         }
  298.  
  299.         function completeFlip() {
  300.             if (onCornerMoveComplete != null) {
  301.                 onCornerMoveComplete();
  302.                 onCornerMoveComplete = null;
  303.             }
  304.  
  305.             flipInProgress = false;
  306.         }
  307.  
  308.         function updateHandlePositions() {
  309.             if (mousePosition == null) {
  310.                 return;
  311.             }
  312.  
  313.             var followerDeltaTop = (mousePosition.top - followerPosition.top) * options.easing;
  314.             var followerDeltaLeft = (mousePosition.left - followerPosition.left) * options.easing;
  315.  
  316.             followerDeltaLeft = Math.abs(followerDeltaLeft) < 0.5 ? 0 : followerDeltaLeft;
  317.             followerDeltaTop = Math.abs(followerDeltaTop) < 0.5 ? 0 : followerDeltaTop;
  318.  
  319.             if (followerDeltaLeft == 0 && followerDeltaTop == 0) {
  320.                 completeFlip();
  321.                 return;
  322.             }
  323.  
  324.             followerPosition.top += followerDeltaTop;
  325.             followerPosition.left += followerDeltaLeft;
  326.  
  327. //          console.debug('mouse: x - ' + mousePosition.left + ', y - ' + mousePosition.top);
  328. //          console.debug('follower: x - ' + followerPosition.left + ', y - ' + followerPosition.top);
  329.  
  330.             var deltaX = followerPosition.left - options.pageWidth;
  331.             var deltaY = spineBottomTop - followerPosition.top;
  332.  
  333.             var spineBottomToFollowerAngle = Math.atan2(deltaY, deltaX);
  334.  
  335.             var radiusLeft = Math.cos(spineBottomToFollowerAngle) * options.pageWidth + options.pageWidth;
  336.             var radiusTop = spineBottomTop - Math.sin(spineBottomToFollowerAngle) * options.pageWidth;
  337.  
  338.             var distanceToFollower = Math.sqrt(
  339.                 (spineBottomTop - followerPosition.top) * (spineBottomTop - followerPosition.top) +
  340.                 (followerPosition.left - options.pageWidth) * (followerPosition.left - options.pageWidth)
  341.             );
  342.             var distanceToRadius = Math.sqrt(
  343.                 (spineBottomTop - radiusTop) * (spineBottomTop - radiusTop) +
  344.                 (radiusLeft - options.pageWidth) * (radiusLeft - options.pageWidth)
  345.             );
  346.  
  347.             var cornerX;
  348.             var cornerY;
  349.             if (distanceToRadius < distanceToFollower) {
  350.                 cornerX = radiusLeft;
  351.                 cornerY = radiusTop;
  352.             } else {
  353.                 cornerX = followerPosition.left;
  354.                 cornerY = followerPosition.top;
  355.             }
  356.            
  357.             deltaX = spineTopX - cornerX;
  358.             deltaY = cornerY;
  359.  
  360.             distanceToFollower = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
  361.             var spineTopToFollowerAngle = Math.atan2(deltaY, deltaX);
  362.  
  363.             if (distanceToFollower > options.pageDiagonal) {
  364.                 var radius2HandleX = -Math.cos(spineTopToFollowerAngle) * options.pageDiagonal + options.pageWidth;
  365.                 var radius2HandleY = spineTopY + Math.sin(spineTopToFollowerAngle) * options.pageDiagonal;
  366.  
  367.                 cornerX = radius2HandleX;
  368.                 cornerY = radius2HandleY;
  369.             }
  370.  
  371.             var bisectorX = leftIsActive ? cornerX / 2 : ((options.pageWidth * 2 - cornerX) / 2 + cornerX);
  372.             var bisectorY = (options.pageHeight - cornerY) / 2 + cornerY;
  373.  
  374.             var bisectorAngle = Math.atan2(options.pageHeight - bisectorY, leftIsActive ? bisectorX : options.pageWidth * 2 - bisectorX);
  375.             var bisectorDeltaX = Math.tan(bisectorAngle) * (options.pageHeight - bisectorY);
  376.             var bisectorTangetX = bisectorX + bisectorDeltaX * (leftIsActive ? 1 : -1);
  377.             if (bisectorTangetX < 0) {
  378.                 bisectorTangetX = 0;
  379.             }
  380.  
  381.             var pageAngleDeltaY = bisectorTangetY - cornerY;
  382.             var pageAngleDeltaX = bisectorTangetX - cornerX;
  383.             pageAngle = leftIsActive ? Math.atan2(-pageAngleDeltaY, -pageAngleDeltaX) : Math.atan2(pageAngleDeltaY, pageAngleDeltaX);
  384.  
  385.             var pageX = cornerX + options.pageWidth / 2 * Math.cos(pageAngle) * (leftIsActive ? -1 : 1)
  386.                 + options.pageHeight / 2 * Math.sin(pageAngle);
  387.             var pageY = cornerY - options.pageHeight / 2 * Math.cos(pageAngle)
  388.                 + options.pageWidth / 2 * Math.sin(pageAngle) * (leftIsActive ? -1 : 1);
  389.            
  390.             var maskTanAngle = Math.atan2(options.pageHeight - bisectorY,
  391.                 bisectorX - bisectorTangetX);
  392.             var maskAngle = 90 * (maskTanAngle / Math.abs(maskTanAngle)) - maskTanAngle * 180 / Math.PI;
  393.             maskAngle = maskAngle / 180 * Math.PI;
  394.  
  395.             var xCoefficient = bisectorTangetY - bisectorY;
  396.             var yCoefficient = bisectorX - bisectorTangetX;
  397.             var freeCoefficient = bisectorTangetX * bisectorY - bisectorX * bisectorTangetY;
  398.  
  399.             var halfPageClipX = -(yCoefficient * options.pageHeight / 2 + freeCoefficient) / xCoefficient;
  400.             var halfPageClipOffset = options.pageClipWidth / 2 / Math.cos(maskAngle);
  401.  
  402.             var maskLeft = halfPageClipX + halfPageClipOffset * (leftIsActive ? 1 : -1);
  403.             var maskTop = options.pageHeight / 2;
  404.  
  405.             var anotherMaskLeft = maskLeft +
  406.                 (leftIsActive ?
  407.                     -halfPageClipOffset * 3:
  408.                     halfPageClipOffset);
  409.  
  410. //          anotherMaskLeft -= options.pageWidth * Math.cos(maskAngle);
  411.  
  412.             drawPage(pageX, pageY, pageAngle, maskLeft, maskTop, maskAngle, anotherMaskLeft);
  413.         }
  414.  
  415.         function mirrorX(value) {
  416.             return options.spreadWidth - value;
  417.         }
  418.  
  419.         function drawPage(pageX, pageY, pageAngle, maskX, maskY, maskAngle, anotherMaskX) {
  420.             tempContext.clearRect(0, 0, tempCanvas.width(), tempCanvas.height());
  421.  
  422.             tempContext.save();
  423.  
  424.             tempContext.translate(maskX, maskY + options.pageHeightOffset);
  425.             tempContext.rotate(maskAngle);
  426.  
  427.             tempContext.beginPath();
  428.             tempContext.rect(-options.pageClipWidth / 2, -options.pageClipHeight / 2, options.pageClipWidth, options.pageClipHeight);
  429.             tempContext.clip();
  430.  
  431.             tempContext.rotate(-maskAngle);
  432.             tempContext.translate(-maskX, -maskY - options.pageHeightOffset);
  433.  
  434.             tempContext.translate(pageX, pageY + options.pageHeightOffset);
  435.             tempContext.rotate(pageAngle);
  436.  
  437.             drawSource(tempContext, getFlipperImage(), -options.pageWidth / 2, -options.pageHeight / 2);
  438.  
  439.             tempContext.restore();
  440.             tempContext.save();
  441.  
  442.             tempContext.translate(anotherMaskX, maskY + options.pageHeightOffset);
  443.             tempContext.rotate(maskAngle);
  444.  
  445.             tempContext.beginPath();
  446. //          tempContext.fillStyle = 'red';
  447. //          tempContext.fillRect(0, -options.pageDiagonal, options.pageClipWidth, options.pageClipHeight);
  448.             tempContext.rect(0, -options.pageDiagonal, options.pageClipWidth, options.pageClipHeight);
  449.             tempContext.clip();
  450.  
  451.             tempContext.rotate(-maskAngle);
  452.             tempContext.translate(-anotherMaskX, -maskY - options.pageHeightOffset);
  453.  
  454.             tempContext.translate(0, 0);
  455.             drawSource(tempContext, getAppearingImage(), leftIsActive ? 0 : options.pageWidth, options.pageHeightOffset);
  456.            
  457.             tempContext.restore();
  458.         }
  459.  
  460.         function positionElement(element, x, y) {
  461.             element = $(element);
  462.             element.css({
  463.                 top: y - element.height() / 2 + options.pageHeightOffset,
  464.                 left: x - element.width() / 2
  465.             });
  466.         }
  467.  
  468.         function rotateElement(element, angle) {
  469.             var angleInDegrees = angle / Math.PI * 180;
  470.             $(element)
  471.                 .css({
  472.                     '-moz-transform': 'rotate(' + angleInDegrees + 'deg)',
  473.                     '-webkit-transform': 'rotate(' + angleInDegrees + 'deg)'
  474.                 });
  475.         }
  476.  
  477.         function startInvalidationWorker() {
  478.             var worker = function() {
  479.                 invalidate();
  480.                 setTimeout(worker, options.updateDelay);
  481.             };
  482.  
  483.             worker();
  484.         }
  485.  
  486.         function invalidate() {
  487.             updateHandlePositions();
  488.         }
  489.  
  490.         function initializeFlipper(element) {
  491.             createCanvas(element);
  492.  
  493.             createHandles();
  494.  
  495.             activateMouseHandle();
  496.             startInvalidationWorker();
  497.            
  498.             initializeDefaultImage();
  499.  
  500.             var listImages = $('li img', element);
  501.             sourceImagesLength = listImages.length + 2;
  502.             for (var index = 0; index < listImages.length; index++) {
  503.                 sourceImages[index] = defaultImage;
  504.                 loadPageImage(listImages, index);
  505.             }
  506.  
  507.             if (listImages.length % 2 == 1) {
  508.                 sourceImages.push(defaultImage);
  509.                 sourceImagesLength++;
  510.             }
  511.  
  512.             drawBackgroundPages();
  513.         };
  514.  
  515.         function drawBackgroundPages() {
  516.             var leftImage = getLeftImage();
  517.             var rightImage = getRightImage();
  518.  
  519.             if (leftImage != null) {
  520.                 drawSource(context, leftImage, 0, options.pageHeightOffset);
  521.             } else {
  522.                 context.clearRect(0, options.pageHeightOffset, options.pageWidth, options.pageHeight);
  523.             }
  524.             if (rightImage != null) {
  525.                 drawSource(context, rightImage, options.pageWidth, options.pageHeightOffset);
  526.             } else {
  527.                 context.clearRect(options.pageWidth, options.pageHeightOffset, options.pageWidth, options.pageHeight);
  528.             }
  529.         }
  530.  
  531.         function drawSource(drawingContext, source, x, y) {
  532.             if (source != null && source.type != null && source.type.length > 0) {
  533.                 if ((source.type == 'image') && source.data != null) {
  534.                     if (source.isLoaded) {
  535.                         drawingContext.drawImage(source.data, x, y);
  536.                     }
  537.                 } else if (source.type == 'background') {
  538.                     drawingContext.fillStyle = options.backgroundColor;
  539.                     drawingContext.fillRect(x, y, options.pageWidth, options.pageHeight);
  540.                 }
  541.             }
  542.         }
  543.  
  544.         var defaultImage = null;
  545.        
  546.         function initializeDefaultImage() {
  547.             var defaultImageCanvas = $("<canvas></canvas>");
  548.             defaultImageCanvas
  549.                 .attr('width', options.pageWidth)
  550.                 .attr('height', options.pageHeight);
  551.  
  552.             var context = defaultImageCanvas[0].getContext('2d');
  553.             context.fillStyle = options.defaultPageColor;
  554.             context.fillRect(0, 0, options.pageWidth, options.pageHeight);
  555.  
  556.             var imageData = new Image();
  557.             imageData.onload = function() {
  558.                 defaultImage.isLoaded = true;
  559.             };
  560.             imageData.src = defaultImageCanvas[0].toDataURL();
  561.             defaultImage = {type: 'image', data: imageData, isLoaded: false};
  562.         }
  563.  
  564.         function getPageImage(index) {
  565.             if (index == 0 || index == sourceImagesLength - 1) {
  566.                 return {type: 'background'};
  567.             }
  568.  
  569.             return sourceImages[index - 1];
  570.         }
  571.  
  572.         function loadPageImage(images, index) {
  573.             var source = $(images[index]).attr('src');
  574.             loadImage(source, function(loadedImage) {
  575.                 sourceImages[index] = {type: 'image', data: loadedImage, isLoaded: true};
  576.                 if (index == imageIndex || index == imageIndex + 1) {
  577.                      drawBackgroundPages();
  578.                 }
  579.             });
  580.         }
  581.  
  582.         function loadImage(url, onLoaded) {
  583.             var image = new Image();
  584.             image.onload = function() {
  585.                 onLoaded(image);
  586.             };
  587.             image.src = url;
  588.         }
  589.  
  590.         function getLeftImage() {
  591.             return getPageImage(imageIndex);
  592.         }
  593.  
  594.         function getRightImage() {
  595.             return getPageImage(imageIndex + 1);
  596.         }
  597.  
  598.         function getFlipperImage() {
  599.             return getPageImage(leftIsActive ? imageIndex - 1 : imageIndex + 2);
  600.         }
  601.  
  602.         function getAppearingImage() {
  603.             return getPageImage(leftIsActive ? imageIndex - 2 : imageIndex + 3);
  604.         }
  605.  
  606.         var sourceImagesLength = 0;
  607.         var sourceImages = [];
  608.         var imageIndex = 0;
  609.  
  610.         return this.each(function () {
  611.             initializeFlipper(this);
  612.         });
  613.     };
  614. })(jQuery);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement